gpsman-6.4.4.2/0000755000175000017500000000000012224351117011262 5ustar migmiggpsman-6.4.4.2/util/0000755000175000017500000000000012224351120012231 5ustar migmiggpsman-6.4.4.2/util/mb2gmn.tcl0000755000175000017500000001140212224351120014120 0ustar migmig#!/bin/sh # This is a Tcl/Tk script to be interpreted by wish (Tk8.0 or better): \ exec wish "$0" -- "$@" # mb2gmn --- convert MapBlast files into GPSManager files # # Copyright (c) 2004 Martin Ostermann (ost@brainaid.dascon.de) and # Miguel Filgueiras (mig@ncc.up.pt) # # To be used with the source of # # gpsman --- GPS Manager: a manager for GPS receiver data # # Copyright (c) 2004 Miguel Filgueiras (mig@ncc.up.pt) / Universidade do Porto # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. # # # File: mb2gmn.tcl # Last change: 25 July 2004 # ############ configuration parameters # # the first variable below MUST be correctly set for mb2gmn to work! # # path to directory with the sources of GPSMan # NOTE for non-Unix users: use "/" (not "\") in pathnames set SRCDIR ../gmsrc ## routes are created with id number starting from: set RTID 900 ## for all these variables see gpsman.tcl, the GPSMan options menus ## and the GPSMan documentation set DISTUNIT KM set LANG engl set ISOLATIN1 1 set DELETE 1 set DateFormat DDMMMYYYY set ALTUNIT M set TimeOffset 0 set CREATIONDATE 0 set PERMS 0644 set LISTHEIGHT 22 set EPOSX 340 ; set EPOSY 50 set DPOSX 290 ; set DPOSY 50 set COLOUR(messbg) "#ff8d90" set COLOUR(dialbg) gray set COLOUR(selbg) "#F0E9C0" set COLOUR(check) red set ALLMONTH(1) "Jan Gen jan" set ALLMONTH(2) "Feb Fev feb" set ALLMONTH(3) "Mar Mr mrt" set ALLMONTH(4) "Apr Abr Avr apr" set ALLMONTH(5) "May Mai Mag mei" set ALLMONTH(6) "Jun Giu jun" set ALLMONTH(7) "Jul Lug jul" set ALLMONTH(8) "Aug Ago Aou aug" set ALLMONTH(9) "Sep Set sep" set ALLMONTH(10) "Oct Okt Out Ott okt" set ALLMONTH(11) "Nov nov" set ALLMONTH(12) "Dec Dez Dic dec" ########## no configurable values after this point set CMDLINE 0 foreach f "lang$LANG gendials compute check util" { source [file join $SRCDIR $f.tcl] } array set FCOMMAND { format "!Format:" pformat "!Position:" datum "!Datum:" dates "!Creation:" 0 no 1 yes WP "!W:" RT "!R:" comment "%" } set File(RT) "" set File(MapBlast) "" set FileTypes {RT MapBlast} set TXT(nameMapBlast) MapBlast set RTCount 0 set WindowStack "" set UNIX [expr ! [string compare $tcl_platform(platform) "unix"]] ### conversion proc MapBlastToGPSMan {infile outfile} { # based on proc ImportMapBlast # by Martin Ostermann # with changes by Miguel Filgueiras global MESS FCOMMAND TimeOffset CREATIONDATE RTID RTCount set date [NowTZ] puts $outfile \ "$FCOMMAND(comment) Written by mb2gm: MapBlast to GPSManager $date" puts $outfile "" puts $outfile "$FCOMMAND(format) DDD $TimeOffset WGS 84" puts $outfile "$FCOMMAND(dates) $FCOMMAND($CREATIONDATE)" puts $outfile "" puts $outfile "$FCOMMAND(RT)\t[expr $RTID+$RTCount]" set void 1 while { ! [eof $infile] } { set line [gets $infile] if { ! [regexp {.*(IMG|img) (SRC|src)="/gif.*} $line] } { continue } if { ! [regexp \ {.*IC=[-0-9.]*:[-0-9.]*:100:([0-9]*):([-0-9.]*):([-0-9.]*):} \ $line match name lat long] } { continue } set name "$RTCount-$name" if { ! [CheckLat GMMessage $lat DDD] || \ ! [CheckLong GMMessage $long DDD] } { continue } set latd [Coord DDD $lat S] ; set longd [Coord DDD $long W] set p "$latd\t$longd" if { $CREATIONDATE } { puts $outfile "$name\t\t$date\t$p" } else { puts $outfile "$name\t\t$p" } set void 0 } if { $void } { GMMessage $MESS(voidRT) wait return } puts $outfile "" incr RTCount return } wm protocol . WM_DELETE_WINDOW { exit 1 } frame .fr -relief flat -borderwidth 5 -bg $COLOUR(messbg) label .fr.title -text "mb2gmn" -relief sunken pack .fr.title -side top -pady 5 pack .fr -side top update idletasks if { ! [GMChooseParams $TXT(select) RTID \ [list "=$TXT(number) ($TXT(nameRT))"]] } { exit } set RTID [string trim "$RTID" " "] if { ! [regexp {^[0-9]+$} $RTID] } { bell ; exit } while 1 { if { [set infile [GMOpenFile $TXT(loadfrm) MapBlast r]] == ".." } { exit } if { [set outfile [GMOpenFile $TXT(saveto) RT w]] == ".." } { exit } MapBlastToGPSMan $infile $outfile close $outfile close $infile } gpsman-6.4.4.2/util/dos2gpsman.tcl0000755000175000017500000002043412224351120015020 0ustar migmig#!/bin/sh # This is a Tcl/Tk script to be interpreted by tclsh \ exec tclsh "$0" "$@" ############################################################################ # # # dos2gpsman --- Convert BGA Turnpoints gpsman "WayPoint" format # # # # BGA Turnpoints are available at # # http://www.spsys.demon.co.uk/turningpoints.htm # # The DOS format file is required by this program # # # # usage: dos2gpsman [-p feature] [-f findability] [-a air_activity] \ # # [-i in_file] [-o out_file] [-h] [--help] # # # # With no arguments, converts all records from stdin to stdout # # # # Version 0.1 # # # # Bugs: # # * "Air activity" is best specified by any single or double # # character, e.g. "x" or "xx", rather than the "#" or "##". # # This avoids the need to escape "#" from the shell. # # # # * There is no way to _exclude_ points by a criterion # # # # * Some information in the original file is discarded # # # # * This code will probably fail if the file format changes # # e.g. if extra information is added to the TurnPoint file # # # # Copyright (c) Paul Scorer, Leeds Metropolitan University # # p.scorer@leedsmet.ac.uk # # # # This program is free software; you can redistribute it and/or modify # # it under the terms of the GNU General Public License as published by # # the Free Software Foundation; either version 2 of the License, or # # (at your option) any later version. # # # # This program is distributed in the hope that it will be useful, # # but WITHOUT ANY WARRANTY; without even the implied warranty of # # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # # GNU General Public License for more details. # # # # You should have received a copy of the GNU General Public License # # along with this program. # # # ############################################################################ global fullname trigraph bganum findability exactpoint\ description distance direction feature\ OSMap Easting_Northing Lat_Long altitude \ degLat minLat NS degLong minLong decLong EW ################ # Read one complete waypoint record ################ proc getRecord {f} { global fullname trigraph bganum findability exactpoint\ description distance direction feature\ OSMap Easting_Northing Lat_Long altitude\ degLat minLat NS degLong minLong decLong EW if {[gets $f fullname] > 0 && \ [gets $f trigraph] > 0 && \ [gets $f bganum] > 0 && \ [gets $f findability] > 0 && \ [gets $f exactpoint] > 0 && \ [gets $f description] > 0 && \ [gets $f distance] > 0 && \ [gets $f direction] > 0 && \ [gets $f feature] > 0 && \ [gets $f OSMap] > 0 && \ [gets $f Easting_Northing] > 0 && \ [gets $f Lat_Long] > 0 && \ [gets $f altitude] > 0 && \ [gets $f trigraph1] > 0 && \ [gets $f junk] == 0} { # Blank line - Record Separator # Simple consistency check: # Trigraph at last line should match that at second line if {[string equal $trigraph $trigraph1] } { scan $Lat_Long "%d%lf%s%d%d.%d%s" \ degLat minLat NS degLong minLong decLong EW return 1; } else { puts stderr "Format Error"; return 0; } } else { return 0 } } ################## # Check if current record is associated # with "feature" specified on command line ################# proc checkPlace {} { global placeList feature foreach place $placeList { if { [string equal -nocase $feature $place] } { return 1 } } return 0 } ################ # Check if "findability" (A B C D or G) # matches that given on command line ################ proc checkFind {} { global findList findability foreach category $findList { if { [string equal -nocase -length 1 $category $findability] } { return 1 } } return 0 } ################ # Check if category of "Air Activity" # matches that given on command line ################ proc checkActivity {} { global activityList findability foreach category $activityList { set len [string length $category] incr len if { [string length $findability ] == $len } { return 1 } } return 0 } ################# # Set some initial values ################# set fi stdin # May be modified by "-i " set fo stdout # May be modified by "-o " set usage " usage: dos2gpsman \[-p feature\] \[-f findability\] \[-a air_activity\] \ \[-i in_file\] \[-o out_file\] \n\ \tfindability == \[A B C D G\]\n\ \tair_activity == \[x xx\] (any character)\n\ \tArguments may be repeated (e.g. to seach for more than one place)\n\ \tSee http://www.spsys.demon.co.uk/turningpoints.htm for the meaning of these terms\n " ################ # Process args ################ foreach {option arg} $argv { # Need help? if { [string equal -nocase -length 6 "--help" $option]} { puts stderr $usage exit } elseif { [string equal -nocase -length 2 "-h" $option]} { puts stderr $usage exit # Select points associated with "Feature" (aka "Place") } elseif { [string equal -nocase -length 2 "-p" $option]} { lappend placeList $arg # Select points with "Findability" A B C D or G } elseif { [string equal -nocase -length 2 "-f" $option]} { if { [lsearch -exact "A B C D G a b c d g" $arg] > 0 } { lappend findList $arg } else { puts stderr $usage exit } # Air Activity } elseif { [string equal -nocase -length 2 "-a" $option]} { if { [string length $arg] < 3 } { lappend activityList $arg } else { puts stderr $usage exit } # Change i/p file } elseif { [string equal -nocase -length 2 "-i" $option]} { set fi [open $arg r] # Change o/p file } elseif { [string equal -nocase -length 2 "-o" $option]} { set fo [open $arg w] } else { puts stderr $usage exit } } ############### # Generate time stamp # Not used, but useful to give date of conversion ############### set timestring [clock format [clock seconds] -format "%d-%b-%Y %H%M"] set doneHdr 0; # Flag to ensure header o/p once only # Process each record while { [getRecord $fi ] } { # Matches "Findability"? if { [info exists findList] } { if { [checkFind] == 0} { continue } } # Matches "Feature"? if { [info exists placeList] } { if { [checkPlace] == 0} { continue } } # Matches "Air Activity"? if { [info exists activityList] } { if { [checkActivity] == 0} { continue } } # Do the Header if needed if {$doneHdr == 0} { puts $fo "!Format: DMM 0 WGS 84\n!Creation: no\n" set doneHdr 1; } # Output the record (with altitude in metres) puts $fo [format "!W:\n%s\t%s\t%s%d %.3f\t%s%d %d.%d\talt=%.0f" \ $trigraph \ $timestring \ $NS $degLat $minLat \ $EW $degLong $minLong $decLong \ [expr { $altitude * 12 * 25.4 / 1000 }]]; puts $fo "!NB:" puts $fo $fullname puts $fo $exactpoint puts $fo $description puts $fo $feature puts $fo $findability puts $fo "" } if {$doneHdr == 0} { puts stderr "No matching waypoints found!\n" } gpsman-6.4.4.2/util/mou2gmn.tcl0000755000175000017500000001261112224351120014325 0ustar migmig#!/bin/sh # This is a Tcl/Tk script to be interpreted by wish (Tk8.0 or better): \ exec wish "$0" -- "$@" # mou2gmn --- convert MapsOnUS files into GPSManager files # # Copyright (c) 2004 Frank Kujawski (Frank@Kujawski.org) and # Miguel Filgueiras (mig@ncc.up.pt) # # To be used with the source of # # gpsman --- GPS Manager: a manager for GPS receiver data # # Copyright (c) 2004 Miguel Filgueiras (mig@ncc.up.pt) / Universidade do Porto # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. # # # File: mou2gmn.tcl # Last change: 25 July 2004 # ############ configuration parameters # # the first variable below MUST be correctly set for mou2gmn to work! # # path to directory with the sources of GPSMan # NOTE for non-Unix users: use "/" (not "\") in pathnames set SRCDIR ../gmsrc ## routes are created with id number starting from: set RTID 900 ## for all these variables see gpsman.tcl, the GPSMan options menus ## and the GPSMan documentation set DISTUNIT KM set LANG engl set ISOLATIN1 1 set DELETE 1 set DateFormat DDMMMYYYY set ALTUNIT M set TimeOffset 0 set CREATIONDATE 0 set PERMS 0644 set LISTHEIGHT 22 set EPOSX 340 ; set EPOSY 50 set DPOSX 290 ; set DPOSY 50 set COLOUR(messbg) "#ff8d90" set COLOUR(dialbg) gray set COLOUR(selbg) "#F0E9C0" set COLOUR(check) red set ALLMONTH(1) "Jan Gen jan" set ALLMONTH(2) "Feb Fev feb" set ALLMONTH(3) "Mar Mr mrt" set ALLMONTH(4) "Apr Abr Avr apr" set ALLMONTH(5) "May Mai Mag mei" set ALLMONTH(6) "Jun Giu jun" set ALLMONTH(7) "Jul Lug jul" set ALLMONTH(8) "Aug Ago Aou aug" set ALLMONTH(9) "Sep Set sep" set ALLMONTH(10) "Oct Okt Out Ott okt" set ALLMONTH(11) "Nov nov" set ALLMONTH(12) "Dec Dez Dic dec" ########## no configurable values after this point set CMDLINE 0 foreach f "lang$LANG gendials compute check util" { source [file join $SRCDIR $f.tcl] } array set FCOMMAND { format "!Format:" pformat "!Position:" datum "!Datum:" dates "!Creation:" 0 no 1 yes WP "!W:" RT "!R:" comment "%" nb "!NB:" } set File(RT) "" set File(MapsOnUS) "" set FileTypes {RT MapsOnUS} set TXT(nameMapsOnUS) MapsOnUS set RTCount 0 set WindowStack "" set UNIX [expr ! [string compare $tcl_platform(platform) "unix"]] ### conversion proc MapsOnUSToGPSMan {infile outfile} { # based on the ConvertMoU.pl Perl script # by Frank Kujawski (Frank@Kujawski.org) # with changes by Miguel Filgueiras global MESS FCOMMAND TimeOffset CREATIONDATE RTID RTCount set date [NowTZ] puts $outfile \ "$FCOMMAND(comment) Written by mou2gm: MapsOnUS to GPSManager $date" puts $outfile "" puts $outfile "$FCOMMAND(format) DDD $TimeOffset WGS 84" puts $outfile "$FCOMMAND(dates) $FCOMMAND($CREATIONDATE)" puts $outfile "" puts $outfile "$FCOMMAND(RT)\t[expr $RTID+$RTCount]" set void 1 while { ! [eof $infile] } { gets $infile line if { [regexp {>Start<} $line] } { gets $infile line if { ! [regexp {>([-0-9]+\.[0-9]+), ([-0-9]+\.[0-9]+)<} $line \ match long lat] } { continue } set name ST gets $infile ; gets $infile nb } elseif { [regexp {>Turn ([0-9]+)<} $line match no] } { gets $infile line if { ! [regexp {>([-0-9]+\.[0-9]+), ([-0-9]+\.[0-9]+)<} $line \ match long lat] } { continue } set name T$no gets $infile ; gets $infile ; gets $infile ; gets $infile nb } elseif { [regexp {>End<} $line] } { gets $infile line if { ! [regexp {>([-0-9]+\.[0-9]+), ([-0-9]+\.[0-9]+)<} $line \ match long lat] } { continue } set name END set nb "" } else { continue } set nb [string trimright "$nb" ","] set name "$RTCount-$name" if { ! [CheckLat GMMessage $lat DDD] || \ ! [CheckLong GMMessage $long DDD] } { continue } set latd [Coord DDD $lat S] ; set longd [Coord DDD $long W] set p "$latd\t$longd" if { $CREATIONDATE } { puts $outfile "$name\t\t$date\t$p" } else { puts $outfile "$name\t\t$p" } if { "$nb" != "" } { puts $outfile "$FCOMMAND(nb) $nb" puts $outfile "" } set void 0 } if { $void } { GMMessage $MESS(voidRT) wait return } puts $outfile "" incr RTCount return } wm protocol . WM_DELETE_WINDOW { exit 1 } frame .fr -relief flat -borderwidth 5 -bg $COLOUR(messbg) label .fr.title -text "mou2gmn" -relief sunken pack .fr.title -side top -pady 5 pack .fr -side top update idletasks if { ! [GMChooseParams $TXT(select) RTID \ [list "=$TXT(number) ($TXT(nameRT))"]] } { exit } set RTID [string trim "$RTID" " "] if { ! [regexp {^[0-9]+$} $RTID] } { bell ; exit } while 1 { if { [set infile [GMOpenFile $TXT(loadfrm) MapsOnUS r]] == ".." } { exit } if { [set outfile [GMOpenFile $TXT(saveto) RT w]] == ".." } { exit } MapsOnUSToGPSMan $infile $outfile close $outfile close $infile } gpsman-6.4.4.2/util/wpsinfull.tcl0000755000175000017500000001211112224351120014757 0ustar migmig#!/bin/sh # This is a Tcl/Tk script to be interpreted by wish (Tk8.0 or better): \ exec wish "$0" "$@" # wpsinfull --- convert old GPSManager files into new format with # route waypoints given in full # # Copyright (c) 2003-2006 Miguel Filgueiras mig@ncc.up.pt Universidade do Porto # # To be used with the source of # # gpsman --- GPS Manager: a manager for GPS receiver data # # Copyright (c) 1998-2006 Miguel Filgueiras mig@ncc.up.pt Universidade do Porto # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. # # # File: wpsinfull.tcl # Last change: 11 July 2006 # ############ configuration parameters # # the first variable below MUST be correctly set! # # path to directory with the sources of GPSMan # NOTE for non-Unix users: use "/" (not "\") in pathnames set SRCDIR ../gmsrc set LANG engl #### configuration continues below foreach f "config lang$LANG gendials compute check util files" { source [file join $SRCDIR $f.tcl] } #### more configuration ## for all these variables see gpsman.tcl, the GPSMan options menus ## and the GPSMan documentation set DISTUNIT KM set ISOLATIN1 1 set DELETE 1 set DateFormat DDMMMYYYY set TimeOffset 0 set CREATIONDATE 0 set EPOSX 340 ; set EPOSY 50 set DPOSX 290 ; set DPOSY 50 set COLOUR(messbg) "#ff8d90" set COLOUR(dialbg) gray set COLOUR(selbg) "#F0E9C0" set COLOUR(check) red ########## no configurable values after this point set FontSize [font actual default -size] if { $FONTSIZE != "Tcl/Tk" } { set f [font actual default] set f [eval font create $f] font configure $f -size $FONTSIZE option add *Font $f } if { $FIXEDFONTSIZE != "Tcl/Tk" } { set FixedFont "fixed $FIXEDFONTSIZE" } else { set FixedFont fixed } set CMDLINE 0 set CursorsChanged 0 array set FCOMMAND { format "!Format:" pformat "!Position:" datum "!Datum:" dates "!Creation:" 0 no 1 yes WP "!W:" RT "!R:" comment "%" } set File(Data) "" set File(old) "" set FileTypes {old Data} set TXT(nameold) old set WindowStack "" set UNIX [expr ! [string compare $tcl_platform(platform) "unix"]] proc SetCursor {args} {} proc ResetCursor {args} {} ### conversion proc WPsInFull {file outfile} { # convert GPSMan data file to new format with RTs having WPs in full global MESS FCOMMAND LFileBuffFull LFileBuff LFileEOF puts $outfile \ "$FCOMMAND(comment) Written by wpsinfull/GPSManager [NowTZ]" puts $outfile "" set line [ReadFileNL $file] while { ! $LFileEOF($file) } { puts $outfile $line if { [string first $FCOMMAND(WP) $line] == 0 } { # read/write WPs but save their textual definitions set line [ReadFileNL $file] while { ! $LFileEOF($file) } { if { [string first ! $line] == 0 } { set LFileBuffFull($file) 1 break } puts $outfile $line set def $line set name [lindex [split $line \t] 0] set line [ReadFileNL $file] # check for remark if { [string first $FCOMMAND(nb) $line] == 0 } { puts $outfile $line set rmrk $line while { [set line [ReadFileNL $file]] != "" && \ ! $LFileEOF($file) } { puts $outfile $line set rmrk [format "%s\n%s" $rmrk $line] } puts $outfile $line set wptext($name) "$def\n$rmrk\n" set line [ReadFileNL $file] } else { set wptext($name) $def } } } elseif { [string first $FCOMMAND(RT) $line] == 0 } { # read/write RTs, replacing isolated WP names by definitions set line [ReadFileNL $file] while { ! $LFileEOF($file) } { if { [string first ! $line] == 0 && \ [string first $FCOMMAND(RS) $line] != 0 && \ [string first $FCOMMAND(nb) $line] != 0 } { set LFileBuffFull($file) 1 break } if { [llength [split $line \t]] == 1 } { if { [catch {set def $wptext($line)}] } { GMMessage [format $MESS(undefinedWP) $line] set def [set wptext($line) $line] } puts $outfile $def } else { puts $outfile $line } set line [ReadFileNL $file] } } set line [ReadFileNL $file] } return } wm protocol . WM_DELETE_WINDOW { exit 1 } frame .fr -relief flat -borderwidth 5 -bg $COLOUR(messbg) label .fr.title -text "wpsinfull" -relief sunken pack .fr.title -side top -pady 5 pack .fr -side top update idletasks set saved "" while 1 { if { [OpenInputFileFails Data GPSMan] } { exit } set old $File(Data) ; set File(Data) $saved if { [set outfile [GMOpenFile $TXT(saveto) Data w]] == ".." } { exit } WPsInFull $LChannel(Data) $outfile close $outfile CloseInputFile Data set saved $File(Data) ; set File(Data) $old } gpsman-6.4.4.2/util/exerciser.tcl0000755000175000017500000001057412224351120014740 0ustar migmig#!/bin/bash #\ exec wish8.2 "$0" ${1+"$@"} set SRLPORT /dev/ttyS0 set BaudRate 4800 set Hours "0" set Minutes "0" set Seconds "0" set Interval 2000 set LatDeg 27 #set LatMin 30.000 set LatMin 54.30 set LatSign S set LongDeg 153 #set LongMin 30.000 set LongMin 19.334 set LongSign E #set LatIncr 0.00 #set LongIncr -0.05 set LatIncr 0.03 set LongIncr 0.01 set SendDummies 0 array set Dummies { S01 GPRMC,172819,A,4110.736,N,00836.659,W,000.0,360.0,091000,005.4,W*7F S02 GPRMB,A,,,,,,,,,,,,V*71 S03 GPGSA,A,3,,,,,,,,,,,,,2.0,2.0,3.0*31 S05 GPGSV,2,1,08,05,82,288,54,07,17,042,43,09,56,080,51,21,22,273,45*7C S06 GPGSV,2,2,08,23,15,223,42,26,19,153,43,29,38,308,48,30,46,242,49*72 S07 PGRME,15.0,M,22.5,M,15.0,M*1B S08 GPGLL,4110.736,N,00836.659,W,172820,A*37 S09 PGRMZ,507,f,3*19 S10 PGRMM,WGS_72*0F S11 GPBOD,,T,,M,,*47 S12 GPRTE,1,1,c,0*07 } proc SetSerial {} { global SRLPORT BaudRate OutputFile set OutputFile [open $SRLPORT r+] fconfigure $OutputFile -blocking 0 -mode $BaudRate,n,8,1 Clock } proc Clock {} { global Interval Hours Minutes Seconds set Seconds [expr $Seconds + 2] if {$Seconds >= 60} { set Seconds [expr $Seconds - 60] set Minutes [incr Minutes] } if {$Minutes >= 60} { set Minutes [expr $Minutes - 60] set Hours [incr Hours] } set secs $Seconds set mins $Minutes set hrs $Hours if {[string length $Seconds] == 1} { set secs "" append secs "0" $Seconds } if {[string length $Minutes] == 1} { set mins "" append mins "0" $Minutes } if {[string length $Hours] == 1} { set hrs "" append hrs "0" $Hours } Sentence [join [list $hrs $mins $secs] ""] after $Interval Clock } proc Sentence {time} { # Creates a valid NMEA GGA sentence. # Lat and Long are lists of "NSEW" "Deg "DecMin" global OutputFile LatDeg LatMin LatSign LongDeg LongMin LongSign \ LatIncr LongIncr Dummies SendDummies set LatMin [expr $LatMin + $LatIncr] set LongMin [expr $LongMin + $LongIncr] if {$LatMin > 60} { set LatMin [expr $LatMin - 60] set LatDeg [incr LatDeg] } if {$LatMin < 0} { set LatMin [expr $LatMin + 60] set LatDeg [incr LatDeg -1] } if {$LongMin > 60} { set LongMin [expr $LongMin - 60] set LongDeg [incr LongDeg] } if {$LongMin < 0} { set LongMin [expr $LongMin + 60] set LongDeg [incr LongDeg -1] } set LatDeg [CheckDeg $LatDeg 0] set LongDeg [CheckDeg $LongDeg 1] set LatMin [CheckMin $LatMin] set LongMin [CheckMin $LongMin] set sentence [list "GPGGA" "," $time , $LatDeg $LatMin , $LatSign , \ $LongDeg $LongMin , $LongSign , "1" , "5" , "0.9" , \ "100" , "M" , "50" , "M" , ,] set sentence [join $sentence ""] set sentence [split $sentence ""] set sum [Checksum $sentence] set sentence [linsert $sentence end "*"] set sentence [linsert $sentence end $sum] set sentence [join $sentence ""] puts -nonewline $OutputFile \$ puts $OutputFile $sentence flush $OutputFile # puts $sentence if { $SendDummies } { PutArray Dummies } return } proc PutArray {name} { global OutputFile upvar $name a foreach el [array names a] { puts $OutputFile "\$$a($el)" puts "\$$a($el)" } return } proc CheckMin {num} { set num [split $num "."] set intgr [lindex $num 0] set len [string length $intgr] switch $len { 0 { set intgr "00" } 1 { set num2 $intgr ; set intgr "0" set intgr [append intgr $num2] } } return [join [list $intgr [lindex $num 1]] "."] } proc CheckDeg {num type} { set len [string length $num] if {$type == 0} {set len [expr $len + 1]} switch $len { 0 { set num "000" } 1 { set num2 $num ; set num "00" set num [append num $num2] } 2 { set num2 $num ; set num "0" set num [append num $num2] } } return $num } proc Checksum {str} { set start [lindex $str 0] binary scan $start c first set str [lreplace $str 0 0] foreach ch $str { binary scan $ch c next set first [expr $first ^ $next] } set hex [Dec2Hex $first] return $hex } proc Dec2Hex {dec} { set lookup {0 1 2 3 4 5 6 7 8 9 A B C D E F} set major [expr $dec/16] set major [expr int($major)] set minor [expr $dec - ($major * 16)] set major [lindex $lookup $major] set minor [lindex $lookup $minor] set hex [list $major $minor] set hex [join $hex ""] return $hex } SetSerialgpsman-6.4.4.2/util/gpsman.sh0000750000175000017500000000007707310724761014073 0ustar migmig#!/bin/sh DIR=/usr/bin PORT=/dev/ttyS1 $DIR/gpsman.tcl $PORT gpsman-6.4.4.2/util/gf2gmn.tcl0000755000175000017500000001232412224351120014122 0ustar migmig#!/bin/sh # This is a Tcl/Tk script to be interpreted by wish (Tk8.0 or better): \ exec wish "$0" -- "$@" # gf2gmn --- convert Greenflag HTML files into GPSManager files # # Copyright (c) 2004 Nigel Orr (gps@river-view.freeserve.co.uk) and # Miguel Filgueiras (mig@ncc.up.pt) / Universidade do Porto # # based on # mb2gmn --- convert MapBlast files into GPSManager files # # Copyright (c) 2004 Martin Ostermann (ost@brainaid.dascon.de) and # Miguel Filgueiras (mig@ncc.up.pt) # # To be used with the source of # # gpsman --- GPS Manager: a manager for GPS receiver data # # Copyright (c) 2004 Miguel Filgueiras (mig@ncc.up.pt) / Universidade do Porto # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. # # # File: gf2gmn.tcl # Last change: 25 July 2004 # ############ configuration parameters # # the first variable below MUST be correctly set for gf2gmn to work! # # path to directory with the sources of GPSMan # NOTE for non-Unix users: use "/" (not "\") in pathnames set SRCDIR ../gmsrc ## routes are created with id number starting from: set RTID 100 ## for all these variables see gpsman.tcl, the GPSMan options menus ## and the GPSMan documentation set DISTUNIT KM set LANG engl set ISOLATIN1 1 set DELETE 1 set DateFormat DDMMMYYYY set ALTUNIT M set TimeOffset 0 set CREATIONDATE 0 set PERMS 0644 set LISTHEIGHT 22 set EPOSX 340 ; set EPOSY 50 set DPOSX 290 ; set DPOSY 50 set COLOUR(dialbg) gray set COLOUR(messbg) "#ff8d90" set COLOUR(selbg) "#F0E9C0" set COLOUR(check) red set ALLMONTH(1) "Jan Gen jan" set ALLMONTH(2) "Feb Fev feb" set ALLMONTH(3) "Mar Mr mrt" set ALLMONTH(4) "Apr Abr Avr apr" set ALLMONTH(5) "May Mai Mag mei" set ALLMONTH(6) "Jun Giu jun" set ALLMONTH(7) "Jul Lug jul" set ALLMONTH(8) "Aug Ago Aou aug" set ALLMONTH(9) "Sep Set sep" set ALLMONTH(10) "Oct Okt Out Ott okt" set ALLMONTH(11) "Nov nov" set ALLMONTH(12) "Dec Dez Dic dec" ########## no configurable values after this point set CMDLINE 0 foreach f "lang$LANG gendials compute check util" { source [file join $SRCDIR $f.tcl] } array set FCOMMAND { format "!Format:" pformat "!Position:" datum "!Datum:" dates "!Creation:" 0 no 1 yes WP "!W:" RT "!R:" comment "%" } set File(RT) "" set File(GreenFlag) "" set FileTypes {RT GreenFlag} set TXT(nameGreenFlag) GreenFlag set RTCount 0 set WindowStack "" set UNIX [expr ! [string compare $tcl_platform(platform) "unix"]] ### conversion proc GreenFlagToGPSMan {infile outfile} { # based on proc ImportMapBlast # by Martin Ostermann # with changes by Miguel Filgueiras # Modified for greenflag.co.uk by Nigel Orr global MESS FCOMMAND TimeOffset CREATIONDATE RTID RTCount set date [NowTZ] puts $outfile \ "$FCOMMAND(comment) Written by gf2gmn: GreenFlag to GPSManager $date" puts $outfile "" puts $outfile "$FCOMMAND(format) DDD $TimeOffset WGS 84" puts $outfile "$FCOMMAND(dates) $FCOMMAND($CREATIONDATE)" puts $outfile "" puts $outfile "$FCOMMAND(RT)\t[expr $RTID+$RTCount]" set ns "" while { ! [eof $infile] } { set line [gets $infile] if { ! [regexp {.*(IMG|img).*} $line] } { continue } if { ! [regexp \ {.*IC=[-0-9.]*%3A[-0-9.]*%3A100%3A([0-9]*)%3A([-0-9.]*)%3A([-0-9.]*)%3A.*} \ $line match name lat long] } { continue } #set name "$RTCount-$name" # increment to match route point number set name "[expr $name+1]" set name "[expr $RTID+$RTCount]-$name" if { ! [CheckLat GMMessage $lat DDD] || \ ! [CheckLong GMMessage $long DDD] } { continue } set latd [Coord DDD $lat S] ; set longd [Coord DDD $long W] set p "$latd\t$longd" if { $CREATIONDATE } { puts $outfile "$name\t\t$date\t$p" } else { puts $outfile "$name\t\t$p" } lappend ns $name } if { [set n [llength $ns]] == 0 } { GMMessage $MESS(voidRT) wait return } puts $outfile "" incr RTCount return } wm protocol . WM_DELETE_WINDOW { exit 1 } frame .fr -relief flat -borderwidth 5 -bg $COLOUR(messbg) label .fr.title -text "gf2gmn" -relief sunken pack .fr.title -side top -pady 5 pack .fr -side top update idletasks if { ! [GMChooseParams $TXT(select) RTID \ [list "=$TXT(number) ($TXT(nameRT))"]] } { exit } set RTID [string trim "$RTID" " "] if { ! [regexp {^[0-9]+$} $RTID] } { bell ; exit } while 1 { if { [set infile [GMOpenFile $TXT(loadfrm) GreenFlag r]] == ".." } { exit } if { [set outfile [GMOpenFile $TXT(saveto) RT w]] == ".." } { exit } GreenFlagToGPSMan $infile $outfile close $outfile close $infile } gpsman-6.4.4.2/util/shape2quadr.tcl0000755000175000017500000001676112224351120015172 0ustar migmig#!/bin/sh # This is a Tcl/Tk script to be interpreted by tclsh (Tk8.3 or better): \ exec tclsh "$0" "$@" # # shape2quadr --- distribute items in a shapefile by gpsman files according # to user given quadrangles # # This is a script done in the context of # # gpsman --- GPS Manager: a manager for GPS receiver data # # Copyright (c) 2004 Miguel Filgueiras (mig@ncc.up.pt) / Universidade do Porto # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. # # last change: 7 July 2004 # needs the gpsmanshp library, preferably version 1.2 or later # see http://www.ncc.up.pt/gpsmanshp set Usage \ {shape2quadr.tcl FILE PREFIX [NAME MINLONG MAXLONG MINLAT MAXLAT]+ shape2quadr.tcl FILE PREFIX -d QPREFIX LONG LONGRANGE STEPLONG MAXLONG LAT LATRANGE STEPLAT MAXLAT} set datum "WGS 84" if { [llength $argv] < 7 } { puts stderr $Usage exit 1 } package require gpsmanshp set basename [file rootname [lindex $argv 0]] if { [set fsid [GSHPOpenInputFiles $basename]] < 1 } { puts stderr "Error when opening shapefile $basename: $fsid" exit 1 } if { [set info [GSHPInfoFrom $fsid]] == 0 } { BUG bad channel ; exit 1 } foreach "fwh fno fdim fix dbfn dbfnps" $info {} if { $fno < 1 } { puts stderr "Empty shapefile" exit 1 } if { $fwh == "WP" } { puts stderr "WP file not supported" exit 1 } set fprefix [lindex $argv 1] set argv [lreplace $argv 0 1] set quadrs "" foreach d "x y" { set qmax$d -1e3 ; set qmin$d 1e3 } if { [lindex $argv 0] == "-d" } { # QPREFIX LONG LONGRANGE STEPLONG MAXLONG LAT LATRANGE STEPLAT MAXLAT if { [llength $argv] != 10 } { puts stderr $Usage exit 1 } foreach "x qpre lo0 lod lost lomx la0 lad last lamx" $argv { break } foreach v "lo0 lod lost lomx la0 lad last lamx" { if { [catch {set $v [expr [set $v]]}] } { puts stderr "Bad value [set $v]" exit 1 } } if { $lod <= 0 || $lad <= 0 } { puts stderr "Ranges must be positive: $lod, $lad" exit 1 } if { $lost <= 0 || $last <= 0 } { puts stderr "Steps must be positive: $lost, $last" exit 1 } if { $lo0 > $lomx || $la0 > $lamx } { puts stderr "Bad bounds" exit 1 } set qminx $lo0 ; set qminy $la0 set qno 0 for { set lo $lo0 } { $lo < $lomx } { set lo [expr $lo+$lost] } { set lox [expr $lo+$lod] set qmaxx $lox for { set la $la0 } { $la < $lamx } { set la [expr $la+$last] } { set lax [expr $la+$lad] set qmaxy $lax set name "${qpre}[incr qno]" array set quadr [list $name {} $name,x0 $lo $name,x1 $lox \ $name,y0 $la $name,y1 $lax] lappend quadrs $name } } } else { while { $argv != {} } { # for each quadrangle: NAME MINLONG MAXLONG MINLAT MAXLAT foreach {name x0 x1 y0 y1} $argv { break } set argv [lreplace $argv 0 4] if { $name == "" } { puts stderr "Quadrangle with empty name" exit 1 } if { ! [catch {set quadr($name)}] } { puts stderr "Repeated quadrangle name: $name" exit 1 } foreach k "x0 y0 x1 y1" mx "180 90 180 90" { if { [catch {expr [set $k]}] || abs([set $k]) > $mx } { puts stderr "Bad bound [set $k] for quadrangle $name" exit 1 } } if { $x0 >= $x1 || $y0 >= $y1 } { puts stderr "Bad bounds for quadrangle $name" exit 1 } array set quadr [list $name {} $name,x0 $x0 $name,x1 $x1 \ $name,y0 $y0 $name,y1 $y1] foreach d "x y" { if { [set ${d}0] < [set qmin$d] } { set qmin$d [set ${d}0] } if { [set ${d}1] > [set qmax$d] } { set qmax$d [set ${d}1] } } lappend quadrs $name } } puts "[llength $quadrs] quadrangles defined; $fno items to be processed" set time0 [clock seconds] set discarded 0 set lnno 0 switch $fwh { RT { puts stderr "RT file: will convert to LN files" set ixno 2 ; set ixstss 100 set ixdbfs 0 ; set dbflst 0 ; set dbfs "Name Comment" } TR { puts stderr "TR file: will convert to LN files" set ixno 2 ; set ixstss 3 set ixdbfs 0 ; set dbflst 0 ; set dbfs "Name Comment" } UNKNOWN { set ixno 0 ; set ixstss 1 ; set ixdbfs 2 ; set dbflst 1 set dbfs "" foreach "n p" $dbfnps { lappend dbfs $n } } } while { $fno } { incr fno -1 if { [set fd [GSHPGetObj $fsid $fno]] == "" } { continue } if { $fd <= 0 } { puts stderr "Error reading object ($fno to read)" ; exit 1 } if { [set np [lindex $fd $ixno]] < 1 } { puts stderr "no points in line ($fno to read)" ; continue } set dpts "" foreach d "x y" { set omax$d -1e3 ; set omin$d 1e3 } while { $np } { incr np -1 if { [set pd [GSHPReadNextPoint $fsid]] == -2 } { break } if { $pd == 0 || $pd == -1 } { BUG bad GSHPReadNextPoint ; return 1 } foreach "x y" $pd { break } foreach d "x y" h "EW NS" { set v [set $d] if { $v < [set omin$d] } { set omin$d $v } if { $v > [set omax$d] } { set omax$d $v } # CreatePos DDD if { $v < 0 } { set v [expr -$v] ; set h [string index $h 1] } else { set h [string index $h 0] } set f$d "${h}[format %.5f $v]" } lappend dpts "$y $x $fy $fx" } if { $omaxx < $qminx || $ominx > $qmaxx || \ $omaxy < $qminy || $ominy > $qmaxy } { incr discarded continue } set d 1 foreach q $quadrs { if { $omaxx < $quadr($q,x0) || $ominx > $quadr($q,x1) || \ $omaxy < $quadr($q,y0) || $ominy > $quadr($q,y1) } { continue } if { $d } { set d 0 set name LN[format %06d [incr lnno]] set obs "" if { $dbfs != "" } { set sep "" if { $dbflst } { foreach n $dbfs v [lindex $fd $ixdbfs] { if { $v != "" } { set obs "${obs}${sep}$n: $v" set sep "\n" } } } else { set ix $ixdbfs foreach n $dbfs { if { [set v [lindex $fd $ix]] != "" } { set obs "${obs}${sep}$n: $v" set sep "\n" } incr ix } } } set line($name) [list $dpts [lindex $fd $ixstss] $obs] } lappend quadr($q) $name } incr discarded $d } GSHPCloseFiles $fsid puts "$discarded discarded\n\nquadrangle\tnumber of lines" set date [clock format [clock seconds]] foreach q $quadrs { set n [llength $quadr($q)] puts "$q\t$n" if { $n } { set fn ${fprefix}_$q if { [catch {set f [open $fn w]}] } { puts stderr "cannot write file $fn; skipping" continue } puts $f "% Written by shape2quadr.tcl $date" puts $f "% Quadrangle bounds: x $quadr($q,x0) to $quadr($q,x1), y $quadr($q,y0) to $quadr($q,y1)" puts $f "" puts $f "!Format: DDD 0 $datum" puts $f "" puts $f "!Creation: no" puts $f "" foreach ln $quadr($q) { puts $f "!LN:\t$ln" foreach "dpts ssts obs" $line($ln) {} if { $obs != "" } { puts $f "!NB:\t$obs" puts $f "" } set lpn 0 ; set nsst [lindex $ssts 0] foreach lp $dpts { if { $nsst == $lpn } { puts $f "!LS:" set ssts [lreplace $ssts 0 0] set nsst [lindex $ssts 0] } incr lpn puts $f "\t$lp\t" } } puts $f "" puts $f "!G:\tQuadrangle $q" set c "!GL:" foreach ln $quadr($q) { puts $f "${c}\t$ln" set c "" } } } puts "spent [clock format [expr [clock seconds]-$time0] -format %T]" gpsman-6.4.4.2/man/0000755000175000017500000000000012224351116012034 5ustar migmiggpsman-6.4.4.2/man/man1/0000755000175000017500000000000012224351117012671 5ustar migmiggpsman-6.4.4.2/man/man1/gpsman.10000644000175000017500000001720512224337530014250 0ustar migmig.TH GPSMAN "1" "October 2013" "gpsman 6.4.4.2" "User Commands" .SH NAME gpsman \- a (graphical) manager of GPS data .SH SYNOPSIS .B gpsman [\fB\-dev\fR \fI[usb=]DEVICE\fR] .br .BI gpsman [\fIOPTIONS\fR] \fICOMMAND\fR [\fICOMMAND_ARGS\fR] .SH DESCRIPTION .PP \fBgpsman\fR GPS Manager (GPSMan) is a graphical manager of GPS data that makes possible the preparation, inspection and edition of GPS data in a friendly environment. GPSMan supports communication and real-time logging with Garmin, Lowrance and Magellan receivers and accepts real-time logging information in NMEA 0183 from any GPS receiver. .PP To comunicate with the GPS port the user must have been granted read/write permissions for the corresponding device. .PP For use in graphical mode GPSMan is normally invoked in the first form above, where the \fBusb=\fR prefix to the device path enforces the use of the Garmin USB protocol. The use in this mode is not further described here, a full description being given in the User Manual available along with the GPSMan distribution. .PP GPSMan can also be used in command line mode (with no graphical interface except with the \fBread\R and \fBstart travel\fR commands), in which case it must be invoked in the second form above. The sections below address this mode. .SH EXIT STATUS .PP In non-graphical mode GPSMan exits with either a 0 if \fICOMMAND\fR was successfully executed, or a 1 if not. Some commands will write information to the standard output channel. Error messages can possibly be written to the standard error channel, but most of the errors will not be explained. In case of doubt the graphical mode should be used to see if there are problems with files or the receiver. .SH OPTIONS .PP Apart from the \fB\-dev\fR option all other options are only for use in non-graphical mode. .TP \fB\-dev\fR \fIDEVICE\fR gives the device path. .TP \fB\-log\fR creates a log file of the low-level communication under the name \fBlogfile\fR in the GPSMan user directory. .TP \fB\-rec Garmin | Lowrance | Magellan\fR changes the brand of the receiver (NOTE: at present will only work with \fBGarmin\fR); this option can be useful to override the options in the preferences file; cannot be used with the \fBreadput\fR command, nor with the \fB\-prefs\fR option, and cannot occur after the \fB\-prot\fR option. .TP \fB\-prefs\fR \fIPREFSFILE\fR gives the path for an alternative preferences file (read after the user preferences file); cannot be used with the \fB\-rec\fR option. .TP \fB\-prot\fR \fIPROTOCOL\fR selects the protocol to be used for connecting to the receiver; cannot occur before the \fB\-rec\fR option; the \fBshow protocols\fR command can be used to find out which protocols are available. .PP Options not related with \fICOMMAND\fR will be silently ignored. .SH NAME=VALUE ARGUMENTS .PP Some commands accept parameters in the form \fINAME=VALUE\fR. The term \fIPARAM\fR when used here referring to arguments of a command has always this meaning. Care should be taken if the value part is a string with spaces (or other characters with special meaning for the shell or system command interpreter) in which case quotes or some other form of quoting should be used. .SH GPSMAN COMMAND SUMMARY .PP There is no room in a manual page to describe in detail the available commands. The following list gives a synopsis for all of them and the User Manual should be consulted for more information. .TP \fBis available\fR exits with 0. .TP \fBis connected\fR exits with 0 if a connection check with the receiver succeeds. .TP \fBshow \fIWHAT\fR writes help information to the standard output; \fIWHAT\fR is one of: \fBdatums\fR, \fBformats\fR (data file formats), \fBhelp\fR, \fBprojections\fR, \fBprotocols\fR, \fBsymbols\fR (waypoint symbols), \fBtransfs\fR (coordinates transformations). .TP \fBhaslib\fR \fILIBRARY\fR checks availability of a library .TP \fBgetwrite\fR \fIINTYPES\fR \fIFORMAT\fR [\fIOUTTYPES\fR] [\fIOUTPARAMS\fR] \fIPATH\fR transfers data from the receiver to a file. .TP \fBreadput\fR \fIFORMAT\fR [\fIINPARAMS\fR] [\fIINTYPES\fR] \fIPATH\fR [\fIOUTTYPES\fR] transfers data from a file to the receiver. .TP \fBgetrtimelog\fR \fIPATH\fR [\fIINTERVAL\fR] gets the real-time log from the receiver and saves it to a file. .TP \fBgetfix\fR \fIPATH\fR [\fITIMEOUT\fR] gets the current fix data from the receiver and saves it to a file. .TP \fBgetalmanac\fR \fIPATH\fR gets the current almanac data from the receiver and saves it to a file. .TP \fBread\fR \fIIN-FORMAT\fR [\fIPARAMS\fR] [\fITYPES\fR] \fIPATH\fR reads a data file and launches the graphical interface (in GPSMan scripts the behaviour is different; see the \fBexec\fR command in the User Manual). .TP \fBstart travel\fR [\fIINTERVAL\fR] launches the graphical interface and starts real-time logging, animation and travelling. .TP \fBtranslate\fR \fIFORMAT\fR [\fIINPARAMS\fR] [\fIINTYPES\fR] \fIPATH\fR [\fIHOWPARAMS\fR] \fIFORMAT\fR [\fIOUTPARAMS\fR] [\fIOUTTYPES\fR] \fIPATH\fR translates from a file format to another. .TP \fBproject\fR \fILATD\fR \fILONGD\fR \fIDATUM\fR \fIPROJECTION\fR \fI[PARAMS]\fR writes to the standard output the projection of a point. .TP \fBgeoref\fR \fIIMGPATH\fR \fITRANSF\fR \fILATD\fR \fILONGD\fR \fILATD\fR \fILONGD\fR \fI[LATD LONGD]\fR \fIDATUM\fR \fIX\fR \fIY\fR \fIX\fR \fIY\fR \fI[X Y]\fR \fIPROJECTION\fR \fI[PARAMS]\fR writes to the standard output a map information file. .TP \fBgeopicts\fR \fIFORMAT\fR [\fIINPARAMS\fR] \fIINTYPE\fR \fIPATH\fR [\fIPROCPARAMS\fR] [\fIFORMAT\fR] [\fIOUTPARAMS\fR] \fIPATH\fR \fIPICTPATHS\fR geo-references files either based on their time-stamps and a given track, or by using the sequence of waypoints in a group. .TP \fBsource\fR \fIPATH\fR executes a Tcl/Tk script. .TP \fBexec\fR \fIPATH\fR executes a GPSMan script. .SH AUTHORS .PP This manual page was written by Miguel Filgueiras using a previous version by Rogerio Reis . .PP GPSMan: developed and maintained by Miguel Filgueiras, with contributions by Brian Baulch, Rogerio Reis, Andreas Lange, Alessandro Palmas, Niki Hammler, Martin Ostermann, Valere Robin, David Wolfskill, Rob Buitenhuis, Frank Kujawski, Tri Agus Prayitno, Matt Martin, Stefan Heinen, Heiko Thede, Sabine Broda, Alberto Morales, Martin Buck, David Kaplan, Jean H. Theoret, Paul Scorer, Nigel Orr, David Gardner, Nikolai Kosyakoff, Benoit Steiner, Sandor Laky, Alexander B. Preobrazhenskiy, Rudolf Martin. .SH REPORTING BUGS .PP Report bugs to . .SH COPYRIGHT .PP Copyright (C) 1998-2013 by Miguel Filgueiras and Rogerio Reis .PP This is free software distributed under the GNU General Public License; a copy of this license is part of the distribution. .PP The two GPSMan logos used by \fBgpsman\fR ara under Copyright (C) 1998-2013 by Miguel Filgueiras and are distributed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License. To view a copy of this license, visit \fBhttp://creativecommons.org/licenses/by-nc-nd/3.0/\fR. .PP All other images used by \fBgpsman\fR ara under Copyright (C) 1998-2013 by Miguel Filgueiras and are distributed under a Creative Commons Attribution-ShareAlike 3.0 Unported License. To view a copy of this license, visit \fBhttp://creativecommons.org/licenses/by-sa/3.0/\fR. .SH SEE ALSO .PP Miguel Filgueiras, \fBGPSMan User Manual\fR, Version 6.4.4.2, October 2013 .br This manual, in both PDF and HTML, is part of the distribution of GPSMan and can be retrieved from the GPSMan site at \fBhttp://sourceforge.net/projects/gpsman\fR. It is distributed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License. To view a copy of this license, visit \fBhttp://creativecommons.org/licenses/by-nc-nd/3.0/\fR. gpsman-6.4.4.2/gpsman.tcl0000755000175000017500000003165112224351117013264 0ustar migmig#!/bin/sh # This is a Tcl/Tk script to be interpreted by wish (Tk8.3 or better): \ exec wish "$0" -- "$@" # This is the main file of: # # gpsman --- GPS Manager: a manager for GPS receiver data # # Copyright (c) 1998-2013 Miguel Filgueiras migfilg@t-online.de # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. # ## Incorporates contributions by # - Brian Baulch (baulchb_AT_onthenet.com.au) # Copyright (c) 2002 by Brian Baulch # that allow for the support of Lowrance receivers # - Alessandro Palmas (alpalmas_AT_tin.it) # Copyright (c) 2003 by Alessandro Palmas # that implement 2D and 3D elevation graphs for tracks and routes, # and support for exportation of waypoints and tracks to OziExplorer # files # - Matt Martin (matt.martin_AT_ieee.org) # Copyright (c) 2003 by Matt Martin # implementing the support of Magellan receivers # - Stefan Heinen (stefan.heinen_AT_djh-freeweb.de) # Copyright (c) 2002 by Stefan Heinen # allowing for better usage under non-Unix-like systems # - Valere Robin (valere.robin_AT_wanadoo.fr) # Copyright (c) 2004-2008 by Valere Robin # implementing support for EasyGPS, GPX and KML data files # - Martin Buck (m_AT_rtin-buck.de) # Copyright (c) 2003 by Martin Buck # for resizing of 2D graphs, change in track edit window # - Jean H. Theoret (ve2za_AT_rac.ca) # Copyright (c) 2004 by Jean H. Theoret # for changing the symbol of each waypoint in a group # - Paul Scorer (p.scorer_AT_leedsmet.ac.uk) # Copyright (c) 2004 by Paul Scorer, Leeds Metropolitan University # implementing inportation of BGA turnpoint (DOS) files # - David Gardner (djgardner_AT_users.sourceforge.net) # Copyright (c) 2004 by David Gardner # for creating a group from (un)displayed items, and for re-numbering # routes when sending to the receiver # - Benoit Steiner (benetsteph_AT_free.fr) # Copyright (c) 2008 by Benoit Steiner # computation of cummulative height of climbing for tracks, and # displaying point information on 2D elevation plots # - Sandor Laky (laky.sandor_AT_freemail.hu) # Copyright (c) 2008 by Sandor Laky # implementation of the EOV projection # - Rudolf Martin (rudolf.martin_AT_gmx.de) # Copyright (c) 2010 by Rudolf Martin # plug-ins for creating plots of tracks using gnuplot and for # other computations related with tracks # ## # ## German language support: # before version 6.0: by Andreas Lange (Andreas.C.Lange_AT_GMX.de) # Copyright (c) 2002 by Andreas Lange # since version 6.0: by Sabine Broda (sbb_AT_dcc.fc.up.pt) # Copyright (c) 2009 by Sabine Broda ## # ## Italian language support by Alessandro Palmas (alpalmas_AT_tin.it) # Copyright (c) 2011 by Alessandro Palmas ## # ## French language support by Valere Robin (valere.robin_AT_wanadoo.fr) # Copyright (c) 2011 by Valere Robin ## # ## Dutch language support by Rob Buitenhuis (geo_AT_btnhs.nl) # Copyright (c) 2011 by Rob Buitenhuis ## # ## Indonesian language support by Tri Agus Prayitno; (acuss_AT_bk.or.id) # Copyright (c) 2008 by Tri Agus Prayitno ## # ## Spanish language support by Alberto Morales; (amd77_AT_gulic.org) # Copyright (c) 2011 by Alberto Morales ## # ## Russian language support: # until version 6.4: by Nikolai Kosyakoff (priroda.net_AT_gmail.com) # Copyright (c) 2007 by Nikolai Kosyakoff # since October 2009: by Alexander B. Preobrazhenskiy, (modul_AT_ihome.ru) # Copyright (c) 2011 by Alexander B. Preobrazhenskiy ## # ## Includes: # - a translation of a Perl script by Niki Hammler # (http://www.nobaq.net) that converts exported FUGAWI data to DDD # GPSman data # # - an adaptation of the script "mg2gpsman.tcl" by Heiko Thede # (Heiko.Thede_AT_gmx.de) that converts exported Map&Guide data to # GPSman data ## # ## Some algorithms, formulae and geodetic information taken or adopted from # gpstrans - a program to communicate with garmin gps # containing parts taken from John F. Waers (jfwaers_AT_csn.net) # program MacGPS. # Copyright (c) 1995 by Carsten Tschach (tschach_AT_zedat.fu-berlin.de) # Uniform Finish grid support: # Copyright (c) 1996 Janne Sinkkonen (janne_AT_iki.fi) # Swedish grid support: # Copyright (c) 1999 by Anders Lennartsson # (anders.lennartsson_AT_sto.foa.se) # INVERSE, FORWARD, INVERS3D, FORWRD3D - programs to compute distances and # azimuths between two points. # Available from ftp://www.ngs.noaa.gov/pub/pcsoft/for_inv.3d/ # libproj and PROJ4.0 - cartographic projection software # by Gerald I. Evenden (gerald.evenden_AT_verizon.net) # Available from http://members.bellatlantic.net/~vze2hc4d/proj4 # (March 2004) # International Institute for Aerospace Survey and Earth Sciences (ITC), # Enschede, http://kartoweb.itc.nl/geometrics # Guidance Note Number 7, European Petroleum Survey Group # Revised November 1999 # Kenneth Foote pages, Department of Geography, The University of # Colorado at Boulder # http://www.colorado.edu/geography/gcraft/notes/datum/edlist.html # geotrans - an open source coordinate transformation tool from the # USA National Imagery and Mapping Agency (NIMA) # http://www.remotesensing.org # Computation of area of spherical polygon adapted from sph_poly.c in # "Graphics Gems IV", edited by Paul Heckbert, Academic Press, 1994. # Formula for ellipsoid radius from # "Ellipsoidal Area Computations of Large Terrestrial Objects" # by Hrvoje Lukatela # http://www.geodyssey.com/papers/ggelare.html # "Formulas and constants for the calculation of the Swiss conformal # cylindrical projection and for the transformation between coordinate # systems", September 2001 # http://www.swisstopo.ch/pub/data/geo/refsyse.pdf # "Het stelsel van de Rijksdriehoeksmeting en het European Terrestrial # Reference System 1989", September 2000 (containing formulas and # constants for the Schreiber projection and the RD grid, used in # The Netherlands; partial English translation kindly provided by # Rob Buitenhuis, rob_AT_buitenhs.demon.nl) # http://www.rdnap.nl # "Le carte topografiche CTR ed il loro uso GPS" # (http://www.gpscomefare.com/guide/tutorialgps/mapdatum.htm) # May 2003 (information kindly sent by Alessandro Palmas) # IGN site (http://www.ign.fr) # Parameters for the Hungarian Datum 72 # http://ftp/gps/honlap-jan2002.pdf, September 2008 # # look for these notices in the corresponding files ## # ## This program uses the following Tcl libraries if they are installed: # - Img, written by Jan Nijtmans # now part of the standard Tcl distribution # - gpsmanshp, written by Miguel Filgueiras # http://sourceforge.net/projects/gpsmanshp # and available as a Debian package under the name gpsmanshp # - TclCurl, available as a Debian package under the name tclcurl # ## # ## Some formulae and geodetic information kindly provided by # Luisa Bastos, Universidade do Porto # Gil Goncalves, Universidade de Coimbra # Jose Alberto Goncalves, Universidade do Porto # Sergio Cunha, Universidade do Porto # Peter H. Dana, University of Texas ## # ## Correction of bugs in the conversion of UTM/UPS coordinates provided by # Peter H. Dana, University of Texas ## # # File: gpsman.tcl # Last change: 6 October 2013 # ############ configuration parameters # # the first 5 variables below MUST be correctly set for GPSMan to work! # DEFSPORT (or SERIALPORT in non-Unix systems), SRCDIR, # USERDIR, USEROPTIONS, USERTMPDIR # NOTE for non-Unix users: use "/" (not "\") in pathnames # path to I/O port; make sure all users have read/write permission # (the globals SERIALPORT and DEFSPORT have outdated names) # when called as a command, if there are 2 or more arguments the # command-line mode is entered instead of the graphical mode; a single # argument is taken as the serial/USB port and the prefix "usb=" means # that the Garmin USB protocol is to be used if { [llength $argv] < 2 } { set SERIALPORT [lindex $argv 0] set CMDLINE 0 } else { set SERIALPORT "" set CMDLINE 1 } switch $tcl_platform(platform) { unix { set UNIX 1 # default serial/USB port is set DEFSPORT /dev/ttyS0 # path to directory containing user data set USERDIR $env(HOME)/.gpsman-dir # name of user preferences file set USEROPTIONS gpsman-options # path to directory for temporary files (cleaned when GPSMan starts) set USERTMPDIR $USERDIR/.tmp # default HTTP address of the HTML version of the user manual # set to "" if unavailable set DEFTMANHTTPADDR "file:///usr/share/doc/gpsman/html" } default { set UNIX 0 ; set CMDLINE 0 # on MS-Windows the serial port could be as follows set SERIALPORT com1: # path to directory containing user data # on MS-Windows it can be set as follows (see the manual) # set USERDIR $::env(APPDATA)\\gpmandir set USERDIR gpmandir # name of user preferences file set USEROPTIONS gpmanopt # path to directory for temporary files (cleaned when GPSMan starts) set USERTMPDIR [file join $USERDIR .tmp] # default HTTP address of the HTML version of the user manual # set to "" if unavailable set DEFTMANHTTPADDR "" } } # path to directory containing program files set SRCDIR gmsrc # all other default configuration is now done in file $SRCDIR/config.tcl ###### NO CONFIGURABLE VALUES AFTER THIS LINE ############################## # abstract data used in the program is now in file $SRCDIR/metadata.tcl foreach f {config metadata} { source [file join $SRCDIR $f.tcl] } # prepare to deal with files not in ascii set SYSENC [encoding system] proc SourceEnc {path} { # source $path that may be not in ascii global SYSENC ENCODED set fn [file tail $path] if { [catch {set enc $ENCODED($fn)}] || $enc == $SYSENC } { uplevel source $path } else { encoding system $enc uplevel source $path encoding system $SYSENC } return } ##### user options: files assumed to be in system encoding set InitDir 0 ; set InitOpts 0 if { ! [file exists $USERDIR] } { set InitDir 1 if { [file readable ~/.gpsman] } { # pre-5.4 default options file source ~/.gpsman } } elseif { ! [file writable $USERDIR] } { set UDUnwritable 1 } else { set UDUnwritable 0 } if { [file readable $USEROPTIONS] } { source $USEROPTIONS set USEROPTIONS [file join [pwd] $USEROPTIONS] } else { set USEROPTIONS [file join $USERDIR $USEROPTIONS] if { [file readable $USEROPTIONS] } { source $USEROPTIONS } else { set InitOpts 1 if { $SYSENC != "iso8859-1" && \ $SYSENC != "iso8859-9" } { set ISOLATIN1 0 } } } ##### source files # source files read before initialization of preferences file set SRCFILESBEGIN {i18n-utf8 lang$LANG symbols gendials util check datumell geod plugins compute posncomp projections projs_main recmodels recdefs rgb options} # this file may cause problems in non-western Linux installations if { $ISOLATIN1 } { lappend SRCFILESBEGIN isolatin1 } # source files depending on receiver brand set SRCFILESFOR(Garmin) {serial garmin_protocols garmin_symbols garmin_nmea garmin} set SRCFILESFOR(Lowrance) {lowrance_symbols lowrance_nmea lowrance lowrance_patches} # MGM contribution set SRCFILESFOR(Magellan) {serial magellan} # other generic source files set SRCFILESEND {setup wrtdials search lists files files_foreign gpsinfo maptransf map mapanim realtime know trtort gdata cluster elevation navigate} # conditional source files set SRCFILESCOND {{ACCFORMULAE acccomp} {CMDLINE command}} if { $tcl_version == 8.4 } { # Tk8.4 is incompatible with Img < 1.3 set NoImgLib [catch {package require Img 1.3}] } else { set NoImgLib [catch {package require Img}] } if { [catch {set GSHPVersion [package require gpsmanshp]}] } { set GSHPVersion "" } ##### if { $CMDLINE } { SourceEnc [file join $SRCDIR command_parse.tcl] if { [BadCommandLine] } { exit 1 } if { $COMMAND(prefsfile) != "" } { source $COMMAND(prefsfile) } } SourceEnc [file join $SRCDIR main.tcl] ##### execution GMStart if { $CMDLINE } { if { $COMMAND(command) } { ShowGPSMan } set CmdClock [clock seconds] if { [set r [ExecCommand]] != "wait" } { if { ! [string compare $r "0"] && \ [set d [expr 100*(6-[clock seconds]+$CmdClock)]] > 0 } { after $d } exit $r } } else { # normal use: initialize and launch graphical interface GMInit } gpsman-6.4.4.2/LICENSE0000644000175000017500000010451312224351117012273 0ustar migmig GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . gpsman-6.4.4.2/gmsrc/0000755000175000017500000000000012224351120012367 5ustar migmiggpsman-6.4.4.2/gmsrc/gdata.tcl0000644000175000017500000002215112224351120014154 0ustar migmig# # This file is part of: # # gpsman --- GPS Manager: a manager for GPS receiver data # # Copyright (c) 1998-2013 Miguel Filgueiras migfilg@t-online.de # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. # # File: gdata.tcl # Last change: 6 October 2013 # ## manipulation of geo-referenced data structures # consisting of a list of pairs $coord1 $col, in increasing order of $coord1 # where $col is a list of pairs $coord2 $data, in increasing order of $coord2 # and $data a list of information for each individual at $coord1 $coord2 proc AddSeqToGData {gdata coord1 coord2 info} { # add information to geo-referenced data structure # sequential search set ne [list $coord1 [list [list $coord2 [list $info]]]] set i 0 foreach e $gdata { if { [set le [lindex $e 0]] > $coord1 } { break } elseif { $le == $coord1 } { set nee [list $coord2 [list $info]] ; set col [lindex $e 1] set j 0 foreach ee $col { if { [set lee [lindex $ee 0]] > $coord2 } { break } elseif { $lee == $coord2 } { set nee [list $coord2 [linsert [lindex $ee 1] 0 $info]] set col [lreplace $col $j $j $nee] return [lreplace $gdata $i $i [list $coord1 $col]] } incr j } set col [linsert $col $j $nee] return [lreplace $gdata $i $i [list $coord1 $col]] } incr i } return [linsert $gdata $i $ne] } proc AddToGData {gdata coord1 coord2 info} { # add information to geo-referenced data structure # binary search on top level list set ne [list $coord1 [list [list $coord2 [list $info]]]] if { [set b [llength $gdata]] == 0 } { return [list $ne] } set a 0 while 1 { set i [expr ($a+$b)/2] set e [lindex $gdata $i] if { [set le [lindex $e 0]] > $coord1 } { if { $a == $i } { break } set b $i } elseif { $le == $coord1 } { set nee [list $coord2 [list $info]] ; set col [lindex $e 1] set j 0 foreach ee $col { if { [set lee [lindex $ee 0]] > $coord2 } { break } elseif { $lee == $coord2 } { set nee [list $coord2 [linsert [lindex $ee 1] 0 $info]] set col [lreplace $col $j $j $nee] return [lreplace $gdata $i $i [list $coord1 $col]] } incr j } set col [linsert $col $j $nee] return [lreplace $gdata $i $i [list $coord1 $col]] } elseif { $a == $i } { incr a break } else { set a $i } } return [linsert $gdata $a $ne] } proc LookupGData {gdata coord1 coord2} { # find information in geo-referenced data structure # return "" if nothing found # binary search on top level list if { [set b [llength $gdata]] == 0 } { return "" } set a 0 while 1 { set i [expr ($a+$b)/2] set e [lindex $gdata $i] if { [set le [lindex $e 0]] > $coord1 } { if { $a == $i } { break } set b $i } elseif { $le == $coord1 } { foreach ee [lindex $e 1] { if { [set lee [lindex $ee 0]] > $coord2 } { return "" } elseif { $lee == $coord2 } { return [lindex $ee 1] } } return "" } elseif { $a == $i } { break } else { set a $i } } return "" } proc LookupQuadrGData {gdata coord1 coord2 dc1 dc2} { # find information in geo-referenced data structure # for each point with coordinates ($coord10,$coord20) if ($coord1,$coord2) # belongs to the quadrangle centred on it and having as corners # ($coord10-$dc1/2,$coord20-$dc2/2) ($coord10+$dc1/2,$coord20+$dc2/2) # with $dc1 and $dc2 > 0 # return list of information for each point # binary search on top level list if { $dc1 <= 0 || $dc2 <= 0 || [set b [llength $gdata]] == 0 } { return "" } set hdc1 [expr 0.5*$dc1] ; set hdc2 [expr 0.5*$dc2] set a 0 ; set res "" while 1 { set i [expr ($a+$b)/2] set e [lindex $gdata $i] if { [set le [lindex $e 0]]-$hdc1 > $coord1 } { if { $a == $i } { return $res } set b $i } elseif { $le+$hdc1 >= $coord1 } { foreach ee [lindex $e 1] { if { [set lee [lindex $ee 0]]-$hdc2 > $coord2 } { break } elseif { $lee+$hdc2 >= $coord2 } { set res [concat $res [lindex $ee 1]] } } break } elseif { $a == $i } { break } else { set a $i } } for { set j [expr $i+1] } { $j != $b } { incr j } { set e [lindex $gdata $j] if { [set le [lindex $e 0]]-$hdc1 > $coord1 } { break } if { $le+$hdc1 >= $coord1 } { foreach ee [lindex $e 1] { if { [set lee [lindex $ee 0]]-$hdc2 > $coord2 } { break } elseif { $lee+$hdc2 >= $coord2 } { set res [concat $res [lindex $ee 1]] } } } } incr a -1 for { set j [expr $i-1] } { $j != $a } { incr j -1 } { set e [lindex $gdata $j] if { [set le [lindex $e 0]]+$hdc1 < $coord1 } { break } if { $le-$hdc1 <= $coord1 } { foreach ee [lindex $e 1] { if { [set lee [lindex $ee 0]]-$hdc2 > $coord2 } { break } elseif { $lee+$hdc2 >= $coord2 } { set res [concat $res [lindex $ee 1]] } } } } return $res } #### geo-referencing time-stamped information proc GeoAdapt {type ix datum lts} { # geo-reference time-stamped information in list $lts adapting it to # item of given $type and index $ix # if $type==TR, interpolate/extrapolate positions from time-stamps of TPs # if $type==GR, take each WP in sequence from GR after sorting time-stamps # $lts is a list of tuples whose first element is the time-stamp in # seconds from $YEAR0, sorted by time-stamps # $datum is the datum for the computed positions # return "" on error, or list with tuples obtained from the tuples in $lst # by inserting the latitude and longitude (decimal degrees, for $datum) # and altitude (metre) at the beginning global TRTPoints TRDatum DataIndex GRConts WPPosn WPDatum WPAlt set glts "" if { $type == "TR" } { foreach v "la lo s alt" n "TPlatd TPlongd TPsecs TPalt" { set ${v}ix $DataIndex($n) set prev$v undef } if { $TRDatum($ix) != $datum } { set tps [ChangeTPsDatum $TRTPoints($ix) $TRDatum($ix) $datum] } else { set tps $TRTPoints($ix) } set tp [lindex $tps 0] ; set tps [lreplace $tps 0 0] foreach x "la lo s alt" { set tpt$x [lindex $tp [set ${x}ix]] } set tptalt [lindex $tptalt 0] foreach tuple $lts { set secs [lindex $tuple 0] while { $secs > $tpts && $tps != "" } { set tp [lindex $tps 0] ; set tps [lreplace $tps 0 0] foreach x "la lo s alt" { set prev$x [set tpt$x] set tpt$x [lindex $tp [set ${x}ix]] } set tptalt [lindex $tptalt 0] } # default to postion of current TP if in trouble # this may imply several tuples to have the same position set la $tptla ; set lo $tptlo ; set alt $tptalt if { $secs != $tpts } { if { $prevla != "undef" } { # liner interpolation or extrapolation if { ! [catch \ {set ratio [expr 1.0*($secs-$prevs)/($tpts-$prevs)]}] } { set la [expr $prevla+$ratio*($tptla-$prevla)] set lo [expr $prevlo+$ratio*($tptlo-$prevlo)] if { $tptalt == "" || $prevalt == "" } { set alt "" } else { set alt [expr $prevalt+$ratio*($tptalt-$prevalt)] } } } elseif { $secs < $tpts && $tps != "" } { set tp2 [lindex $tps 0] foreach x "la lo s alt" { set tp2$x [lindex $tp2 [set ${x}ix]] } set tp2alt [lindex $tp2alt 0] if { ! [catch \ {set ratio [expr 1.0*($secs-$tp2s)/($tpts-$tp2s)]}] } { set la [expr $tp2la+$ratio*($tptla-$tp2la)] set lo [expr $tp2lo+$ratio*($tptlo-$tp2lo)] if { $tptalt == "" || $tp2alt == "" } { set alt "" } else { set alt [expr $tp2alt+$ratio*($tptalt-$tp2alt)] } } } } lappend glts [linsert $tuple 0 $la $lo $alt] } } else { # $type == "GR" set wpns "" foreach p $GRConts($ix) { if { [lindex $p 0] == "WP" } { set wpns [lindex $p 1] break } } if { $wpns == "" } { GMMessage $MESS(allundef) return "" } foreach tuple $lts { set secs [lindex $tuple 0] while { $wpns != "" && \ [set wpix [IndexNamed WP [lindex $wpns 0]]] == -1 } { GMMessage [format $MESS(undefinedWP) [lindex $wpns 0]] set wpns [lreplace $wpns 0 0] } if { $wpns == "" } { # $la, ... are defined because $wpns was initially non-empty # not enough WPs: use last one for the remaining tuples lappend glts [linsert $tuple 0 $la $lo $alt] continue } set la [lindex $WPPosn($wpix) 0] ; set lo [lindex $WPPosn($wpix) 1] if { $WPDatum($wpix) != $datum } { set p [ToDatum $la $lo $WPDatum($wpix) $datum] set la [lindex $p 0] ; set lo [lindex $p 1] } set alt [lindex $WPAlt($wpix) 0] lappend glts [linsert $tuple 0 $la $lo $alt] set wpns [lreplace $wpns 0 0] } } return $glts } gpsman-6.4.4.2/gmsrc/garmin_nmea.tcl0000644000175000017500000003356312224351120015362 0ustar migmig# # This file is part of: # # gpsman --- GPS Manager: a manager for GPS receiver data # # Copyright (c) 1998-2013 Miguel Filgueiras migfilg@t-online.de # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. # # File: garmin_nmea.tcl # Last change: 6 October 2013 # # Includes contributions by # - Valere Robin (valere.robin _AT_ wanadoo.fr) marked "VR contribution" ## procedures used to interpret NMEA-0183 sentences from a receiver or ## a file (see files_foreign.tcl) ### Some NMEA-0183 sentences (check proc CollectNMEAData for the information # actually used) # GPRMC Recommended minimum specific GPS/Transit data # [course made good assumed to give current bearing] # GPRMB Recommended minimum navigation information (active destination) # GPGGA GPS fix data # GPGLL Latitude and longitude # GPGSA GPS DOP and Active Satellites # (3) Number of Satellites used in solution # PDOP (4) Position dilution of precision 1.0 to 99.9 # HDOP (5) Horizontal DOP 1.0 to 99.9 # VDOP (6) Vertical DOP 1.0 to 99.9 # GPGSV GPS Satellites in View # (3) Number of Satellites in view # (4) Satellites ID (PRN) # (5) Elevations (degrees) 00 to 90 # (6) Azimuths (true) (degrees) 000 to 359 # (7) Signal to noise ratios 00 to 99 dB # GPBOD Bearing from origin to destination # GPBWC Bearing and distance to destination along great circle # GPBWR Bearing and distance to destination along rhumb line # GPVTG Velocity and track made good [assumed to give current bearing] # GPXTE Cross-track error # PGRMC Garmin Configuration Information # (1) Fix Mode 2D/3D/Automatic # (3) Earth Datum Index # (4-9) User defined Earth Datum a/f/dx/dy/dz # (11) Velocity Filter Automatic/2-256 seconds # PGRME Garmin EPE # PGRMF Garmin GPS Fix Data Sentence # PGRMI Garmin Initiallzation Information # PGRMM Garmin datum # PGRMO Garmin Output Sentence Enable/Disable # PGRMT Garmin Sensor Status Information # PGRMV Garmin 3D Velocity Information non-standard # (1) True east velocity (m/sec) -999.9 to 9999.9 # (2) True north velocity (m/sec) -999.9 to 9999.9 # (3) Up velocity (m/sec) -999.9 to 9999.9 # PGRMZ Garmin altitude ## changes here will affect proc CollectNMEAData array set NMEASent { GPRMC {time fix lat long knot-speed bear date magnvar} GPRMC,tp {time status=V/A DMM,N/S DMM,E/W float float date float} GPRMB {fix nm-XTE TRNdir WPStart WPName WPlat WPlong nm-WPdist bearWP knot-velWP prox} GPRMB,tp {status=V/A float<9.9 L/R string string DMM,N/S DMM,E/W float float float V/A} GPGGA {time lat long fix nsat HDOP alt gheight DGPSdt DGPSid} GPGGA,tp {time DMM,N/S DMM,E/W status=0/1/2 int float float,=M float,=M float int} GPGLL {lat long time sel} GPGLL,tp {DMM,N/S DMM,E/W time status=?/A} GPBOD {bearStartDest magnbearStartDest WPDest WPStart} GPBOD,tp {float,=T float,=M string string} GPBWC {time WPlat WPlong bearWP magnbearWP nm-WPdist WPname} GPBWC,tp {time DMM,N/S DMM,E/W float float float string} GPBWR {time WPlat WPlong rhumbWP magnrhumbWP nm-WPdist WPname} GPBWR,tp {time DMM,N/S DMM,E/W float float float string} GPVTG {bear magnbear knot-speed kph-speed} GPVTG,tp {float,=T float,=M float float} GPXTE {XTE TRNdir XTEunit} GPXTE,tp {float L/R N/K/M} PGRME {EPH EPV EPE} PGRME,tp {float,=M float,=M float,=M} PGRMZ {ft-alt fixalt} PGRMZ,tp {float,=f status=?/2/3} PGRMM datum PGRMM,tp string } set NMEAKnown [array names NMEASent] array set NMEAStatus { 0 _ 1 GPS 2 DGPS A Auto V _ alt=2 Manual alt=3 GPS } set NMEARLTM 0 ### user control proc GarminStartNMEA {from args} { # start interpretation of NMEA 0183 sentences # $from in {rec, file} for, respectively, # real time logging from receiver # reading from a file $args # return 0 on failure global NMEARLTM NMEAData NMEACurrentTime NMEACurrentDate NMEASeen \ NMEAFrom NMEADataFile NMEADefDate NMEAPrevSecs if { ! $NMEARLTM } { set NMEAData "_ _ _ _ _ _ _ _ _ _" set NMEASeen "" ; set NMEACurrentTime undef set NMEACurrentDate "" if { [set NMEAFrom $from] == "rec" } { set NMEADefDate [clock format [clock seconds] -format "%Y %m %d"] set NMEAPrevSecs -2 return [set NMEARLTM [StartLineProtocol ProcNMEALine 4800]] } set NMEADefDate "1990 1 1" ; set NMEAPrevSecs -1 set NMEADataFile $args set NMEARLTM 1 } elseif { $NMEAFrom != $from || $from == "file" } { return 0 } return 1 } proc GarminStopNMEA {} { global NMEARLTM StopLineProtocol set NMEARLTM 0 return } ### low-level line processing proc ProcNMEALine {line lxor} { # process a NMEA sentence # $lxor is the XOR of all chars in $line (as string) # return 1 on error global NMEAKnown NMEASent NMEAInvalid if { [regexp {[^ -~]+} $line] } { Log "PNL> bad chars in: $line" return 1 } if { [string index $line 0] != "\$" } { Log "PNL> no starting dollar in: $line" return 1 } set fs [split [string range $line 1 end] ","] set last [lindex $fs end] if { [regexp {(.*)\*(..)} $last z field chksum] } { if { [scan $chksum "%x" csval] } { # take from $lxor the codes of "$", "*" and the checksum digits binary scan [string index $chksum 0] "c" d1 binary scan [string index $chksum 1] "c" d2 foreach code "36 42 $d1 $d2" { set lxor [expr $lxor ^ $code] } if { $lxor != $csval } { Log "PNL> wrong checksum ($lxor not $csval) in: $line" return 1 } } else { Log "PNL> bad checksum field in: $line" return 1 } set fs [lreplace $fs end end $field] } set sent [lindex $fs 0] if { [lsearch -exact $NMEAKnown $sent] == -1 } { # Log "PNL> discarding: $line" } else { set NMEAInvalid 0 set data "" ; set time undef set ix 1 foreach attr $NMEASent($sent) type $NMEASent($sent,tp) { set fld [lindex $fs $ix] ; incr ix if { [regexp {.+,.+} $type] } { set annex [lindex $fs $ix] ; incr ix } else { set annex "" } set val [DecodeNMEAField $type $fld $annex] if { $NMEAInvalid } { return 1 } lappend data $val if { $attr == "time" } { set time $val } } CollectNMEAData $sent $time $data } return 0 } proc DecodeNMEAField {type field annex} { # decode field in NMEA sentence # return "_" if field is empty # set NMEAInvalid on error or if the fix status is invalid global NMEAInvalid if { $field == "" } { if { [regexp {^status=} $type] } { # Log "DNF> invalid fix; discarding sentence" set NMEAInvalid 1 } return "_" } switch -glob $type { DMM,?/? { # DMM and heading letter -> signed degrees regexp {DMM,(.)/(.)} $type z ph nh if { $annex == $ph } { set sign 1 } elseif { $annex == $nh } { set sign -1 } else { Log "DNF> bad sign in $type: $annex, field is $field" set NMEAInvalid 1 ; return 0 } if { ! [regexp {0*([1-9]*[0-9]*)([0-9])([0-9]\.[0-9]+)} $field \ z d m1 m2] } { Log "DNF> bad DMM value: $field" set NMEAInvalid 1 ; return 0 } if { $d == "" } { set d 0 } if { $m1 == 0 } { set m $m2 } else { set m [expr 10*$m1+$m2] } return [expr $sign*($d+$m/60.0)] } *,=* { regexp {(.+),=(.+)} $type z t1 str if { $annex == $str } { return [DecodeNMEAField $t1 $field ""] } Log "DNF> bad sub-field of type $type: $annex, for field $field" } status=* { # fix status, first possible value is for error regsub {status=} $type "" vals set vals [split $vals "/"] if { [set ix [lsearch -exact $vals $field]] != -1 || \ [set ix [lsearch -exact $vals "?"]] != -1 } { if { $ix == 0 } { set NMEAInvalid 1 } return $field } Log "DNF> bad or unknown value for $type: $field" } */* { # choice of values set vals [split $type "/"] if { [lsearch -exact $vals $field] != -1 } { return $field } Log "DNF> bad or unknown value for $type: $field" } time { # HHMMSS -> [list h mn s] return [DecodeNMEATimeDate $field "23 59 59"] } date { # DDMMYY -> [list d m yy] return [DecodeNMEATimeDate $field "31 12 99"] } float { if { [scan $field %f val] == 1 } { return $val } Log "DNF> bad float: $field" } float<* { if { [scan $field %f val] == 1 } { regsub {float<} $type "" mx if { $val >= $mx } { set val Inf } return $val } Log "DNF> bad float with limit: $field" } int { if { [scan $field %d val] == 1 } { return $val } Log "DNF> bad int: $field" } string { return $field } default { BUG "bad specification for type of NMEA field" } } set NMEAInvalid 1 return 0 } proc DecodeNMEATimeDate {td mxs} { # HHMMSS or DDMMYY into list # if $td has a "." then it is taken to be in HHMMXX._ format # where XX._ is seconds in %0f format # $mxs are extreme values for each sub-field # set NMEAInvalid on error global NMEAInvalid if { [string length $td] == 6 } { set fmt %02d%02d%02d } elseif { [regexp {\.} $td] } { set fmt %02d%02d%0f } else { set fmt %1d%02d%02d } if { [scan $td $fmt s1 s2 s3] == 3 } { set s3 [expr round($s3)] foreach v "s1 s2 s3" mx $mxs { if { [set $v] > $mx } { Log "DNTD> bad time or date: [set $v] in $td" set NMEAInvalid 1 ; return 0 } } return [list $s1 $s2 $s3] } Log "DNTD> bad time or date: $td" set NMEAInvalid 1 return 0 } ### collect data proc CollectNMEAData {sent time data} { # collect data from sentence $sent with given time stamp # $data is a list of values for the attributes described # in the NMEASent array; their positions are used here explicitly # the list $NMEAData contains (any element may be "_" for undefined): # 0 - latitude in degrees (assumed datum is "WGS 84") # 1 - longitude in degrees # 2 - position fix: either in {1, 2} for {GPS, DGPS}, or "A" for ok # 3 - EPE in metres # 4 - EPH im metres # 5 - EPV in metres # 6 - altitude in metres # 7 - speed in km/h # 8 - bearing # collected data is sent to upper level only when a new time stamp # or a repeated sentence is got global NMEAData NMEASeen NMEACurrentTime NMEACurrentDate if { [lsearch -exact $NMEASeen $sent] != -1 } { SendNMEAData $time } elseif { $time != "undef" } { if { $NMEACurrentTime == "undef" } { set NMEACurrentTime $time } elseif { $time != $NMEACurrentTime } { SendNMEAData $time } } switch $sent { GPGGA { set from "1 2 3 6" ; set to "0 1 2 6" } GPGLL { set from "0 1 3" ; set to "0 1 2" } GPRMC { # VR contribution: test for validity of data if { [lindex $data 4] != "_" } { set sp [expr [lindex $data 4]/539.9568e-3] set data [lreplace $data 4 4 $sp] set date [lindex $data 6] if { $date != "_" } { set NMEACurrentDate $date } set from "1 2 3 4 5" ; set to "2 0 1 7 8" } else { set from "" } } GPVTG { set from "0 3" ; set to "8 7" } PGRME { set from "0 1 2" ; set to "4 5 3" } PGRMZ { if { [lindex $NMEAData 6] != "_" } { set data [expr round([lindex $data 0]*0.3048)] set from 0 ; set to 6 } else { set from "" } } default { set from "" } } if { $from != "" } { MergeNMEAData $from $data $to } return } proc MergeNMEAData {frixs data toixs} { # merge data items indexed by $frixs with NMEAData at indices $toixs # undefined items are discarded global NMEAData foreach from $frixs to $toixs { if { [set it [lindex $data $from]] != "_" } { set NMEAData [lreplace $NMEAData $to $to $it] } } return } proc SendNMEAData {time} { # send data collected to upper level if current time is defined global NMEAStatus NMEAData NMEASeen NMEACurrentTime NMEACurrentDate \ NMEAFrom NMEADataFile NMEADefDate NMEAPrevSecs if { $NMEACurrentTime != "undef" } { foreach "h m s" $NMEACurrentTime {} set tsecs [expr $h*3600+$m*60+$s] if { $NMEACurrentDate == "" } { if { $NMEAPrevSecs > $tsecs && [lindex $NMEADefDate 0] != 1990 } { # $NMEAPrevSecs >= 0 and over midnight foreach "y m d" $NMEADefDate {} set NMEADefDate [clock format \ [clock scan "1 day" \ -base [clock scan ${y}-${m}-${d}]] -format "%Y %m %d"] } } else { if { [scan $NMEACurrentDate "%d %d %d" d m y] != 3 } { BUG "bad current date in SendNMEAData: $NMEACurrentDate" } if { $y < 88 } { # safe up to 2087... incr y 2000 } else { incr y 1900 } set NMEADefDate "$y $m $d" } set NMEACurrentDate "" if { $NMEAPrevSecs != -2 } { set NMEAPrevSecs $tsecs } set date [concat $NMEADefDate $NMEACurrentTime] set sp [lindex $NMEAData 7] if { [set bear [lindex $NMEAData 8]] == "_" || $sp == "_" } { set vx "_" ; set vy "_" } else { set a [expr $bear*0.01745329251994329576] set vx [expr $sp*cos($a)/1000.0] set vy [expr $sp*sin($a)/1000.0] } set rltmdata [list $date \ [list [lindex $NMEAData 0] [lindex $NMEAData 1]] \ $NMEAStatus([lindex $NMEAData 2]) \ [lrange $NMEAData 3 5] \ [lindex $NMEAData 6] \ [list $vx $vy _] \ $bear "_" "_" $sp] if { $NMEAFrom == "rec" } { after 0 [list UseRealTimeData $rltmdata] } else { ImportNMEAData $rltmdata $NMEADataFile } } if { $NMEAFrom == "rec" } { set NMEADefDate [clock format [clock seconds] -format "%Y %m %d"] } set NMEAData "_ _ _ _ _ _ _ _ _" set NMEASeen "" ; set NMEACurrentTime $time return } gpsman-6.4.4.2/gmsrc/lowrance.tcl0000644000175000017500000007603012224351120014713 0ustar migmig# # This file is part of: # # gpsman --- GPS Manager: a manager for GPS receiver data # # Copyright (c) 1998-2013 Miguel Filgueiras migfilg@t-online.de # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. # ######################################################################### # # This file (lowrance.tcl) - Author - Brian Baulch # (baulchb@hotkey.net.au) is based on the file garmin.tcl (Author # Miguel Filgueiras) # Copyright (c) Brian Baulch 1999, 2000 # # Last change: 26 Jan 2002 # # All the text above and including these lines MUST be reproduced in full # by any person modifying or copying this file. ########################################################################## # Includes changes/contributions by Miguel Filgueiras marked # "MF change" or "MF contribution" # Date last modified: 19 June 2007 set SERIALLOG ~/.gpsman-log set NotLogging 1 set LogMutex 0 proc Log {m} { global NotLogging LogFile LogMutex if { $NotLogging } { return } if { $LogMutex } { after 50 "Log {$m}" return } set LogMutex 1 puts $LogFile $m flush $LogFile set LogMutex 0 return } # Constants needed by the Mercator conversion routines. set RADtoDEG 57.29577951308232087684 set PI 3.14159265358979 # Correction constant (in days) to convert GPSMan time to Lowrance time. set GPSMANDAYS 1461 # The LSI100 command preamble - actually 0x8155, but must be in decimal # format to allow comparison under TCL. set PREAMBLE 33109 # Lowrance Products & Software set PRODID {dummy GlobalMap AirMap AccuMap {GlobalNav 310} {Eagle View} \ {Eagle Explorer} {GlobalNav 200} {Expedition II} {GlobalNav 212} \ {GlobalMap 12} {Accumap 12}} set PROTV {{Version 1.0} {Version 2.0} {Version 3}} # Lowrance Commands: set CMD(GetMEM) 8 set CMD(GetWP) 771 set CMD(GetRT) 773 set CMD(GetTRp) 775 set CMD(GetTR) 786 set CMD(GetTRd) 787 set CMD(GetICno) 776 set CMD(GetICpos) 777 set CMD(GetInfo) 782 set CMD(PutMEM) 9 set CMD(PutWP) 772 set CMD(PutRT) 774 set CMD(PutTRd) 789 set CMD(PutTR) 788 set CMD(PutICno) 778 set CMD(PutIC) 779 set PDTYPE(Header) {word word word byte} set PDTYPE(GetMEM) {long word byte} set PDTYPE(GetWP) {byte word byte byte long long charray=13 long} set PDTYPE(PutWP) {word byte byte long long charray=13 long} set PDTYPE(GetRT) {byte word byte charray=13} set PDTYPE(PutRT) {word byte charray=13 wordarray} set PDTYPE(GetICno) {byte word} set PDTYPE(GetICpos) {byte word long long byte} set PDTYPE(PutICno) {word} set PDTYPE(PutIC) {word long long byte} set PDTYPE(GetICgrn) {byte word} set PDTYPE(GetICgr) {byte byte byte byte long} set PDTYPE(GPSInfo) {byte word word word word word word word word \ word byte byte byte long} set PDTYPE(GetTR) {byte byte long long word} set PDTYPE(GetTRd) {byte byte word} set PDTYPE(PutTR) {byte long long word} set PDTYPE(PutTRd) {byte word} set TIMEOUT 1000 ############################################################# proc ErrorMess {mess} { global MessSent MESS if { ! $MessSent} { set MessSent 1 GMMessage $MESS($mess) set ReadState done ResetCursor . DisableGPS GPSOff } return } proc ReadProc {what} { global ReadState set data [ReadInterface $what] ProcessRead $what $data set ReadState done return } proc TimeOutProc {} { global Id ReadState if { [string compare $ReadState done] } { after cancel $Id ErrorMess {receiver} } return } proc GPSInterface {what data} { # what, as in Get?? Put?? etc. as above under CMD(???) global Id NotLogging ReadState TIMEOUT SRLFILE \ set ReadState "" if {! $NotLogging} { foreach b $data { binary scan $b "c" x lappend log $x } Log "SP> $log" } foreach b $data { puts -nonewline $SRLFILE "$b" } flush $SRLFILE set Id [after 0 ReadProc $what] after $TIMEOUT TimeOutProc while { [ string compare $ReadState "done"] } { update } return } proc ReadInterface {what} { global NotLogging PREAMBLE SRLFILE MessSent PDTYPE CMD if { ! $MessSent } { set header "" for { set i 1 } { $i < 9 } { incr i } { set ch "" while { [string length $ch] == 0 } { set ch [read $SRLFILE 1] update } append header $ch } set inheader [split $header ""] if {! $NotLogging} { set log "" foreach b $inheader { binary scan $b "c" x lappend log $x } Log "SP< $log" } set sumin [lindex $inheader "end"] set inheader [lreplace $inheader "end" "end"] set sumcalc [CheckSum $inheader] if {$sumcalc != $sumin} { ErrorMess {checksum1} return } set header [UnPackData $inheader $PDTYPE(Header)] if {[lindex $header 0] != $PREAMBLE} { ErrorMess {serial1} return } if {[lindex $header 1] != ($CMD($what) + 128)} { ErrorMess {serial2} return } set bytecount [lindex $header 2] set data "" if {$bytecount > 0} { set bytecount [incr bytecount 2] for { set i 1 } { $i < $bytecount } { incr i } { set ch "" while { [string length $ch] == 0 } { set ch [read $SRLFILE 1] update } append bdata $ch } set data [split $bdata ""] if {! $NotLogging} { set log "" foreach b $data { binary scan $b "c" x lappend log $x } Log $log } set sumin [lindex $data "end"] set data [lreplace $data "end" "end"] set sumcalc [CheckSum $data] if {$sumcalc != $sumin} { ErrorMess {checksum2} set data "" return } } after cancel TimeOutProc } return $data } proc ProcessRead {what data} { switch $what { GetWP { WayPoint $data } GetRT { Routes $data } GetTR { TrailOrigin $data } GetTRd { TrailDelta $data } GetICno { IconCount $data } GetICpos { IconPosn $data } GetInfo { ProductInfo $data } PutTR - PutTRd { PutTrail } } return } proc WayPoint {data} { global PDTYPE WNames WName WNum WSymb WLatitude WLongitude WDate set data [UnPackData $data $PDTYPE(GetWP)] if [lindex $data 2] { set name [lindex $data 6] set WNum($name) [lindex $data 1] lappend WNames $name set WName($WNum($name)) $name set WSymb($name) [lindex $data 3] set merclat [lindex $data 4] set WLatitude($name) [Merc2Lat $merclat] set merclong [lindex $data 5] set WLongitude($name) [Merc2Long $merclong] set WDate($name) [lindex $data 7] # ListWayPoints $name } return } proc ListWayPoints {} { global WNames WNum WSymb WLatitude WLongitude WDate UnusedWPInx set bulkdata "" foreach name $WNames { set data $WNum($name) lappend data $WSymb($name) $WLatitude($name) $WLongitude($name) \ $name $WDate($name) lappend bulkdata $data set inx [lsearch -exact $UnusedWPInx $WNum($name)] set UnusedWPInx [lreplace $UnusedWPInx $inx $inx] } return $bulkdata } proc Routes {data} { global PDTYPE RNum RPoints RNames set pts "" set packdata [lrange $data 0 16] set data [lreplace $data 0 16] set rtdata [UnPackData $packdata $PDTYPE(GetRT)] set points [lindex $rtdata 2] if { $points } { if { [string compare [lindex $rtdata 3] ""] } { set name [lindex $rtdata 3] } else { set num [expr [lindex $rtdata 1] + 1] set name ROUTE$num } lappend RNames $name set RNum($name) [expr [lindex $rtdata 1] + 1] set i 0 ; set x 0 ; set y 1 while {$i < $points} { binary scan [join [list [lindex $data $x] \ [lindex $data $y]] ""] "s" p lappend pts $p incr x 2 ; incr y 2 ; incr i } set RPoints($name) $pts } return } proc ListRoutes {} { global PDTYPE RNames RNum RPoints set bulkdata "" foreach n $RNames { set name $n set data $RNum($name) lappend data $name $RPoints($name) lappend bulkdata $data } return $bulkdata } proc IconCount {data} { global PDTYPE BulkData set BulkData "" set data [UnPackData $data $PDTYPE(GetICno)] set count [lindex $data 1] for {set i 0} {$i < $count} {incr i} { SendData GetICpos $i } return } proc IconPosn {data} { global PDTYPE UnusedICInx BulkData set d [UnPackData $data $PDTYPE(GetICpos)] set data [lindex $d 1] set merclat [lindex $d 2] set inx [lsearch -exact $UnusedICInx $data] set UnusedICInx [lreplace $UnusedICInx $inx $inx] set merclong [lindex $d 3] lappend data [Merc2Lat $merclat] [Merc2Long $merclong] [lindex $d 4] lappend BulkData $data return } proc ProductInfo {data} { global PDTYPE PRODID PROTV MAX Prod Protv set data [UnPackData $data $PDTYPE(GPSInfo)] set prod [lindex $data 1] set Prod [lindex $PRODID $prod] set vn [lindex $data 2] set Protv [lindex $PROTV $vn] # set MAX(WP) [lindex $data 6] # set MAX(RT) [lindex $data 8] # MF change: using the user defaults global MAXWPOINTS MAXROUTES set MAX(WP) $MAXWPOINTS set MAX(RT) $MAXROUTES #-- set MAX(IC) [lindex $data 7] set MAXWPINROUTE) [lindex $data 9] set MAX(TR) [lindex $data 10] set MAXICG [lindex $data 11] return } proc PutTrail {} { global PntCount CurrentTrack while {$PntCount > 0} { SendData PutTRd $CurrentTrack } return } proc TrailOrigin {data} { global NIXDAYS PDTYPE TRNumDeltas Time Trail Xcurrent Ycurrent \ BulkData TrailData set TrailData "" set Time [clock seconds] set data [UnPackData $data $PDTYPE(GetTR)] set TRNumDeltas [lindex $data 4] if {$TRNumDeltas > 0} then { set trail [lindex $data 1] set Trail [expr 1 + $trail] # set the current global trail points to the received XY origins. set Xcurrent [lindex $data 3] set Ycurrent [lindex $data 2] lappend TrailData [list "Trail$Trail" [TimeStamp $Time] $Time [Merc2Lat \ $Ycurrent] [Merc2Long $Xcurrent] "1"] while {$TRNumDeltas > 0} { SendData GetTRd $trail } lappend BulkData $TrailData } return } proc TrailDelta {data} { global Time PDTYPE TrailData Xcurrent Ycurrent Trail INTERVAL set ddata [UnPackData $data $PDTYPE(GetTRd)] set pnts [lindex $ddata 2] set data [lreplace $data 0 3] for {set p 0} {$p < $pnts} {incr p} { binary scan [join [list [lindex $data 0] \ [lindex $data 1]] ""] "s" deltaY set Ycurrent [expr ($Ycurrent + $deltaY)] binary scan [join [list [lindex $data 2] \ [lindex $data 3]] ""] "s" deltaX set Xcurrent [expr ($Xcurrent + $deltaX)] set Time [expr ($Time + $INTERVAL)] lappend TrailData [list "Trail$Trail" [TimeStamp $Time] $Time \ [Merc2Lat $Ycurrent] [Merc2Long $Xcurrent]] # delete point just calc'ed & printed, ready for the next iteration. set data [lreplace $data 0 3] } return } proc Lat2Merc {data} { global RADtoDEG PI set lat [expr (($data / $RADtoDEG) + $PI/2)/2] set tanlat [expr tan($lat)] set loglat [expr log($tanlat)] return [expr round ($loglat * 6356752.3142)] } proc Long2Merc {data} { global RADtoDEG return [expr round (6356752.3142 * $data / $RADtoDEG)] } proc Merc2Lat {data} { global PI RADtoDEG set temp [expr ($data / 6356752.3142)] set temp [expr exp($temp)] set temp [expr (2 * atan($temp)) - ($PI / 2)] set x [expr ($temp * $RADtoDEG)] return $x } proc Merc2Long {data} { global RADtoDEG set temp [expr ($data / 6356752.3142)] return [expr ($temp * $RADtoDEG)] } proc UnPackData {data types} { # convert from list of bytes (as TCL characters) to list of elements # conforming to the types in the list $types global PDTYPE set vals "" foreach t $types { switch -glob $t { byte { set n 1 binary scan [lindex $data 0] "c" x set x [expr ($x+0x100)%0x100] } int { set n 2 binary scan [join [list [lindex $data 0] [lindex $data 1]] \ ""] "s" x } word { set n 2 binary scan [join [list [lindex $data 0] [lindex $data 1]] \ ""] "s" x set x [expr ($x+0x10000)%0x10000] } long - longword { # longword cannot be represented in Tcl as unsigned! set n 4 binary scan [join [list [lindex $data 0] [lindex $data 1] \ [lindex $data 2] [lindex $data 3]] ""] "i" x } charray=* { regsub charray= $t "" n set x "" for { set i 0 } { $i < $n } { incr i } { set c [lindex $data $i] binary scan $c c d if { $d == 0 } { set c " " } append x $c } set x [string trim $x " "] regsub -all {:} $x "" x } ignored { return $vals } default { Log "unimplemented data type when unpacking: $t" set n 1 ; set x 0 } } # MF change: the following comments were taken from the switch body # above # # double { # set n 8 # binary scan [join [list [lindex $data 0] [lindex $data 1] \ # [lindex $data 2] [lindex $data 3] \ # [lindex $data 4] [lindex $data 5] \ # [lindex $data 6] [lindex $data 7]] ""] "d" x # } #-- lappend vals $x set data [lrange $data $n end] } return $vals } proc SendData {command indx} { # transfer data to receiver # first group sent will be the Command Header. This will # be followed by a data group for PUTS (& for some GETS) or will # trigger a reply header & data group for GETS. # Second arg is the data index or zero, as appropriate. global WPName WPNum UnusedWPInx UnusedICInx RTWPoints RTList TRNumDeltas \ PntCount NDeltas CMD CurrentTrack set data "" switch $command { GetWP - GetICpos - GetRT - GetICgr { set data [PacketHeader $CMD($command) 2] lappend data [CheckSum $data] set suffix [binary format "s" $indx] set d [split $suffix ""] lappend data [lindex $d 0] [lindex $d 1] lappend data [CheckSum $d] } GetTR { set data [PacketHeader $CMD($command) 1] lappend data [CheckSum $data] set suffix [binary format "c" $indx] lappend data $suffix lappend data [CheckSum $suffix] } GetTRd { set deltaslice 20 set sdata [PacketHeader $CMD($command) 3] lappend sdata [CheckSum $sdata] set suffix [binary format "c" $indx] if {$TRNumDeltas < $deltaslice} { set deltas [binary format "s" $TRNumDeltas] set TRNumDeltas 0 } else { set deltas [binary format "s" $deltaslice] set TRNumDeltas [expr ($TRNumDeltas - $deltaslice)] } set d [split $deltas ""] lappend suffix [lindex $d 0] [lindex $d 1] lappend suffix [CheckSum $suffix] set data [concat $sdata $suffix] } PutWP { if { $WPNum($indx) < 0} { set WPNum($indx) [lindex $UnusedWPInx 0] set UnusedWPInx [lreplace $UnusedWPInx 0 0] } set sdata [PacketHeader $CMD($command) 29] lappend sdata [CheckSum $sdata] set tvals [PrepData $command $indx] set packdata [PackData $tvals] lappend packdata [CheckSum $packdata] set data [concat $sdata $packdata] } PutRT { set count [array size WPName] set RTList "" foreach pnt $RTWPoints($indx) { set inx [IndexNamed WP $pnt] if { ! [string compare WPNum($inx) "" ] } { if { [llength $unusedWPInx] == 0 } { GMMessage $MESS(noWPinx) ResetCursor . } else { set WPNum($inx) [lindex $UnusedWPInx 0] set UnusedWPInx [lreplace $UnusedWPInx 0 0] } } lappend RTList $WPNum($inx) } set PntCount [llength $RTList] set numbytes [expr ($PntCount * 2) + 16] set data [PacketHeader $CMD($command) $numbytes] lappend data [CheckSum $data] set tvals [PrepData $command $indx] set packdata [PackData $tvals] set chk [CheckSum $packdata] set packdata [concat $packdata [list $chk]] set data [concat $data $packdata] } PutIC { foreach i { $indx } { if { ! [string compare WPNum($i) "" ] } { if { [llength $unusedICInx] == 0 } { GMMessage $MESS(noICinx) ResetCursor . } else { set WPNum($i) [lindex $UnusedICInx 0] set UnusedICInx [lreplace $UnusedICInx 0 0] } } } set count [llength $indx] set data [PacketHeader $CMD(PutICno) 2] lappend data [CheckSum $data] set suffix [binary format "s" $count] set d [split $suffix ""] lappend data [lindex $d 0] [lindex $d 1] [CheckSum $d] GPSInterface PutICno $data for {set i 0} {$i < $count} {incr i} { set inx [lindex $indx $i] set data [PacketHeader $CMD(PutIC) 11] lappend data [CheckSum $data] set tvals [PrepData $command $inx] set packdata [PackData $tvals] lappend packdata [CheckSum $packdata] set data [concat $data $packdata] GPSInterface $command $data } return } PutTR { set CurrentTrack $indx set sdata [PacketHeader $CMD($command) 11] lappend sdata [CheckSum $sdata] set tvals [PrepData $command $indx] set packdata [PackData $tvals] lappend packdata [CheckSum $packdata] set data [concat $sdata $packdata] } PutTRd { if {$PntCount < 40} { set NDeltas $PntCount set PntCount 0 } else { set NDeltas 40 set PntCount [expr $PntCount - 40] } set n [expr $NDeltas * 4 + 3] set data [PacketHeader $CMD($command) $n] lappend data [CheckSum $data] set tvals [PrepData $command $CurrentTrack] set packdata [PackData $tvals] lappend packdata [CheckSum $packdata] set data [concat $data $packdata] } default { set data [PacketHeader $CMD($command) 0] lappend data [CheckSum $data] } } GPSInterface $command $data return } proc PacketHeader {command count} { # Formats the correct Packet Command header. global PREAMBLE PDTYPE set headdata "" lappend headdata $PREAMBLE $command $count 0 return [PackData [list $PDTYPE(Header) $headdata]] } proc CheckSum {data} { # Calculates the 2's complement checksum and returns checksum. set datasum 0 foreach ch $data { binary scan $ch "c" v incr datasum $v } set checksum [expr 256 - ($datasum & 255)] set chk [binary format "c" $checksum] return $chk } proc PrepData {cmd inx} { # prepare WPs, RTs, or TRs data to be transferred global GPSMANDAYS PDTYPE WPName WPSymbol WPNum WPCommt WPPosn WPDatum WPDate \ ICIdNumber ICSymbol ICPfrmt ICPosn ICDatum RTList RTIdNumber \ RTCommt TRName TRDatum TRTPoints NDeltas TDeltas TRNumDeltas \ PntCount Choice SYMBOLCODE YEAR0 MONTHNAMES DateFormat CurrentTrack switch $cmd { PutWP { set p $WPPosn($inx) if { [string compare $WPDatum($inx) "WGS 84"] } { set p [ConvertDatum [lindex $p 0] [lindex $p 1] \ $WPDatum($inx) "WGS 84" DDD] } set latd [lindex $p 0] set longd [lindex $p 1] set sym $SYMBOLCODE($WPSymbol($inx)) if { ! [string compare $WPDate($inx) ""] } { set year0 $YEAR0 ; set YEAR0 1992 set t { %Y %m %d %H %M %S } set s [clock format [clock seconds] -format $t] scan $s "%d %d %d %d %d %d" y m d h mn s set wpdate [DateToSecs $y $m $d $h $mn $s] set YEAR0 $year0 } else { set date [split $WPDate($inx) ": -/."] if { ! [string compare $DateFormat "DDMMMYYYY"] } { scan $date {%d %[a-zA-Z] %d %d %d %d} d mnth y h mn s set m [lsearch -exact $MONTHNAMES $mnth] set month [expr $m + 1] } if { ! [string compare $DateFormat "YYYY-MM-DD"] } { scan $date {%d-%d%-d %d %d %d} month d y h mn s } if { ! [string compare $DateFormat "MMDDYYYY"] } { scan $date {%d %d %d %d %d %d} month d y h mn s } if { ! [string compare $DateFormat "YYYYMMDD"] } { scan $date {%d %d %d %d %d %d} y month d h mn s } set gpsdate [DateToSecs $y $month $d $h $mn $s] set wpdate [expr $gpsdate - ($GPSMANDAYS*24*3600)] } set wpnum [expr $WPNum($inx) - 1] return [list $PDTYPE($cmd) [PrepWPData $WPNum($inx) $WPName($inx) \ $sym $WPCommt($inx) $latd $longd $wpdate ]] } PutRT { set pointlist "" for {set i 0} {$i < $PntCount} {incr i} { lappend pointlist [lindex $RTList $i] } return [list $PDTYPE(PutRT) [PrepRTData $RTIdNumber($inx) \ $PntCount $RTCommt($inx) $pointlist]] } PutIC { set p $WPPosn($inx) if { [string compare $WPDatum($inx) "WGS 84"] } { set p [ConvertDatum [lindex $p 0] [lindex $p 1] \ $WPDatum($inx) "WGS 84" DDD] } set num [string range $WPName($inx) 4 end] set sym $SYMBOLCODE($WPSymbol($inx)) set latd [lindex $p 0] set longd [lindex $p 1] return [list $PDTYPE($cmd) [PrepICData $num \ $sym $latd $longd]] } PutTR { set TDeltas "" set points "" foreach p $TRTPoints($inx) { lappend points [list [lindex $p 0] [lindex $p 1]] } set pnts "" if { [string compare $TRDatum($inx) "WGS 84"] } { foreach p $points { lappend pnts [ConvertDatum [lindex $p 0] \ [lindex $p 1] $TRDatum($inx) "WGS 84" DDD] } set points $pnts } foreach p $points { set ymerc [Lat2Merc [lindex $p 0]] set xmerc [Long2Merc [lindex $p 1]] lappend tpoints [list $ymerc $xmerc] } set PntCount [expr [llength $tpoints] -1] set p [lindex $tpoints 0] set y [lindex $p 0] ; set x [lindex $p 1] set yo $y ; set xo $x for {set i 1} {$i <= $PntCount} {incr i} { set p [lindex $tpoints $i] set y1 [lindex $p 0] ; set x1 [lindex $p 1] set dy [expr $y1 - $y] ; set dx [expr $x1 - $x] lappend TDeltas [list $dy $dx] set y $y1 ; set x $x1 } return [list $PDTYPE($cmd) [list $inx $yo $xo $PntCount]] } PutTRd { set deltas "" ; set type $PDTYPE($cmd) for {set i 0} {$i < $NDeltas} {incr i} { set d [lindex $TDeltas 0] lappend deltas [lindex $d 0] [lindex $d 1] lappend type "word" "word" set TDeltas [lreplace $TDeltas 0 0] } return [list $type [concat [list $CurrentTrack $NDeltas] $deltas ]] } } } proc PrepWPData {number name sym cmmt lat long date} { return [list $number 1 $sym [Lat2Merc $lat] [Long2Merc $long] \ $name $date] } proc PrepICData {number sym lat long } { return [list $number [Lat2Merc $lat] [Long2Merc $long] $sym] } proc PrepRTData {id wpcount name points} { set id [expr ($id - 1)] return [list $id $wpcount $name $points] } proc PackData {tvals} { # convert from a pair with a list of types and a list of values into a # list of bytes (as TCL characters) return [split [DataToStr [lindex $tvals 0] [lindex $tvals 1]] ""] } proc DataToStr {types vals} { # convert from list of elements conforming to the types in $types to # a TCL string global PntCount set data "" foreach t $types v $vals { switch -glob $t { byte { append data [binary format "c" $v] } word { append data [binary format "s" $v] } longword - long { append data [binary format "i" $v] } wordarray { append data [binary format "s$PntCount" $v] } charray=* { regsub charray= $t "" n append data [binary format "A$n" $v] } default { Log "unimplemented data type when packing: $t" } } # MF change: the following comments were taken from the switch body # above # double { # append data [binary format "d" $v] # } #-- } return $data } ##### upper level proc EndOutProt {} { # deal with end of output protocol CloseInProgrWindow return } proc EndInProt {what data} { # deal with end of input protocol CloseInProgrWindow switch $what { IC {InData$what $data} TR {InData$what $data} } return } proc InDataWP {data} { # add WPs data from receiver to database global Index Number WPRoute GetDispl GetSet WPDispl WPSymbol foreach d $data { set d [ConvWPData $d] set name [lindex $d 0] set ix [IndexNamed WP $name] # set name [lindex $d 0] ; set name [split $name " "] # set name [join $name ""] ; set ix [IndexNamed WP $name] set d [lreplace $d 0 0 $name] if {! [string compare $GetSet(WP) ""] || \ [lsearch $GetSet(WP) $ix] != -1 } { StoreWP $ix $name $d $GetDispl } } return } proc ConvWPData {d} { # convert WPs data got from receiver into list of lists suitable for # use with SetItem global PositionFormat DEFAULTDISPOPT DATAFOR set t [PosType $PositionFormat] set wpnum [lindex $d 0] set wpname [lindex $d 4] set date [ConvLowrDate [lindex $d 5]] set s [lindex $d 1] set sym [NameForCodeOf SYMBOL $s] set p [CreatePos [lindex $d 2] [lindex $d 3] \ $PositionFormat $t "WGS 84"] set all [list Name Num Posn Date Symbol] set r [list $wpname $wpnum $p $date $sym] set r [FormData WP $all $r] return $r } proc InDataIC {data} { # add Icon data from receiver to database # return list of set Icons global Index Number GetDispl foreach d $data { set d [ConvICData $d] set id [lindex $d 1] set name "ICON$id" set d [lreplace $d 0 0 $name] set ix [IndexNamed WP $name] StoreWP $ix $name $d $GetDispl } return } proc ConvICData {d} { # convert Icon data got from receiver into list of lists suitable for # use with SetItem global PositionFormat DEFAULTDISPOPT set t [PosType $PositionFormat] set id [lindex $d 0] set name [lindex $d 4] set p [CreatePos [lindex $d 1] [lindex $d 2] $PositionFormat $t "WGS 84"] set s [lindex $d 3] set sym [NameForCodeOf SYMBOL $s] set all [list Name Num Posn Symbol] set r [list $name $id $p $sym] set r [FormData WP $all $r] return $r } proc InDataRT {data} { # add RT data from receiver to database global Index Number WName RTWPoints RTDispl GetDispl GetSet foreach d $data { set wps "" set id [lindex $d 0] set name [lindex $d 1] ; set ix [IndexNamed RT $id] foreach pnt [lindex $d 2] { lappend wps $WName($pnt) } if { [string compare $wps ""] } { set all [list IdNumber Commt WPoints] set r [list $id $name $wps] set r [FormData RT $all $r] StoreRT $ix $name $r $wps $GetDispl } SetWPRoute $id $wps } return } proc InDataTR {data} { # add TRs data from receiver to database global Index Number GetDispl foreach p $data { set tps "" set f [lindex $p 0] set id [lindex $f 0] set ix [IndexNamed TR $id] if {$ix == -1} then { foreach d $p { set t [CreatePos [lindex $d 3] [lindex $d 4] \ DMS latlong "WGS 84"] lappend t [lindex $d 1] [lindex $d 2] lappend tps $t } set trdata [list [lindex $d 0] $tps] set all [list Name TPoints] set r [FormData TR $all $trdata] StoreTR $ix $id $r $GetDispl } } return } ##### GPSMan interface proc GPSChangeProtocol {prot} { # change current protocol # $prot in {lowrance, nmeal} # must change GPSProtocolExt if successful global GPSProtocol GPSProtocolExt GPSState TXT if { "$GPSProtocol" == "$prot" } { return } if { "$GPSState" == "online" } { set Eof 1 close $SRLFILE DisableGPS } set GPSProtocol $prot ; set GPSProtocolExt $TXT($prot) return } proc ConvLowrDate {ld} { # converts Lowrance date (seconds since 1992.01.01 00:00:00) into # seconds from $YEAR0 # with date in current format and seconds since beginning of $YEAR0 # (assumed a leap year < 1990) global YEAR0 set dd 0 for { set yy $YEAR0 } { $yy < 1990 } { incr yy 4 } { incr dd } set secs [expr ((1992-$YEAR0)*365+$dd)*24*3600+$ld] return [DateFromSecs $secs] } proc GPSConnection {data} { EnableGPS return } proc GPSBye {} { return } proc InitGPS {} { global MAX MESS StartGPS if { [FailsInProgrWindow $MESS(fillbuffWP)] } { return } SendData GetInfo 0 BulkRead $MAX(WP) GetWP EndInProt WP 0 if { [FailsInProgrWindow $MESS(fillbuffRT)] } { return } BulkRead $MAX(RT) GetRT EndInProt RT 0 return } proc GetGPSIn {wh ixs} { # get data of type $wh (in {WP, RT}), but only to replace items with # given indices $ixs (that may contain -1, meaning that new items # can be created) global GetSet set GetSet($wh) $ixs DoGetGPS $wh return } proc GetGPS {wh} { global GetSet set GetSet($wh) "" DoGetGPS $wh return } proc DoGetGPS {wh} { global MESS MAX BulkData Choice if { [FailsInProgrWindow $MESS(get$wh)] } { return } switch $wh { WP { set data [ListWayPoints] InDataWP $data CloseInProgrWindow } RT { set data [ListRoutes] InDataRT $data CloseInProgrWindow } TR { BulkRead $MAX(TR) Get$wh EndInProt TR $BulkData } IC { SendData GetICno 0 EndInProt IC $BulkData } Info { SendData Get$wh 0 } } return } proc PutGPS {wh inx} { global MESS if { [FailsInProgrWindow $MESS(put$wh)] } { return } switch $wh { WP { set indx [WPSort PutWP $inx] if { [llength $indx] > 0 } { SendData PutIC $indx } } default { foreach p $inx { SendData Put$wh $p } } } EndOutProt return } proc WPSort {what inx} { # Sorts WP's from Icons and sends them to Receiver appropriately global WPName set data "" foreach p $inx { if { [string match "ICON*" $WPName($p)] } { lappend data $p } else { SendData PutWP $p } } return $data } proc BulkRead {count wh} { global BulkData GetSet WNames RNames switch $wh { GetWP { set WNames "" } GetRT { set RNames "" } } set BulkData "" for {set i 0} {$i < $count} {incr i} { SendData $wh $i } } proc StartGPS {} { global NotLogging LogFile MessSent SERIALLOG SRLFILE SERIALPORT if {! $NotLogging } { set LogFile [open $SERIALLOG w] } set MessSent 0 set SRLFILE [open $SERIALPORT r+] fconfigure $SRLFILE -blocking 0 -mode 19200,n,8,1 -translation binary # fconfigure $SRLFILE -blocking 0 -mode 9600,n,8,1 -translation binary LowranceStdSymbols return } proc GPSOff {} { global SRLFILE # close $SRLFILE CloseInProgrWindow return } proc CloseInProgrWindow {} { destroy .inprogr return } proc FailsInProgrWindow {mess} { # create dialog for signaling operation in progress # fail if window already exists # single button: Abort; no bindings global COLOUR EPOSX EPOSY TXT if { [winfo exists .inprogr] } { Raise .inprogr ; bell ; return 1 } toplevel .inprogr wm protocol .inprogr WM_DELETE_WINDOW { bell } wm title .inprogr "GPS Manager: $TXT(commrec)" wm transient .inprogr wm geometry .inprogr +$EPOSX+$EPOSY frame .inprogr.fr -relief flat -borderwidth 5 -bg $COLOUR(messbg) label .inprogr.fr.title -text "..." -relief sunken label .inprogr.fr.text -text "$mess" # button .inprogr.fr.stop -text "STOP" -default active -command "NMEAOff" set fw .inprogr.fr.frc frame $fw -relief flat -borderwidth 0 label $fw.tit -text "Working - please wait" button .inprogr.fr.ok -text "Stop" -state normal \ -command NMEAOff # button .inprogr.fr.ok -text $TEXT(abort) -command NMEAOff pack $fw.tit -side left -padx 0 pack .inprogr.fr -side top pack .inprogr.fr.title .inprogr.fr.text .inprogr.fr.frc \ .inprogr.fr.ok -side top -pady 5 # pack .inprogr.fr.stop -side top -pady 5 update idletasks grab .inprogr.fr.ok RaiseWindow .inprogr return 0 } gpsman-6.4.4.2/gmsrc/maptransf.tcl0000644000175000017500000006445712224351120015106 0ustar migmig# # This file is part of: # # gpsman --- GPS Manager: a manager for GPS receiver data # # Copyright (c) 1998-2013 Miguel Filgueiras migfilg@t-online.de # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. # # File: maptransf.tcl # Last change: 6 October 2013 # ## Uses information kindly supplied by # Jose Alberto Goncalves, Universidade do Porto # J. B. Mehl ## ## transformations for geo-referencing of images # # (xt,yt) terrain coordinates (metre) # (xm,-ym) map coordinates (pixel, ym grows downwards!) # # affine transformation, 6 parameters # (xt,yt) = [ aij ] x (xm,ym) + (e,f) # where a11 = a a12 = b a21 = c a22 = d # # affine conformal transformation, 4 parameters # (xt,yt) = lambda [ aij ] x (xm,ym) + (e,f) # where a11 = cos a a12 = -sin a a21 = sin a a22 = cos a # rotation angle: a scaling factor: lambda # # affine conformal no rotation transformation, 3 parameters # (xt,yt) = lambda (xm,ym) + (e,f) ## ## when adding new transformation procedures the variables MAPTRANSFNPTS and # MAPKNOWNTRANSFS must be changed in metadata.tcl # see also relevant procedures in map.tcl, command_parse.tcl, command.tcl # indices of MTData array used for each transformation array set MAPTRANSFDATA { NoRot {lambda e f} Affine {a b c d e f det k2m1 k4m3} AffineConf {a b e f det k2m1 k4m3} } proc MapTransfIs {transf} { # set global variables so that map transformation is $transf # $transf in $MAPKNOWNTRANSFS global MapTransf MapTransfTitle TXT set MapTransf $transf ; set MapTransfTitle $TXT(TRNSF$transf) return } ## transformation procs proc MapInitNoRotTransf {scale xt0 yt0 xm0 ym0} { # compute parameters of affine conformal transformation with no rotation # $scale is in metre/pixel # $xt0,$yt0: terrain coordinates of the map point at $xm0,$ym0 pixel global MTData MapTransfIs NoRot # to avoid integer divisions set MTData(lambda) [expr $scale*1.0] set MTData(e) [expr $xt0-$scale*$xm0] set MTData(f) [expr $yt0+$scale*$ym0] return 0 } proc InitNoRotTransf {} { # compute representation of affine conformal transformation with no # rotation transformation from 2 WPs # $MapLoadWPs is list of indices of relevant WPs # $MapLoadPos($n,x), $MapLoadPos($n,y) $n in 0..2 give pixel coordinates # set MapScale to appropriate value in metre/pixel # return 0 if failed to solve equations global MapLoadPos MapScale MTData MapTransfIs NoRot foreach p "0 1" tcs [MapGeoRefPoints 2] { foreach "xt$p yt$p" $tcs {} } # distance between points in the terrain (metre) set dxt [expr $xt0-$xt1] ; set dyt [expr $yt0-$yt1] # must have both multiplications by 1.0 !!! set lt [expr sqrt(1.0*$dxt*$dxt+1.0*$dyt*$dyt)] # distance between points in the map (pixel) set dxm [expr $MapLoadPos(0,x)-$MapLoadPos(1,x)] set dym [expr $MapLoadPos(0,y)-$MapLoadPos(1,y)] # must have both multiplications by 1.0 !!! set lm [expr sqrt(1.0*$dxm*$dxm+1.0*$dym*$dym)] # scale if { [catch {set scale [expr 1.0*$lt/$lm]}] } { return 0 } set MapScale $scale set MTData(lambda) [expr $scale*1.0] set MTData(e) [expr $xt0-$scale*$MapLoadPos(0,x)] set MTData(f) [expr $yt0+$scale*$MapLoadPos(0,y)] return 1 } proc MapApplyNoRotTransf {xt yt} { # apply affine conformal transformation with no rotation global MTData set s $MTData(lambda) return [list [expr ($xt-$MTData(e))/$s] [expr ($MTData(f)-$yt)/$s]] } proc MapInvertNoRotTransf {xm ym} { # invert affine conformal transformation with no rotation global MTData set s $MTData(lambda) return [list [expr $s*$xm+$MTData(e)] [expr $MTData(f)-$s*$ym]] } proc MapNewScaleNoRotTransf {scale} { # set transformation parameters after change in map scale # return 1 if possible global MTData set MTData(lambda) [expr $scale*1.0] return 1 } proc MapInitAffineTransf {args} { # compute representation of affine transformation from 3 points # $args=="" points are WPs, with $MapLoadWPs the list of # indices of relevant WPs, used by proc MapGeoRefPoints # that sets MapLoadPos(_,_) to the pixel coordinates # ==list of projected coordinates, MapLoadPos(_,_) was already set # $MapLoadPos($n,x), $MapLoadPos($n,y) $n in 0..2 give pixel coordinates # set MapScale to appropriate value in metre/pixel # return 0 if failed to solve equations global MapLoadPos MapScale MTData Mat Rx MapTransfIs Affine if { $args == "" } { if { [set tcs [MapGeoRefPoints 3]] == -1 } { return 0 } } else { set tcs [lindex $args 0] } foreach ps [list "a b e" "c d f"] d "0 1" { foreach i "0 1 2" { set Mat($i,0) $MapLoadPos($i,x) set Mat($i,1) $MapLoadPos($i,y) set Mat($i,2) 1 set Mat($i,3) [lindex [lindex $tcs $i] $d] } if { [GaussReduce 3] != 1 } { return 0 } foreach p $ps i "0 1 2" { set MTData($p) $Mat($Rx($i),3) } } # the following parameters simplify computations set MTData(det) [expr $MTData(a)*$MTData(d)-$MTData(b)*$MTData(c)] set MTData(k2m1) [expr $MTData(b)*$MTData(f)-$MTData(d)*$MTData(e)] set MTData(k4m3) [expr $MTData(c)*$MTData(e)-$MTData(a)*$MTData(f)] # scale along the xm-axis when variation of ym=0 set MapScale [expr abs($MTData(a))] return 1 } proc MapApplyAffineTransf {xt yt} { # apply affine transformation global MTData set x [expr ($MTData(d)*$xt-$MTData(b)*$yt+$MTData(k2m1))/$MTData(det)] set y [expr ($MTData(a)*$yt-$MTData(c)*$xt+$MTData(k4m3))/$MTData(det)] return [list $x $y] } proc MapInvertAffineTransf {xm ym} { # invert affine transformation global MTData set xt [expr $MTData(a)*$xm+$MTData(b)*$ym+$MTData(e)] set yt [expr $MTData(c)*$xm+$MTData(d)*$ym+$MTData(f)] return [list $xt $yt] } proc MapNewScaleAffineTransf {scale} { # set transformation parameters after change in map scale # return 1 if possible return 0 } proc MapInitAffineConfTransf {args} { # compute representation of affine conformal transformation from 2 points # $args=="" points are WPs, with $MapLoadWPs the list of # indices of relevant WPs, used by proc MapGeoRefPoints # that sets MapLoadPos(_,_) to the pixel coordinates # ==list of projected coordinates, MapLoadPos(_,_) was already set # $MapLoadPos($n,x), $MapLoadPos($n,y) $n in 0..1 give pixel coordinates # set MapScale to appropriate value in metre/pixel # return 0 if failed to solve equations global MapLoadPos MapScale MTData Mat Rx MapTransfIs AffineConf catch {unset MTData} if { $args == "" } { if { [set tcs [MapGeoRefPoints 2]] == -1 } { return 0 } } else { set tcs [lindex $args 0] } foreach e "0 2" i "0 1" { set xyt [lindex $tcs $i] set Mat($e,0) $MapLoadPos($i,x) set Mat($e,1) [expr -$MapLoadPos($i,y)] set Mat($e,2) 1 ; set Mat($e,3) 0 set Mat($e,4) [lindex $xyt 0] incr e set Mat($e,0) [expr -$MapLoadPos($i,y)] set Mat($e,1) [expr -$MapLoadPos($i,x)] set Mat($e,2) 0 ; set Mat($e,3) 1 set Mat($e,4) [lindex $xyt 1] } if { [GaussReduce 4] != 1 } { return 0 } foreach p "a b e f" i "0 1 2 3" { set MTData($p) $Mat($Rx($i),4) } # the following parameters make calculations easier set MTData(det) [expr $MTData(a)*$MTData(a)+$MTData(b)*$MTData(b)] set MTData(k2m1) [expr $MTData(b)*$MTData(f)-$MTData(a)*$MTData(e)] set MTData(k4m3) [expr $MTData(b)*$MTData(e)+$MTData(a)*$MTData(f)] # scale along the xm-axis when variation of ym=0 set MapScale [expr abs($MTData(a))] return 1 } proc MapApplyAffineConfTransf {xt yt} { # apply affine conformal transformation global MTData set xm [expr ($MTData(a)*$xt-$MTData(b)*$yt+$MTData(k2m1))/$MTData(det)] set ym [expr -($MTData(a)*$yt+$MTData(b)*$xt-$MTData(k4m3))/$MTData(det)] return [list $xm $ym] } proc MapInvertAffineConfTransf {xm ym} { # invert affine conformal transformation global MTData set xt [expr $MTData(a)*$xm-$MTData(b)*$ym+$MTData(e)] set yt [expr -$MTData(b)*$xm-$MTData(a)*$ym+$MTData(f)] return [list $xt $yt] } proc MapNewScaleAffineConfTransf {scale} { # set transformation parameters after change in map scale # return 1 if possible return 0 } proc MapAffineParams {} { # convert parameters of current map transformation to corresponding # parameters of an affine transformation # return list of a parameter name followed by its value, where the # parameter names are at least the following ones a, b, c, d, e, f # as described above for the affine transformation global MapTransf MTData parray MTData switch $MapTransf { Affine { return [array get MTData] } AffineConf { set ps {} foreach p {a b c d e f} cp {a b b a e f} s {1 -1 -1 -1 1 1} { lappend ps $p [expr $s*$MTData($cp)] puts "p=$p, cp=$cp v=$MTData($cp) e=[expr $s*$MTData($cp)]" } } NoRot { set lambda $MTData(lambda) return [list a $lambda b 0 c 0 d $lambda \ e $MTData(e) f $MTData(f)] } } return $ps } ## solving a linear system of equations nxn by Gauss-Jordan elimination # code adopted from the Slopes Algorithm implementation in C # by M Filgueiras and A P Tomas / Universidade do Porto / 1996, 1997 # proc GaussNullFirst {k n} { # check first row with non-null element in $k,$k using Rx, Cx and # exchange rows if needs be # $n is dimension of matrix # return 0 if non-null element found global Rx Cx Mat for { set i [expr $k+1] } { $i < $n } { incr i } { if { $Mat($Rx($i),$Cx($k)) != 0 } { set l $Rx($k) ; set Rx($k) $Rx($i) ; set Rx($i) $l return 0 } } return 1 } proc GaussElim {i k n p} { # eliminate $i,$k element on ?x($n+1) matrix, pivot $p at $k,$k, # using Rx, Cx; the $i,$k element is assumed to be non-null global Rx Cx Mat set ii $Rx($i) ; set ik $Rx($k) set m [expr 1.0*$Mat($ii,$Cx($k))/$p] for { set j [expr $k+1] } { $j <= $n } { incr j } { set jj $Cx($j) set Mat($ii,$jj) [expr $Mat($ii,$jj)-$m*$Mat($ik,$jj)] } set Mat($ii,$Cx($k)) 0 return } proc GaussSubelim {k n} { # eliminate below $k on nx(n+1) matrix, using Rx, Cx[] global Rx Cx Mat set ck $Cx($k) set p $Mat($Rx($k),$ck) for { set i [expr $k+1] } { $i < $n } { incr i } { if { $Mat($Rx($i),$ck) != 0 } { GaussElim $i $k $n $p } } return } proc GaussSupraelim {i n} { # eliminate above $i on _x($n1) matrix, using Rx, Cx global Rx Cx Mat set ci $Cx($i) set p $Mat($Rx($i),$ci) for { set a 0 } { $a < $i } { incr a } { if { $Mat($Rx($a),$ci) != 0 } { GaussElim $a $i $n $p } } return } proc GaussReduce {n} { # reduction of $nx($n+1) matrix, using Rx, Cx to index rows and columns # indices start from 0 # values in global array $Mat are changed by this procedure # return 1 if there are is only one solution # solutions to be retrived from $Mat($Rx($i),$n) for each $i from 0 to $n-1 global Rx Cx Mat for { set i 0 } { $i < $n } { incr i } { set Rx($i) $i ; set Cx($i) $i } set Cx($n) $n for { set i 0 } { $i < $n } { incr i } { if { $Mat($Rx($i),$Cx($i))==0 && [GaussNullFirst $i $n] } { return 0 } GaussSubelim $i $n } for { set i [expr $n-1] } { $i > -1 } { incr i -1 } { set Mat($Rx($i),$n) [expr $Mat($Rx($i),$n)/$Mat($Rx($i),$Cx($i))] set Mat($Rx($i),$Cx($i)) 1 GaussSupraelim $i $n } return 1 } ### new version of least squares fit yielding one of the affine, # affine conformal, or affine conformal without rotation transformation ## using equations worked out by J. B. Mehl 20070712, corrected 20070808 # # (xt,yt) terrain coordinates # (xm,-ym) map coordinates (pixel, ym grows downwards!) # with origin of pixel coordinates in the upper left corner of image # # (e,f) terrain coordinates of upper left corner, map (0,0) # # with n = number of points # Sxm = sum_i xm_i # Sxtxm = sum_i xt_i xm_i # ... # # parameters of an affine conformal with no rotation transformation # # (xt,yt) = lambda (xm,ym) + (e,f) # # (e,f) = lambda (xm_0,H-ym_0) + (xt_0,yt_0) # where H is map height and (xt_0,yt_0) the terrain coordinates of # map lower corner # # for all control points replace vertical coordinate ym_i by # H-ym-i # # F = sum_i (xt_i-xt_0-lambda xm_i)^2+(yt_i-yt_0-lambda ym_i)^2 # min # # d(F,xt_0)=0 => Sxt - n xt_0 - lambda Sxm = 0 # => xt_0 = (Sxt - lambda Sxm) / n # d(F,yt_0)=0 => Syt - n yt_0 - lambda Sym = 0 # => yt_0 = (Syt - lambda Sym) / n # d(F,lambda)=0 => Sxtxm - xt_0 Sxm - lambda Sxmxm + # Sytm - y_t0 Sym - lambda Symym # # lambda = (n (Sxtxm + Sytym) - Sxt Sxm - Syt Sym) / # (n (Sxmxm + Symym) - Sxm^2 - Sym^2) # # e = (Sxt - lambda Sxm) / n # # f = (Syt + lambda Sym) / n # # parameters of an affine conformal transformation # # | a b | # (xt,yt) = | c d | (xm,ym) + (e,f) # # with a = -d = s cos r b = c = s sin r # NB: as GPSMan procs use b = c = -s sin r, the equation for b below # must be preceded by a minus sign # # minimize sum_i d(xt_i)^2+d(yt_i)^2 # where # d(xt_i) = xt_i - e - a xm_i - b ym_i # d(yt_i) = yt_i - f - b xm_i + a ym_i # # | n 0 Sxm Sym | | e | | Sxt | # | 0 n -Sym Sxm | | f | | Syt | # M = | Sxm -Sym Sxmxm+Symym 0 | | a | = | Sxtxm-Sytym | # | Sym Sxm 0 Sxmxm+Symym | | b | | Sxtym+Sytxm | # # e = (Sxm (Sxtxm-Sytym)+Sym (Sxtym+Sytxm)-Sxt (Sxmxm+Symym)) / # (Sxm^2 + Sym^2 - n (Sxmxm+Symym)) # # f = (Sym (Sytym-Sxtxm)+Sxm (Sxtym+Sytxm)-Syt (Sxmxm+Symym)) / # (Sxm^2 + Sym^2 - n (Sxmxm+Symym)) # # a = (Sxt Sxm - Syt Sym - n (Sxtxm - Sytym)) / # (Sxm^2 + Sym^2 - n (Sxmxm+Symym)) # # b = (Sxt Sym + Syt Sxm - n (Sxtym + Sytxm)) / # (Sxm^2 + Sym^2 - n (Sxmxm+Symym)) # # parameters of an affine transformation # # | a b | # (xt,yt) = | c d | (xm,ym) + (e,f) # # minimize sum_i d(xt_i)^2+d(yt_i)^2 # where # d(xt_i) = xt_i - xt(xm_i,ym_i,a,...,f) # similarly for d(yt_i) # # => minimize sum_i (xt_i-e-a xm_i-ab ym_i)^2 + # (yt_i-f-ac xm_i-ad ym_i)^2 # # | n Sxm Sym | | e | | Sxt | # M = | Sxm Sxmxm Sxmym | Vx = | a | Cx = | Sxtxm | # | Sym Sxmym Symym | | b | | Sxtym | # # # | f | | Syt | # Vy = | c | Cy = | Sytxm | # | d | | Sytym | # # equations: M Vx = Cx, M Vy = Cy yield [aij], e, f # proc MapInitLeastSquaresTransf {args} { # use datum and geodetic and pixel coordinates of points either # from the graphical interface or from a GPSMan least-squares # info file to compute parameters of transformation using a # least-squares fit # $LSqsTransf in {Affine, AffineConf, NoRot} is the transformation type # $args=="" points are WPs, with $MapLoadWPs the list of # indices of relevant WPs, used by proc MapGeoRefPoints # that sets MapLoadPos(_,_) to the pixel coordinates # ==pair whose 2nd element is the projection and 1st element is # a list with list of latd, longd and datum, a list of pairs # with pixel coordinates (x, y, in Tcl sign convention with # origin at upper left corner), a list with waypoints names (empty # for positions given explictly), and the input file path # return list of WP names to be displayed or 0 on error or operation being # cancelled global MPData MTData MapScale MPData MapLoadWPs MapLoadPos MapImageHeight \ LSqsTransf Mat Rx SUBDTUNIT DSCALE SUBDSCALE TXT GFShowInfo GFVisible set dispWPs "" if { $args == "" } { # from interface: always show fit information, no WPs to display set showinfo 1 set names "" set fpath "" set n [llength $MapLoadWPs] if { [set tcs [MapGeoRefPoints $n]] == -1 } { return 0 } set xys "" for { set k 0 } { $k < $n } { incr k } { lappend xys [list $MapLoadPos($k,x) $MapLoadPos($k,y)] } foreach ix $MapLoadWPs { lappend names [NameOf WP $ix] } } else { # from file: show fit information and display WPs if required set showinfo $GFShowInfo foreach "p proj" $args { break } foreach "ldds xys names fpath" $p { break } set tcs "" foreach ldd $ldds { foreach "latd longd datum" $ldd {} lappend tcs [Proj${proj}Point MPData $latd $longd $datum] } set n [llength $names] if { $GFVisible } { set dispWPs $names } } # least-squares on $tcs and $xys MapTransfIs $LSqsTransf if { $LSqsTransf == "NoRot" } { set ymoff $MapImageHeight ; set ymsign -1 } else { set ymoff 0 ; set ymsign 1 } foreach i "xt xtxm xtym yt ytxm ytym xm xmxm xmym ym ymym" { set s($i) 0.0 } foreach tc $tcs pc $xys { foreach "xt yt" $tc {} foreach "xm ym" $pc {} set ym [expr $ymoff+$ymsign*$ym] foreach i "xt yt xm ym" { set s($i) [expr $s($i)+[set $i]] } set s(xmym) [expr $s(xmym)+1.0*$xm*$ym] foreach j "x y" { set z [set ${j}m] set w "${j}m${j}m" set s($w) [expr $s($w)+1.0*$z*$z] foreach i "x y" { set w "${i}t${j}m" set s($w) [expr $s($w)+1.0*[set ${i}t]*$z] } } } set dfreedom [expr $n+$n] set n [expr 1.0*$n] switch $LSqsTransf { Affine { incr dfreedom -6 foreach d "xt yt" ps [list "e a b" "f c d"] { catch {unset Mat} set Mat(0,0) $n set Mat(0,1) [set Mat(1,0) $s(xm)] set Mat(0,2) [set Mat(2,0) $s(ym)] set Mat(1,1) $s(xmxm) set Mat(1,2) [set Mat(2,1) $s(xmym)] set Mat(2,2) $s(ymym) set Mat(0,3) $s($d) set Mat(1,3) $s(${d}xm) set Mat(2,3) $s(${d}ym) if { [GaussReduce 3] != 1 } { return 0 } foreach p $ps i "0 1 2" { set MTData($p) $Mat($Rx($i),3) } } # the following parameters simplify computations set MTData(det) [expr $MTData(a)*$MTData(d)-$MTData(b)*$MTData(c)] set MTData(k2m1) [expr $MTData(b)*$MTData(f)-$MTData(d)*$MTData(e)] set MTData(k4m3) [expr $MTData(c)*$MTData(e)-$MTData(a)*$MTData(f)] # scale along the xm-axis when variation of ym=0 set MapScale [expr abs($MTData(a))] } AffineConf { incr dfreedom -4 set zxym [expr $s(xmxm)+$s(ymym)] set zuyvx [expr $s(xtym)+$s(ytxm)] set zuxMvy [expr $s(xtxm)-$s(ytym)] if { abs([set den [expr $s(xm)*$s(xm)+$s(ym)*$s(ym)-$n*$zxym]]) \ < 1e-50 } { return 0 } set MTData(a) [expr ($s(xt)*$s(xm)-$s(yt)*$s(ym)-$n*$zuxMvy) \ / $den] # b sign is changed in GPSMan affine conformal procs set MTData(b) [expr -($s(xt)*$s(ym)+$s(yt)*$s(xm)-$n*$zuyvx) /$den] set MTData(e) [expr ($s(xm)*$zuxMvy+$s(ym)*$zuyvx-$s(xt)*$zxym) \ / $den] set MTData(f) [expr ($s(xm)*$zuyvx-$s(ym)*$zuxMvy-$s(yt)*$zxym) \ / $den] # the following parameters make calculations easier set MTData(det) [expr $MTData(a)*$MTData(a)+$MTData(b)*$MTData(b)] set MTData(k2m1) [expr $MTData(b)*$MTData(f)-$MTData(a)*$MTData(e)] set MTData(k4m3) [expr $MTData(b)*$MTData(e)+$MTData(a)*$MTData(f)] # scale along the xm-axis when variation of ym=0 set MapScale [expr abs($MTData(a))] } NoRot { incr dfreedom -3 if { [catch {set k [expr 1.0*($n*($s(xtxm)+$s(ytym))- \ $s(xt)*$s(xm)-$s(yt)*$s(ym)) / \ ($n*($s(xmxm)+$s(ymym)) - $s(xm)*$s(xm) - \ $s(ym)*$s(ym))]}] } { return 0 } # assuming: # set MapLoadPos(origin,x) 0 # set MapLoadPos(origin,y) 0 set MTData(lambda) [set MapScale $k] set MTData(e) [expr 1.0*($s(xt)-$k*$s(xm))/$n] set MTData(f) [expr 1.0*($s(yt)-$k*$s(ym))/$n+$k*$MapImageHeight] } } if { $showinfo } { # deviations of control points in user units (m, ft) set sc [expr $MapScale*$DSCALE/$SUBDSCALE/1000.0] append info $TXT(lstsqs) " / " $TXT(TRNSF$LSqsTransf) "\n" if { $fpath != "" } { append info $TXT(file) ": " $fpath "\n" } set xt $TXT(xtcoord) ; set yt $TXT(ytcoord) set delta $TXT(delta) append info \ "\t\t$xt\t$yt\t$delta $xt\t$delta $yt\t$delta $TXT(residual)\n" \ "\t\tm\tm\t$SUBDTUNIT\t$SUBDTUNIT\t$SUBDTUNIT\n" set sumdrt2 0 foreach tc $tcs pc $xys name $names { foreach "xt yt" $tc {} foreach "xm ym" $pc {} foreach "nxm nym" [MapApply${LSqsTransf}Transf $xt $yt] {} set dxt [expr $sc*($nxm-$xm)] set dyt [expr $sc*($nym-$ym)] set drt [expr sqrt($dxt*$dxt+$dyt*$dyt)] set sumdrt2 [expr $sumdrt2+$drt*$drt] foreach v "dxt dyt drt" { set $v [format %7.2f [set $v]] } append info $name "\t\t" [format %.2f $xt] "\t" [format %.2f $yt] \ "\t" $dxt "\t" $dyt "\t" $drt "\n" } set rms [expr sqrt($sumdrt2/($n+$n))] set rmsdf [expr sqrt(1.0*$sumdrt2/$dfreedom)] append info "$TXT(rmsxydev) = " [format %.2f $rms] $SUBDTUNIT "\n" \ "$TXT(resstderr) = " [format %.2f $rmsdf] $SUBDTUNIT "\n" DisplayInfo $info tabs \ [list -10 right -24 right -38 right -46 right -54 right -62 right] } return $dispWPs } ##### TFW metadata file proc MapInitTFWTransf {data proj} { # compute parameters of affine transformation from the values in a # TFW metadata file # based on the ESRI ArcGIS 2.9 manual (consulted November 2009) at # http://webhelp.esri.com/arcgisdesktop/9.2/index.cfm?id=2676&pid=2664&topicname=World_files_for_raster_datasets # this is an affine transformation with # (xt,yt) = [ Aij ] x (xm,ym) + (C,F) # where A11 = A = tfw1 # A12 = B = tfw3 # A21 = D = tfw2 # A22 = E = tfw4 (correct sign for y map coordinates growing down) # C = tfw5, F = tfw6 # # therefore in the GPSMan notation # a = A, b = B, e = C # c = D, d = E, f = F # # $data is a pair with an empty list and a list with the 6 parameters # (tfw_ in the formulae above) # $proj is the projection # return 0 if determinant is 0 global MTData MapScale MapTransfIs Affine foreach m {a c b d e f} v [lindex $data 1] { # to avoid integer divisions set MTData($m) [expr 0.0+$v] } set MTData(det) [expr $MTData(a)*$MTData(d)-$MTData(b)*$MTData(c)] if { abs($MTData(det)) < 1e-30 } { return 0 } # the following parameters simplify computations set MTData(k2m1) [expr $MTData(b)*$MTData(f)-$MTData(d)*$MTData(e)] set MTData(k4m3) [expr $MTData(c)*$MTData(e)-$MTData(a)*$MTData(f)] # scale along the xm-axis when variation of ym=0 set MapScale [expr abs($MTData(a))] return 1 } ##### partial support for OziExplorer .map files proc MapInitOziMapTransf {data proj} { # use datum and geodetic and pixel coordinates of points in Ozi .map # file to compute parameters of affine or affine conformal transformation # $data is pair with list of latd,longd,datum and # list of pairs with pixel coordinates (in Tcl sign convention) # aligned with the previous one # $proj is the projection # return 0 on error global MTData MapScale MPData MapLoadPos foreach "opds opxs" $data {} if { [set sel [MapReduceCPoints $opxs]] == "" } { return 0 } set n 0 set projcs "" foreach ix $sel { foreach "x y" [lindex $opxs $ix] {} set MapLoadPos($n,x) $x ; set MapLoadPos($n,y) $y set lld [lindex $opds $ix] lappend projcs [eval Proj${proj}Point MPData $lld] incr n } if { $n == 3 } { set r [MapInitAffineTransf $projcs] } else { set r [MapInitAffineConfTransf $projcs] } if { $r != 0 } { FixMapScale $proj } return $r } proc MapReduceCPoints {xys} { # reduce a set of points given by a list of their planar # coordinates to 3 or 2 # return list of indices in $xys of selected points or "" if less than 2 # # reduction principle (suggested by Luis Damas): maximize the # minimum distance between each 2 points in a triangle # algorithm: find the leftmost 3 edges forming a triangle # in a list of triples with distance between two points and # the 2 points indices, sorted by decreasing distance if { [set n [llength $xys]] < 2 } { return "" } if { $n == 2 } { return "0 1" } # form list of triples set ds "" set ix 0 foreach p [lrange $xys 0 end-1] { foreach "x y" $p {} set ixi [expr $ix+1] foreach pi [lrange $xys 1 end] { foreach "xi yi" $pi {} set dx [expr $x-$xi] ; set dy [expr $y-$yi] lappend ds [list [expr sqrt($dx*$dx+$dy*$dy)] $ix $ixi] incr ixi } incr ix } set ds [lsort -decreasing -real -index 0 $ds] foreach t $ds { foreach "d ix0 ix1" $t {} # $ix0 < $ix1 by construction if { [catch {set s0 $seen($ix0)}] } { set seen($ix0) $ix1 if { [catch {set seen($ix1)}] } { set seen($ix1) $ix0 } else { lappend seen($ix1) $ix0 } } elseif { [catch {set s1 $seen($ix1)}] } { set seen($ix1) $ix0 lappend seen($ix0) $ix1 } elseif { [set ix2 [Intersect1 $s0 $s1]] == "" } { lappend seen($ix0) $ix1 lappend seen($ix1) $ix0 } else { # distance between $ix0 and $ix1 is the minimum of the # 3 distances, therefore if the points are colinear # $ix2 is an extreme break } } foreach n "0 1 2" { foreach "x$n y$n" [lindex $xys [set ix$n]] {} } # colinear? if { $x0 == $x2 || $x1 == $x2 } { if { abs ($x0-$x1) < 10 } { if { abs($y0-$y2) > abs($y1-$y2) } { return [list $ix2 $ix0] } return [list $ix2 $ix1] } } else { set dd02 [expr 1.0*($y0-$y2)/($x0-$x2)] set dd12 [expr 1.0*($y1-$y2)/($x1-$x2)] set ddm [expr { abs($dd02) > abs($dd12) } ? $dd02 : $dd12] if { abs(($dd02-$dd12)/$ddm) < 0.5 } { if { abs($x0-$x2) > abs($x1-$x2) } { return [list $ix2 $ix0] } return [list $ix2 $ix1] } } return [list $ix2 $ix1 $ix0] } gpsman-6.4.4.2/gmsrc/files.tcl0000644000175000017500000023562712224351120014214 0ustar migmig# # This file is part of: # # gpsman --- GPS Manager: a manager for GPS receiver data # # Copyright (c) 1998-2013 Miguel Filgueiras migfilg@t-online.de # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. # # File: files.tcl # Last change: 6 October 2013 # # See also files_foreign.tcl # and metadata.tcl for properties of known file formats # # Includes contributions by # - Brian Baulch (baulchb _AT_ onthenet.com.au) marked "BSB contribution" # - Matt Martin (matt.martin _AT_ ieee.org) marked "MGM contribution" # - Valere Robin (valere.robin _AT_ wanadoo.fr) marked "VR contribution" # - Rudolf Martin (rudolf.martin _AT_ gmx.de) marked "RM contribution" # array set FCOMMAND { format "!Format:" datum "!Datum:" pformat "!Position:" pfdatum "!PFDatum:" dates "!Creation:" 0 no 1 yes WP "!W:" RT "!R:" RS "!RS:" TR "!T:" TS "!TS:" LN "!LN:" LS "!LS:" LAP "!LAP:" GR "!G:" GRWP "!GW:" GRRT "!GR:" GRTR "!GT:" GRLN "!GL:" GRLAP "!GLAP:" GRGR "!GG:" nb "!NB:" comment "%" mapback "!Image:" mapproj "!Projection:" maptransf "!Transf:" mapscale "!Scale:" mapbackat "!Image at:" mapbackcs "!Image coords:" maporigin "!Origin:" mapinfo "!Map:" } set FCOMMARGS {RT RS TR LN LAP GR GRWP GRRT GRTR GRLN GRLAP GRGR nb format pformat pfdatum datum dates mapback mapproj maptransf maporigin mapscale mapbackat mapbackcs} # attribute-value pairs: # name of attribute, data array name, var for default value, and proc # to check value (Ignore if appropriate; proc should return 1 on error # and will be called with the value as argument) array set FATTRPAIRS { WP {{symbol WPSymbol DEFAULTSYMBOL BadSymbol} {dispopt WPDispOpt DEFAULTDISPOPT BadDispOpt} {alt WPAlt EMPTYSTR BadAltitude} {mapbak WPMBack EMPTYSTR Ignore}} RT {{width RTWidth DEFTRTWIDTH BadWidth} {colour RTColour DEFTRTCOLOUR BadColour} {mapbak RTMBack EMPTYSTR Ignore}} TR {{width TRWidth DEFTTRWIDTH BadWidth} {colour TRColour DEFTTRCOLOUR BadColour} {mapbak TRMBack EMPTYSTR Ignore}} LN {{width LNWidth DEFTLNWIDTH BadWidth} {colour LNColour DEFTLNCOLOUR BadColour} {mapbak LNMBack EMPTYSTR Ignore}} LAP {} } # needing a global variable (not array) for default colours set DEFTRTCOLOUR $MAPCOLOUR(RT) set DEFTTRCOLOUR $MAPCOLOUR(TR) set DEFTLNCOLOUR $MAPCOLOUR(LN) ##### saving proc WriteHeader {file pformt} { # write header to file in GPSMan format, using $pformt for positions global TimeOffset Datum FCOMMAND CREATIONDATE \ SFilePFrmt SFileDatum SFileHeader MESS if { $SFileHeader($file) } { if { $SFilePFrmt($file) != $pformt } { WriteChgPFormat $file $pformt } if { $SFileDatum($file) != $Datum } { WriteChgDatum $file $Datum } } else { puts $file "$FCOMMAND(comment) $MESS(written) GPSManager [NowTZ]" puts $file "$FCOMMAND(comment) $MESS(editrisk)" puts $file "" puts $file "$FCOMMAND(format) $pformt $TimeOffset $Datum" puts $file "$FCOMMAND(dates) $FCOMMAND($CREATIONDATE)" puts $file "" set SFilePFrmt($file) $pformt set SFileDatum($file) $Datum set SFileHeader($file) 1 } return } proc WriteChgPFormat {file pformt} { # write command for changing position format to file in GPSMan format global FCOMMAND SFilePFrmt puts $file "$FCOMMAND(pformat) $pformt" set SFilePFrmt($file) $pformt return } proc WriteChgDatum {file datum} { # write command for changing datum to file in GPSMan format global FCOMMAND SFilePFrmt SFileDatum puts $file "$FCOMMAND(datum) $datum" set SFileDatum($file) $datum return } proc FormatPosn {posn type} { # from position to string under given format type switch $type { latlong { return [format "%s\t%s" [lindex $posn 2] [lindex $posn 3]] } utm { return [format "%s\t%s\t%s\t%s" [lindex $posn 2] \ [lindex $posn 3] [lindex $posn 4] [lindex $posn 5]] } grid { return [format "%s\t%s\t%s" [lindex $posn 2] \ [lindex $posn 3] [lindex $posn 4]] } nzgrid { return [format "%s\t%s" [lindex $posn 2] [lindex $posn 3]] } mh { return [lindex $posn 2] } } } proc SaveNB {file obs} { # write NB data to file in GPSMan format global FCOMMAND if { $obs != "" } { puts $file "$FCOMMAND(nb)\t$obs" puts $file "" } return } proc WriteAttrPairs {file always wh ix hidden} { # write attribute-value pairs and hidden information for item # with index $ix # $wh in {WP, RT, TR, LN} # $always is a flag set when the pairs must be always written out, # otherwise they will be written only if they differ from their # default value # no newline is written! global FATTRPAIRS foreach fd $FATTRPAIRS($wh) { set an [lindex $fd 1] ; set dv [lindex $fd 2] global $an $dv set x [set [set an]($ix)] if { $always || $x != [set $dv] } { puts -nonewline $file "\t[lindex $fd 0]=$x" } } foreach h $hidden { puts -nonewline $file "\t$h" } return } proc WriteWPsRSs {file ixs stages} { # write WPs with indices in list $ixs and RT $stages (may be void) to # file in GPSMan format global WPName WPCommt WPObs WPPFrmt WPPosn WPDatum WPDate WPHidden \ CREATIONDATE SFilePFrmt SFileDatum POSTYPE foreach i $ixs st $stages { if { [SlowOpAborted] } { return } if { $i != -1 } { if { $WPPFrmt($i) != $SFilePFrmt($file) } { WriteChgPFormat $file $WPPFrmt($i) } if { $WPDatum($i) != $SFileDatum($file) } { WriteChgDatum $file $WPDatum($i) } set p [FormatPosn $WPPosn($i) $POSTYPE($SFilePFrmt($file))] if { $CREATIONDATE } { puts -nonewline $file \ "$WPName($i)\t$WPCommt($i)\t$WPDate($i)\t$p" } else { puts -nonewline $file "$WPName($i)\t$WPCommt($i)\t$p" } WriteAttrPairs $file 0 WP $i $WPHidden($i) puts $file "" SaveNB $file $WPObs($i) } else { puts $file "UNDEF" } if { $st != "" } { WriteRTStage $file $st } } puts $file "" return } proc WriteRTStage {file stage} { # write a non-empty RT stage to file in GPSMan format global FCOMMAND DataIndex set c [lindex $stage $DataIndex(RScommt)] set l [lindex $stage $DataIndex(RSlabel)] puts -nonewline $file "$FCOMMAND(RS)\t$c\t$l" foreach h [lindex $stage $DataIndex(RShidden)] { puts -nonewline $file "\t$h" } puts $file "" return } proc JustfLeft {n string} { # justify string left to get a $n-characters string set k [expr $n-[string length $string]] if { $k > 0 } { set sp [format "%${k}s" " "] return [append string $sp] } return $string } proc SaveWP {file ixs} { # save data for WPs with indices in list $ixs to file in GPSMan format global FCOMMAND PositionFormat WriteHeader $file $PositionFormat puts $file $FCOMMAND(WP) WriteWPsRSs $file $ixs "" return } proc SaveRT {file ixs} { # save data for RTs with indices in list $ixs to file in GPSMan format global FCOMMAND RTIdNumber RTCommt RTObs RTWPoints RTStages \ PositionFormat MESS WriteHeader $file $PositionFormat foreach i $ixs { if { [SlowOpAborted] } { return } set wpixs [Apply "$RTWPoints($i)" IndexNamed WP] if { [Undefined $wpixs] } { GMMessage [format $MESS(undefWP) $RTIdNumber($i)] } else { puts -nonewline $file \ "$FCOMMAND(RT)\t$RTIdNumber($i)\t$RTCommt($i)" WriteAttrPairs $file 1 RT $i "" puts $file "" SaveNB $file $RTObs($i) WriteWPsRSs $file $wpixs $RTStages($i) } } return } proc SaveTR {file ixs} { # save data for TRs with indices in list $ixs to file in GPSMan format global FCOMMAND TRName TRObs TRDatum TRTPoints TRSegStarts TRHidden \ DataIndex SFileDatum WriteHeader $file DMS set ilt $DataIndex(TPlatDMS) ; set ilg $DataIndex(TPlongDMS) set idt $DataIndex(TPdate) set ial $DataIndex(TPalt) ; set idp $DataIndex(TPdepth) foreach i $ixs { if { [SlowOpAborted] } { return } if { $TRDatum($i) != $SFileDatum($file) } { WriteChgDatum $file $TRDatum($i) } puts -nonewline $file [format "%s\t%s" $FCOMMAND(TR) $TRName($i)] WriteAttrPairs $file 1 TR $i $TRHidden($i) puts $file "" SaveNB $file $TRObs($i) set ssts $TRSegStarts($i) set tpn 0 ; set nsst [lindex $ssts 0] foreach tp $TRTPoints($i) { if { [SlowOpAborted] } { return } if { $nsst == $tpn } { puts $file $FCOMMAND(TS) set ssts [lreplace $ssts 0 0] set nsst [lindex $ssts 0] } incr tpn set alt [lindex $tp $ial] ; set dep [lindex $tp $idp] if { $dep == "" } { if { $alt == "" } { puts $file [format "\t%s\t%s\t%s" [lindex $tp $idt] \ [lindex $tp $ilt] [lindex $tp $ilg]] } else { puts $file [format "\t%s\t%s\t%s\t%s" [lindex $tp $idt] \ [lindex $tp $ilt] [lindex $tp $ilg] $alt] } } else { puts $file [format "\t%s\t%s\t%s\t%s\t%s" [lindex $tp $idt] \ [lindex $tp $ilt] [lindex $tp $ilg] $alt $dep] } } puts $file "" } return } proc SaveLN {file ixs} { # save data for LNs with indices in list $ixs to file in GPSMan format global FCOMMAND LNName LNObs LNDatum LNPFrmt LNLPoints LNSegStarts \ LNWidth LNColour DataIndex SFileDatum SFilePFrmt WriteHeader $file $LNPFrmt([lindex $ixs 0]) set iposn $DataIndex(LPposn) ; set ialt $DataIndex(LPalt) foreach i $ixs { if { [SlowOpAborted] } { return } if { $LNDatum($i) != $SFileDatum($file) } { WriteChgDatum $file $LNDatum($i) } if { $LNPFrmt($i) != $SFilePFrmt($file) } { WriteChgPFormat $file $LNPFrmt($i) } puts -nonewline $file [format "%s\t%s" $FCOMMAND(LN) $LNName($i)] WriteAttrPairs $file 1 LN $i "" puts $file "" SaveNB $file $LNObs($i) set ssts $LNSegStarts($i) set lpn 0 ; set nsst [lindex $ssts 0] foreach lp $LNLPoints($i) { if { [SlowOpAborted] } { return } if { $nsst == $lpn } { puts $file $FCOMMAND(LS) set ssts [lreplace $ssts 0 0] set nsst [lindex $ssts 0] } incr lpn puts $file "\t[lindex $lp $iposn]\t[lindex $lp $ialt]" } puts $file "" } return } proc SaveLAP {file ixs} { # save data for LAPs with indices in list $ixs to file in GPSMan format global FCOMMAND LAPName LAPObs LAPDur LAPDist LAPBegPosn LAPEndPosn \ LAPCals LAPTRIx LAPPFrmt LAPDatum SFileDatum SFilePFrmt WriteHeader $file $LAPPFrmt([lindex $ixs 0]) foreach i $ixs { if { [SlowOpAborted] } { return } if { $LAPDatum($i) != $SFileDatum($file) } { WriteChgDatum $file $LAPDatum($i) } if { $LAPPFrmt($i) != $SFilePFrmt($file) } { WriteChgPFormat $file $LAPPFrmt($i) } puts -nonewline $file [format "%s\t%s\t" $FCOMMAND(LAP) $LAPName($i)] puts -nonewline $file "$LAPDur($i)\t$LAPDist($i)\t" puts -nonewline $file "[lrange $LAPBegPosn($i) 2 end]\t" puts -nonewline $file "[lrange $LAPEndPosn($i) 2 end]\t" puts $file "$LAPCals($i)\t$LAPTRIx($i)" SaveNB $file $LAPObs($i) } return } proc SaveGR {file ixs} { # save data for GRs with indices in list $ixs to file in GPSMan format global SFileHeader TYPES SUPPORTLAPS FCOMMAND MESS GRName GRObs GRConts set gtypes $TYPES if { $SUPPORTLAPS } { lappend gtypes LAP } foreach wh $gtypes { set l [GRsElements $ixs 1 $wh] if { $wh != "GR" } { if { $l != "" } { Save$wh $file $l if { [SlowOpAborted] } { return } } } else { set nixs $l } } if { ! $SFileHeader($file) } { puts $file "$FCOMMAND(comment) $MESS(written) GPSManager [NowTZ]" puts $file "" } foreach i $nixs { puts $file [format "%s\t%s" $FCOMMAND(GR) $GRName($i)] SaveNB $file $GRObs($i) foreach p $GRConts($i) { if { [SlowOpAborted] } { return } set c $FCOMMAND(GR[lindex $p 0]) foreach e [lindex $p 1] { puts $file [format "%s\t%s" $c "$e"] set c "" } } puts $file "" } return } proc SaveWPDistBear {file w} { # save distances and bearings between WPs from window $w puts $file [$w.fr.fromto cget -text] puts $file "" puts $file [$w.fr.fr1.dist cget -text] puts $file [$w.fr.fr1.bear cget -text] puts $file "" return } proc SaveWPNearest {file w} { # save nearest WPs information from window $w global MESS puts $file [$w.fr.from cget -text] puts $file "" puts $file $MESS(WPNearest) set fb $w.fr.fr1.frbx foreach n [$fb.bxn get 0 end] d [$fb.bxd get 0 end] b [$fb.bxb get 0 end] { if { [SlowOpAborted] } { return } puts $file "$n\t$d\t$b" } puts $file "" return } proc SaveRTComp {file w} { # save results of RT computation from window $w global MESS puts $file [$w.fr.fr1.ntitle cget -text] puts $file $MESS(RTcomp) set w $w.fr.fr3.fr31 foreach n [$w.frbx.bxn get 0 end] \ p [$w.frbx.box get 0 end] \ d [$w.frbx.bxd get 0 end] \ b [$w.frbx.bxb get 0 end] \ da [$w.frbx.bxda get 0 end] \ sc [$w.frbx.bxsc get 0 end] \ sl [$w.frbx.bxsl get 0 end] { if { [SlowOpAborted] } { return } puts $file "$n\t$p\t$d\t$b\t$da\t$sc\t$sl" } puts $file [$w.frt.tt cget -text] puts $file "" return } proc SaveTRComp {file w} { # save results of TR computation from window $w global MESS puts $file [$w.fr.fr1.ntitle cget -text] puts $file $MESS(TRcomp) set w $w.fr.fr3 foreach n [$w.frbx.bxn get 0 end] \ d [$w.frbx.bxd get 0 end] \ la [$w.frbx.bxlat get 0 end] \ lo [$w.frbx.bxlong get 0 end] \ a [$w.frbx.bal get 0 end] \ l [$w.frbx.bxl get 0 end] \ tl [$w.frbx.btl get 0 end] \ dt [$w.frbx.bdt get 0 end] \ s [$w.frbx.bsp get 0 end] \ b [$w.frbx.bbg get 0 end] { if { [SlowOpAborted] } { return } puts $file "$n\t$d\t$la\t$lo\t$a\t$l\t$tl\t$dt\t$s\t$b" } foreach k {td tt} { puts $file [$w.frt.$k cget -text] } if { [winfo exists $w.frtng] } { foreach k {td tt} { puts $file [$w.frtng.$k cget -text] } } foreach k {avg max min} { puts $file [$w.frsp.$k cget -text] } # RM contribution foreach k {avg trt} { puts $file [$w.frrest.$k cget -text] } #=== if { [winfo exists $w.frmxnalt] } { foreach k {mx mn} { puts $file [$w.frmxnalt.$k cget -text] } if { [winfo exists $w.frcad] } { foreach k {cumula cumuld thresh} { puts $file [$w.frcad.$k cget -text] } } } puts $file "[$w.frd0.toend cget -text] [$w.frd0.max cget -text]" puts $file "" return } proc SavePVTData {file args} { # save real-time log (Garmin PVT) information global TXT puts $file $TXT(realtimelog) set fx .pvt.fri.frtbx foreach bname "d lat long alt fix epe eph epv velx vely velz trk" { puts -nonewline $file "[$fx.tit$bname cget -text]\t" set $bname [$fx.bx$bname get 0 end] } puts $file "" ; puts $file "" foreach xd $d xlat $lat xlong $long xalt $alt xfix $fix xepe $epe \ xeph $eph xepv $epv xvelx $velx xvely $vely xvelz $velz xtrk $trk { if { [SlowOpAborted] } { return } puts $file "$xd\t$xlat\t$xlong\t$xalt\t$xfix\t$xepe\t$xeph\t$xepv\t$xvelx\t$xvely\t$xvelz\t$xtrk" } puts $file "" return } proc SaveMapBkInfo {file args} { # save map background information # $args: list with path to image file, projection data, transformation # data, scale, and data on subsidary images # projection and transformation data are lists with a name and a sequence # of attribute=value pairs # data on subsidary images consists of 2 lists of pairs: one with grid # coordinates and path, and the other one with canvas coordinates of NW # corner and path global Datum FCOMMAND MESS set args [lindex $args 0] puts $file "$FCOMMAND(comment) $MESS(written) GPSManager [NowTZ]" puts $file "$FCOMMAND(comment) $MESS(edityourrisk)" puts $file "" puts $file "$FCOMMAND(mapback) [lindex $args 0]" puts $file "$FCOMMAND(datum) $Datum" set pd [lindex $args 1] puts -nonewline $file "$FCOMMAND(mapproj) [lindex $pd 0]" foreach p [lrange $pd 1 end] { puts -nonewline $file "\t$p" } puts $file "" set pt [lindex $args 2] puts -nonewline $file "$FCOMMAND(maptransf) [lindex $pt 0]" foreach p [lrange $pt 1 end] { puts -nonewline $file "\t$p" } puts $file "" puts $file "$FCOMMAND(mapscale) [lindex $args 3]" puts $file "" foreach ixsp [lindex $args 4] { puts $file "$FCOMMAND(mapbackat) [lindex $ixsp 0] [lindex $ixsp 1]" } puts $file "" foreach csp [lindex $args 5] { puts $file "$FCOMMAND(mapbackcs) [lindex $csp 0] [lindex $csp 1]" } puts $file "" return } proc SaveMapInfo {file args} { # save map datum, projection, transformation, grid and scale # $args is list with projection data, transformation data, position # format of coordinates, datum for coordinates and scale # projection and transformation data are lists with a name and a sequence # of attribute=value pairs global Datum FCOMMAND MESS set args [lindex $args 0] puts $file "$FCOMMAND(comment) $MESS(written) GPSManager [NowTZ]" puts $file "$FCOMMAND(comment) $MESS(edityourrisk)" puts $file "" puts $file $FCOMMAND(mapinfo) puts $file "$FCOMMAND(datum) $Datum" set pd [lindex $args 0] puts -nonewline $file "$FCOMMAND(mapproj) [lindex $pd 0]" foreach p [lrange $pd 1 end] { puts -nonewline $file "\t$p" } puts $file "" set pt [lindex $args 1] puts -nonewline $file "$FCOMMAND(maptransf) [lindex $pt 0]" foreach p [lrange $pt 1 end] { puts -nonewline $file "\t$p" } puts $file "" puts $file "$FCOMMAND(pformat) [lindex $args 2]" puts $file "$FCOMMAND(pfdatum) [lindex $args 3]" puts $file "$FCOMMAND(mapscale) [lindex $args 4]" puts $file "" return } proc SaveGREls {how args} { # save elements of group to file in GPSMan format # if file != "stdout" file will be closed at the end # $how==all: all elements in all groups # $how==select: groups and element types chosen from list # $args not used but in call-back global GRName SFilePFrmt SFileDatum SFileHeader TYPES SUPPORTLAPS MESS TXT set gtypes $TYPES if { $SUPPORTLAPS } { lappend gtypes LAP } switch $how { all { set ixs [array names GRName] set whs $gtypes } select { if { [set ixs [ChooseItems GR]] == "" } { return } set ts "" foreach k $gtypes { lappend ts $TXT(name$k) } if { [set whs \ [GMChooseFrom many $MESS(putwhat) 6 $ts $gtypes]] == "" } { return } } } set f [GMOpenFile $TXT(saveto) GR w] if { $f != ".." } { set sid [SlowOpWindow $TXT(save)] set SFileHeader($f) 0 if { [set i [lsearch -exact $whs GR]] != -1 } { set whs [lreplace $whs $i $i] set r 1 } else { set r 0 } foreach wh $whs { if { [set l [GRsElements $ixs $r $wh]] != "" } { Save${wh} $f $l } } catch { unset SFilePFrmt($f) ; unset SFileDatum($f) unset SFileHeader($f) } if { $f != "stdout" } { close $f } SlowOpFinish $sid "" } return } proc SaveFile {how what args} { # save information to file in GPSMan format # $how==comp: computation results; # $what in {WPDistBear, WPNearest, RTComp, TRComp, PVTData} # $args: normally the window containing the information; see # procs Save$what # $how==all: all items of type $what # $what in $TYPES or $what=="LAP" or $what=="Data" # $how==state: as "all" but without slow operation dialog # $how==select: items of type $what chosen from list # $what in $TYPES or $what=="LAP" # $how==mapback: map background image information # (used when saving state: no slow operation dialog) # $what: MapBkInfo # $args: see proc SaveMapBkInfo # $how==mapinfo: map projection, transformation, position format and scale # (used when saving state: no slow operation dialog) # $what: MapInfo # $args: see proc SaveMapInfo eval [list SaveFileTo {} $how $what $args] return } proc SaveFileTo {f how what args} { # save information to file $f in GPSMan format # if $f=="" ask user to select output file # if $f!="stdout" file will be closed at the end # file can be appended to if it exists only when $how=="comp" or # $APPGMDATAFILE is non-zero # see proc SaveFile for the description of the arguments global SFilePFrmt SFileDatum SFileHeader TXT TYPES SUPPORTLAPS File \ APPGMDATAFILE set stypes $TYPES if { $SUPPORTLAPS } { lappend stypes LAP } if { $how == "state" } { set slow 0 } else { set slow 1 } if { $APPGMDATAFILE } { set mode wapp } else { set mode w } switch $how { all - state { set lp [AllIndicesForType $what $stypes] } select { if { [set ixs [ChooseItems $what]] == "" } { return } set lp [list [list $what $ixs]] } comp { set mode wapp } mapinfo - mapback { set slow 0 } } set oldf $f if { $f != "" || [set f [GMOpenFile $TXT(saveto) $what $mode]] != ".." } { if { $slow } { set sid [SlowOpWindow $TXT(save)] } else { SetCursor . watch } set SFileHeader($f) 0 switch $how { comp - mapinfo { Save${what} $f $args } mapback { Save${what} $f $args if { $oldf == "" } { Define backgrnd "" $File(MapBkInfo) "" } } default { foreach p $lp { Save[lindex $p 0] $f [lindex $p 1] } } } catch { unset SFilePFrmt($f) ; unset SFileDatum($f) unset SFileHeader($f) } if { $f != "stdout" } { close $f } if { $slow } { SlowOpFinish $sid "" } else { ResetCursor . } } return } ## saving/restoring state proc SaveState {} { # save current state of interface and current data # slow operation dialog not used global USvState USvData USvMap MESS Number MapEmpty Map TYPES EdWindow \ MapPFormat MapPFDatum MapPFNeedsDatum MapFont Travelling Travel \ GMEd SUPPORTLAPS File set stypes $TYPES if { $SUPPORTLAPS } { lappend stypes LAP } set todispl "" ; set toopen "" if { $Number(Data) != 0 } { if { [catch {set f [open $USvData w]}] } { GMMessage [format $MESS(cantwrtsstate) $USvData] return } set saveddata $USvData SaveFileTo $f state Data foreach wh $stypes { global ${wh}Displ set ns "" ; set os "" foreach ix [array names ${wh}Displ] { set name [NameOf $wh $ix] if { [set [set wh]Displ($ix)] } { lappend ns $name } if { [winfo exists .gm${wh}sh$ix] } { lappend os $name } } if { [winfo exists $EdWindow($wh)] && $GMEd($wh,Index) != -1 } { set os [linsert $os 0 [NameOf $wh $GMEd($wh,Index)]] } if { $ns != "" } { lappend todispl [list $wh $ns] } if { $os != "" } { lappend toopen [list $wh $os] } } } else { set saveddata "" } if { ! $MapEmpty } { if { [catch {set f [open $USvMap w]}] } { GMMessage [format $MESS(cantwrtsstate) $USvMap] return } set savedmap $USvMap if { [$Map find withtag mapimage] != "" } { set mapfile Back SaveMapBack $f } else { set mapfile Params SaveMapParams $f } } else { set savedmap "" } if { [catch {set f [open $USvState w]}] } { GMMessage [format $MESS(cantwrtsstate) $USvState] return } puts $f "" puts $f "# $MESS(written) GPSManager [NowTZ]" puts $f "# $MESS(editrisk)" puts $f "" puts $f "set saveddata \"$saveddata\"" puts $f "set todispl \{$todispl\}" puts $f "set toopen \{$toopen\}" puts $f "" puts $f "set savedmap \"$savedmap\"" if { $savedmap != "" } { puts $f "set mapfile \"$mapfile\"" puts $f "set mappformat \"$MapPFormat\"" puts $f "set mappfdatum \"$MapPFDatum\"" puts $f "set mappfndatum \"$MapPFNeedsDatum\"" puts $f "set mapfont \"$MapFont\"" } puts $f "" puts $f "set Travelling \"$Travelling\"" puts $f "array set Travel \{" foreach p $Travel(tosave) { foreach n [array names Travel $p] { puts $f " $n \{$Travel($n)\}" } } puts $f "\}" puts $f "" puts $f "array set File \{" foreach n [array names File] { puts $f " $n \{$File($n)\}" } puts $f "\}" puts $f "" # must be the last instruction: puts $f "if \{ \[catch \{cd \"[pwd]\"\}\] \} \{" puts $f " set saved \"[pwd]\"" puts $f "\} else \{ set saved 1 \}" puts $f "" close $f return } proc RestoreState {} { # restore saved state and clear it if the user agrees global USvState MESS CREATIONDATE Proc DELSTATE MapPFormat Map MapFont \ Travelling Travel MapEmpty ASKPROJPARAMS Datum MapPFDatum \ MapPFNeedsDatum File if { [file size $USvState] == 0 } { return } # assumed to be in system encoding source $USvState if { [catch {set saved}] } { GMMessage [format $MESS(corruptsstate) $USvState] return } if { $saved != 1 } { GMMessage [format $MESS(couldntcd) $saved] } if { $DELSTATE == "always" || \ ( $DELSTATE == "ask" && [GMConfirm $MESS(delsstate)] ) } { set del 1 } else { set del 0 } if { $savedmap != "" } { if { $mapfile == "Back" } { set r [LoadMapFixedBk $savedmap] if { $r == -1 } { return } if { [lindex $r 0] != 1 } { GMMessage "$MESS(badfile): $savedmap" return } set MapEmpty 0 eval LoadMapBackGeoRef [lrange $r 1 end] } else { # $mapfile == "Params" set r [LoadMapInfo $savedmap] if { $r == -1 } { return } eval LoadMapParams $r } set MapPFormat $mappformat # compatibility with 6.1.2 and older versions if { [catch {set mappfdatum}] } { set MapPFDatum $Datum ChangeMapPFormat $MapPFormat } else { set MapPFDatum $mappfdatum ; set MapPFNeedsDatum $mappfndatum } if { ! [catch {set mapfont}] } { set MapFont $mapfont } if { $del } { file delete -- $savedmap } } if { $saveddata != "" } { if { [catch {set f [open $saveddata r]}] } { GMMessage [format $MESS(cantrdsstate) $saveddata] return } if { [LoadFileFrom $f Data] == 0 } { return } if { $del } { file delete -- $saveddata } } set a $ASKPROJPARAMS ; set ASKPROJPARAMS 0 foreach p $todispl { set wh [lindex $p 0] foreach n [lindex $p 1] { if { [set ix [IndexNamed $wh $n]] != -1 } { PutMap $wh $ix } } } set ASKPROJPARAMS $a foreach p $toopen { set wh [lindex $p 0] if { $wh == "LAP" } { set opts "change revert forget cancel" } else { set opts "change revert create forget cancel" } foreach n [lindex $p 1] { if { [set ix [IndexNamed $wh $n]] != -1 } { $Proc($wh) $ix $opts [ItemData $wh $ix] set opts "" } } } if { $del } { file delete -- $USvState } # delete logo $Map delete dummy if { $Travelling } { set Travelling 0 ToTravel } return } ## saving canvas to Postscript or other format proc SaveCanvas {cv bounds fmt dest} { # save canvas $c to file or printer under format $fmt # $bounds is bounding box of visible part of canvas # (should be set to "" if there is no need for it) # $fmt is either PS, or in $ImgOutFormats (if the Img library is loaded) # and probably will be PS if $dest==printer # $dest in {file, printer} # items with tag "temp" can be created in and deleted from $cv # if $cv==$Map inclusion of map scale is an option # when printing, a temporary file named "print.tmp" is created in the # user GPSMan temporary files directory global PRINTCMD PAPERSIZE PAGEWIDTH PAGEHEIGHT GFMode GFRot \ GFPaper GFLegend GFOnlyVisible GFScale GFPrintOption MESS TXT \ MAPCOLOUR Map MpW MAPSCLENGTH USERTMPDIR MapFont FixedFont set leg "=$TXT(legend)" set cms [list $TXT(colour) $TXT(grey) $TXT(mono)] set GFOnlyVisible 0 ; set GFMode $TXT(colour) switch $fmt { PS { set vs {GFLegend GFMode GFRot GFPaper} set pps [array names PAGEWIDTH] if { [set i [lsearch -exact $pps $PAPERSIZE]] != 0 } { set pps [linsert [lreplace $pps $i $i] 0 $PAPERSIZE] } set ds [list $leg $cms [list $TXT(portr) $TXT(landsc)] $pps] } jpeg { set vs {GFLegend GFMode} set ds [list $leg [lreplace $cms 2 2]] } default { set vs {GFLegend} set ds [list $leg] } } if { $bounds != {} && $fmt == "PS" } { set vs [linsert $vs 1 GFOnlyVisible] set ds [linsert $ds 1 "@$TXT(psvisible)"] } if { $cv == $Map } { set GFScale 1 set vs [linsert $vs 1 GFScale] set ds [linsert $ds 1 "@$TXT(incscale)"] set font $MapFont } else { set GFScale 0 set font $FixedFont } switch $dest { file { set fn [GMGetFileName $TXT(saveto) Plot w $vs $ds] } printer { if { $PRINTCMD == "" } { GMMessage $MESS(noprintcmd) return } lappend vs GFPrintOption lappend ds "=$TXT(printopt)" if { ! [GMChooseParams $TXT(print) $vs $ds] } { return } set fn [file join $USERTMPDIR print.tmp] } } if { $fn != ".." } { SetCursor . watch foreach m $cms tm {color gray mono} { if { $GFMode == $m } { set GFMode $tm break } } if { $GFOnlyVisible && $mbs != {} } { set mbs $bounds } else { set mbs [$cv bbox all] } foreach {x0 y0 xf yf} $mbs { break } set sm [expr ($xf+$x0)/2.0] if { $GFScale } { # only applies when $cv == $Map set m $MAPSCLENGTH ; set m2 [expr $m/2.0] scan [$MpW.frm.frmap3.fr3.cv.val cget -text] "%f %s" sc su if { [set xs0 [expr $sm-$m2]] < $x0 } { set m $m2 if { [set xs0 [expr $sm-$m/2.0]] < $x0 } { set x0 $xs0 } set sc [expr $sc/2.0] if { int($sc) != $sc } { set sc [format "%.1f" $sc] } else { set sc [expr int($sc)] } } if { [set xsf [expr $xs0+$m]] > $xf } { set xf $xsf } if { $GFOnlyVisible } { set ys [expr $yf-100] } else { set ys [expr $yf+60] ; set yf [expr $ys+10] } set yd [expr $ys-7.5] ; set ylf [expr $ys+7.5] $Map create line $xs0 $ys $xsf $ys -arrow both \ -fill $MAPCOLOUR(mapsel) -tags temp $Map create line $xs0 $yd $xs0 $ylf -fill $MAPCOLOUR(mapsel) \ -tags temp $Map create line $xsf $yd $xsf $ylf -fill $MAPCOLOUR(mapsel) \ -tags temp $Map create text $sm [expr $ys-8] -font $font \ -fill $MAPCOLOUR(mapsel) -text "$sc $su" -tags temp } if { $GFLegend != "" } { if { $GFOnlyVisible } { set yt [expr $yf-60] } else { set yt [expr $yf+20] ; set yf [expr $yt+5] } $cv create text $sm $yt -font $font \ -fill $MAPCOLOUR(mapleg) -text $GFLegend -tags temp } switch $fmt { PS { set rot [expr [string compare $GFRot $TXT(portr)]!=0] set h [expr $yf-$y0+100] ; set w [expr $xf-$x0+100] if { $h > $w } { set sc "-pageheight" if { $rot } { set sca $PAGEWIDTH($GFPaper) } else { set sca $PAGEHEIGHT($GFPaper) } } else { set sc "-pagewidth" if { $rot } { set sca $PAGEHEIGHT($GFPaper) } else { set sca $PAGEWIDTH($GFPaper) } } if { $GFOnlyVisible } { $cv postscript -file $fn -colormode $GFMode $sc $sca \ -rotate $rot } else { $cv postscript -file $fn -width $w -height $h \ -colormode $GFMode $sc $sca -rotate $rot \ -x [expr $x0-50] -y [expr $y0-50] } } default { raise [winfo toplevel $cv] update after 500 while { [catch {set im [image create photo -format window \ -data $Map]}] } { if { ! [GMConfirm $MESS(unobscmap)] } { ResetCursor . return } after 2000 } if { $fmt == "jpeg" && $GFMode == "gray" } { if { [catch {$im write $fn -format jpeg -grayscale}] } { GMMessage [format $MESS(cantwrtimg) $fmt] } } else { if { [catch {$im write $fn -format $fmt}] } { GMMessage [format $MESS(cantwrtimg) $fmt] } } image delete $im } } $cv delete temp if { $dest == "printer" } { if { $GFPrintOption != "" } { exec $PRINTCMD $GFPrintOption [glob $fn] } else { exec $PRINTCMD [glob $fn] } file delete -- $fn } ResetCursor . } return } ##### loading proc OpenInputFileFails {what fmt} { # open file for loading/importing and set initial values # $what in $TYPES or $what=="LAP" or $what=="Data" # $fmt is such that "in" is in $FILEFORMAT($fmt,mode) # return 0 unless operation is to be cancelled global CREATIONDATE GFVisible TXT MESS FILEFORMAT SHOWFILEITEMS set params "" ; set parwidgts "" if { ! [catch {set pars $FILEFORMAT($fmt,in,params)}] } { set vrcvct "" ; set dvs $FILEFORMAT($fmt,in,pdefts) foreach p $pars dv $dvs { if { [regexp {^global:(.+)$} $dv m dvv] } { global $dvv set dv [set $dvv] } set ff $FILEFORMAT($fmt,param,$p) if { [llength $ff] < 4 } { BUG bad FILEFORMAT param } foreach "var cv ct widgt" $FILEFORMAT($fmt,param,$p) { break } global $var set $var $dv lappend params $var # this needs the global TXT lappend parwidgts [subst $widgt] lappend vrcvct $var $cv $ct } } else { set pars "" } switch $fmt { GPSMan { set for loadfrm ; set cr $CREATIONDATE } GPStrans { # some code for loading GPSMan is used for importing GPStrans set for importfrm ; set cr 1 } default { # incorporates MGM contribution # incorporates VR contribution set for importfrm ; set cr 0 } } # mapping items is always an option set GFVisible $SHOWFILEITEMS lappend params GFVisible lappend parwidgts "@$TXT(mapitems)" while 1 { set f [GMOpenFileParms $TXT($for) $what r $params $parwidgts] if { $f == ".." } { EndWPRenaming return 1 } set ok 1 if { $pars != "" } { set vrctvl "" foreach p $pars dv $dvs "var cv ct" $vrcvct { set val [set $var] if { [catch {eval $cv}] } { set ms badconv ; set ok 0 break } lappend vrctvl $var $ct $val } if { $ok } { foreach p $pars dv $dvs "var ct val" $vrctvl { if { [catch {set r [eval $ct]}] || $r == 0 } { set ms badprmval ; set ok 0 break } set $var $val } } } if { $ok } { break } GMMessage [format $MESS($ms) $p $val] wait set $var $dv } InitInputFileVars $f $what $cr $GFVisible return 0 } proc InitInputFileVars {f what cr vis} { # initialise input file $f global variables # $what in $TYPES or $what=="LAP" or $what=="Data" # $cr set if creation date is in use # $vis set if must display items read in global LFileLNo LFileCreat LFileBuffFull LFileEOF LFileDefs LFileVisible \ LFileTimeOff LFileSlowId LChannel TXT set sid [SlowOpWindow $TXT(fread)] set LChannel($what) $f ; set LFileSlowId($f) $sid set LFileLNo($f) 0 ; set LFileCreat($f) $cr ; set LFileTimeOff($f) "" set LFileBuffFull($f) 0 ; set LFileEOF($f) 0 set LFileDefs($f) 0 ; set LFileVisible($f) $vis return 0 } proc CloseInputFile {what} { # close file opened for loading/importing and unset some global variables # if file is "stdin" it will not be closed # $what in $TYPES or $what=="LAP" global LFilePFrmt LFileDatum LFileLNo LFileCreat \ LFileId LFileOther LFileBuff LFileBuffFull LFileEOF LFileDefs \ LFileVisible LFileTimeOff LFileSlowId LChannel set f $LChannel($what) if { $f != "stdin" } { close $f } set sid $LFileSlowId($f) foreach v "LFilePFrmt($f) LFileDatum($f) LFileTimeOff($f) \ LFileLNo($f) LFileCreat($f) LFileDefs($f) LFileId($f) \ LFileOther($f) LFileBuff($f) LFileBuffFull($f) \ LFileEOF($f) LFileVisible($f) LFileSlowId($f) \ LChannel($what)" { catch { unset $v } } SlowOpFinish $sid "" return } # encodings in Tcl proc TclEncodingName {enc} { # tries to convert $enc to a Tcl encoding name global MESS set lenc [string tolower $enc] switch -glob -- $lenc { iso* { regsub {^iso[-_]} $lenc iso enc } utf8 { return utf-8 } utf16* { # not supported by Tcl 8.4 set enc utf-16 } latin1 - us-ascii { return iso8859-1 } latin[2-4] { set enc iso8859-[string index $lenc 5] } latin[56] { set enc iso8859-[expr [string index $lenc 5]+4] } latin[89] { set enc iso8859-[expr [string index $lenc 5]+6] } latin10 { set enc iso8859-16 } mac* - x11controlchars { # keep the original name for uppercase letters } default { set enc $lenc } } if { [lsearch -exact [encoding names] $enc] == -1 } { GMMessage [format $MESS(unknownenc) $enc] } return $enc } # buffered reading proc ReadFileNL {file} { # buffered read from file a line (may be empty) at a time # uses and sets: # buffer LFileBuff, flag LFileBuffFull set if buffer contents not used # flag LFileEOF, line counter LFileLNo global LFileBuffFull LFileBuff LFileLNo LFileEOF if { $LFileEOF($file) } { return "" } if { $LFileBuffFull($file) } { set LFileBuffFull($file) 0 } else { if { [eof $file] } { set LFileEOF($file) 1 return "" } gets $file LFileBuff($file) ; incr LFileLNo($file) } return $LFileBuff($file) } proc ReadFile {file} { # buffered read from file a line at a time skipping empty lines # uses and sets: # buffer LFileBuff, flag LFileBuffFull set if buffer contents not used # flag LFileEOF, line counter LFileLNo global LFileBuffFull LFileBuff LFileLNo LFileEOF if { $LFileEOF($file) } { return "" } if { $LFileBuffFull($file) } { set LFileBuffFull($file) 0 } else { if { [eof $file] } { set LFileEOF($file) 1 return "" } gets $file LFileBuff($file) ; incr LFileLNo($file) while { $LFileBuff($file) == "" } { if { [eof $file] } { set LFileEOF($file) 1 return "" } gets $file LFileBuff($file) ; incr LFileLNo($file) } } return $LFileBuff($file) } # reading utilities proc ChopInString {m s} { # deletes prefix of length $m and leading spaces and tabs from string $s return [string trimleft [string range "$s" [string length "$m"] end] " \t"] } proc CleanLine {m importing} { # deletes leading/trailing blanks, and, if not importing, comments global FCOMMAND set m [string trim $m " "] if { ! $importing && [string first $FCOMMAND(comment) $m] == 0 } { return "" } return $m } # parsing proc MakeComment {commt} { # try to change comment to fit to acceptable character set and length; # on failure return "" global COMMENTLENGTH NOLOWERCASE if { ! [CheckChars Ignore $commt] } { if { $NOLOWERCASE } { set commt [string toupper $commt] } regsub -all {:\.} $commt "" commt } if { ! [CheckChars Ignore $commt] } { return "" } if { [string length $commt] > $COMMENTLENGTH } { set commt [string trim $commt "\ \t"] } if { [string length $commt] > $COMMENTLENGTH } { set commt [string range $commt 0 [expr $COMMENTLENGTH-1]] } return $commt } proc FindPFormat {line} { # parse position format; position format names cannot have blanks global NONGRIDFMTS GRIDS if { [regexp {^([^ ]+)} $line x pf] } { foreach f $NONGRIDFMTS { if { $f == $pf } { return $f } } foreach i $GRIDS { if { $i == $pf } { return $i } } } return BAD } proc BadFilePTArgs {file name list params f cf} { # parse arguments of projection or transformation command # $f in {Proj, Transf} # $cf in {PROJ, TRANSF} # LFile${f}($file) is set to list with name and list of pairs with # parameter name and value # return 0 if correct global LFile${f} MESS set l "" foreach av [lrange $list 1 end] { set fp [split $av =] if { [llength $fp] != 2 } { GMMessage "$MESS(badfield): $f" return 1 } set fn [lindex $fp 0] if { [set i [lsearch -exact $params $fn]] == -1 } { if { $name == "UTM" && $fn == "long0" } { # parameter name changed after version 6.0.1 set fn m_0 set i [lsearch -exact $params $fn] } else { GMMessage "$MESS(badattr): $fn" return 1 } } set params [lreplace $params $i $i] lappend l [list $fn [lindex $fp 1]] } if { $params != "" } { GMMessage "$MESS(missattrs): $params" return 1 } set LFile${f}($file) [list $name $l] return 0 } proc FilePTComm {file f cf line} { # parse projection or transformation command # $f in {Proj, Transf} # $cf in {PROJ, TRANSF} # LFile${f}($file) is set to parsed data here or by proc BadFilePTArgs # return 1 if correct global MAPKNOWN${cf}S MAP${cf}DATA MESS LFile${f} set l [split $line \t] set p [lindex $l 0] if { [lsearch -exact [set MAPKNOWN${cf}S] $p] == -1 } { GMMessage "$MESS(unkn$f): $p" return 0 } if { [catch {set MAP${cf}DATA($p)}] } { # for particular cases of projections with fixed parameters set LFile${f}($file) $p return 1 } if { [BadFilePTArgs $file $p $l [set MAP${cf}DATA($p)] $f $cf] } { GMMessage $MESS(bad${f}args) return 0 } return 1 } proc FindArgs {commd line file} { # parse arguments of command when reading file in GPSMan format global LFilePFrmt LFileDatum LFileLNo LFileCreat LFileId LFileOther \ LFileEOF LFileDefs LFilePath LFileOrigin LFileScale LFileIxPath \ LFileTimeOff MESS FromTimeOffset switch $commd { RT { if { [set tix [string first "\t" $line]] != -1 } { set LFileId($file) [string range $line 0 [expr $tix-1]] # comment and attributes set LFileOther($file) [string range $line [expr $tix+1] end] } else { set LFileId($file) $line set LFileOther($file) "" } return RT } RS { set l [split $line \t] if { [llength $l] >= 2 } { set d [list [lindex $l 0] [lindex $l 1] [lrange $l 2 end]] set LFileOther($file) [FormData RS "commt label hidden" $d] return RS } } TR - LN - LAP { set l [split $line \t] set LFileId($file) [lindex $l 0] # attributes or other fields set LFileOther($file) [lreplace $l 0 0] return $commd } GR - GRWP - GRRT - GRTR - GRLN - GRLAP - GRGR { set LFileId($file) [lindex [split $line \t] 0] return $commd } nb { set t $line while { [set line [ReadFileNL $file]] != "" && \ ! $LFileEOF($file) } { set t [format "%s\n%s" $t $line] } set LFileOther($file) [string trim $t " \n\t"] return nb } format { if { [set pf [FindPFormat $line]] != "BAD" } { set line [ChopInString $pf $line] if { [scan $line "%f" off] == 1 && abs($off) < 14.5 } { if { $LFileTimeOff($file) != "" && \ $off != $LFileTimeOff($file) } { GMMessage $MESS(twotimeoffsets) } else { regsub {[+-]?[0-9]+\.?[0-9]*} $line "" line set line [string trimleft $line "\ \t"] if { [DatumRefId $line] != -1 } { set LFilePFrmt($file) $pf if { $FromTimeOffset != "" } { set LFileTimeOff($file) $FromTimeOffset } else { set LFileTimeOff($file) $off } set LFileDatum($file) $line set LFileDefs($file) 7 return format } GMMessage "$MESS(unkndatum): $line" } } } } dates { switch $line { yes { set LFileCreat($file) 1 ; return dates } no { set LFileCreat($file) 0 ; return dates } } } pformat { if { [set pf [FindPFormat $line]] != "BAD" } { set LFilePFrmt($file) $pf set LFileDefs($file) [expr $LFileDefs($file)|6] return pformat } } datum - pfdatum { if { [DatumRefId $line] != -1 } { set LFileDatum($file) $line set LFileDefs($file) [expr $LFileDefs($file)|1] return $commd } GMMessage "$MESS(unkndatum): $line" } mapback { if { $line != "" } { set LFilePath($file) $line return mapback } } mapproj { if { [FilePTComm $file Proj PROJ $line] } { # LFileProj set by proc FilePTComm return mapproj } } maptransf { if { [FilePTComm $file Transf TRANSF $line] } { # LFileTransf set by proc FilePTComm return maptransf } } maporigin { GMMessage $MESS(oldfilefmt) return BADC } mapscale { if { [scan $line %f s] == 1 && $s > 0 } { set LFileScale($file) $s return mapscale } } mapbackat - mapbackcs { if { [scan $line %d,%d%s x y p] == 3 } { set LFileIxPath($file) [list $x $y $p] return $commd } GMMessage "$MESS(mbkbadat): $line" } } return BADC } proc ProcCommand {line file} { # parse command when reading file in GPSMan format global FCOMMAND FCOMMARGS if { [string first ! $line] } { return BAD } foreach t "WP TS LS mapinfo" { if { $line == $FCOMMAND($t) } { return $t } } foreach c $FCOMMARGS { if { [string first $FCOMMAND($c) $line] == 0 } { if { $c != "RS" } { set line [ChopInString $FCOMMAND($c) $line] } else { # first 2 fields may be empty: delete only command and 1st tab set line [string range "$line" \ [string length "$FCOMMAND($c)"] end] regsub {[ ]*\t} $line "" line } return [FindArgs $c $line $file] } } return BADC } proc FindCommand {file} { # parse command when reading from file in GPSMan format global LFileEOF while { 1 } { set m [ReadFile $file] if { $LFileEOF($file) } { return EOF } set m [string trim [CleanLine $m 0] "\t"] if { [string length $m]>0 && ! [regexp {^%.*} $m] } { return [ProcCommand $m $file] } } } proc ReadNB {file} { # parse NB when reading from file in GPSMan format global LFileBuffFull LFileOther if { [FindCommand $file] != "nb" } { set LFileBuffFull($file) 1 return "" } return $LFileOther($file) } proc FindHeader {file} { # parse commands at the beginning of file in GPSMan format; # succeed if "format" command found, which may be preceded by # "dates", "position format" or "datum" commands; fail otherwise while { 1 } { switch [FindCommand $file] { format { return 1 } dates - pformat - datum { } default { return 0 } } } } proc Clean {coord} { # replace degree, minute and second characters by space in coordinate regsub -all {['"]} $coord "\ " nc # replace degree symbol while { [set i [string first \xb0 $nc]] != -1 } { set nc \ "[string range $nc 0 [expr $i-1]] [string range $nc [expr $i+1] end]" } return $nc } proc ReadPosn {fs i file} { # parse position when reading file in GPSMan format # $fs is list of fields, and position starts at index $i # sets $PosnLength to number of fields global LFilePFrmt LFileDatum PosnLength MESS TXT POSTYPE set pformt $LFilePFrmt($file) switch [set ptype $POSTYPE($pformt)] { latlong { set PosnLength 2 set lat [Clean [lindex $fs $i]] set long [Clean [lindex $fs [expr $i+1]]] if { ! [CheckLat GMMessage $lat $pformt] || \ ! [CheckLong GMMessage $long $pformt] } { return -1 } set latd [Coord $pformt $lat S] set longd [Coord $pformt $long W] return [list $latd $longd $lat $long] } utm { set PosnLength 4 set ze [lindex $fs $i] ; incr i set zn [lindex $fs $i] ; incr i set eng [lindex $fs $i] ; incr i set nng [lindex $fs $i] if { ! [CheckZE GMMessage $ze] || \ ! [CheckZN GMMessage $zn] || \ ! [CheckNumber GMMessage $eng] || \ ! [CheckNumber GMMessage $nng] } { return -1 } set pd [UTMToDegrees $ze $zn $eng $nng $LFileDatum($file)] return [lappend pd $ze $zn $eng $nng] } grid - nzgrid { if { $ptype == "grid" } { set gr 1 set zone [lindex $fs $i] ; incr i if { ! [CheckZone GMMessage $zone $pformt] } { return -1 } } else { set gr 0 ; set zone "" } set eng [lindex $fs $i] ; incr i set nng [lindex $fs $i] if { ! [CheckFloat GMMessage $eng] || \ ! [CheckFloat GMMessage $nng] } { return -1 } if { [BadDatumFor $pformt $LFileDatum($file) GMMessage] != 0 } { return -1 } set pd [GridToDegrees $pformt $zone $eng $nng $LFileDatum($file)] if { $pd == 0 } { GMMessage $MESS(outofgrid) return -1 } if { $gr } { set PosnLength 3 return [lappend pd $zone $eng $nng] } else { set PosnLength 2 return [lappend pd $eng $nng] } } mh { set PosnLength 1 set mhl [lindex $fs $i] if { ! [CheckMHLocator GMMessage $mhl] } { return -1 } return [linsert [MHLocToDegrees $mhl] end $mhl] } } } proc LoadAttrPairs {wh fields ix hidden} { # parse attribute-value pairs in list $fields from index $ix # $wh in {WP, RT, TR, LN} # $hidden is 0 if no hidden attributes are allowed # return pair with info on open attributes and list of hidden attributes # or "" on error global FATTRPAIRS MESS DataIndex set pairs $FATTRPAIRS($wh) set os "" ; set hs "" foreach f [lrange $fields $ix end] { set fp [split $f =] ; set l [llength $fp] set fn [lindex $fp 0] if { [set i [lsearch -glob $pairs "$fn *"]] == -1 } { if { $hidden } { lappend hs $f } else { GMMessage [format $MESS(badattr) $wh $f] return "" } } elseif { $l > 2 } { GMMessage [format $MESS(badattr) $wh $f] return "" } else { set fd [lindex $pairs $i] set fv [lindex $fp 1] if { [[lindex $fd 3] $fv] } { GMMessage [format $MESS(badattrval) $wh $f] return "" } lappend os [list $DataIndex([lindex $fd 1]) $fv] } } return [list $os $hs] } proc InsertAttrPairs {as data} { # insert information from attribute-value pairs into data list foreach p $as { set k [lindex $p 0] set data [lreplace $data $k $k [lindex $p 1]] } return $data } proc LoadWPs {file outRT importing how} { # parse WPs data from file # $outRT set if not in the context of reading a RT # $importing set if reading from file in GPStrans instead of GPSMan format # $how in {normal, inGR, inRTGR, void} meaning: keep all data, keep # data for WPs with indices in $LFileIxs($file,WP), save data to # LFileWPs($file) for possible use in RTs in GRs, discard data # if ! $outRT && ! $importing assume $LFileId($file) has the identifier # of the RT being loaded global LFileLNo LFileBuffFull LFileCreat LFilePFrmt \ LFileOther LFileDatum LFileEOF LFileVisible LFileWPs LFileIxs \ LFileRTStages LFileId LFileTimeOff PosnLength DEFAULTSYMBOL \ DEFAULTDISPOPT CREATIONDATE MESS DataIndex TimeOffset DateFormat if { ! $importing } { if { $LFileCreat($file) && $LFileTimeOff($file) == "" } { GMMessage $MESS(notimeoffset) set LFileTimeOff($file) 0 } set adjtimeoff [expr $TimeOffset != $LFileTimeOff($file)] set adjsecs [expr int(3600*($LFileTimeOff($file)-$TimeOffset))] } else { set adjtimeoff 0 } set wps "" ; set ix -1 ; set count 0 while { 1 } { if { [SlowOpAborted] } { return "" } set m [ReadFile $file] if { $LFileEOF($file) } { return $wps } if { [set m [CleanLine $m $importing]] == "" } { continue } if { ! $importing && [string first ! $m] == 0 } { switch -glob [ProcCommand $m $file] { WP - RT - TR - LN - LAP - GR { set LFileBuffFull($file) 1 return $wps } RS { if { $outRT } { GMMessage "$MESS(badRS) $LFileLNo($file)" return "" } lappend LFileRTStages($file) \ [list $count $LFileOther($file)] } nb { if { $how != "void" } { GMMessage "$MESS(badcommdWP) $LFileLNo($file)" return "" } } GR?? - map* - BADC { GMMessage "$MESS(badcommdWP) $LFileLNo($file)" return "" } } continue } if { $how == "void" } { continue } if { $importing } { if { [regexp {^[RT].*} $m] } { set LFileBuffFull($file) 1 return $wps } if { [string first W $m] != 0 && [string first \t $m] != 1 } { GMMessage "$MESS(notabsWP) $LFileLNo($file)" return "" } set m [string range $m 2 end] } set as [split $m \t] set n [llength $as] if { $n == 1 } { if { $importing || $outRT } { set m notabsWP } else { # WP name only, in a RT in GPSMan format # this is no longer supported set m RTnoWPname } GMMessage "$MESS($m) $LFileLNo($file)" return "" } if { $n < [expr 3+$LFileCreat($file)] } { GMMessage "$MESS(nofieldsWP) $LFileLNo($file)" return "" } set name [string trim [lindex $as 0] " "] if { ! [CheckName Ignore $name] } { if { [set nname [AskForName $name]] == "" } { return "" } set chgdname $name set name $nname } else { set chgdname "" } set commt [string trim [lindex $as 1] " "] if { ! [CheckComment Ignore $commt] } { set commt [MakeComment $commt] } set i 2 if { $LFileCreat($file) && [incr i] && \ [set date [lindex $as 2]] != "" } { if { [set sd [ScanDate $date]] == "" } { GMMessage [format $MESS(baddateas) $date] return "" } if { $adjtimeoff } { set secs [expr [eval DateToSecs $sd]+$adjsecs] set sd [DateIntsFromSecs $secs] set date [eval FormatDate $DateFormat $sd] } } else { set date [Now] } set posn [ReadPosn $as $i $file] if { $posn == -1 } { return "" } incr i $PosnLength set hs "" if { $n > $i } { if { $importing } { GMMessage "$MESS(excfieldsWP) $LFileLNo($file)" return "" } # optional attribute-value pairs if { [set as [LoadAttrPairs WP $as $i 1]] == "" } { return "" } set hs [lindex $as 1] ; set as [lindex $as 0] } else { set as "" } set fs "Name Commt PFrmt Posn Datum Date Hidden" set data [FormData WP $fs [list $name $commt $LFilePFrmt($file) $posn \ $LFileDatum($file) $date $hs]] if { $chgdname != "" } { set data [AddOldNameToObs WP $data $chgdname] } set data [InsertAttrPairs $as $data] # check for a NB if { ! $importing } { set m [CleanLine [ReadFile $file] 0] while { ! $LFileEOF($file) && [string length $m]==0 } { set m [CleanLine [ReadFile $file] 0] } if { ! $LFileEOF($file) && [string first ! $m]==0 && \ [ProcCommand $m $file] == "nb" } { set i $DataIndex(WPObs) set data [lreplace $data $i $i $LFileOther($file)] } else { set LFileBuffFull($file) 1 } } set ix [IndexNamed WP $name] switch $how { normal { set name [StoreWP $ix $name $data $LFileVisible($file)] lappend wps $name } inGR { if { [lsearch -exact $LFileIxs($file,WP) $ix] != -1 } { set name [StoreWP $ix $name $data $LFileVisible($file)] lappend wps $name } } inRTGR { lappend LFileWPs($file) [list $name $ix $data] lappend wps $name } } incr count } # not used return } proc BadRTRead {file importing how} { # parse RTs data from file in GPSMan or GPStrans format # $how in {normal, inGR, void}: keep data on all RTs, keep data for RTs # with indices in $LFileIxs($file,RT), discard data global LFileLNo LFileId LFileOther LFileVisible LFileIxs LFileWPs \ LFileRTStages MAXWPINROUTE MESS # this global is used in LoadWPs set id $LFileId($file) set as [split $LFileOther($file) "\t"] set commt [lindex $as 0] ; set as [lreplace $as 0 0] if { ! [CheckComment Ignore $commt] } { set commt [MakeComment $commt] } if { $as != "" } { if { [set as [LoadAttrPairs RT $as 0 0]] == "" } { return 1 } set as [lindex $as 0] } if { $importing } { set obs "" } else { set obs [ReadNB $file] } set LFileRTStages($file) "" switch $how { normal { set wpshow normal } inGR { set wpshow inRTGR } void { LoadWPs $file 0 $importing void return 0 } } set wps [LoadWPs $file 0 $importing $wpshow] if { [SlowOpAborted] } { return 1 } set cstages $LFileRTStages($file) set n [llength $wps] if { $n == 0 } { GMMessage "$MESS(badWPsRT) $LFileLNo($file)" return 1 } if { $n > $MAXWPINROUTE } { GMMessage [format $MESS(toomuchWPs) $MAXWPINROUTE] } set stages "" ; set i 1 foreach cst $cstages { if { [SlowOpAborted] } { return 1 } if { [set ct [lindex $cst 0]] > $n || $ct == 0 } { GMMessage "$MESS(badWPsRSs) $LFileLNo($file)" return 1 } while { $ct > $i } { lappend stages "" ; incr i } lappend stages [lindex $cst 1] ; incr i } set ix [IndexNamed RT $id] if { $how == "inGR" } { if { [lsearch -exact $LFileIxs($file,RT) $ix] == -1 } { return 0 } set nwps "" foreach n $wps { if { [SlowOpAborted] } { return 1 } # that there is an entry for the WP was checked in LoadWPs foreach e $LFileWPs($file) { if { [lindex $e 0] == $n } { set name [StoreWP [lindex $e 1] $n [lindex $e 2] \ $LFileVisible($file)] lappend nwps $name break } } } set wps $nwps } set data [FormData RT "IdNumber Commt Obs WPoints Stages" \ [list $id $commt $obs $wps $stages]] set data [InsertAttrPairs $as $data] StoreRT $ix $id $data $wps $LFileVisible($file) return 0 } proc LoadTPs {file importing e0} { # parse TR points data from file in either GPSMan or GPStrans format # $e0 is the expected contents of first field (either "" or "T") # return list with list of TR points and list of indices (!=0) of TPs # starting segments (always "" when importing) global LFileLNo LFileBuffFull LFilePFrmt LFileDatum LFileEOF LFileTimeOff \ TimeOffset DateFormat MESS if { ! $importing } { if { $LFileTimeOff($file) == "" } { GMMessage $MESS(notimeoffset) set LFileTimeOff($file) 0 } set adjtimeoff [expr $TimeOffset != $LFileTimeOff($file)] set adjsecs [expr int(3600*($LFileTimeOff($file)-$TimeOffset))] } else { set adjtimeoff 0 } set tps "" set tpn 0 ; set segsts "" while { 1 } { if { [SlowOpAborted] } { return "" } if { $importing } { set line [ReadFileNL $file] if { $LFileEOF($file) || $line == "" } { return [list $tps ""] } } else { set line [ReadFile $file] if { $LFileEOF($file) } { return [list $tps $segsts] } } if { [set line [CleanLine $line $importing]] == "" } { continue } if { ! $importing && [string first ! $line] == 0 } { switch [ProcCommand $line $file] { format - datum - pformat - dates - WP - RT - TR - LN - LAP - GR { set LFileBuffFull($file) 1 return [list $tps $segsts] } comment { } TS { if { $tpn != 0 } { lappend segsts $tpn } } default { GMMessage "$MESS(badcommdTP) $LFileLNo($file)" return "" } } continue } incr tpn set fs [split $line \t] if { [lindex $fs 0] != $e0 } { GMMessage "$MESS(badTP) $LFileLNo($file)" return "" } set ad error ; set dep "" if { [set l [llength $fs]] == 4 } { set ad "" } elseif { ! $importing } { if { $l == 5 } { set ad [lindex $fs 4] if { [BadAltitude $ad] } { set ad error } } elseif { $l == 6 } { # "?"s used in 5.0, 5.1 if { [set ad [lindex $fs 4]] == "?" } { set ad "" } elseif { [BadAltitude $ad] } { set ad error } set dep [lindex $fs 5] if { $dep != "?" && [BadAltitude $dep] } { set ad error } } } if { $ad == "" } { if { $dep == "" } { set ns "latd longd latDMS longDMS date secs" } else { set ad $dep set ns "latd longd latDMS longDMS date secs depth" } } elseif { $ad == "error" } { GMMessage "$MESS(badTP) $LFileLNo($file)" return "" } elseif { $dep == "" } { set ns "latd longd latDMS longDMS date secs alt" } else { set ad [list $ad $dep] set ns "latd longd latDMS longDMS date secs alt depth" } if { [set sd [ScanDate [string trim [lindex $fs 1] " "]]] == "" } { GMMessage [format $MESS(baddateas) [lindex $fs 1]] return "" } set secs [eval DateToSecs $sd] if { $adjtimeoff } { set secs [expr $secs+$adjsecs] set sd [DateIntsFromSecs $secs] } set date [list [eval FormatDate $DateFormat $sd] $secs] set posn [ReadPosn $fs 2 $file] if { $posn == -1 } { return "" } if { $LFilePFrmt($file) != "DMS" } { set posn [FormatLatLong [lindex $posn 0] [lindex $posn 1] DMS] } set tp [FormData TP $ns [concat $posn $date $ad]] lappend tps $tp } # not used return } proc BadTRRead {file importing how} { # parse TRs data from file in either GPSMan or GPStrans format # $how in {normal, inGR, void}: keep data on all TRs, keep data for TRs # with indices in $LFileIxs($file,TR), discard data global LFileLNo LFileDatum LFileId LFileOther LFileVisible LFileIxs MESS \ MYGPS set hs "" if { $importing } { set e0 T ; set obs "" ; set as "" after 1000 ; set id [Now] } else { set e0 "" set id $LFileId($file) if { [set as $LFileOther($file)] != "" } { if { [set as [LoadAttrPairs TR $as 0 1]] == "" } { return 1 } set hs [lindex $as 1] ; set as [lindex $as 0] if { $hs != "" && $MYGPS == "Garmin" } { foreach "as hs" [HiddenRecover TR $as $hs] {} } } set obs [ReadNB $file] } # save current datum: a new one may appear at the end of the track set datum $LFileDatum($file) set ltps [LoadTPs $file $importing $e0] if { [SlowOpAborted] } { return 1 } set tps [lindex $ltps 0] if { $tps != "" } { if { $how == "void" } { return 0 } set ix [IndexNamed TR $id] if { $how != "inGR" || \ [lsearch -exact $LFileIxs($file,TR) $ix] != -1 } { set data [FormData TR "Name Obs Datum TPoints SegStarts Hidden" \ [list $id $obs $datum $tps [lindex $ltps 1] $hs]] set data [InsertAttrPairs $as $data] StoreTR $ix $id $data $LFileVisible($file) } return 0 } GMMessage "$MESS(badTPsTR) $LFileLNo($file)" return 1 } proc LoadLPs {file} { # parse LN points data from file in GPSMan format # return list with list of LN points and list of indices (!=0) of LPs # starting segments global LFileLNo LFileBuffFull LFilePFrmt LFileDatum LFileEOF MESS set lps "" set lpn 0 ; set segsts "" while { 1 } { if { [SlowOpAborted] } { return "" } set line [ReadFile $file] if { $LFileEOF($file) } { return [list $lps $segsts] } if { [set line [CleanLine $line 0]] == "" } { continue } if { [string first ! $line]==0 } { switch [ProcCommand $line $file] { format - datum - pformat - dates - WP - RT - TR - LN - LAP - GR { set LFileBuffFull($file) 1 return [list $lps $segsts] } comment { } LS { if { $lpn != 0 } { lappend segsts $lpn } } default { GMMessage "$MESS(badcommdLP) $LFileLNo($file)" return "" } } continue } incr lpn set fs [split $line \t] foreach "b posn alt" $fs { break } foreach "latd longd" $posn { break } if { $b != "" || [llength $fs] != 3 || \ ! [CheckLat GMMessage $latd DDD] || \ ! [CheckLong GMMessage $longd DDD] || \ ($alt != "" && [BadAltitude $alt]) } { GMMessage "$MESS(badLP) $LFileLNo($file)" return "" } # no check on user visible position, for speed lappend lps [FormData LP "posn alt" [list $posn $alt]] } # not used return } proc BadLNRead {file importing how} { # parse LNs data from file in GPSMan format # $how in {normal, inGR, void}: keep data on all LNs, keep data for LNs # with indices in $LFileIxs($file,LN), discard data global LFileLNo LFileDatum LFileId LFileOther LFileVisible LFileIxs \ LFilePFrmt MESS set id $LFileId($file) if { [set as [LoadAttrPairs LN $LFileOther($file) 0 0]] == "" } { return 1 } set as [lindex $as 0] set obs [ReadNB $file] # save current datum: a new one may appear at the end of the line set datum $LFileDatum($file) if { [SlowOpAborted] } { return 1 } set lpss [LoadLPs $file] set lps [lindex $lpss 0] if { $lps != "" } { if { $how == "void" } { return 0 } set ix [IndexNamed LN $id] if { $how != "inGR" || \ [lsearch -exact $LFileIxs($file,LN) $ix] != -1 } { set pfrmt $LFilePFrmt($file) set data [FormData LN "Name Obs Datum PFrmt LPoints SegStarts" \ [list $id $obs $datum $pfrmt $lps [lindex $lpss 1]]] set data [InsertAttrPairs $as $data] StoreLN $ix $id $data $LFileVisible($file) } return 0 } GMMessage "$MESS(badLPsLN) $LFileLNo($file)" return 1 } proc BadLAPRead {file importing how} { # parse LAP data from file in GPSMan format # $how in {normal, inGR}: keep data on all LAPs, keep data for LAPs # with indices in $LFileIxs($file,LAP) global LFileLNo LFileDatum LFileId LFileOther LFilePFrmt LFileIxs \ LFileTimeOff TimeOffset DateFormat MESS SUPPORTLAPS if { ! $SUPPORTLAPS } { GMMessage $MESS(lapncnsdrd) return 0 } set id $LFileId($file) if { $LFileTimeOff($file) == "" } { GMMessage $MESS(notimeoffset) set LFileTimeOff($file) 0 } if { [set sd [ScanDate $id]] == "" } { GMMessage [format $MESS(baddateas) $id] return "" } set secs [eval DateToSecs $sd] if { $TimeOffset != $LFileTimeOff($file) } { set secs [expr $secs+int(3600*($LFileTimeOff($file)-$TimeOffset))] set id [eval FormatDate $DateFormat [DateIntsFromSecs $secs]] } set start [list $id $secs] set n [llength [set as $LFileOther($file)]] foreach "dur dist begp endp cals trix" $as { break } if { $n != 6 || ! [CheckTime GMMessage $dur] || \ ( $dist != "" && ! [CheckFloat GMMessage $dist] ) || \ ( $begp != "" && [set begp [ReadPosn $begp 0 $file]] == -1 ) || \ ( $endp != "" && [set endp [ReadPosn $endp 0 $file]] == -1 ) || \ ( $cals != "" && ! [CheckNumber GMMessage $cals] ) || \ ( $trix != "" && \ ( ! [CheckNumber GMMessage $trix] || $trix > 255 )) } { GMMessage "$MESS(badLAP) $LFileLNo($file)" return 1 } set ix [IndexNamed LAP $id] if { $how != "inGR" || \ [lsearch -exact $LFileIxs($file,LAP) $ix] != -1 } { set pfrmt $LFilePFrmt($file) ; set datum $LFileDatum($file) set obs [ReadNB $file] set data [FormData LAP \ "Name Obs Start Dur Dist BegPosn EndPosn Cals TRIx PFrmt Datum" \ [list $id $obs $start $dur $dist $begp $endp $cals $trix \ $pfrmt $datum]] StoreLAP $ix $id $data } return 0 } proc LoadGRElements {file id} { # parse GR elements from file in GPSMan format # $id is name of GR global LFileEOF LFileLNo LFileId LFileBuffFull TYPES SUPPORTLAPS MESS set gtypes [linsert $TYPES end LAP] foreach wh $gtypes { set l($wh) "" } set wh 0 while 1 { if { [SlowOpAborted] } { return "" } set line [ReadFile $file] if { $LFileEOF($file) } { break } set line [CleanLine $line 0] if { $line != "" } { if { [string first ! $line] == 0 } { switch -glob [set c [ProcCommand $line $file]] { format - datum - pformat - dates - WP - RT - TR - LN - LAP - GR { set LFileBuffFull($file) 1 break } GRWP { set wh WP set n [GetReplNameInGR $LFileId($file) $id] if { ! [CheckName Ignore $n] } { GMMessage "$MESS(badGRel) $LFileLNo($file)" return "" } lappend l(WP) $n } GR* { regsub GR $c "" wh lappend l($wh) $LFileId($file) } RS - map* - BADC { GMMessage "$MESS(badcommdGRel) $LFileLNo($file)" return "" } } } else { if { $wh == 0 } { GMMessage "$MESS(notypeforGRel) $LFileLNo($file)" return "" } set fs [split $line \t] if { [lindex $fs 0] != "" || [llength $fs]!=2 } { GMMessage "$MESS(badGRel) $LFileLNo($file)" return "" } set n [lindex $fs 1] if { $wh == "WP" } { set n [GetReplNameInGR $n $id] if { ! [CheckName Ignore $n] } { GMMessage "$MESS(badGRel) $LFileLNo($file)" return "" } } lappend l($wh) $n } } } set els "" foreach wh $gtypes { if { $l($wh) != "" && \ ( $wh != "LAP" || $SUPPORTLAPS ) } { lappend els [list $wh $l($wh)] } } return $els } proc BadGRRead {file keep} { # parse GRs data from file in GPSMan format # $keep is true if data is to be kept global LFileLNo LFileId LFileVisible MESS set id $LFileId($file) ; set obs [ReadNB $file] set els [LoadGRElements $file $id] if { [SlowOpAborted] } { return 1 } if { $els != "" } { if { $keep } { set data [FormData GR "Name Obs Conts" [list $id $obs $els]] StoreGR [IndexNamed GR $id] $id $data $LFileVisible($file) } return 0 } GMMessage "$MESS(badGRels) $LFileLNo($file)" return 1 } proc LoadAll {file} { # load all items from file in GPSMan format # return 0 on error global LFileLNo LFileDefs MESS FCOMMAND set r 0 while { 1 } { if { [SlowOpAborted] } { return 0 } switch [set wh [FindCommand $file]] { WP { if { $LFileDefs($file) != 7 } { GMMessage $MESS(noheader) break } LoadWPs $file 1 0 normal set r 1 } RT - TR - LN - LAP { if { $LFileDefs($file) != 7 } { GMMessage $MESS(noheader) break } if { [Bad${wh}Read $file 0 normal] } { break } set r 1 } GR { if { [BadGRRead $file 1] } { break } set r 1 } GRWP - GRRT - GRTR - GRLN - GRLAP - GRGR { GMMessage "$MESS(GRelout) $LFileLNo($file)" } format - dates - pformat - datum { } EOF { set r 1 ; break } pfdatum - NBC - BAD { GMMessage "$MESS(loaderr) $LFileLNo($file)" break } BADC { GMMessage "$MESS(unkncommd) $LFileLNo($file)" break } } } return $r } proc LoadFile {what} { # open file in GPSMan format and load all items in it # $what in $TYPES or $what=="LAP" or $what==Data identifies menu # (see proc LoadAll) # return 0 on error global LChannel if { [InitWPRenaming] == 0 || [OpenInputFileFails $what GPSMan] } { return 0 } set r [LoadAll $LChannel($what)] CloseInputFile $what EndWPRenaming return $r } proc LoadFileFrom {f what} { # open file in GPSMan format and load all items in it # $what in $TYPES or $what=="LAP" or $what==Data # (see proc LoadAll) # return 0 on error global LChannel CREATIONDATE SHOWFILEITEMS if { [InitWPRenaming] == 0 } { return 0 } InitInputFileVars $f $what $CREATIONDATE $SHOWFILEITEMS set r [LoadAll $f] CloseInputFile $what EndWPRenaming return $r } proc LoadGRElsIn {types lixs fmt} { # load items of $types (part of $TYPES except GR) to replace # items with given indices, with -1 meaning new items should be accepted # $lixs is list of lists of indices (and maybe -1) aligned with $types # $fmt is "GPSMan" global LChannel LFileLNo LFileDefs LFileWPs LFileIxs MESS FCOMMAND TYPES set file $LChannel(GR) foreach wh $TYPES { set how$wh void } foreach wh $types ixs $lixs { set LFileIxs($file,$wh) $ixs set how$wh inGR } while { 1 } { switch [set wh [FindCommand $file]] { WP { if { $LFileDefs($file) != 7 } { GMMessage $MESS(noheader) break } LoadWPs $file 1 0 $howWP } RT - TR - LN - LAP { if { $LFileDefs($file) != 7 } { GMMessage $MESS(noheader) break } if { [Bad${wh}Read $file 0 [set how$wh]] } { break } } GR { if { [BadGRRead $file 0] } { break } } GRWP - GRRT - GRTR - GRLN - GRLAP - GRGR { GMMessage "$MESS(GRelout) $LFileLNo($file)" } format - dates - pformat - datum { } EOF { break } pfdatum - NBC - BAD { GMMessage "$MESS(loaderr) $LFileLNo($file)" break } BADC { GMMessage "$MESS(unkncommd) $LFileLNo($file)" break } } } foreach wh $types { catch { unset LFileIxs($file,$wh) } } catch { unset LFileWPs($file) } return } proc LoadGREls {what} { # load data from file in GPSMan format according to contents of GR(s) # $what in $TYPES identifies menu, not being used global TYPES InputToGR $TYPES "" OpenInputFileFails LoadGRElsIn CloseInputFile GPSMan return } proc LoadMapFixedBk {path} { # try to load map background information # if file does not start with !Image command, return 0 # otherwise, return -1 on error or abort, or on success: # "1 path datum pd td scale lixp lcsp" if new format # Before release 5.3 this returned also # "2 path datum origin scale lixp" if old format with !Origin: command # but this command is not accepted anymore by proc FindArgs # where # pd, pt are pairs with name and list of pairs with parameter # name and value # lixp is list of grid indices and path for each subsidiary image in # grid # lcsp is list of canvas coordinates (NW) and path for each subsidiary # image not in grid global LFileLNo LFileBuffFull LFileEOF LFilePath LFileDatum LFileDefs \ LFileProj LFileTransf LFileOrigin LFileScale LFileIxPath LFileTimeOff \ MESS TXT if { $path == "" } { set f [GMOpenFile $TXT(loadfrm) MapBkInfo r] } else { if { [catch {set f [open $path r]}] } { GMMessage "$MESS(cantread) $path" return -1 } } set r -1 if { $f != ".." } { set LFileLNo($f) 0 ; set LFileBuffFull($f) 0 ; set LFileEOF($f) 0 set LFileTimeOff($f) "" if { [FindCommand $f] != "mapback" } { set r 0 } else { SetCursor . watch set LFileDefs($f) 0 if { [FindCommand $f] != "datum" } { GMMessage $MESS(mbkbaddatum) } else { switch [FindCommand $f] { maporigin { set r [list 2 $LFilePath($f) $LFileDatum($f) \ $LFileOrigin($f)] } mapproj { if { [FindCommand $f] != "maptransf" } { GMMessage $MESS(mbkbadtransf) } else { set r [list 1 $LFilePath($f) $LFileDatum($f) \ $LFileProj($f) $LFileTransf($f)] } } default { GMMessage $MESS(mbkbadproj) } } if { $r != -1 } { if { [FindCommand $f] != "mapscale" } { GMMessage $MESS(mbkbadscale) set r -1 } else { set lg "" ; set lc "" while 1 { switch [FindCommand $f] { mapbackat { lappend lg $LFileIxPath($f) } mapbackcs { lappend lc $LFileIxPath($f) } default { break } } } lappend r $LFileScale($f) $lg $lc } } } ResetCursor . } foreach v "LFileLNo($f) LFileBuffFull($f) LFileEOF($f) LFilePath($f) \ LFileDefs($f) LFileDatum($f) LFileProj($f) LFileTransf($f) \ LFileOrigin($f) LFileScale($f) LFileIxPath($f) \ LFileTimeOff($f)" { catch { unset $v } } close $f } return $r } proc LoadMapInfo {path} { # try to load map information # if file does not start with !Map command, return 0 # otherwise, return -1 on error or abort, or on success a list with # datum pd td pformat pfdatum scale # where # pd, pt are pairs with name and list of pairs with parameter # name and value for projection and transformation # for files generated by 6.1.2 or older $pfdatum defaults to $datum global LFileLNo LFileBuffFull LFileEOF LFileDatum LFileDefs \ LFileProj LFileTransf LFilePFrmt LFileScale LFileTimeOff MESS TXT if { $path == "" } { set f [GMOpenFile $TXT(loadfrm) MapInfo r] } else { if { [catch {set f [open $path r]}] } { GMMessage "$MESS(cantread) $path" return -1 } } set r -1 if { $f != ".." } { set LFileLNo($f) 0 ; set LFileBuffFull($f) 0 ; set LFileEOF($f) 0 set LFileTimeOff($f) "" if { [FindCommand $f] != "mapinfo" } { GMMessage $MESS(badmapinfo) } else { SetCursor . watch set LFileDefs($f) 0 if { [FindCommand $f] != "datum" } { GMMessage $MESS(mbkbaddatum) } elseif { [FindCommand $f] != "mapproj" || \ [FindCommand $f] != "maptransf" || \ [FindCommand $f] != "pformat" } { GMMessage $MESS(badmapinfo) } else { set datum $LFileDatum($f) if { [set c [FindCommand $f]] != "pfdatum" } { # file by 6.1.2 or older set LFileDatum($f) $datum } else { set c [FindCommand $f] } if { $c != "mapscale" } { GMMessage $MESS(badmapinfo) } else { set r [list $datum $LFileProj($f) $LFileTransf($f) \ $LFilePFrmt($f) $LFileDatum($f) $LFileScale($f)] } } } ResetCursor . foreach v "LFileLNo($f) LFileBuffFull($f) LFileEOF($f) \ LFileDefs($f) LFileDatum($f) LFileProj($f) LFileTransf($f) \ LFilePFrmt($f) LFileScale($f) LFileTimeOff($f)" { catch { unset $v } } close $f } return $r } array set LSqIStates { start {format datum pformat} start,nxt {point pformat datum} pformat {pformat} pformat,nxt {datum} datum {datum} datum,nxt {pformat} point {} } proc LoadLeastSquaresInfo {} { # read geodetic and pixel coordinates of points for geo-referencing # a map image using a least squares fit # file starts with optional datum and position format commands, or a # format command, (defaults are "WGS 84" and DDD), followed by a line # for each point with fields separated by tabulations; such lines # either start with a $FCOMMAND(WP) field, followed by fields with # an existing WP name and the pixel coordinates (x, y, with y # increasing downwards), or have a position, in the selected/default # datum and format, and the pixel coordinates (as before) # the minimum number of points is given by the global # $MAPTRANSFNPTS(LeastSquares) defined in metadata.tcl # return 0 on failure, or a list with list of latd, longd and datum, # a list of pairs with pixel coordinates (x, y, in Tcl sign convention # with origin at upper left corner), a list with waypoints names (empty # for explicit positions), and the input file path global LSqIStates LFileLNo LFileEOF LFileBuffFull LFileDatum LFileDefs \ LFileDatum LFilePFrmt PosnLength TXT MESS MAPTRANSFNPTS FCOMMAND File \ WPPosn WPDatum GFShowInfo GFVisible SHOWFILEITEMS set GFVisible $SHOWFILEITEMS set prms {GFShowInfo GFVisible} set pws [list "@$TXT(showfitinfo)" "@$TXT(mapfitWPs)"] set f [GMOpenFileParms $TXT(loadfrm) MapBkInfo r $prms $pws] if { $f == ".." } { return 0 } set fpath $File(MapBkInfo) set LFileLNo($f) 0 ; set LFileBuffFull($f) 0 ; set LFileEOF($f) 0 set LFileDefs($f) 0 # defaults set LFileDatum($f) "WGS 84" ; set LFilePFrmt($f) DDD set state start ; set err 0 set ldds "" ; set xys "" ; set names "" while { ! $LFileEOF($f) } { if { [set line [CleanLine [ReadFile $f] 0]] == "" } { continue } if { [string first ! $line] == 0 && \ [string first $FCOMMAND(WP) $line] != 0 } { set c [ProcCommand $line $f] if { [set ix [lsearch -exact $LSqIStates($state) $c]] == -1 } { incr err ; break } set state [lindex $LSqIStates($state,nxt) $ix] } else { set state point set fs [split $line \t] if { [lindex $fs 0] == $FCOMMAND(WP) } { set name [string trim [lindex $fs 1]] if { ! [CheckName GMMessage $name] } { incr err ; break } if { [set ix [IndexNamed WP $name]] == -1 } { GMMessage [format $MESS(undefinedWP) $name] incr err ; break } set p $WPPosn($ix) set datum $WPDatum($ix) set fix 2 } elseif { [set p [ReadPosn $fs 0 $f]] != -1 } { set name "" set datum $LFileDatum($f) set fix $PosnLength } else { incr err ; break } set x [lindex $fs $fix] set y [lindex $fs [expr $fix+1]] if { ! [CheckSignedFloat GMMessage $x] || \ ! [CheckSignedFloat GMMessage $y] } { incr err ; break } lappend ldds [list [lindex $p 0] [lindex $p 1] $datum] lappend xys [list $x $y] lappend names $name } } close $f if { $err } { GMMessage "$MESS(loaderr) $LFileLNo($f)" set r 0 } elseif { [regexp {^>=([0-9]+)$} $MAPTRANSFNPTS(LeastSquares) x n] && \ [lindex $xys [expr $n-1]] == "" } { GMMessage [format $MESS(needNpoints) $n] set r 0 } else { set r [list $ldds $xys $names $fpath] } foreach v "LNo EOF BuffFull Datum Defs Datum PFrmt" { catch { unset LFile${v}($f) } } return $r } ## BSB contribution proc LoadAutoMapInfo {} { # Load index of mapfiles and bounds global ImageIndex MESS TXT set f [GMOpenFile $TXT(loadfrm) MapBkInfo r] if { $f != ".." } { set index -1 while {! [eof $f]} { incr index set line [gets $f] set ImageIndex($index) [split $line "\t"] } } return } gpsman-6.4.4.2/gmsrc/posncomp.tcl0000644000175000017500000003050512224351120014734 0ustar migmig# # This file is part of: # # gpsman --- GPS Manager: a manager for GPS receiver data # # Copyright (c) 1998-2013 Miguel Filgueiras migfilg@t-online.de # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. # # File: posncomp.tcl # Last change: 6 October 2013 # ## algorithms and formulae taken or adapted from # gpstrans - a program to communicate with garmin gps # containing parts taken from John F. Waers (jfwaers _AT_ csn.net) # program MacGPS. # Copyright (c) 1995 by Carsten Tschach (tschach _AT_ zedat.fu-berlin.de) # Uniform Finish grid support: # Copyright (c) 1996 Janne Sinkkonen (janne _AT_ iki.fi) # # some formulae have been simplified or corrected ## correction of a bug in the conversion from UPS coordinates due to # Peter H. Dana, University of Texas ## proc ToDatum {latd longd datum0 datum1} { # convert position given in lat/long signed degrees from one datum # to another # return list with lat and long in signed degrees if { $datum0 != $datum1 } { set phi [expr $latd*0.01745329251994329576] set lambda [expr $longd*0.01745329251994329576] set d0 [EllipsdData $datum0] set a0 [lindex $d0 0] ; set f0 [lindex $d0 1] set d1 [EllipsdData $datum1] set a1 [lindex $d1 0] ; set f1 [lindex $d1 1] set dx [expr [lindex $d1 2]-[lindex $d0 2]] set dy [expr [lindex $d1 3]-[lindex $d0 3]] set dz [expr [lindex $d1 4]-[lindex $d0 4]] set b0 [expr $a0*(1-$f0)] ; set es0 [expr $f0*(2-$f0)] set b1 [expr $a1*(1-$f1)] ; set es1 [expr $f1*(2-$f1)] # convert geodetic latitude to geocentric latitude if { $latd==0 || $latd==90 || $latd==-90 } { set psi $phi } else { set psi [expr atan((1-$es0)*tan($phi))] } # x and y axis coordinates with respect to original ellipsoid set t1 [expr tan($psi)] if { $longd==90 || $longd==-90.0 } { set x 0 set y [expr abs($a0*$b0/sqrt($b0*$b0+$a0*$a0*$t1*$t1))] } else { set t2 [expr tan($lambda)] set x [expr abs(($a0*$b0)/ \ sqrt((1+$t2*$t2)*($b0*$b0+$a0*$a0*$t1*$t1)))] set y [expr abs($x*$t2)] } if { $longd<-90 || $longd>90 } { set x [expr -$x] } if { $longd < 0 } { set y [expr -$y] } # z axis coordinate with respect to the original ellipsoid if { $latd == 90 } { set z $b0 } elseif { $latd == -90 } { set z [expr -$b0] } else { set z [expr $t1*sqrt(($a0*$a0*$b0*$b0)/ \ ($b0*$b0+$a0*$a0*$t1*$t1))] } # geocentric latitude with respect to the new ellipsoid set ddx [expr $x-$dx] ; set ddy [expr $y-$dy] ; set ddz [expr $z-$dz] set psi1 [expr atan2($ddz,sqrt($ddx*$ddx+$ddy*$ddy))] # geocentric latitude and longitude set clat [expr atan2(tan($psi1),1-$es1)*57.29577951308232087684] set clong [expr atan2($ddy,$ddx)*57.29577951308232087684] } else { set clat $latd ; set clong $longd } return [list $clat $clong] } # reference TM lat set UTMlat0 0 set UTMk0 0.9996 proc DegreesToUTM {lat long datum} { # convert position in lat/long signed degrees and given datum to # UTM/UPS global UTMlat0 UTMk0 if { $lat>=-80 && $lat<=84 } { set zn [expr 67+int(floor(($lat+80)/8.0))] # skip I, O if { $zn > 72 } { incr zn } if { $zn > 78 } { incr zn } set zn [format "%c" $zn] set long0 [expr 6*int(floor($long/6.0))+3] set ze [format "%02d" [expr int(floor(($long0+183)/6.0))]] foreach "x y" [ConvToTM $lat $long $UTMlat0 $long0 $UTMk0 $datum] {} set x [expr 500000+$x] if { $lat < 0 } { set y [expr 10000000+$y] } } else { set ze 00 if { $lat > 0 } { if { $long < 0 } { set zn Y } else { set zn Z } } else { if { $long < 0 } { set zn A } else { set zn B } } foreach "x y" [ConvToUPS $lat $long $datum] {} } return [list $ze $zn $x $y] } proc UTMToDegrees {ze zn x y datum} { # convert from UTM/UPS to lat/long in signed degrees global UTMlat0 UTMk0 scan $ze %0d zze if { $zze != 0 } { set long0 [expr -183+6.0*$zze] if { [string compare $zn M] <= 0 } { set y [expr $y-1e7] } set x [expr $x-5e5] return [ConvFromTM $x $y $UTMlat0 $long0 $UTMk0 $datum] } else { return [ConvFromUPS $zn $x $y $datum] } } set BNGZONE1 STUQRNOPLMHJKFGCDEABXYZVW set BNGZONE2 VWXYZQRSTULMNOPFGHJKABCDE proc DegreesToBNG {lat long datum} { # convert from lat/long in signed degrees to British National Grid coords global BNGZONE1 BNGZONE2 set cs [ConvToTM $lat $long 49.0 -2.0 0.9996012717 $datum] if { [set x [expr round(4e5+[lindex $cs 0])]] < 0 || $x > 1e6 || \ [set y [expr round([lindex $cs 1]-1e5)]] < 0 || $y > 2.5e6 } { return "-- 0 0" } set i0 [expr int($x/5e5)] ; set j0 [expr int($y/5e5)] set i1 [expr int($x/1e5)%5] ; set j1 [expr int($y/1e5)%5] set z1 [string index $BNGZONE1 [expr 5*$j0+$i0]] set z2 [string index $BNGZONE2 [expr 5*$j1+$i1]] return [list ${z1}$z2 [expr $x%100000] [expr $y%100000]] } proc BNGToDegrees {zone x y datum} { # convert from British National Grid coords to lat/long in signed degrees global BNGZONE1 BNGZONE2 set z1 [string index $zone 0] ; set z2 [string index $zone 1] if { [set i1 [string first $z1 $BNGZONE1]] == -1 || $x < 0 || $x > 1e5 || \ [set i2 [string first $z2 $BNGZONE2]] == -1 || \ $y < 0 || $y > 1e5 } { return 0 } set x [expr $x+1e5*(($i1%5)*5+($i2%5)-4)] set y [expr $y+1e5*(int($i1/5)*5+int($i2/5)+1)] return [ConvFromTM $x $y 49.0 -2.0 0.9996012717 $datum] } set ITMZONE VWXYZQRSTULMNOPFGHJKABCDE proc DegreesToITM {lat long datum} { # convert from lat/long in signed degrees to Irish TM Grid coords global ITMZONE set cs [ConvToTM $lat $long 53.5 -8.0 1.000035 $datum] if { [set x [expr round(2e5+[lindex $cs 0])]] < 0 || $x > 5e5 || \ [set y [expr round([lindex $cs 1]+25e4)]] < 0 || $y > 5e5 } { return "-- 0 0" } set i [expr int($x/1e5)] ; set j [expr int($y/1e5)] set zone [string index $ITMZONE [expr 5*$j+$i]] return [list $zone [expr $x%100000] [expr $y%100000]] } proc ITMToDegrees {zone x y datum} { # convert from Irish TM Grid coords to lat/long in signed degrees global ITMZONE if { $x < 0 || $x > 1e5 || $y < 0 || $y > 1e5 || \ [set i [string first $zone $ITMZONE]] == -1 } { return 0 } set x [expr $x+1e5*(($i%5)-2)] set y [expr $y+1e4*(int($i/5)*10-25)] return [ConvFromTM $x $y 53.5 -8.0 1.000035 $datum] } proc DegreesToKKJY {lat long datum} { # convert from lat/long in signed degrees to Uniform Finnish Grid coords set cs [ConvToTM $lat $long 0 27.0 1.0 $datum] if { [set x [expr round(5e5+[lindex $cs 0])]] < 0 || \ [set y [lindex $cs 1]] < 0 } { return "-- 0 0" } return [list 27E $x $y] } proc KKJYToDegrees {zone x y datum} { # convert from Uniform Finnish Grid coords to lat/long in signed degrees if { $zone != "27E" || $x < 0 || $y < 0 } { return 0 } return [ConvFromTM [expr $x-5e5] $y 0 27.0 1.0 $datum] } proc ConvToTM {lat long lat0 long0 k0 datum} { # convert to TM # $lat0, $long0: centre coordinates in signed degrees # $k0: scale at central meridian # value of $long will be adjusted to be closer to $long0 set long [NormalLongCentred $long $long0] set d [EllipsdData $datum] set a [lindex $d 0] ; set f [lindex $d 1] set es [expr $f*(2-$f)] set phi [expr $lat*0.01745329251994329576] set lambda [expr $long*0.01745329251994329576] set phi0 [expr $lat0*0.01745329251994329576] set lambda0 [expr $long0*0.01745329251994329576] set m0 [TMAux $phi0 $a $es] ; set m [TMAux $phi $a $es] set et2 [expr $es/(1-$es)] set n [expr sin($phi)] ; set n [expr $a/sqrt(1-$es*$n*$n)] set t [expr tan($phi)] ; set t [expr $t*$t] set c [expr cos($phi)] set A [expr ($lambda-$lambda0)*$c] ; set c [expr $et2*$c*$c] set x [expr round($k0*$n*($A+(1-$t+$c)*$A*$A*$A/6+ \ (5-18*$t+$t*$t+72*$c-58*$et2)* \ $A*$A*$A*$A*$A/120))] set y [expr round($k0*($m-$m0+$n*tan($phi)*($A*$A/2+ \ (5-$t+9*$c+4*$c*$c)*$A*$A*$A*$A/24+ \ (61-58*$t+$t*$t+600*$c-330*$et2)* \ $A*$A*$A*$A*$A*$A/720)))] return [list $x $y] } proc ConvFromTM {x y lat0 long0 k0 datum} { # convert from TM # $lat0, $long0: centre coordinates in signed degrees # $k0: scale at central meridian # return value of longitude in the -179,180 range set d [EllipsdData $datum] set a [lindex $d 0] ; set f [lindex $d 1] set es [expr $f*(2-$f)] set phi0 [expr $lat0*0.01745329251994329576] set lambda0 [expr $long0*0.01745329251994329576] set es [expr $f*(2-$f)] set m0 [TMAux $phi0 $a $es] ; set m [expr $m0+1.0*$y/$k0] set et2 [expr $es/(1-$es)] set e1 [expr sqrt(1-$es)] ; set e1 [expr (1-$e1)/(1+$e1)] set mu [expr $m/($a*(1-$es/4-3*$es*$es/64-0.01953125*$es*$es*$es))] set phi1 [expr $mu+(1.5*$e1-27*$e1*$e1*$e1/32)*sin($mu+$mu)+ \ (1.3125-1.71875*$e1*$e1)*$e1*$e1*sin(4*$mu)+ \ 1.572916666667*$e1*$e1*$e1*sin(6*$mu)+ \ +2.142578125*$e1*$e1*$e1*$e1*sin(8*$mu)] set c1 [expr cos($phi1)] ; set c1 [expr $et2*$c1*$c1] set t1 [expr tan($phi1)] ; set t1 [expr $t1*$t1] set n1 [expr sin($phi1)] set r1 [expr $a*(1-$es)/pow(1-$es*$n1*$n1, 1.5)] set n1 [expr $a/sqrt(1-$es*$n1*$n1)] set d [expr $x/($n1*$k0)] set lat [expr ($phi1-$n1*tan($phi1)/$r1* \ ($d*$d/2-(5+3*$t1+10*$c1-4*$c1*$c1-9*$et2)* \ $d*$d*$d*$d/24+ \ (61+90*$t1+298*$c1+45*$t1*$t1-252*$et2-3*$c1*$c1)* \ $d*$d*$d*$d*$d*$d/720))*57.29577951308232087684] set long [expr ($lambda0+($d-(1+($t1+$t1)+$c1)*$d*$d*$d/6+ \ (5-($c1+$c1)+28*$t1-3*$c1*$c1+8*$et2+24*$t1*$t1)* \ $d*$d*$d*$d*$d/120)/cos($phi1))*57.29577951308232087684] set long [NormalLong $long] return [list $lat $long] } proc TMAux {phi a es} { if { abs($phi) < 1e-20 } { return 0 } set es2 [expr $es*$es] set es3 [expr $es2*$es] return [expr $a*((1-$es/4-0.046875*$es2-0.01953125*$es3)*$phi- \ (0.375*$es+0.09375*$es2+0.0439453125*$es3)* \ sin($phi+$phi)+ \ (0.05859375*$es2+0.0439453125*$es3)*sin(4*$phi)- \ 0.011393229166667*$es3*sin(6*$phi))] } set UPSk0 0.994 proc ConvToUPS {lat long datum} { global UPSk0 set d [EllipsdData $datum] set a [lindex $d 0] ; set f [lindex $d 1] set es [expr $f*(2-$f)] set lambda [expr $long*0.01745329251994329576] set phi [expr abs($lat*0.01745329251994329576)] set e [expr sqrt($es)] set ee [expr $e*sin($phi)] set t [expr tan(0.78539816339744830961-$phi/2)/pow((1-$ee)/(1+$ee),($e/2))] set rho [expr 2*$a*$UPSk0*$t/sqrt(pow(1+$e,1+$e)*pow(1-$e,1-$e))] set x [expr round($rho*sin($lambda)+2e6)] ; set y [expr $rho*cos($lambda)] if { $lat > 0 } { set y [expr -$y] } return [list $x [expr round($y+2e6)]] } proc ConvFromUPS {zn x y datum} { global UPSk0 set d [EllipsdData $datum] set a [lindex $d 0] ; set f [lindex $d 1] set es [expr $f*(2-$f)] ; set e [expr sqrt($es)] set x [expr $x-2e6] ; set y [expr $y-2e6] set rho [Hypot $x $y] set t [expr $rho*sqrt(pow(1+$e,1+$e)*pow(1-$e,1-$e))/(2*$a*$UPSk0)] set lat [expr [UPSAux $e $t]*57.29577951308232087684] if { abs($y) > 1e-20 } { set long [expr atan2(abs($x),abs($y))*57.29577951308232087684] } else { set long 90 if { $x < 0 } { set long [expr -$long] } } if { [string compare $zn M] > 0 } { set y [expr -$y] } if { $y < 0 } { set long [expr 180-$long] } if { $x < 0 } { set long [expr -$long] } return [list $lat $long] } proc UPSAux {e t} { set phi [expr 1.57079632679489661923-2*atan($t)] set old 999.9e-99 set maxIterations 20 ; set i 0 while { abs(($phi-$old)/$phi)>1e-8 && $i<$maxIterations } { incr i set old $phi set phi [expr 1.57079632679489661923- \ 2*atan($t*pow((1-$e*sin($phi))/((1+$e*sin($phi))),$e/2.0))] } return $phi } gpsman-6.4.4.2/gmsrc/garmin_protocols.tcl0000644000175000017500000013376612224351120016474 0ustar migmig# # This file is part of: # # gpsman --- GPS Manager: a manager for GPS receiver data # # Copyright (c) 1998-2013 Miguel Filgueiras migfilg@t-online.de # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. # # File: garmin_protocols.tcl # Last change: 6 October 2013 # # description of Garmin protocols based on # #- Garmin GPS Interface Specification Version 1 Rev. 2 # updated for: # Garmin GPS Interface Specification Version 1 Rev. 3 # Garmin GPS Interface Specification Version 1 Rev. A # Garmin GPS Interface Specification Version 1 Rev. B # Garmin GPS Interface Specification Version 1 Rev. C, May 2006 # #- Garmin Fleet Management Interface Control Specification, 001-00096-00 Rev. A # January 2, 2007 # #- GPS 15H & 15L TECHNICAL SPECIFICATIONS, 190-00266-01, Rev. D, February 2006 # # Garmin USB protocol is implemented assuming that the USB port is driven by # the garmin_gps Linux kernel driver by Hermann Kneissel and part of the # official >=2.6 Linux kernel releases # ASCII codes (decimal) set DLE 16 set ETX 3 set ACK 6 set NAK 21 # DLE char set DLECHR [binary format "c" $DLE] # protocol tags array set PROTTAG { P Physical L Link A Application D Data T Transmission } # categories of known product specific protocols set PSPROTOCOLS {Link Baud DevCmd WP WPCat RT TR LAP Prx AL DtTm FleetManagement FlightBook Posn PVT} # application protocol categories array set PROTCAT { T001 Baud A010 DevCmd A011 DevCmd A100 WP A101 WPCat A200 RT A201 RT A300 TR A301 TR A302 TR A400 Prx A500 AL A600 DtTm A601 nospec A602 FleetManagement A603 FleetManagement A650 FlightBook A700 Posn A800 PVT A801 nospec A802 nospec A900 nospec A901 nospec A902 nospec A903 nospec A904 nospec A905 nospec A906 LAP A907 nospec A908 nospec A912 nospec A913 nospec A914 nospec A915 nospec A916 nospec A917 nospec A918 nospec A919 nospec A1000 RUN A1002 WKO A1003 WKOOcc A1004 FUP A1005 WKOLimits A1006 nospec A1007 nospec A1008 nospec A1009 CRSLimits A1010 nospec A1011 nospec } # protocol requirements for each application protocol # a prefix "?" indicates a non-mandatory requirement (only after all # mandatory ones) # a "D?" is used when there is no information array set PROTREQ { N/A "" P000 "" L000 "" L001 "" L002 "" T001 "" A010 "" A011 "" A100 WPData A101 {WPCatData ?D? ?D?} A200 {RTHeader RTWPData} A201 {RTHeader RTWPData RTLinkData} A300 TRData A301 {TRHeader TRData} A302 {TRHeader TRData} A400 PrxWPData A500 ALData A600 DtTmData A601 D? A602 FMData A603 FMData A650 "" A700 PosnData A800 PVTData A801 D? A802 D? A900 "" A901 D? A902 "" A903 "" A904 "" A905 D? A906 LAPData A907 {D? D? D? D?} A908 D? A912 D? A913 D? A914 "" A915 D? A916 "" A917 D? A918 D? A919 "" A1000 RUNData A1002 WKOData A1003 WKOOcc A1004 FUPData A1005 WKOLimits A1006 CRSData A1007 D? A1008 D? A1009 CRSLimits A1010 "" A1011 "" } # Garmin USB Protocol array set GUSB { LAYERID,TRANSPORT 0 LAYERID,APPL 20 LAYERID,PRIVATE 0x01106E4B PRIV,PID,SET,DEBUG 1 PRIV,PID,SET,MODE 2 PRIV,PID,INFO,REQ 3 PRIV,PID,INFO,RESP 4 PRIV,PID,RESET,REQ 5 PRIV,PID,SET,DEF,MODE 6 MODE,NATIVE 0 MODE,GARMIN,SERIAL 1 PID,TRANSPORT,DATA,AVAILABLE 2 PID,TRANSPORT,START,SESSION,REQ 5 PID,TRANSPORT,START,SESSION,RESP 6 } # Basic Link Protocol array set PID { ACK 6 NAK 21 PrdExtData 248 PArray 253 PrdReq 254 PrdData 255 } array set RPID { 6 ACK 21 NAK 248 PrdExtData 253 PArray 254 PrdReq 255 PrdData } # definitions of Link product specific protocols set PSPDEF(L001) {{CmdData 10} {XfrCmpl 12} {DtTmData 14} {PosnData 17} {PrxWPData 19} {Records 27} {RqstData 28} {RTHeader 29} {RTWPData 30} {ALData 31} {TRData 34} {WPData 35} {UIdData 38} {BaudRqstData 48} {BaudAcptData 49} {PVTData 51} {RTLinkData 98} {TRHeader 99} {FlightBook_Record 134} {FMILegStopAt 135} {FMILegPutMess 136} {LAPData 149} {WPCatData 152} {FMIPacket 161} {RUNData 990} {WKOData 991} {WKOOcc 992} {FUPData 993} {WKOLimits 994} {CRSData 1061} {CRSLap 1062} {CRSPoint 1063} {CRSTRHeader 1064} {CRSTRData 1065} {CRSLimits 1066}} set PSPDEF(L002) {{ALData 4} {CmdData 11} {XfrCmpl 12} {DtTmData 20} {PosnData 24} {PrxWPData 27} {Records 35} {RTHeader 37} {RTWPData 39} {WPData 43}} # packet ids in Fleet Management Interface packets array set FMIPSP { FMIEnable 0 FMIPrdReq 1 FMIPrdData 2 FMIProtSupp 3 FMIGetAckTxtMess 32 FMIPutTxtMess 33 FMIPutAckTxtMess 34 FMIPutYesNoTxtMess 35 FMIGetTxtMess 36 FMIPutAckTxtMess 37 FMIA602StopAt 256 FMIA603StopAt 257 FMIA603RqstETA 516 FMIA603GetETA 517 FMIA603PutETARec 518 FMIA603PutStopSt 528 FMIA603GetStopSt 529 FMIA603PutStStRec 530 FMIA603PutAArrival 548 FMIA630Delete 560 } # packet ids not described in the specifications: # 114: appears before a PVTData packet in the Quest # definition of product specific device commands set PSCMDDEF(A010) {{Abort 0} {XfrAL 1} {XfrPosnData 2} {XfrPrx 3} {XfrRT 4} {XfrDtTmData 5} {XfrTR 6} {XfrWP 7} {TurnOff 8} {RqstUId 14} {StartPVT 49} {StopPVT 50} {AckPing 58} {XfrFlightBook 92} {XfrLAP 117} {XfrWPCat 121} {XfrRUN 450} {XfrWKO 451} {XfrWKOOcc 452} {XfrFUP 453} {XfrWKOLimits 454} {XfrCRS 561} {XfrCRSLap 562} {XfrCRSPoint 563} {XfrCRSTrack 564} {XfrCRSLimits 565}} set PSCMDDEF(A011) {{Abort 0} {XfrAL 1} {XfrRT 8} {XfrPrx 17} {XfrDtTmData 20} {XfrWP 21} {TurnOff 26}} # size in bytes of data types used in unions # unions are only used if there is a single data item and sizes of # types in the union must be all different array set PDTSIZE { byte 1 int 2 } # protocol data types # data type for ACK/NAK packet; this is now set in proc FixACKNAKType # when the first such packet is received # sending 16-bit int according to Garmin specifications versions < 3 # but accepting either int or byte as in versions <= 3 set PDTYPE(ACK) union=int,byte set PDTYPE(NAK) union=int,byte # protocols for which no output is available (as in the Garmin specs, # or because of no support or no complete specification available) # list of pairs with item type and either empty (for any) or list of # pairs with protocol type and protocol identifier set PROTNOOUTPUT {{TR {{TR A302} {TRData D304}}} {Prx {}} {AL {}}} ## RT/TR Header protocols with a numeric identifier set PRTNUMID {D200 D201} set PTRNUMID {D311} array set PDTYPE { PArray starray=char,word PrdReq ignored PrdData {int int string ignored} PrdExtData ignored UIdData {longword ignored} Records int D100 {charray=6 semicircle unused=4 charray=40} D101 {charray=6 semicircle unused=4 charray=40 float byte} D102 {charray=6 semicircle unused=4 charray=40 float int} D103 {charray=6 semicircle unused=4 charray=40 byte byte} D104 {charray=6 semicircle unused=4 charray=40 float int byte} D105 {semicircle int string} D106 {byte bytes=13 semicircle int string string} D107 {charray=6 semicircle unused=4 charray=40 byte byte float byte} D108 {byte byte byte byte int bytes=18 semicircle float float float charray=2 charray=2 string string string string string string} D109 {byte byte byte byte int bytes=18 semicircle float float float charray=2 charray=2 longword string string string string string string} D110 {byte byte byte byte int bytes=18 semicircle float float float charray=2 charray=2 longword float longword int string string string string string string} D120 {string<17} D150 {charray=6 charray=2 byte semicircle int charray=24 charray=2 charray=30 charray=40} D151 {charray=6 semicircle unused=4 charray=40 float charray=30 charray=24 charray=2 int charray=2 unused=1 byte} D152 {charray=6 semicircle unused=4 charray=40 float charray=30 charray=24 charray=2 int charray=2 unused=1 byte} D154 {charray=6 semicircle unused=4 charray=40 float charray=30 charray=24 charray=2 int charray=2 unused=1 byte int} D155 {charray=6 semicircle unused=4 charray=40 float charray=30 charray=24 charray=2 int charray=2 unused=1 byte int byte} D200 byte D201 {byte charray=20} D202 string D210 {word bytes=18 string} D300 {semicircle longword boolean} D301 {semicircle longword float float boolean} D302 {semicircle longword float float float boolean} D303 {semicircle longword float byte} D304 {semicircle longword float float byte byte boolean} D310 {boolean byte string} D311 word D312 {boolean byte string} D400 {charray=6 semicircle unused=4 charray=40 float} D403 {charray=6 semicircle unused=4 charray=40 byte byte float} D450 {int charray=6 charray=2 byte semicircle int charray=24 charray=2 charray=30 charray=40 float} D500 {int float float float float float float float float float float} D501 {int float float float float float float float float float float byte} D550 {byte int float float float float float float float float float float} D551 {byte int float float float float float float float float float float byte} D600 {byte byte word int byte byte} D601 nospec D602 _multiple D602_a {longword string<200} D602_b {longword byte unused=3 byte=16 string<200} D602_c {longword byte unused=3 byte=16 longword} D602_d {longword semicircle string<200} D603 _multiple D603_a {longword longword string<200} D603_b {longword} D603_c {longword semicircle longword string<200} D603_d {longword word word} D603_e {longword longword longword semicircle} D603_f {longword longword} D603_g {longword} D650 {longword longword semicircle semicircle longword longword float float float boolean string string string string string} D700 radian D800 {float float float float int double radian float float float float int long} D801 nospec D802 nospec D900 nospec D901 nospec D906 {longword longword float semicircle semicircle word byte byte} D907 nospec D908 nospec D909 nospec D910 nospec D911 nospec D917 nospec D918 nospec D1003 nospec D1004 nospec D1005 nospec D1006 nospec D1007 nospec D1008 nospec D1009 nospec D1011 nospec D1012 nospec D1013 nospec FMILegPutMess {string<200} FMILegStopAt {semicircle string<51} } array set FMIPDTYPE { FMIEnable {} FMIPrdReq {} FMIPrdData PrdData FMIProtSupp PArray FMIGetAckTxtMess D602_c FMIPutTxtMess D602_a FMIPutAckTxtMess D602_b FMIPutYesNoTxtMess D602_b FMIGetTxtMess D603_a FMIPutAckTxtMess D603_b FMIA602StopAt D602_c FMIA603StopAt D603_c FMIA603PutStopSt D603_d FMIA603GetStopSt D603_d FMIA603PutStStRec D603_b FMIA603RqstETA {} FMIA603GetETA D603_e FMIA603PutETARec D603_b FMIA603PutAArrival D603_f FMIA630Delete D603_g } # product identifiers; new entries should also be added to recmodels.tcl # numbers followed by a letter are defined here to support older # software versions; not following Garmin specs in this array set PRODID { "GPS 50" 7 "GPS 75" {13 23 42} "GPS 55" 14 "GPS 55 AVD" 15 "GPS 65" 18 "GPS 95 AVD" {22 36} "GPS 95" {24 35} "GPS 85" 25 "GPSMAP 205" {29 44} "GPSMAP 210" 29 "GPSMAP 220" 29 "GPS 40" {31 41} "GPS 45" {31 41} "GPS 95 XL" 36 "GPS 89" 39 "GPS 38" 41 "GPS 45 XL" 41 "GPS 90" 45 "GPS 120" 47 "GPSMAP 195" 48 "GPSMAP 130" 49 "GPSMAP 135 Sounder" 49 "GPSMAP 175" 49 "GPSMAP 230" 49 "GPSMAP 235 Sounder" 49 "GPSCOM 170" 50 "GPSCOM 190" 53 "GPS 120 Chinese" 55 "GPS 38 Chinese" 56 "GPS 40 Chinese" 56 "GPS 45 Chinese" 56 "GPS II" 59 "GPS 125 Sounder" 61 "GPS 38 Japanese" 62 "GPS 40 Japanese" 62 "Street Pilot I" 67 "GPS III Pilot" 71 "GPS III" 72 "GPS II Plus" {73 97} "GPS 120 XL" 74 "GPSMAP 130 Chinese" 76 "GPSMAP 230 Chinese" 76 "GPS 12" {77 87 96} "GPS 12 XL" {77 96} "GPS 12 XL - software < 3.01" 77a "GPSMAP 215" 88 "GPSMAP 225" 88 "GPSMAP 180" 89 "GPS 126" 95 "GPS 128" 95 "GPS 48" 96 "GPS 126 Chinese" 100 "GPS 128 Chinese" 100 "GPS 12 Arabic" 103 "GPS 12 XL Japanese" 105 "GPS 12 XL Chinese" 106 eMap 111 "GPS 92" 112 "GPS 12CX" 116 "GPS III Plus" 119 "GPSMAP 162" 126 "GPSMAP 295" 128 "GPS 12 Map" 129 eTrex 130 "GPSMAP 176" 136 "GPS 12 4.58" 138 "eTrex Summit" {141 295} "GPSMAP 196" 145 "StreetPilot 3" 151 "eTrex Venture/Mariner" 154 "GPS 5" 155 "eTrex Euro" 156 "eTrex Vista" {169 420} "GPS 76" 173 "GPSMAP 76" {177 439} "eTrex Legend" {179 411} "GPSMAP 76S" 194 "Rino 110" 197 "Rino 120" 209 "eTrex LegendJ" 219 "Quest" 231 "GPS 72" {247 430} "Geko 201" {248 574} "Geko 301" 256 "Rino 130" 264 "GPS 18USB" 273 "Forerunner" 282 "Forerunner 301" 283 "GPSmap 276C" 285 "GPS 60" 289 "GPSMap60C" 291 "GPSMap60CSX" 292 "GPSMap76CSX" 292 "GPSMap60" 308 "ForeTrex" 314 "eTrex Vista C" 315 "eTrex Legend C" 315 "StreetPilot c320" {382 497} "StreetPilot 2720" 404 "eTrex Venture" 419 "eTrex Legend Cx" 421 "EDGE205" 450 "EDGE305" 450 "StreetPilot c340" 481 "Forerunner 205" 484 "Forerunner 305" 484 "StreetPilot c330" 497 "StreetPilot i2" 532 "GPSmap 378 SYS" 557 "Rino 530HCx" 577 "eTrex Legend HCx" 694 "eTrex Vista HCx" 694 "eTrex Venture HC" {695 786} "eTrex H" {696 696+} "eTrex Summit HC" {695 786} "GPS 20x USB" 811 "eTrex Legend H" 957 "GPS 72H" 1095 } # product names and how to obain its product specific protocols # valid values for $PRTCLDEF($product_id) are # array set PSPID($product_id,$name_prod_spec_prot) to protocol # to use, for each $name_prod_spec_prot # see=$ID use the same protocols as product $ID # diff set PSDIFF($product_id) to list whose head is a product id # and whose tail contains pairs of $name_prod_spec_prot and # protocol to use; these pairs describe the differences to # the other product and must not contain Link or DevCmd array set PNAME { 7 "GPS 50" 13 "GPS 75" 14 "GPS 55" 15 "GPS 55 AVD" 18 "GPS 65" 22 "GPS 95 AVD" 23 "GPS 75" 24 "GPS 95" 25 "GPS 85" 29a "GPSMAP 205/210/220 - <4.0" 29 "GPSMAP 205/210/220" 31 "GPS 40/45" 35 "GPS 95" 36a "GPS 95 AVD/XL - < 3.0" 36 "GPS 95 AVD/XL" 39 "GPS 89" 41 "GPS 38/40/45/45 XL" 42 "GPS 75" 44 "GPSMAP 205" 45 "GPS 90" 47 "GPS 120" 48 "GPSMAP 195" 49 "GPSMAP 130/135 Sounder/175/230/235 Sounder" 50 "GPSCOM 170" 53 "GPSCOM 190" 55 "GPS 120 Chinese" 56 "GPS 38/40/45 Chinese" 59 "GPS II" 61 "GPS 125 Sounder" 62 "GPS 38 Japanese/40 Japanese" 67 "Street Pilot I" 71 "GPS III Pilot" 72 "GPS III" 73 "GPS II Plus" 74 "GPS 120 XL" 76 "GPSMAP 130 Chinese/230 Chinese" 77a "GPS 12 XL - < 3.01" 77b "GPS 12 XL - 3.01 < 3.50" 77c "GPS 12 XL - 3.50 < 3.61" 77 "GPS 12/12 XL" 87 "GPS 12" 88 "GPSMAP 215/225" 89 "GPSMAP 180" 95 "GPS 126/128" 96 "GPS 12/12 XL/48" 97 "GPS II Plus" 100 "GPS 126 Chinese/128 Chinese" 103 "GPS 12 Arabic" 105 "GPS 12 XL Japanese" 106 "GPS 12 XL Chinese" 119 "GPS III Plus" 111 eMap 112 "GPS 92" 116 "GPS 12CX" 126 "GPSMAP 162" 128 "GPSMAP 295" 129 "GPS 12 Map" 130 eTrex 136 "GPSMAP 176" 138 "GPS 12" 141 "eTrex Summit" 145 "GPSMAP 196" 151 "StreetPilot 3" 154 "eTrex Venture/Mariner" 155 "GPS 5" 156 "eTrex Euro" 169 "eTrex Vista" 173 "GPS 76" 177 "GPSMAP 76" 179 "eTrex Legend" 194 "GPSMAP 76S" 197 "Rino 110" 209 "Rino 120" 219 "eTrex LegendJ" 231 "Quest" 247 "GPS 72" 248 "Geko 201" 256 "Geko 301" 264 "Rino 130" 273 "GPS 18USB" 282 "Forerunner" 283 "Forerunner 301" 285 "GPSmap 276C" 289 "GPS 60" 291 "GPSMap60C" 292 "GPSMap60CSX/76CSX" 295 "eTrex Summit" 308 "GPSMap60" 314 "ForeTrex" 315 "eTrex Legend/Vista C" 382 "StreetPilot c320" 404 "StreetPilot 2720" 411 "eTrex Legend" 419 "eTrex Venture" 420 "eTrex Vista" 421 "eTrex Legend Cx" 430 "GPS 72" 439 "GPSMAP 76" 450 "EDGE205/305" 481 "StreetPilot c340" 484 "Forerunner 205/305" 497 "StreetPilot c320/c330" 532 "StreetPilot i2" 557 "GPSmap 378 SYS" 574 "Geko 201" 577 "Rino 530HCx" 694 "eTrex Legend/Vista HCx" 695 "eTrex Summit/Venture HC" 696 "eTrex H" 696+ "eTrex H" 786 "eTrex Summit/Venture HC" 811 "GPS 20x USB" 957 "eTrex Legend H" 1095 "GPS 72H" } # the descriptions below are valid for all versions except: # 29 version < 4.0 # 29+ version >= 4.0 # 36 version < 3.0 # 36+ version >= 3.0 # 77, 77+, 77++ versions < 3.01, < 3.50, < 3.61 # 77+++ version >= 3.61 # 111 version < 2.7 # 111+ version >= 2.7 # 285 version < 3.0 (just a guess) # 285+ version >= 3.0 # 484 version < 2.6 (just a guess) # 484+ version >= 2.6 # 694 version < 2.4 (just a guess) # 694+ version >= 2.4 # the pairs in the following entries have a comparison to be made # to the receiver version and the identifier to be used if the # comparison succeeds array set PRTCLVERSION { 29 {{{>= 400} 29+}} 36 {{{>= 300} 36+}} 77 {{{>= 361} 77+++} {{>= 350} 77++} {{>= 301} 77+}} 111 {{{>= 270} 111+}} 285 {{{>= 300} 285+}} 289 {{{>= 240} 289+}} 484 {{{>= 260} 484+}} 694 {{{>= 240} 694+}} 696 {{{>= 300} 696+}} } array set PRTCLDEF { 7 diff 13 diff 14 diff 15 diff 18 see=13 22 diff 23 see=13 24 see=13 25 see=13 29 diff 29+ diff 31 see=59 35 see=13 36 see=22 36+ see=45 39 diff 41 see=59 42 see=13 44 see=29 45 diff 47 see=59 48 diff 49 diff 50 diff 53 see=50 55 see=59 56 see=59 59 array 61 see=59 62 see=59 67 diff 71 diff 72 diff 73 diff 74 see=59 76 see=49 77 diff 77+ diff 77++ see=73 77+++ see=77+ 87 see=77+ 88 see=49 89 see=29+ 95 see=77+ 96 see=77+ 97 see=73 100 see=77+ 103 see=77+ 105 see=77+ 106 see=77+ 111 array 111+ diff 112 diff 116 array 119 array 126 diff 128 see=111 129 array 130 diff 136 diff 138 see=77+ 141 see=130 145 array 151 array 154 see=130 155 diff 156 see=130 169 see=130 173 see=177 177 array 179 see=130 194 see=177 197 diff 209 see=197 219 diff 231 array 247 see=116 248 array 256 diff 264 diff 273 array 282 array 283 array 285 see=291 285+ array 289 see=315 289+ diff 291 array 292 array 295 see=248 308 see=289+ 314 array 315 array 382 array 404 array 411 diff 419 array 420 see=411 421 array 430 see=177 439 diff 450 array 481 array 484 diff 484+ diff 497 array 532 array 574 see=248 577 see=292 694 diff 694+ diff 695 see=694+ 696 see=248 696+ diff 786 see=694+ 811 diff 957 diff 1095 diff } ### there is no information on which receivers use the PVT protocol # and therefore it is assumed all can use it array set PSPID { 59,Link L001 59,DevCmd A010 59,WP A100 59,WPData D100 59,RT A200 59,RTHeader D201 59,RTWPData D100 59,TR A300 59,TRData D300 59,Prx N/A 59,AL A500 59,ALData D500 59,DtTm A600 59,DtTmData D600 59,Posn A700 59,PosnData D700 59,PVT A800 59,PVTData D800 111,Link L001 111,DevCmd A010 111,WP A100 111,WPData D108 111,RT A201 111,RTHeader D201 111,RTWPData D108 111,RTLinkData D210 111,TR A301 111,TRHeader D310 111,TRData D301 111,Prx A400 111,PrxWPData D108 111,AL A500 111,ALData D500 111,DtTm A600 111,DtTmData D600 111,Posn A700 111,PosnData D700 111,PVT A800 111,PVTData D800 116,Link L001 116,DevCmd A010 116,WP A100 116,WPData D107 116,RT A200 116,RTHeader D201 116,RTWPData D107 116,TR A300 116,TRData D300 116,Prx A400 116,PrxWPData D107 116,AL A500 116,ALData D501 116,DtTm A600 116,DtTmData D600 116,Posn A700 116,PosnData D700 116,PVT A800 116,PVTData D800 119,Link L001 119,DevCmd A010 119,WP A100 119,WPData D104 119,RT A200 119,RTHeader D201 119,RTWPData D104 119,TR A300 119,TRData D300 119,Prx N/A 119,AL A500 119,ALData D501 119,DtTm A600 119,DtTmData D600 119,Posn A700 119,PosnData D700 119,PVT A800 119,PVTData D800 129,Link L001 129,DevCmd A010 129,WP A100 129,WPData D104 129,RT A200 129,RTHeader D201 129,RTWPData D104 129,TR A300 129,TRData D300 129,Prx N/A 129,AL A500 129,ALData D501 129,DtTm A600 129,DtTmData D600 129,Posn A700 129,PosnData D700 129,PVT A800 129,PVTData D800 129,nospec A900 145,Link L001 145,DevCmd A010 145,WP A100 145,WPData D109 145,RT A201 145,RTHeader D202 145,RTWPData D109 145,RTLinkData D210 145,TR A301 145,TRHeader D310 145,TRData D301 145,Prx A400 145,PrxWPData D109 145,AL A500 145,ALData D501 145,DtTm A600 145,DtTmData D600 145,Posn A700 145,PosnData D700 145,PVT A800 145,PVTData D800 145,nospec A650+D650+A900+A901+D901+A902+A903+A904 151,Link L001 151,DevCmd A010 151,WP A100 151,WPData D109 151,RT A201 151,RTHeader D202 151,RTWPData D109 151,RTLinkData D210 151,TR A301 151,TRHeader D310 151,TRData D301 151,Prx N/A 151,AL A500 151,ALData D501 151,DtTm A600 151,DtTmData D600 151,Posn A700 151,PosnData D700 151,PVT A800 151,PVTData D800 151,nospec A900+A902+A903+A904 177,Link L001 177,DevCmd A010 177,WP A100 177,WPData D109 177,RT A201 177,RTHeader D202 177,RTWPData D109 177,RTLinkData D210 177,TR A301 177,TRHeader D310 177,TRData D301 177,Prx A400 177,PrxWPData D109 177,AL A500 177,ALData D501 177,DtTm A600 177,DtTmData D600 177,Posn A700 177,PosnData D700 177,PVT A800 177,PVTData D800 177,nospec A900+A902+A903 231,Link L001 231,Baud T001 231,DevCmd A010 231,WP A100 231,WPData D110 231,WPCat A101 231,WPCatData D120 231,RT A201 231,RTHeader D202 231,RTWPData D110 231,RTLinkData D210 231,TR A301 231,TRHeader D312 231,TRData D302 231,Prx N/A 231,AL A500 231,ALData D501 231,DtTm A600 231,DtTmData D600 231,Posn A700 231,PosnData D700 231,PVT A800 231,PVTData D800 231,nospec A601+D601+A900+A902+A903+A904+A905 248,Link L001 248,DevCmd A010 248,WP A100 248,WPData D108 248,RT A201 248,RTHeader D202 248,RTWPData D108 248,RTLinkData D210 248,TR A301 248,TRHeader D310 248,TRData D301 248,Prx N/A 248,AL A500 248,ALData D501 248,DtTm A600 248,DtTmData D600 248,Posn A700 248,PosnData D700 248,PVT A800 248,PVTData D800 273,Link L001 273,Baud T001 273,DevCmd A010 273,WP N/A 273,RT N/A 273,TR N/A 273,Prx N/A 273,AL A500 273,ALData D501 273,DtTm A600 273,DtTmData D600 273,Posn A700 273,PosnData D700 273,PVT A800 273,PVTData D800 273,nospec A601+D601+A801+D801+A802+D802+A902+A903 282,Link L001 282,DevCmd A010 282,WP A100 282,WPData D108 282,RT N/A 282,TR A302 282,TRHeader D311 282,TRData D301 282,Prx N/A 282,AL A500 282,ALData D501 282,DtTm A600 282,DtTmData D600 282,Posn A700 282,PosnData D700 282,PVT A800 282,PVTData D800 282,LAP A906 282,LAPData D906 282,nospec A802+A903 283,Link L001 283,DevCmd A010 283,WP A100 283,WPData D110 283,RT A201 283,RTHeader D202 283,RTWPData D110 283,RTLinkData D210 283,TR A302 283,TRHeader D311 283,TRData D301 283,Prx N/A 283,AL A500 283,ALData D501 283,DtTm A600 283,DtTmData D600 283,Posn A700 283,PosnData D700 283,PVT A800 283,PVTData D800 283,LAP A906 283,LAPData D906 285+,Link L001 285+,Baud T001 285+,DevCmd A010 285+,WP A100 285+,WPData D110 285+,WPCat A101 285+,WPCatData D120 285+,RT A201 285+,RTHeader D202 285+,RTWPData D110 285+,RTLinkData D210 285+,TR A301 285+,TRHeader D312 285+,TRData D302 285+,Prx A400 285+,PrxWPData D110 285+,AL A500 285+,ALData D501 285+,DtTm A600 285+,DtTmData D600 285+,Posn A700 285+,PosnData D700 285+,PVT A800 285+,PVTData D800 285+,LAP A906 285+,LAPData D906 285+,nospec A601+D601+A802+D802A900+A902+A903+A904+A907+D907+D908+D909+D910 291,Link L001 291,DevCmd A010 291,WP A100 291,WPData D109 291,RT A201 291,RTHeader D202 291,RTWPData D109 291,RTLinkData D210 291,TR A301 291,TRHeader D310 291,TRData D301 291,Prx A400 291,PrxWPData D109 291,AL A500 291,ALData D501 291,DtTm A600 291,DtTmData D600 291,Posn A700 291,PosnData D700 291,PVT A800 291,PVTData D800 291,nospec A601+D601+A900+A902+A903+A904 292,Link L001 292,Baud T001 292,DevCmd A010 292,WP A100 292,WPData D110 292,RT A201 292,RTHeader D202 292,RTWPData D110 292,RTLinkData D210 292,TR A301 292,TRHeader D312 292,TRData D302 292,Prx A400 292,PrxWPData D110 292,AL A500 292,ALData D501 292,DtTm A600 292,DtTmData D600 292,Posn A700 292,PosnData D700 292,PVT A800 292,PVTData D800 292,nospec A601+D601+A801+D801+A900+A902+A903+A904+A907+D907+D908+D909+D910+A908+D911+A914+A916+A917+D917+A918+D918+A1010+A1011 314,Link L001 314,DevCmd A010 314,WP A100 314,WPData D108 314,RT A201 314,RTHeade D202 314,RTWPData D108 314,RTLinkData D210 314,TR A301 314,TRHeader D310 314,TRData D301 314,Prx N/A 314,AL A500 314,ALData D501 314,DtTm A600 314,DtTmData D600 314,Posn A700 314,PosnData D700 314,PVT A800 314,PVTData D800 314,nospec A802+D802+A903 315,Link L001 315,Baud T001 315,DevCmd A010 315,WP A100 315,WPData D109 315,RT A201 315,RTHeader D202 315,RTWPData D109 315,RTLinkData D210 315,TR A301 315,TRHeader D310 315,TRData D301 315,Prx A400 315,PrxWPData D109 315,AL A500 315,ALData D501 315,DtTm A600 315,DtTmData D600 315,Posn A700 315,PosnData D700 315,PVT A800 315,PVTData D800 315,nospec A601+D601+A900+A902+A903+A904+A907+D907+D908+D909+D910+A914 382,Link L001 382,Baud T001 382,DevCmd A010 382,WP A100 382,WPData D110 382,RT N/A 382,TR N/A 382,Prx N/A 382,AL A500 382,ALData D501 382,DtTm A600 382,DtTmData: D600 382,Posn A700 382,PosnData D700 382,PVT A800 382,PVTData D800 382,nospec A101+D120+D110+D210+A601+D601+A802+D802+A900+A902+A903+A904+A905+D900+A907+D907+D908+D909+D910+A908+D911+A912+D912+A913+D913+A916+A917+D917 404,Link L001 404,Baud T001 404,DevCmd A010 404,WP A100 404,WPData D110 404,WPCat A101 404,WPCatData D120 404,RT A201 404,RTHeader D202 404,RTWPData D110 404,RTLinkData D210 404,TR A301 404,TRHeader D310 404,TRData D302 404,Prx A400 404,PrxWPData D110 404,AL A500 404,ALData D501 404,DtTm A600 404,DtTmData D600 404,FleetManagement A602 404,FMData D602 404,Posn A700 404,PosnData D700 404,PVT A800 404,PVTData D800 404,nospec A601+D601+A802+D802+A900+A902+A903+A904+A905+D900+A907+D907+D908+D909+D910+A908+D911+A912+D912+A913+D913+A915+D915+A916+A917+D917+A918+D918 419,Link L001 419,DevCmd A010 419,WP A100 419,WPData D108 419,RT A201 419,RTHeade D202 419,RTWPData D108 419,RTLinkData D210 419,TR A301 419,TRHeader D310 419,TRData D301 419,Prx N/A 419,AL A500 419,ALData D501 419,DtTm A600 419,DtTmData D600 419,Posn A700 419,PosnData D700 419,PVT A800 419,PVTData D800 419,nospec A900,A902,A903 421,Link L001 421,Baud T001 421,DevCmd A010 421,WP A100 421,WPData D110 421,RT A201 421,RTHeader D202 421,RTWPData D110 421,RTLinkData D210 421,TR A301 421,TRHeader D312 421,TRData D302 421,Prx A400 421,PrxWPData D110 421,AL A500 421,ALData D501 421,DtTm A600 421,DtTmData D600 421,Posn A700 421,PosnData D700 421,PVT A800 421,PVTData D800 421,nospec A601+D601+A900+A902+A903+A904+A907+D907+D908+D909+D910+A908+D911+A914+A916+A917+D917+A918+D918 450,Link L001 450,Baud T001 450,DevCmd A010 450,WP A100 450,WPData D110 450,RT A201 450,RTHeader D202 450,RTWPData D110 450,RTLinkData D210 450,TR A302 450,TRHeader D311 450,TRData D304 450,Prx N/A 450,AL A500 450,ALData D501 450,DtTm A600 450,DtTmData D600 450,Posn A700 450,PosnData D700 450,PVT A800 450,PVTData D800 450,nospec A601+D601+A801+D801+A902+A903+A907+D907+D908+D909+D910+A918+D918+A1000+D1009+A906+D1011+A1002+D1008+A1003+D1003+A1004+D1004+A1005+D1005+A1006+D1006+A1007+D1007+A1008+D1012+A1009+D1013 481,Link L001 481,Baud T001 481,DevCmd A010 481,WP A100 481,WPData D110 481,RT N/A 481,TR N/A 481,Prx N/A 481,AL A500 481,ALData D501 481,DtTm A600 481,DtTmData: D600 481,FleetManagement A602+A603 481,FMData D602+D603 481,Posn A700 481,PosnData D700 481,PVT A800 481,PVTData D800 481,nospec A101+D120+D110+D210+A601+D601+A802+D802+A900+A902+A903+A904+A905+D900+A907+D907+D908+D909+D910+A908+D911+A912+D912+A913+D913+A916+A917+D917+A918+D918+A919 497,Link L001 497,Baud T001 497,DevCmd A010 497,WP A100 497,WPData D110 497,RT N/A 497,TR N/A 497,Prx N/A 497,AL A500 497,ALData D501 497,DtTm A600 497,DtTmData: D600 497,Posn A700 497,PosnData D700 497,PVT A800 497,PVTData D800 497,nospec A101+D120+D110+D210+A601+D601+A802+D802+A900+A902+A903+A904+A905+D900+A907+D907+D908+D909+D910+A908+D911+A912+D912+A913+D913+A916+A917+D917+A918+D918+A919 532,Link L001 532,Baud T001 532,DevCmd A010 532,WP A100 532,WPData D110 532,RT N/A 532,TR N/A 532,Prx N/A 532,AL A500 532,ALData D501 532,DtTm A600 532,DtTmData: D600 532,Posn A700 532,PosnData D700 532,PVT A800 532,PVTData D800 532,nospec A601+D601+A802+D802+A900+A902+A903+A904+A905+D900+A907+D907+D908+D909+D910+A908+D911+A913+A916+A917+D917+A918+D918 557,Link L001 557,Baud T001 557,DevCmd A010 557,WP A100 557,WPData D110 557,WPCat A101 557,WPCatData D120 557,RT A201 557,RTHeader D202 557,RTWPData D110 557,RTLinkData D210 557,TR A301 557,TRHeader D312 557,TRData D302 557,Prx A400 557,PrxWPData D110 557,AL A500 557,ALData D501 557,DtTm A600 557,DtTmData D600 557,Posn A700 557,PosnData D700 557,PVT A800 557,PVTData D800 557,nospec A601+D601+A802+D802+A900+A902+A903+A904+A905+D900+A907+D907+D908+D909+D910+A908+D911+A913+D913+A916+A918+D918 } # must not differ on the Link and DevCmd protocols # cannot refer to unknown/unsupported protocols except in # list of "nospec" protocols array set PSDIFF { 7 {59 {RTHeader D200} {TR N/A}} 13 {59 {RTHeader D200} {Prx A400} {PrxData D400}} 14 {59 {RTHeader D200} {TR N/A} {Prx A400} {PrxData D400}} 15 {14 {WPData D151} {RTWPData D151} {PrxData D151}} 22 {13 {WPData D152} {RTWPData D152} {PrxData D152}} 29 {59 {WPData D101} {RTWPData D101} {Prx A400} {PrxData D101}} 29+ {29 {WPData D102} {RTWPData D102} {PrxData D102}} 39 {59 {WPData D151} {RTWPData D151}} 45 {59 {WPData D152} {RTWPData D152}} 48 {59 {WPData D154} {RTWPData D154} {ALData D501}} 49 {29 {ALData D501}} 50 {45 {ALData D501}} 67 {59 {WPData D105} {RTHeader D202} {RTWPData D106} {ALData D501}} 71 {59 {WPData D155} {RTWPData D155} {ALData D501}} 72 {71 {WPData D104} {RTWPData D104}} 73 {71 {WPData D103} {RTWPData D103}} 77 {59 {Prx A400} {PrxData D400} {ALData D501}} 77+ {73 {Prx A400} {PrxData D403}} 130 {111 {RTHeader D202}} 136 {177 {nospec A802+D802+A900+A902+A903}} 111+ {111 {WPData D109} {RTWPData D109} {PrxWPData D109}} 112 {59 {WPData D152} {RTWPData D152} {ALData D501}} 126 {145 {nospec A900+A902+A903}} 155 {145 {nospec A900+A902+A903+A904}} 197 {177 {Prx N/A}} 219 {248 {nospec A900+A902+A903}} 256 {248 {nospec A802}} 264 {291 {Baud T001} {nospec A802+D802+A900+A902+A903}} 289+ {289 {nospec A601+D601+A900+A902+A903+A904+A907+D907+D908+D909+D910+A914+A1010+A1011}} 411 {419 {nospec A802+D802+A900+A902+A903}} 439 {177 {nospec A800+D801+A802+D802+A900+A902+A903}} 484 {450 {AL N/A} {nospec A601+D601+A902+A903+A907+D907+D908+D909+D910+A1000+D1009+A906+D1011+A1000+D1009+A1002+D1008+A1003+D1003+A1004+D1004+A1005+D1005+A1006+D1006+A1007+D1007+A1008+D1012+A1009+D1013}} 484+ {450 {nospec A601+D601+A801+D801+A902+A903+A907+D907+D908+D909+D910+A918+D918+A1000+D1009+A906+D1015+A1002+D1008+A1003+D1003+A1004+D1004+A1005+D1005+A1006+D1006+A1007+D1007+A1008+D1012+A1009+D1013+A1013+D1014}} 694 {421 {nospec A601+D601+A801+D801+A900+A902+A903+A904+A907+D907+D908+D909+D910+A908+D911+A914+A916+A917+D917+A918+D918}} 694+ {421 {nospec A601+D601+A801+D801+A900+A902+A903+A904+A905+D900+A907+D907+D908+D909+D910+A908+D911+A914+A916+A917+D917+A918+D918}} 696+ {696 {nospec A902+A903}} 811 {273 {Baud N/A} {nospec A902+A903+A1010}} 957 {421 {nospec A601+D601+A801+D801+A900+A902+A903+A904+A905+D900+A907+D907+D908+D909+D910+A908+D911+A914+A916+A918+D918}} 1095 {177 {Baud T001} {nospec A601+D601+A902+A903+A904+A907+D907+D908+D909+D910+A908+D910+A914}} } ## descriptions, positions in Garmin structures of GPSMan data # normally the suffixes of each data array name, but see # the corresponding proc Conv${wh}Data (garmin.tcl) array set DATAFOR { D100,ns {Name Posn Commt} D100,ps {0 1 3} D101,ns {Name Posn Commt Symbol} D101,ps {0 1 3 5} D102,ns {Name Posn Commt Symbol} D102,ps {0 1 3 5} D103,ns {Name Posn Commt Symbol DispOpt} D103,ps {0 1 3 4 5} D104,ns {Name Posn Commt Symbol DispOpt} D104,ps {0 1 3 5 6} D105,ns {Posn Symbol Name} D105,ps {0 1 2} D106,ns {Posn Symbol Name} D106,ps {2 3 4} D107,ns {Name Posn Commt Symbol DispOpt} D107,ps {0 1 3 4 5} D108,ns {DispOpt Symbol Posn Alt Name Commt} D108,ps {2 4 6 7 12 13} D109,ns {DispOpt Symbol Posn Alt Name Commt} D109,ps {2 4 6 7 13 14} D110,ns {DispOpt Symbol Posn Alt Name Commt} D110,ps {2 4 6 7 16 17} D150,ns {Name Posn Alt Commt} D150,ps {0 3 4 8} D151,ns {Name Posn Commt Alt} D151,ps {0 1 3 8} D152,ns {Name Posn Commt Alt} D152,ps {0 1 3 8} D154,ns {Name Posn Commt Alt Symbol} D154,ps {0 1 3 8 12} D155,ns {Name Posn Commt Alt Symbol DispOpt} D155,ps {0 1 3 8 12 13} D310,ns {Colour Name} D310,ps {1 2} D311,ns Name D311,ps 0 D312,ns {Colour Name} D312,ps {1 2} D500,ns {week datatime clockc1 clockc2 ecc sqrta mnanom argprgee rightasc rtrightasc inclin} D500,ps {0 1 2 3 4 5 6 7 8 9 10} D501,ns {week datatime clockc1 clockc2 ecc sqrta mnanom argprgee rightasc rtrightasc inclin health} D501,ps {0 1 2 3 4 5 6 7 8 9 10 11} D550,ns {svid week datatime clockc1 clockc2 ecc sqrta mnanom argprgee rightasc rtrightasc inclin} D550,ps {0 1 2 3 4 5 6 7 8 9 10 11} D551,ns {svid week datatime clockc1 clockc2 ecc sqrta mnanom argprgee rightasc rtrightasc inclin health} D551,ps {0 1 2 3 4 5 6 7 8 9 10 11 12} D906,ns {Start Dur Dist BegPosn EndPosn Cals TRIx} D906,ps {0 1 2 3 4 5 6} } ## colours: names (as in rgb.tcl) ordered as in a C enumeration according to # Garmin value, and name of global variable containing default value array set GARMINCOLOURS { D310 {black darkred darkgreen darkyellow darkblue darkmagenta darkcyan lightgray darkgray red green yellow blue magenta cyan white default} D310,dvar DEFTTRCOLOUR D312 {black darkred darkgreen darkyellow darkblue darkmagenta darkcyan lightgray darkgray red green yellow blue magenta cyan white transparent default} D312,dvar DEFTTRCOLOUR } ## hidden attributes: # names, types, default values, positions in Garmin structures, # constraints of hidden attributes and (possibly) preprocessing info # and formatting info (see proc HiddenFormatVal) # positions must be in increasing order! # constraints assume that all attributes have been assigned to variables # with the same name array set HIDDENFOR { D106,ns {class subclass lnk_ident} D106,ts {byte bytes=13 string} D106,vs {0 0 ""} D106,ps {0 1 5} D106,cs { { if { $class==0 } { lappend undef subclass } } } D106,fm {{class enumd {user non_user}}} D107,ns {colour} D107,ts {byte} D107,vs {0} D107,ps {7} D107,cs {} D107,fm {{colour enum {default red green blue}}} D108,ns {class colour attrs subclass depth state country facility city addr int_road} D108,ts {byte byte byte bytes=18 float charray=2 charray=2 string string string string} D108,vs {0 255 96 "0 0 0 0 0 0 255 255 255 255 255 255 255 255 255 255 255 255" 1.0e25 "" "" "" "" "" ""} D108,ps {0 1 3 5 8 10 11 14 15 16 17} D108,cs { { if { $class==0 || $class>0x46 } { lappend undef city facility } } { if { $class<0x80 } { lappend undef subclass } } { if { $class!=0x83 } { lappend undef addr } } { if { $class!=0x82 } { lappend undef int_road } } } D108,fm {{class envals {{0 user} {0x40 avn_airport} {0x41 avn_inters} {0x42 avn_NDB} {0x43 avn_VOR} {0x44 avn_airp_rway} {0x45 avn_airp_int} {0x46 avn_airp_NDB} {0x80 map_pt} {0x81 map_area} {0x82 map_int} {0x83 map_addr} {0x84 map_line}}} {colour enumd {black dark_red dark_green dark_yellow dark_blue dark_magenta dark_cyan light_gray dark_gray red green yellow blue magenta cyan white default}}} D109,ns {dtyp class colour attrs subclass depth state country ete facility city addr int_road} D109,ts {byte byte byte byte bytes=18 float charray=2 charray=2 longword string string string string} D109,vs {1 0 0x1f 0x70 "0 0 0 0 0 0 255 255 255 255 255 255 255 255 255 255 255 255" 1.0e25 "" "" 0xffffffff "" "" "" ""} D109,ps {0 1 2 3 5 8 10 11 12 15 16 17 18} D109,cs { { if { $class==0 || $class>0x46 } { lappend undef city facility } } { if { $class<0x80 } { lappend undef subclass } } { if { $class!=0x83 } { lappend undef addr } } { if { $class!=0x82 } { lappend undef int_road } } } D109,pp {{colour &0x1f}} D109,fm {{class envals {{0 user} {0x40 avn_airport} {0x41 avn_inters} {0x42 avn_NDB} {0x43 avn_VOR} {0x44 avn_airp_rway} {0x45 avn_airp_int} {0x46 avn_airp_NDB} {0x80 map_pt} {0x81 map_area} {0x82 map_int} {0x83 map_addr} {0x84 map_line}}} {colour enumd {black dark_red dark_green dark_yellow dark_blue dark_magenta dark_cyan light_gray dark_gray red green yellow blue magenta cyan white default}}} D110,ns {dtyp class colour attrs subclass depth state country ete temp time cat facility city addr int_road} D110,ts {byte byte byte byte bytes=18 float charray=2 charray=2 longword float longword int string string string string} D110,vs {1 0 0 0x80 "0 0 0 0 0 0 255 255 255 255 255 255 255 255 255 255 255 255" 1.0e25 "" "" 0xffffffff 1.0e25 0xffffffff 0 "" "" "" ""} D110,ps {0 1 2 3 5 8 10 11 12 13 14 15 18 19 20 21} D110,cs { { if { $class==0 || $class>0x46 } { lappend undef city facility } } { if { $class<0x80 } { lappend undef subclass } } { if { $class!=0x83 } { lappend undef addr } } { if { $class!=0x82 } { lappend undef int_road } } } D110,pp {{colour &0x1f}} D110,fm {{class envals {{0 user} {0x40 avn_airport} {0x41 avn_inters} {0x42 avn_NDB} {0x43 avn_VOR} {0x44 avn_airp_rway} {0x45 avn_airp_int} {0x46 avn_airp_NDB} {0x80 map_pt} {0x81 map_area} {0x82 map_int} {0x83 map_addr} {0x84 map_line}}} {colour enumd {black dark_red dark_green dark_yellow dark_blue dark_magenta dark_cyan light_gray dark_gray red green yellow blue magenta cyan white transparent}}} D150,ns {country class city state facility} D150,ts {charray=2 byte charray=24 charray=2 charray=30} D150,vs {"" 4 "" "" ""} D150,ps {1 2 5 6 7} D150,cs { { if { $class==4 } { lappend undef city state country facility } } } D150,fm {{class enum {avn_airport avn_inters avn_NDB avn_VOR user avn_airp_rway avn_airp_int locked}}} D151,ns {facility city state country class} D151,ts {charray=30 charray=24 charray=2 charray=2 byte} D151,vs {"" "" "" "" 2} D151,ps {5 6 7 9 11} D151,cs { { if { $class==2 } { lappend undef city state country facility } } } D151,fm {{class enum {avn_airport avn_VOR user locked}}} D152,ns {facility city state country class} D152,ts {charray=30 charray=24 charray=2 charray=2 byte} D152,vs {"" "" "" "" 4} D152,ps {5 6 7 9 11} D152,cs { { if { $class==4 } { lappend undef city state country facility } } } D152,fm {{class enum {avn_airport avn_inters avn_NDB avn_VOR user locked}}} D154,ns {facility city state country class} D154,ts {charray=30 charray=24 charray=2 charray=2 byte} D154,vs {"" "" "" "" 4} D154,ps {5 6 7 9 11} D154,cs { { if { $class==4 } { lappend undef city state country facility } } } D154,fm {{class enum {avn_airport avn_inters avn_NDB avn_VOR user avn_airp_rway avn_airp_int avn_airp_NDB user_symbol locked}}} D155,ns {facility city state country class} D155,ts {charray=30 charray=24 charray=2 charray=2 byte} D155,vs {"" "" "" "" 4} D155,ps {5 6 7 9 11} D155,cs { { if { $class==4 } { lappend undef city state country facility } } } D155,fm {{class enum {avn_airport avn_inters avn_NDB avn_VOR user locked}}} D210,ns {class subclass} D210,ts {word bytes=18} D210,vs {0 "0 0 0 0 0 0 255 255 255 255 255 255 255 255 255 255 255 255"} D210,ps {0 1} D210,cs { { if { $class==3 || $class==0xff } { lappend undef subclass } } } D210,fm {{class enum {line link net direct snap}}} D310,ns {display} D310,ts {boolean} D310,vs {0} D310,ps {0} D310,cs {} D310,fm {{display enumd {no yes}}} D312,ns {display} D312,ts {boolean} D312,vs {0} D312,ps {0} D312,cs {} D312,fm {{display enumd {no yes}}} } # no longer used hidden attributes # type, name in FATTRPAIRS array (see files.tcl), and # conversion code from Garmin value to GPSMan value # conversion code assumes that # - each attribute value have been assigned to a variable with same name # as the attribute # - each such variable is set to the converted value # - the variable $default has been assigned to the default value array set OLDHIDDENFOR { D310:colour {byte colour { set colour [FromGarminColour D310 $colour] } } } ### PVT status for D800 array set GarminPVTStatus { 0 error 1 _ 2 2D 3 3D 4 2D-diff 5 3D-diff } ### Simple Text Output Protocol set SimpleTextBegs "1 3 5 7 9 11 13 14 16 21 22 25 30 31 34 35 40 \ 41 45 46 50 51" set SimpleTextEnds "2 4 6 8 10 12 13 15 20 21 24 29 30 33 34 39 40 \ 44 45 49 50 54" array set SimpleTextPStatus { _ _ d 2D-diff D 3D-diff g 2D G 3D S simul } gpsman-6.4.4.2/gmsrc/acccomp.tcl0000644000175000017500000003335412224351117014516 0ustar migmig# # This file is part of: # # gpsman --- GPS Manager: a manager for GPS receiver data # # Copyright (c) 1998-2013 Miguel Filgueiras migfilg@t-online.de # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. # # File: acccomp.tcl # Last change: 6 October 2013 # # Replacement procedures for more accurate and more slow computations of # distances and bearings # This file to be consulted after compute.tcl ## Formulae for distances and bearings taken from the program "inverse" # available from ftp://www.ngs.noaa.gov/pub/pcsoft/for_inv.3d/ # They correspond to the modified Rainsford's Method with Helmert's # elliptical terms, and are effective in any azimuth and at any # distance short of antipodal, none of the points can be a pole # If one of the points is a pole, or the points are nearly antipodal # the Law of Cosines for Spherical Trigonometry, kindly supplied by # Luisa Bastos (Universidade do Porto) and Gil Goncalves (Universidade # de Coimbra), will be applied ## proc ComputeDist {p1 p2 datum} { # distance between positions $p1 and $p2 with same datum # formulae from "inverse" program (see above) set lad1 [lindex $p1 0] ; set lod1 [lindex $p1 1] set lad2 [lindex $p2 0] ; set lod2 [lindex $p2 1] if { $lad1==$lad2 && $lod1==$lod2 } { return 0 } set la1 [expr $lad1*0.01745329251994329576] set lo1 [expr $lod1*0.01745329251994329576] set la2 [expr $lad2*0.01745329251994329576] set lo2 [expr $lod2*0.01745329251994329576] set dt [EllipsdData $datum] set a [lindex $dt 0] ; set f [lindex $dt 1] if { [expr abs(cos($la1))]<1.e-20 || [expr abs(cos($la2))]<1.e-20 || \ ( $lad1+$lad2 < 1e-4 && abs(abs($lod1-$lod2)-180) < 1e-4 ) } { # use Law of Cosines for Spherical Trigonometry set x [expr cos($lo1-$lo2)*cos($la1)*cos($la2)+sin($la1)*sin($la2)] if { $x >= 1 } { return 0 } return [expr 1e-3*$a*acos($x)] } set eps 5e-12 set r [expr 1-$f] set tu1 [expr $r*tan($la1)] ; set tu2 [expr $r*tan($la2)] set cu1 [expr 1.0/sqrt($tu1*$tu1+1.0)] set su1 [expr $cu1*$tu1] set cu2 [expr 1.0/sqrt($tu2*$tu2+1.0)] set s [expr $cu1*$cu2] set baz [expr $s*$tu2] ; set faz [expr $baz*$tu1] set x [expr $lo2-$lo1] ; set d [expr $x+1] while { abs($d-$x) > $eps } { set sx [expr sin($x)] ; set cx [expr cos($x)] set tu1 [expr $cu2*$sx] ; set tu2 [expr $baz-$su1*$cu2*$cx] set sy [expr sqrt($tu1*$tu1+$tu2*$tu2)] set cy [expr $s*$cx+$faz] ; set y [expr atan2($sy,$cy)] set sa [expr $s*$sx/$sy] ; set c2a [expr -$sa*$sa+1.0] set cz [expr $faz+$faz] if { $cz > 0 } { set cz [expr -$cz/$c2a+$cy] } set e [expr $cz*$cz*2-1.0] set c [expr ((-3*$c2a+4.0)*$f+4.0)*$c2a*$f/16] set d $x set x [expr (($e*$cy*$c+$cz)*$sy*$c+$y)*$sa] set x [expr (1-$c)*$x*$f+$lo2-$lo1] } set faz [expr atan2($tu1,$tu2)] set baz [expr atan2($cu1*$sx,$baz*$cx-$su1*$cu2)+3.14159265358979323846] set x [expr sqrt((1.0/$r/$r-1)*$c2a+1)+1] ; set x [expr ($x-2.0)/$x] set c [expr 1-$x] ; set c [expr ($x*$x/4.0+1)/$c] set d [expr (0.375*$x*$x-1)*$x] set x [expr $e*$cy] set s [expr 1-$e-$e] set s [expr (((($sy*$sy*4-3)*$s*$cz*$d/6.0-$x)*$d/4.0+$cz)*$sy*$d+$y) \ *$c*$a*$r*1e-3] return $s } proc ComputeBear {p1 p2 datum} { # bearing from positions $p1 and $p2 with same datum # formulae from "inverse" program (see above) set lad1 [lindex $p1 0] ; set lod1 [lindex $p1 1] set lad2 [lindex $p2 0] ; set lod2 [lindex $p2 1] if { $lad1==$lad2 && $lod1==$lod2 } { return 0 } set la1 [expr $lad1*0.01745329251994329576] set lo1 [expr $lod1*0.01745329251994329576] set la2 [expr $lad2*0.01745329251994329576] set lo2 [expr $lod2*0.01745329251994329576] if { [expr abs(cos($la1))]<1.e-20 || [expr abs(cos($la2))]<1.e-20 } { # use Law of Cosines for Spherical Trigonometry # bearing set da [expr $la2-$la1] ; set do [expr $lo2-$lo1] if { [expr abs($da)] < 1e-20 } { if { [expr abs($do)] < 1e-20 } { set b 0 } elseif { $do < 0 } { set b 270 } else { set b 90 } } elseif { [expr abs($do)] < 1e-20 } { if { $da < 0 } { set b 180 } else { set b 0 } } else { set b [expr round(atan2(sin($do), \ tan($la2)*cos($la1)-sin($la1)*cos($do)) \ *57.29577951308232087684)] if { $b < 0 } { if { $do < 0 } { incr b 360 } else { incr b 180 } } elseif { $do < 0 } { incr b 180 } } return $b } set dt [EllipsdData $datum] set a [lindex $dt 0] ; set f [lindex $dt 1] set eps 5e-12 set r [expr 1-$f] set tu1 [expr $r*tan($la1)] ; set tu2 [expr $r*tan($la2)] set cu1 [expr 1.0/sqrt($tu1*$tu1+1.0)] set su1 [expr $cu1*$tu1] set cu2 [expr 1.0/sqrt($tu2*$tu2+1.0)] set s [expr $cu1*$cu2] set baz [expr $s*$tu2] ; set faz [expr $baz*$tu1] set x [expr $lo2-$lo1] ; set d [expr $x+1] while { abs($d-$x) > $eps } { set sx [expr sin($x)] ; set cx [expr cos($x)] set tu1 [expr $cu2*$sx] ; set tu2 [expr $baz-$su1*$cu2*$cx] set sy [expr sqrt($tu1*$tu1+$tu2*$tu2)] set cy [expr $s*$cx+$faz] ; set y [expr atan2($sy,$cy)] set sa [expr $s*$sx/$sy] ; set c2a [expr -$sa*$sa+1.0] set cz [expr $faz+$faz] if { $cz > 0 } { set cz [expr -$cz/$c2a+$cy] } set e [expr $cz*$cz*2-1.0] set c [expr ((-3*$c2a+4.0)*$f+4.0)*$c2a*$f/16] set d $x set x [expr (($e*$cy*$c+$cz)*$sy*$c+$y)*$sa] set x [expr (1-$c)*$x*$f+$lo2-$lo1] } set faz [expr atan2($tu1,$tu2)] set b [expr round($faz*57.29577951308232087684)] if { $b < 0 } { incr b 360 } return $b } proc ComputeDistBear {p1 p2 datum} { # distance between and bearing from positions $p1 and $p2 with same datum # formulae from "inverse" program (see above) set lad1 [lindex $p1 0] ; set lod1 [lindex $p1 1] set lad2 [lindex $p2 0] ; set lod2 [lindex $p2 1] if { $lad1==$lad2 && $lod1==$lod2 } { return "0 0" } set la1 [expr $lad1*0.01745329251994329576] set lo1 [expr $lod1*0.01745329251994329576] set la2 [expr $lad2*0.01745329251994329576] set lo2 [expr $lod2*0.01745329251994329576] set dt [EllipsdData $datum] set a [lindex $dt 0] ; set f [lindex $dt 1] if { [expr abs(cos($la1))]<1.e-20 || [expr abs(cos($la2))]<1.e-20 } { # use Law of Cosines for Spherical Trigonometry # bearing set da [expr $la2-$la1] ; set do [expr $lo2-$lo1] if { [expr abs($da)] < 1e-20 } { if { [expr abs($do)] < 1e-20 } { set b 0 } elseif { $do < 0 } { set b 270 } else { set b 90 } } elseif { [expr abs($do)] < 1e-20 } { if { $da < 0 } { set b 180 } else { set b 0 } } else { set b [expr round(atan2(sin($do), \ tan($la2)*cos($la1)-sin($la1)*cos($do)) \ *57.29577951308232087684)] if { $b < 0 } { if { $do < 0 } { incr b 360 } else { incr b 180 } } elseif { $do < 0 } { incr b 180 } } return [list [expr 1e-3*$a*acos(cos($lo1-$lo2)*cos($la1)*cos($la2)+ \ sin($la1)*sin($la2))] $b] } set eps 5e-12 set r [expr 1-$f] set tu1 [expr $r*tan($la1)] ; set tu2 [expr $r*tan($la2)] set cu1 [expr 1.0/sqrt($tu1*$tu1+1.0)] set su1 [expr $cu1*$tu1] set cu2 [expr 1.0/sqrt($tu2*$tu2+1.0)] set s [expr $cu1*$cu2] set baz [expr $s*$tu2] ; set faz [expr $baz*$tu1] set x [expr $lo2-$lo1] ; set d [expr $x+1] while { abs($d-$x) > $eps } { set sx [expr sin($x)] ; set cx [expr cos($x)] set tu1 [expr $cu2*$sx] ; set tu2 [expr $baz-$su1*$cu2*$cx] set sy [expr sqrt($tu1*$tu1+$tu2*$tu2)] set cy [expr $s*$cx+$faz] ; set y [expr atan2($sy,$cy)] set sa [expr $s*$sx/$sy] ; set c2a [expr -$sa*$sa+1.0] set cz [expr $faz+$faz] if { $cz > 0 } { set cz [expr -$cz/$c2a+$cy] } set e [expr $cz*$cz*2-1.0] set c [expr ((-3*$c2a+4.0)*$f+4.0)*$c2a*$f/16] set d $x set x [expr (($e*$cy*$c+$cz)*$sy*$c+$y)*$sa] set x [expr (1-$c)*$x*$f+$lo2-$lo1] } set faz [expr atan2($tu1,$tu2)] set baz [expr atan2($cu1*$sx,$baz*$cx-$su1*$cu2)+3.14159265358979323846] set x [expr sqrt((1.0/$r/$r-1)*$c2a+1)+1] ; set x [expr ($x-2.0)/$x] set c [expr 1-$x] ; set c [expr ($x*$x/4.0+1)/$c] set d [expr (0.375*$x*$x-1)*$x] set x [expr $e*$cy] set s [expr 1-$e-$e] set s [expr (((($sy*$sy*4-3)*$s*$cz*$d/6.0-$x)*$d/4.0+$cz)*$sy*$d+$y) \ *$c*$a*$r*1e-3] set b [expr round($faz*57.29577951308232087684)] if { $b < 0 } { incr b 360 } return [list $s $b] } proc ComputeDistFD {p1 p2} { # compute distance between positions $p1 and $p2 assuming datum # parameters where set by calling SetDatumData global DatumA DatumF # formulae from "inverse" program (see above) set lad1 [lindex $p1 0] ; set lod1 [lindex $p1 1] set lad2 [lindex $p2 0] ; set lod2 [lindex $p2 1] if { $lad1==$lad2 && $lod1==$lod2 } { return 0 } set la1 [expr $lad1*0.01745329251994329576] set lo1 [expr $lod1*0.01745329251994329576] set la2 [expr $lad2*0.01745329251994329576] set lo2 [expr $lod2*0.01745329251994329576] if { [expr abs(cos($la1))]<1.e-20 || [expr abs(cos($la2))]<1.e-20 } { # use Law of Cosines for Spherical Trigonometry set x [expr cos($lo1-$lo2)*cos($la1)*cos($la2)+sin($la1)*sin($la2)] if { $x >= 1 } { return 0 } return [expr 1e-3*$DatumA*acos($x)] } set eps 5e-12 set r [expr 1-$DatumF] set tu1 [expr $r*tan($la1)] ; set tu2 [expr $r*tan($la2)] set cu1 [expr 1.0/sqrt($tu1*$tu1+1.0)] set su1 [expr $cu1*$tu1] set cu2 [expr 1.0/sqrt($tu2*$tu2+1.0)] set s [expr $cu1*$cu2] set baz [expr $s*$tu2] ; set faz [expr $baz*$tu1] set x [expr $lo2-$lo1] ; set d [expr $x+1] while { abs($d-$x) > $eps } { set sx [expr sin($x)] ; set cx [expr cos($x)] set tu1 [expr $cu2*$sx] ; set tu2 [expr $baz-$su1*$cu2*$cx] set sy [expr sqrt($tu1*$tu1+$tu2*$tu2)] set cy [expr $s*$cx+$faz] ; set y [expr atan2($sy,$cy)] set sa [expr $s*$sx/$sy] ; set c2a [expr -$sa*$sa+1.0] set cz [expr $faz+$faz] if { $cz > 0 } { set cz [expr -$cz/$c2a+$cy] } set e [expr $cz*$cz*2-1.0] set c [expr ((-3*$c2a+4.0)*$DatumF+4.0)*$c2a*$DatumF/16] set d $x set x [expr (($e*$cy*$c+$cz)*$sy*$c+$y)*$sa] set x [expr (1-$c)*$x*$DatumF+$lo2-$lo1] } set faz [expr atan2($tu1,$tu2)] set baz [expr atan2($cu1*$sx,$baz*$cx-$su1*$cu2)+3.14159265358979323846] set x [expr sqrt((1.0/$r/$r-1)*$c2a+1)+1] ; set x [expr ($x-2.0)/$x] set c [expr 1-$x] ; set c [expr ($x*$x/4.0+1)/$c] set d [expr (0.375*$x*$x-1)*$x] set x [expr $e*$cy] set s [expr 1-$e-$e] set s [expr (((($sy*$sy*4-3)*$s*$cz*$d/6.0-$x)*$d/4.0+$cz)*$sy*$d+$y) \ *$c*$DatumA*$r*1e-3] return $s } proc ComputeDistBearFD {p1 p2} { # compute distance between and bearing from positions $p1 and $p2 # assuming datum parameters where set by calling SetDatumData global DatumA DatumF # formulae from "inverse" program (see above) set lad1 [lindex $p1 0] ; set lod1 [lindex $p1 1] set lad2 [lindex $p2 0] ; set lod2 [lindex $p2 1] if { $lad1==$lad2 && $lod1==$lod2 } { return "0 0" } set la1 [expr $lad1*0.01745329251994329576] set lo1 [expr $lod1*0.01745329251994329576] set la2 [expr $lad2*0.01745329251994329576] set lo2 [expr $lod2*0.01745329251994329576] if { [expr abs(cos($la1))]<1.e-20 || [expr abs(cos($la2))]<1.e-20 } { # use Law of Cosines for Spherical Trigonometry # bearing set da [expr $la2-$la1] ; set do [expr $lo2-$lo1] if { [expr abs($da)] < 1e-20 } { if { [expr abs($do)] < 1e-20 } { set b 0 } elseif { $do < 0 } { set b 270 } else { set b 90 } } elseif { [expr abs($do)] < 1e-20 } { if { $da < 0 } { set b 180 } else { set b 0 } } else { set b [expr round(atan2(sin($do), \ tan($la2)*cos($la1)-sin($la1)*cos($do)) \ *57.29577951308232087684)] if { $b < 0 } { if { $do < 0 } { incr b 360 } else { incr b 180 } } elseif { $do < 0 } { incr b 180 } } return [list [expr 1e-3*$DatumA*acos(cos($lo1-$lo2)*cos($la1)* \ cos($la2)+sin($la1)*sin($la2))] $b] } set eps 5e-12 set r [expr 1-$DatumF] set tu1 [expr $r*tan($la1)] ; set tu2 [expr $r*tan($la2)] set cu1 [expr 1.0/sqrt($tu1*$tu1+1.0)] set su1 [expr $cu1*$tu1] set cu2 [expr 1.0/sqrt($tu2*$tu2+1.0)] set s [expr $cu1*$cu2] set baz [expr $s*$tu2] ; set faz [expr $baz*$tu1] set x [expr $lo2-$lo1] ; set d [expr $x+1] while { abs($d-$x) > $eps } { set sx [expr sin($x)] ; set cx [expr cos($x)] set tu1 [expr $cu2*$sx] ; set tu2 [expr $baz-$su1*$cu2*$cx] set sy [expr sqrt($tu1*$tu1+$tu2*$tu2)] set cy [expr $s*$cx+$faz] ; set y [expr atan2($sy,$cy)] set sa [expr $s*$sx/$sy] ; set c2a [expr -$sa*$sa+1.0] set cz [expr $faz+$faz] if { $cz > 0 } { set cz [expr -$cz/$c2a+$cy] } set e [expr $cz*$cz*2-1.0] set c [expr ((-3*$c2a+4.0)*$DatumF+4.0)*$c2a*$DatumF/16] set d $x set x [expr (($e*$cy*$c+$cz)*$sy*$c+$y)*$sa] set x [expr (1-$c)*$x*$DatumF+$lo2-$lo1] } set faz [expr atan2($tu1,$tu2)] set baz [expr atan2($cu1*$sx,$baz*$cx-$su1*$cu2)+3.14159265358979323846] set x [expr sqrt((1.0/$r/$r-1)*$c2a+1)+1] ; set x [expr ($x-2.0)/$x] set c [expr 1-$x] ; set c [expr ($x*$x/4.0+1)/$c] set d [expr (0.375*$x*$x-1)*$x] set x [expr $e*$cy] set s [expr 1-$e-$e] set s [expr (((($sy*$sy*4-3)*$s*$cz*$d/6.0-$x)*$d/4.0+$cz)*$sy*$d+$y) \ *$c*$DatumA*$r*1e-3] set b [expr round($faz*57.29577951308232087684)] if { $b < 0 } { incr b 360 } return [list $s $b] } gpsman-6.4.4.2/gmsrc/langfr.tcl0000644000175000017500000015124112224351120014350 0ustar migmig# # This file is part of: # # gpsman --- GPS Manager: a manager for GPS receiver data # # Copyright (c) 1998-2013 Miguel Filgueiras migfilg@t-online.de # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. # # File: langengl.tcl # Last change: 6 October 2013 # # French language file by Valre Robin (valere.robin _AT_ wanadoo.fr) # Last change by him: 11 November 2001 # last input from him inserted: 12 October 2011 # # Includes contributions by Jean H Theoret (ve2za _AT_ rac.ca) # Includes contributions by Benoit Steiner (benetsteph _AT_ free.fr) # Includes typo corrections by Laurent Bonnaud (bonnaud _AT_ lis.inpg.fr) # # file langengl.tcl is consulted first; no need for duplicating entries here # only 3 chars long names; check also ALLMONTH in file i18n-utf8.tcl set MONTHNAMES "Jan Fev Mar Avr Mai Jun Jul Aou Sep Oct Nov Dec" set DLUNIT(KM,dist) km set DLUNIT(KM,subdist) m set DLUNIT(KM,speed) km/h set DLUNIT(KM,area) "km2" set DLUNIT(NAUTMILE,dist) "mn" set DLUNIT(NAUTMILE,area) "mn2" set DLUNIT(NAUTMILE,speed) noeud set DLUNIT(M,dist) $DLUNIT(KM,subdist) set DLUNIT(FT,dist) $DLUNIT(STATMILE,subdist) set DTUNIT $DLUNIT($DISTUNIT,dist) set SPUNIT $DLUNIT($DISTUNIT,speed) set ARUNIT $DLUNIT($DISTUNIT,area) set ALUNIT $DLUNIT($ALTUNIT,dist) set MESS(RTcomp) "#\tWP\t\t$DTUNIT\tdeg\t$ALUNIT" set MESS(TRcomp) "#\t\t\t\t$ALUNIT\t$DTUNIT\t$DTUNIT\th:m:s\t$SPUNIT\tdeg" set MESS(WPNearest) "WP\t\t$DTUNIT\tdeg" array set MESS { badscale "Valeur errone pour l'chelle de la carte" oktoexit "Ok pour quitter (les donnes non sauves vont tre perdues)" okclrmap "Ok pour effacer la carte" namelgth "Le nom ne doit pas dpasser %d caractres" cmmtlgth "=== Un commentaire ne peut dpasser %d caractres" namevoid "Le nom ne peut tre vide" baddate "Date errone; ligne" badhdg "Mauvais en-tte %s: doit tre %s ou +/-" badcoord "Mauvais format ou intervalle de coordonnes: \"%s\" doit tre %s" outofrng "Nombre non valide" UTMZN "Doit tre une lettre parmi A..H, J..N, ou P..Z" badstrg "Caractre(s) erron(s)" strgvoid "Une chane de caractre ne peut tre vide" nan "\"%s\" n'est pas un nombre" written "crit par" undefWP "L'itinraire %s a des points (WPs) non dfinis; non sauv ou export" bigRT "Itinraire %s > nombre max; non export" unkndatum "Donne inconnue" badcommdWP "Mauvaise commande en chargeant les WPs; ligne" notabsWP "Mauvaise dfinition d'un point d'itinraire; pas de tabulation, ligne" undefinedWP "Rfrence un point d'itinraire inconnu: %s" nofieldsWP "Mauvais point d'itinraire, pas assez de champs; ligne" excfieldsWP "Mauvais point d'itinraire, trop de champs; ligne" badWPsRT "Route avec une liste de points d'itinraire errone; ligne" toomuchWPs "Attention: plus de %d points dans l'itinraire" badcommdTP "Mauvaise commande lors du chargement de TPs; ligne" badTP "Mauvais point dans la trace; ligne" badTPsTR "Trace avec une liste errone de points; ligne" noheader "Le fichier ne commence pas par un en-tte" loaderr "Erreur lors du chargement du fichier; ligne" unkncommd "Commande errone lors du chargement du fichier; ligne" noformat "Le fichier ne commence pas par une ligne Format" badformat "Mauvaise ligne format" badRT "Mauvaise dfinition de route; ligne" badRTargs "Argument de route erron; ligne" badTR "Mauvaise dfinition de trace; ligne" fileact "%s le fichier de %s?" filexists "Le fichier existe!" GPSok "Connexion correcte" toomany "Trop de %ss (> %d)" cantfgt "Oubli impossible %s: appartient un item de la carte" cantfgted "Oubli impossible %s: en cours d'dition" cantmapRTunkn "La route n'est pas sur la carte; pas d'info sur point d'itinraire" cantmapRTed "La route n'est pas sur la carte; point d'itinraire en cours d'dition" cantrun "Excution impossible" inprogr "Opration en cours" cantread "Lecture du fichier auxiliaire impossible" cantwrtopt "criture du fichier de prfrence impossible" voidRT "La route ne contient pas de points" activeRT "La route 0 est active; continuer?" voidTR "La trace ne contient pas de points" idinuse "Identificateur dj utilis" cantunmap "Impossible d'liminer %s de la carte: appartient un item de la carte" askrevert "Retour aux donnes initiales?" askforget "Oubli de ce %s?" notimpl "Non implment" forgetall "Oubli de tous les lments %s de la liste?" counted "Il y a %d %ss dfini(e)s" notlisted "Item non list" wrgval "Valeur errone pour" voidGR "Le groupe n'a pas d'lment." initselfGR "Le groupe se contient lui mme par" GRelout "La commande pour GR est hors d'une dfinition; ligne" badGRels "Groupe avec une mauvaise liste d'lments; ligne" badcommdGRel "Commande errone lors du chargement d'lments GR; ligne" notypeforGRel "lment sans type; ligne" badGRel "Mauvaise dfinition d'lment; ligne" check "Connexion en cours de vrification" toomanyerr "Erreurs trop nombreuses; abandon..." getWP "Acquisition des points d'itinraire" getRT "Acquisition des routes" getTR "Acquisition des traces" getLAP "Acquisition des tapes" putWP "Chargement des points d'itinraire" putRT "Chargement des routes" putTR "Chargement des traces" fillbuffWP "Chargement des buffers de point d'itinraire" fillbuffRT "Chargement des buffers de RT" noACKNAK "Rception d'un paquet au lieu de ACK/NAK; vrifier la connexion GPS" badplatform "Pas de port d'entre/sortie" badserial "Impossibilit d'ouvrir le priphrique %s" nodata "Pas de %ss dans le rcepteur" badimage "Fichier image erron" mapadjust "Placer les points d'itinraire sur la carte puis cliquer sur Ok" duplicate "%s est dj slectionn" clrcurrmap "Effacement de la carte courante?" mbkbaddatum "Donnes absentes ou inconnues" mbkbadscale "L'chelle ne doit pas tre ngative" mbkbadat "Arguments errons" edityourrisk "ditez vos risques!" okclrbkmap "Ok pour effacer le fond de carte" okclrbkim "Ok pour effacer l'image " badSYMBOLcode "Code de symbole erron" badDISPOPTcode "Code d'option d'affichage erron" goingdown "Prfrences sauvegardes; redmarrer" putwhat "criture de quel type d'item?" readwhat "Lecture de quel type d'item?" noWPinx "Trop de points d'itinraire pour le rcepteur" noICinx "Trop d'icnes pour le rcepteur" getIC "Rception des icnes" serial1 "Prambule de l'en-tte erron" serial2 "Commande incorrecte" checksum1 "Checksum de l'en-tte erron" checksum2 "Checksum sur les donnes erron" receiver "Priphrique non connect!" importonly1 "Importation d'une seule sorte de donnes" exportonly1 "Exportation d'une seule sorte de donnes" outdatedprefs "Fichier des prfrences prim ; vrifier maintenant" mustchoose1type "Il faut slectionner une seule sorte d'item" nosuchitems "Pas d'lment correspondant la description" resultsin "Rsultats de recherche dans le groupe" badWP "point d'itinraire non dfini ou absent" badangle "L'angle doit tre compris entre 0 et 360 degrs" georefhow "Mthode de go-rfrencement" cantsolve "Rsolution de l'quation impossible" transfcantscale "chelle absente dans la transformation courante" oldfilefmt "Format de fichier prim ; merci de sauver dans le nouveau format de fichier" unknProj "Projection de la carte inconnue" unknTransf "Transformation de la carte inconnue" badProjargs "Arguments de la projection errons" badTransfargs "Arguments de la transformation errones" badfield "Mauvaise paire d'attribut-valeur" badattr "Mauvais nom d'attribut" missattrs "Argument manquant" mbkbadproj "Projection de la carte errone" mbkbadtransf "Transformation de la carte errone" notUTMproj "Information sauvegarde pour l'UTM; continuer avec la projection" projchg "Merci de confirmer les paramtres de la projection" badparam "Valeur errone pour %s" connectedto "Connect %s" recnotsuppd "Modle du rcepteur non support" gotprots "Dfinition du protocole reue" badprots "Dfinition du protocole erron" defprots "Utilisation de la table du protocole" nohidden "Suppression des donnes caches?" badRS "Itinraire en dehors de la route dfinie; ligne" badWPsRSs "Itinraire avant le premier ou aprs le dernier WP; ligne" windowdestr "La fentre a t dtruite!" badhidden "Format errone pour les donnes caches" replname "Remplacer \"%s\" par un nom ayant au plus %d caractres parmi \"%s\"" badalt "Valeur errone pour l'altitude" baddistunit "Unit de distance errone pour l'chelle de la carte dans le fichier de prfrences" badgridzone "Zone de grille errone" outofgrid "Position en dehors du domaine de la grille" timeoffnotint "Le dcalage horaire doit tre un entier ou se terminer par .5" cantchkprot "Vrification impossible avec le protocole courant" mustconn1st "Connexion avec le rcepteur vrifier" rltmnotsupp "Journalisation en temps rel non supporte par ce rcepteur" createdir "Crer un rpertoire %s et redmarrer" oktomkdir "Accord pour crer le rpertoire %s?" projnameabbr "Donner un nom et un nom court la nouvelle projection" abbrevinuse "Nom court dj pris" nameinuse "Nom dj pris" projinuse "La projection est dj utilise; les modifications vont tre perdues" gridneedsdatum "Dfinition de grille errone pour %s; donne non saisie" badgriddatum "La donne pour la grille %s doit tre %s" cantchggriddatum "La grille ncessite la donne %s" gridinuse "Grille utilise par %s, ne peut pas tre dtruite; continuer?" gridinusenochg "Grille utilise par %s; modification non prise en compte" cantwrtprgr "criture impossible du fichier des projections utilisateur" cantwrtdtel "criture impossible du fichier des donnes utilisateur" movingWP "Placer %s avec le bouton gauche\nAbandonner avec le bouton droit" missingdata "Pas assez de donnes!" needs1wp "L'itinraire doit contenir au moins un point" emptypos "Position avec des champs vides" cantwrtsstate "criture impossible du fichier de sauvegarde d'tat: %s" cantrdsstate "Lecture impossible du fichier de sauvegarde d'tat: %s" corruptsstate "Fichier de sauvegarde d'tat corrompu: %s" editrisk "ditez vos risques!" savestate "Sauvegarde de l'tat courant?" delsstate "Destruction des fichiers de sauvegarde d'tat?" badmapinfo "Mauvais fichier de paramtres de carte" badMHloc "Localisation Maidenhead errone" areais "L'aire du polygone (ne se recoupant pas) est %.3f%s" areatoosmall "L'aire est trop petite (<0.001 km2)" projarea "Calcul de l'aire projete" selfintsct "Rptition d'un point : la route ne doit pas se recouper!" badinvmdist "Erreur d'approximation dans l'inversion de la distance mridienne" badinvproj "Erreur d'approximation dans l'inversion de la projection %s" negdlatlong "Intervalle lat/long erron : ne peut tre negatif!" allundef "Dfinitions manquantes pour les points du groupe" badfloats "Erreurs dans la conversion en virgule flottante; connecter tout de mme?" noprintcmd "Commande d'impression absente; positionner dans les options" cantexecasroot "GPSMan ne peut tre excut par le super-utilisateur ROOT" badargtofunc "Argument erron pour la fonction %s" redefproj "La projection %s dfinie par l'utilisateur efface une projection prdfinie ayant le mme nom abrg ; dfinition modifier!" badattr "Champ optionnel inconnu pour %s : %s" badattrval "Champ optionnel erron pour %s : %s " couldntcd "chec du changement de rpertoire %s" shpext "Mauvaise extension %s; utilisation de .shp, .shx, .dbf?" shpcntopen "Cration/Ouverture du fichier de profil impossible" shpcntcrtfs "Cration des champs .dbf du profil impossible" shpcntwrtfs "criture des champs .dbf du profil impossible" shpoutmem "Saturation mmoire!" shpemptyfile "Fichier vide" shpwrongfile "Type de fichier invalide" shplessdim "Nombre de dimensions insuffisant dans le fichier; continuer?" shpbadWPinRT "%d-ime WP aux coordonnes errones ignors dans la route %s" badGTMvers "Version du fichier GTrackMaker inacceptable" badGTMfile "Chane initiale errone dans le fichier GTrackMake" badGTMcounts "Nombre(s) ngatif(s) dans le fichier GTrakMake" badGTMlat "Dbordement de la latitude dans le fichier GTrackMaker" badGTMlong "Dbordement de la longitude dans le fichier GTrackMaker" badGTMdatum "Mauvaise donne dans le fichier GTrackMaker" unobscmap "Erreur probablement cause par le recouvrement de la carte par une icne ou une fentre: recommencer aprs un dlai." cantwrtimg "Erreur d'criture dans un fichier au format %s" TRsimplres "Cration d'une trace simplifie %s" cantsaveRTid "%s route(s) non sauvegarde(s) : identifiant non numrique" cantsaveTRid "%s trace(s) non sauvegard(s) : identifiant non numrique" badtrvconf "Configuration corrompue; recommencer avec une configuration vide" drvsimoff "Simulateur de conduite : pas encore dmarr" needWP "Simulateur de conduite : charger ou dfinir des points de route" chgrecprot "Changer le protocole du rcepteur" frgetGRcs "Oubli du groupe et de tous ses lments?" clrtrvlog "Effacement du journal de voyage?" nmeainuse "Capture en temps-rel ou lecture d'un fichier NMEA en cours" badfile "Erreur lors de la lecture d'un fichier" RTnoWPname "Un point d'une route ne peux plus tre dsign uniquement par son nom" distlarge "Distance trop grande!" timeconsmg "Opration potentiellement longue: continuer?" badtimeval "Mauvaise heure" badLAP "tapes errones" lapncnsdrd "tapes non lues" undefinedTR "TR inconnu" emptymenu "Menu vide; continuer?" cantwrtsymenu "Impossible d'criture le fichier des menus de symboles" abbrevhasspaces "Nom court ne peut pas avoir des blancs" getAL "Acquisition de l'almanach" needNpoints "Merci de fournir au moins %s points!" twotimeoffsets "Fichier contenant des dcalages horaires diffrents" notimeoffset "Pas d'information de dcalage horaire, suppos nul" baddateas "Mauvaise format de date: %s" unknownenc "Code de caractre inconnu : %s" chgbaudto "Essai de changement de la vitesse %s; merci d'attendre..." baudchgfailed "Changement de la vitesse de transfert impossible" busytrylater "Opration en cours; merci d'essayer plus tard" obssplit "Resultat de la fragmentation de la %s nomme \"%s\"" loginto "Connexion %s" samelgth "Les 2 chaines doivent avoir le mme nombre de caractres" rschkargs "L'appel de la fonction TCL regsub lve une erreur; vrifier les arguments" emptyrmeth "La fonction de renommage ne peut tre vide" cantwrtdefs "Impossibilit d'crire le fichier de dfinitions de l'utilisateur" xcantbey "%s ne peut tre %s" mustselftfam "Une police de caractre doit tre slectionne" badpluginwhere "Mauvais argument \"where\" (localisation) pour le greffon; doit tre une liste de tripls" badpluginparam "Mauvais paramtre du greffon : liste d'expressions de NAME EXPR, NAME commence par _" badpluginparamexec "Lors de l'excution du greffon %s, mauvais paramtre: %s" pluginfailed "Echec du greffon %s avec le message: %s" cantwrtdir "Ecriture sur %s impossible; permissions changer" cantcleandir "Nettoyage du rpertoire %s impossible" defTERMCMD "L'option permettant d'ouvrir une fentre de commande doit tre dfinie au pralable." gpOutfile "Le rsultat est dans le fichier \"%s\" dans le rpertoire de travail." gpQuitgnuplot "Appuyer sur la touche Entre pour quitter GnuPlot." gpModgnuplot "Modifiez la visualisation dans la fentre GnuPlot\ en dplaant la souris (bouton de gauche ou du milieu)\n\ Aprs la fermeture de la fentre GnuPlot, le rsultat\ sera dans le fichier \"%s\" du rpertoire de travail." htResult1 "Traces=\"%s\"" htResult2 "Distance totale=%s Monte totale=%s Descente totale=%s" htResult3 "Dure totale=%s Dure des pauses=%s(%s) Dure des dplacements=%s" htResult4 "%s Cap. plat=%s Cap. monte=%s Cap. descente=%s Est. temps de marche=%s" srResult1 "Pauses (>5min) de la trace \"%s\"" badcumuls "Diffrence d'altitude %s > total des montes %s et/ou descente %s; l'option sur le seuil d'altitude % % devrait tre modifie" } set TXT(RTcompflds) "# WP {$DTUNIT} deg {$ALUNIT} stage label" set TXT(TRcompflds) \ "TP {} {} {} {$ALUNIT} {$DTUNIT} {$DTUNIT} h:m:s {$SPUNIT} deg" set TXT(starttoend) "Dpart: vers la fin %s $DTUNIT;" set TXT(startmax) "max %s $DTUNIT;" set TXT(WPnearflds) "WP {$DTUNIT} deg" set TXT(within) "Parmi (${DTUNIT}s)" set TXT(between) "Entre (${DTUNIT}s)" array set TXT { GMtit "GPS Manager - version" exit Fin map Carte load Chargement loadfrm "Chargement depuis" save Sauvegarde saveels "Sauvegarde des lments" saveto "Sauvegarde vers" clear Effacement clearall "Effacement complet" newWP "Nouveau point d'itinraire" newRT "Nouvelle route" newTR "Nouvelle trace" newGR "Nouveau groupe" import Importation importfrm "Importation depuis" export Exportation exportels "Exportation depuis" exportto "Exportation vers" count Comptage trueN "Nord vrai" automagn "Auto Magntique" usrdef "Dfini par l'utilisateur" nameWP Point nameRT Route nameTR Trace nameGR Groupe namePlot Graphique nameMap Carte nameRTComp "Calcul de route" nameTRComp "Calcul de trace" GPSrec "Rcepteur GPS" turnoff "Arrt" get Prendre put Mettre all Tout select Slectionner selection Slection options Options DMS DMS DMM DMM DDD DDD UTM/UPS UTM/UPS message Message cancel Abandon file Fichier ovwrt craser app Ajout onligne "en ligne" offligne "hors ligne" check Vrifier create Crer revert Rtablir colour couleur grey gris mono mono portr portrait landsc paysage legend Lgende incscale "Inclure l'chelle" more Plus waypoint Waypoint name Nom created Cr cmmt Commentaire withWP "Avec ce point d'itinraire:" displ "Afficher sur la carte" startRT "Dmarrage de la route" route Route number Nombre insb "Insrer avant" insa "Insrer aprs" del Dtruire repl "Remplacer par" comp Calculer RTcomp "Calcul de route" savecomp "Sauvegarde du calcul" totdst "Distance totale" tottime "Temps total" track Trace chophd "Supprimer avant" choptl "Supprimer aprs" incb "Inclure avant" date Date newdate "Nouvelle date pour le point suivant" endprTR "Fin de la trace prcdente" begnxt "Dbut du prochain" date1st "Date du premier point du prochain" TRcomp "Calcul de trace" avgsp "Vitesse moyenne" maxsp "Vitesse maximale" minsp "Vitesse minimale" lat Lat long Long ze ZE zn ZN eastng "Est" nrthng "Nord" zone Zone change Changer forget Oublier others Autres opt_Interf "Interface utilisateur" optLANG Langage optISOLATIN1 "Caractres composs" optDELETE "DEL efface le dernier caractre" optMWINDOWSCONF "Fentre principale" optGPSREC "Modle de GPS" opt_GPSRecConf "Paramtres du rcepteur" optNAMELENGTH "Longueur maximale pour un nom" optINTERVAL "Intervale d'chantillonage" optCOMMENTLENGTH "Longueur maximale pour un commentaire" optMAXWPOINTS "Nombre max des points d'itinraire" optMAXROUTES "Nombre max de routes" optMAXWPINROUTE "Nombre max de points dans une route" optMAXTPOINTS "Nombre max de points dans une trace" optCREATIONDATE "L'enregistrement a une date de cration" optNOLOWERCASE "L'enregistrement n'a pas de minuscule" optDEFAULTSYMBOL "Symbole par dfaut pour un point d'itinraire" optDEFAULTDISPOPT "Option d'affichage par dfaut pour un point d'itinraire" opt_Data "Donnes" optEQNAMEDATA "Donne avec le mme nom" optKEEPHIDDEN "Garder les donnes caches" optDatum Donne optTimeOffset "Dcalage horaire" optACCFORMULAE "Formule juste" optASKPROJPARAMS "Confirmer les paramtres de projection" optBalloonHelp "Bulles d'aide" optNumberingTracks "Numrotation des points des traces" opt_Formats "Units et formats" optDISTUNIT "Distance" KM km NAUTMILE "mile nautique" STATMILE "mile" optPositionFormat "Format de position" optDateFormat "Format de date" opt_Geom "Gomtrie des fentres" opt_MapGeom "Gomtrie des cartes" optMAPWIDTH "Largeur de carte" optMAPHEIGHT "Hauteur de la carte" optMAPSCLENGTH "Longueur de l'chelle" optMAPSCALE "chelle de la carte" optMAXMENUITEMS "Nombre maximum d'lments par menu" optLPOSX "Abscisse de la fentre des listes" optLPOSY "Ordonne de la fentre des listes" optMPOSX "Abscisse de la fentre de la carte" optMPOSY "Ordonne de la fentre de la carte" optRPOSX "Abscisse de la fentre du rcepteur" optRPOSY "Ordonne de la fentre du rcepteur" optEPOSX "Abscisse de la fentre d'erreur" optEPOSY "Ordonne de la fentre d'erreur" optDPOSX "Abscisse de la fentre de dialogue" optDPOSY "Ordonne de la fentre de dialogue" optDPOSRTMAP "Position de la fentre de route par rapport la carte" optLISTWIDTH "Largeur de la liste" optLISTHEIGHT "Hauteur de la liste" optCOLOUR Couleurs optCOLOUR,fg "Premier plan" optCOLOUR,bg "Fond d'cran" optCOLOUR,messbg "Fond pour les erreurs" optCOLOUR,confbg "Fond pour les confirmations" optCOLOUR,selbg "Fond pour les slections" optCOLOUR,dialbg "Fond pour les saisies" optCOLOUR,offligne "Rcepteur hors ligne" optCOLOUR,onligne "Rcepteur en ligne" optCOLOUR,check "Bouton cocher slectionn" optCOLOUR,ballbg "Fond pour les bulles d'aide" optCOLOUR,ballfg "Premier plan pour les bulles d'aide" optMAPCOLOUR "Couleur pour la carte" optMAPCOLOUR,mapsel "Item slectionn" optMAPCOLOUR,WP "Points sur la carte" optMAPCOLOUR,RT "Routes sur la carte" optMAPCOLOUR,mkRT "Routes dfinies sur la carte" optMAPCOLOUR,TR "Traces sur la carte" optMAPCOLOUR,TP "Point d'itinraire sur la carte" optMAPCOLOUR,mapleg "Lgende de la carte" optMAPCOLOUR,anim "Animation sur la carte" optMAPCOLOUR,emptygrid "Image vide" optMAPCOLOUR,fullgrid "Image existante" opt_Files "Priphriques et fichiers" optDEFSPORT "Priphrique" optSAVESTATE "Sauvegarde de l'tat en quittant" optDELSTATE "Destruction des fichiers aprs avoir restaur l'tat" optPERMS "Permission du fichier" optPAPERSIZE "Taille du papier" red Rouge green Vert blue Bleu owner Propritaire permgroup Groupe others Autres fread Lecture fwrite criture fexec Excution YYYYMMDD AAAAMMJJ MMDDYYYY MMJJAAAA DDMMMYYYY JJMMAAAA YYYY-MM-DD AAAA-MM-JJ mainwd "Fentre principale" distazim "Distance et direction" nearestWPs "Points les plus proches" fromto "De %s %s" degrees degrs nameWPDistBear "distance et direction" nameWPNearest "point d'itinraire le plus prs" inrect "Dans le rectangle" forthisWP "pour ce point d'itinraire" formappedWPs "pour les points d'itinraire sur la carte" group Groupe element lment insert Insertion joinGR "Joindre au groupe" TRtoRT "Conversion de trace en route" TRRTnpoints "Nombre de points garder" TRTRdispl "Affichage de la trace" WP WP RT RT TR TR GR GR commrec "Communication avec le rcepteur" abort Arrt ACKs ACKs NAKs NAKs packets paquets unnamed "(inconnu)" fromTR "Depuis la trace : %s" mapload "Image de go-rfrencement" loadmback Chargement savemback "Sauvegarde des informations de go-rfrencement" chgmback Modification clearmback Effacement backgrnd Fond nameMapBkInfo "Fond de carte" nameMapInfo "Paramtres de la carte" mpbkchg "Changement du fond" mpbkgrcs "Position de la grille" nameImage Image symbol Symbole SYCATgeneral "Utilisation gnrale" SYCATland Terre SYCATwater Eau SYCATaviation Aviation SY1st_aid "Premiers secours" SYWP_buoy_white "Boue, blanche" SYWP_dot "WP" SYairport "Aroport" SYamusement_park "Parc de loisirs" SYanchor "Ancre" SYavn_danger "Danger" SYavn_faf "Premier point d'approche" SYavn_lom "Localizer outer marker" SYavn_map "Point d'approche manqu" SYavn_ndb "Signal ND" SYavn_tacan "TACAN" SYavn_vor "VHF omni-range" SYavn_vordme "VOR-DME" SYavn_vortac "VOR/TACAN" SYball "Balle" SYbeach "Plage" SYbell "Cloche" SYboat "Bateau" SYboat_ramp "Embarcadre" SYborder "Poste frontire" SYbowling "Bowling" SYbridge "Pont" SYbuilding "Btiment" SYbuoy_amber "Boue, ambre" SYbuoy_black "Boue, noire" SYbuoy_blue "Boue, bleue" SYbuoy_green "Boue, verte" SYbuoy_green_red "Boue, verte et rouge" SYbuoy_green_white "Boue, verte et blanche" SYbuoy_orange "Boue, orange" SYbuoy_red "Boue, rouge" SYbuoy_red_green "Boue, rouge et verte" SYbuoy_red_white "Boue, rouge et blanche" SYbuoy_violet "Boue, violette" SYbuoy_white "Boue, blanche" SYbuoy_white_green "Boue, blanche et verte" SYbuoy_white_red "Boue, blanche et rouge" SYcamping "Campement" SYcapitol_city "Ville, toile" SYcar "Vhicule" SYcar_rental "Location de vhicule" SYcar_repair "Garage" SYcasino "Casino" SYcastle "Chteau" SYcemetery "Cimetire" SYchapel "Chapelle" SYchurch "glise" SYcircle_x "Rond avec un X" SYcivil "Civil location" SYcontrolled "Aire rglemente" SYcrossing "Croisement" SYdam "Barrage" SYdanger "Danger" SYdeer "Cerf" SYdiamond_green "Diamant, vert" SYdiamond_red "Diamant, rouge" SYdiver_down_1 "Plonge 1" SYdiver_down_2 "Plonge 2" SYdollar "Dollar" SYdot "Point" SYdrinking_water "Eau potable" SYduck "Canard" SYelevation "Altitude" SYexit_no_serv "Sortie, pas de service" SYexit "Sortie" SYfactory "Usine" SYfastfood "Restauration rapide" SYfish "Poisson" SYfitness "Remise en forme" SYflag "Drapeau" SYfreeway "Autoroute" SYfuel "Carburant" SYfuel_store "Carburant et magasin" SYgeo_name_land "Nom topographique, naturel" SYgeo_name_man "Nom topographique, artificiel" SYgeo_name_water "Nom topographique, eau" SYglider "Planeur" SYgolf "Golf" SYheliport "Hliport" SYhorn "Corne" SYhouse "Maison" SYice_skating "Patinoire" SYinfo "Point d'information" SYintersection "Intersection" SYis_highway "Autoroute" SYknife_fork "Nourriture" SYladder "chelle" SYlanding "Atterrissage" SYlarge_city "Ville, grande" SYlarge_exit_ns "Sortie sans service, grande" SYlarge_ramp_int "Ramp int, large" SYlevee "Digue" SYlight "Lumire" SYlodging "Hbergement" SYmany_fish "Banc de poisson" SYmany_tracks "Nombreuses traces" SYmark_x "Marque, x" SYmedium_city "Ville, moyenne" SYmile_marker "Point kilomtrique" SYmilitary "Zone militaire" SYmine "Mine" SYMOB "Homme la mer" SYmonument "Monument" SYmountains "Montagnes" SYmovie "Cinma" SYmug "Mug" SYmuseum "Muse" SYntl_highway "Autoroute nationale" SYnull "(transparent)" SYnull_2 "(vide)" SYoil_field "Puits de ptrole" SYparachute "Parachute" SYpark "Parc" SYparking "Parking" SYpharmacy "Pharmacie" SYphone "Tlphone" SYpicnic "Pique nique" SYpizza "Pizza" SYpolice "Police" SYpost_office "Bureau de poste" SYprivate "Proprit prive" SYradio_beacon "Signal radio" SYramp_int "Croisement de rampes" SYrestricted "Aire accs restreint" SYrestrooms "WC" SYRV_park "Camping car" SYscenic "Point de vue" SYschool "cole" SYseaplane "Base d'hydravion" SYshopping_cart "Commerces" SYshort_tower "Tour, courte" SYshowers "Douches" SYskiing "Ski nautique" SYskull "Skull" SYsmall_city "Ville, petite" SYsnow_skiing "Ski" SYsoft_field "Zone meuble" SYsquare_green "Carr, vert" SYsquare_red "Carr, rouge" SYst_highway "Autoroute rgionale" SYstadium "Stade" SYstore "Magasin" SYstreet_int "Croisement de rues" SYsummit "Sommet" SYswimming "Natation" SYtake_off "Dcollage" SYtall_tower "Tour, haute" SYtheater "Thtre" SYtoll "Page" SYtow_truck "Dpanneuse" SYtraceback "Itinraire de retour" SYtracks "Traces" SYtrail_head "Dpart de piste" SYtree "Arbre" SYtruck_stop "Arrt pour camion" SYtunnel "Tunnel" SYultralight "ULM" SYus_highway "Autoroute nord amricaine" SYweight_station "Station de pesage" SYwreck "pave" SYzoo "Zoo" psvisible "Seul lment visible" DISPsymbol "Symbole uniquement" DISPs_name "Symbole et nom" DISPs_comment "Symbole et commentaire" DISPname "Nom uniquement" DISPcomment "Commentaire uniquement" dispopt "Affichage" mapitems "Affichage des lments sur la carte" nameIC "Icne" prod "Produit" WPCapac "Capacit en points d'itinraire" ICCapac "Capacit en icnes" RTCapac "Capacit en route" TRCapac "Capacit en traces" protcl "Protocole" ICGraph "Graphique des icnes" WPperRT "Point par route" notinGR "n'est pas dans le (sous-)groupe" onlyinGR "uniquement dans le (sous-)groupe" loadgrels "Chargement des lments" importgrels "Importation des lments" about "Informations sur GPSman..." contrib " Contributions de" errorsto "Error reports to:" obsTRToRT "WPs created by a TR to RT conversion" nameLists "Listes" nameData "Donnes" MWCmap "Cartes" MWClists "Listes" MWCsingle "Fentre simple" search "Recherche" rmrk "NB" closeto "Fermer vers" with "Avec" srchres "Trouv" database "Base de donnes" where "O" what "Quoi" list "liste" distance "Distance" fromWP "depuis le point" fromPos "depuis la position" azimuth "Direction" any "indiffrente" opening "Ouverture" suggested "suggr" another "Un autre" srchdd1 "Recherche sur" srchdd2Data "tous les lments" srchdd2GR "Groupe(s)" from "depuis" started "partant de " transf "Transformation de coordonnes" TRNSFAffine "Affine" TRNSFAffineConf "Affine Conforme" TRNSFNoRot "Conforme sans rotation" projection "Projection" lat0 "Latitude du centre" long0 "Longitude centre" lat1 "Latitude du 1er parallle" lat2 "Latitude du 2me parallle" latF "Latitude de l'origine errone" longF "Longitude de l'origine errone" k0 "Facteur d'chelle" PRJUTM "UTM/UPS" PRJTM "Mercator Transverse" PRJCMP "Carte Militaire Portugaise" PRJBNG "Grille Nationale Britannique" PRJBWI "British West Indies" PRJITM "Mercator Transverse Irlandaise" PRJGKK "Grille Allemande" PRJLCC1 "Lambert Conique Conf 1" PRJLCC2 "Lambert Conique Conf 2" PRJKKJP "Grille Finlandaise de base" PRJKKJY "Grille Finlandaise uniforme" PRJSEG "Grille Sudoise" PRJMerc1 "Mercator 1" PRJMerc2 "Mercator 2" PRJCS "Cassini-Soldner" dontaskagain "Ne plus demander" rename "Utiliser le nouveau nom" oname "Nom d'origine" never "Jamais" ask "Demander" always "Toujours" stage "tape" label "tiquette" alt "Altitude" optALTUNIT "Altitude" locate "Localiser" animation Animation fast Rapide slow Lent start "Dpart" pause Pause speed Vitesse centred "Centrage" state "tat" animinit "dbut / fin" animon "en cours" animpause "en pause" animabort "arrt" realtimelog "Traage en temps rel" garmin Garmin nmea "NMEA 0183" stext "Simple texte" simul "Simulateur" lowrance Lowrance getlog "Charger le journal" stop "Arrt" dolog "Enregistrement" show Montrer hide Cacher posfixerror erreur posfix_ ? posfix2D 2D posfix3D 3D posfix2D-diff "2D d" posfix3D-diff "3D d" posfixGPS GPS posfixDGPS DGPS posfixAuto ok posfixsimul simul restart "Redmarrage" mkTR "Faire une route" PVTflds "# t lat long alt fix EPE EPH EPV vel_x vel_y vel_z TRK" namePVTData "Journaliser les donnes" mkavgWP "Calcul du point moyen" move Dplacer define Dfinir open Ouvrir defs "Dfinitions" baseproj "Projection de base" abbrev "Nom court" grid Grille use Utiliser unit Unit feasting "Erreur sur l'axe Est-Ouest" fnorthing "Erreur sur l'axe Nord-Sud" bounds Limite max Max min Min easting "Axe Est-Ouest" northing "Axe Nord-Sud" fixeddatum "donnes fixes" elevation Altitude usewps "Utiliser les points d'itinraire" chgpfrmt "Changer le format de position" here Ici atprevwp "Au point prcdent" prevwp "Point prcdent" firstwp "Premier point" chglstrs "diter la phase prcdente" chgnxtrs "diter la phase suivante" contnend "Ajouter en fin" closemenu "Fermeture du menu" ellpsd Ellipsode datum Datum userdefs "Dfinitions de l'utilisateur" edmap "diter sur la carte" actual "rel" rtimelogintv "Intervalle de journalisation" inca "Inclure aprs" invert "Inverser" recwindow "Fentre du rcepteur" volume "Volume" latS "Lat Sud" latN "Lat Nord" longW "Long Ouest" longE "Long Est" no Non PRJAPOLY "Polyconique amricaine - American Polyconic" computations Calculs comparea "Calcul de l'aire" cluster "Groupement de points" mkclusters "Construction de groupements" dlat "Intervalle de latitude" dlong "Intervalle de longitude" collcntr "Dtection des centres..." compclstr "Calcul des groupements..." crtgclstrgrs "Cration des groupes..." PRJStereogr "Strographique" PRJTWG "Grille tawanaise" chgdatum "Remplacer datum..." optPRINTCMD "Commande d'impression" print Impression prevctr "Centre prcdent" PRJSOM "Mercator Oblique Suisse" PRJLV03 "Grille suisse LV03" PRJIcG "Grille islandaise" PRJRDG "Grille nerlandaise" chgmfsize "Changement de taille pour la police de la carte" printopt "Options d'impression" numberid "Numro/Identifiant" hiddendata "Donne masque" YYYY/MM/DD YYYY/MM/DD cwpsdef "Dfinir les point de contrle" nextTP "Prochain point de trace" generate "Gnrer" optSERIALBAUD "Vitesse de transfert" optDEFTRTWIDTH "Largeur des routes" optDEFTTRWIDTH "Largeur des traces" width "Largeur" TRtoTR "Simplification d'une trace" TRlinedispl "Affichage des rsultats" obsTRsimpl "Trace rsultant d'une simplification" simplTRto "Simplifier en" exstglog "Journal existant" contnsly "en continu" animate "animer" animabbrev "anim." noanabbr "pas d'anim." zelev "Echelle-Z" xyelev "Echelle-XY" notext "sans texte" view "vue" sideview "vue de cot" persptv "Perspective" SYgeocache "Gocache" SYgeocache_fnd "Gocache trouve" optMAPCOLOUR,trvtrk "Flche de trace" optMAPCOLOUR,trvtrn "Flche " optMAPCOLOUR,trvcts "Flche de course" optMAPCOLOUR,trvcts2 "Seconde flche de course" optMAPCOLOUR,trvvel_z "Flche haut/bas" optMAPCOLOUR,trvwrnimportant "Avertissement important (nav)" optMAPCOLOUR,trvwrnnormal "Avertissement (nav)" optMAPCOLOUR,trvwrninfo "Information (nav)" travel "Voyage" notravel "Arrt du voyage" travdisplay "Configuration de l'affichage" travchgdisplay "Changement pour l'affichage %s" travdsetup "Configuration de l'affichage du voyage" navMOB "Homme la mer" startnav "Navigation" navWP "Aller au point" goback "Retour" follow "Suivre %s" exactly "exactement" fromnrst "depuis le plus prs" inrvrs " l'envers" forgetgoal "Oubli du but" suspend "Suspension" resume "Reprise" TRVfix "Fix" TRVhour "Heure" TRVspeed "Vitesse" TRVpos "Pos." TRValt "Alt." TRVtrk "Dir." TRVnxtWP "Vers" TRVprvWP "Depuis" TRVete "ETE" TRVeta "ETA" TRVvmg "VMG" TRVxtk "XTK" TRVcts "Dir." TRVtrn "Rot." TRVvel_z "Vitesse vert." TRVtrkcts "Trace, dir." TRVdist "Dist" TRVc_trkcts "Flche" TRVc_trn "Flche" TRVc_vel_z "Haut/Bas" add "Ajout" addlabelled "Ajout avec tiquette" remove "Suppression" mindist "Distance cible" chginggoal "Changement vers le but suivant" chggoalhlp "Changement depuis le but\ncourant jusqu'au prochain\nsur une route" soon "bientt" late "tard" warnings "Avertissements" dowarn "mission d'avertissements" warnconf "Configuration d'avertissements" priority "Priorit" high "haute" medium "mdiane" low "basse" warnprox "Distance au point <" warnanchor "Distance au point >" warnspeed "Vitesse >" warntrn "Rotation (abs.) >" warnvspeed "Vitesse verticale" warnxtk "XTK (abs.)>" fntsize "Taille de police" trvhlpbox "Utiliser le bouton droit pour rordonnancer les lments ci-dessous" trvhlpbxs "Utiliser le bouton droit pour rordonnancer les lments de la liste" trvwarrv "Arrive %s!" trvwleave "Dpart de %s!" trvwspeed "Vitesse > %s!" trvwtrn "Rotation > %s!" trvwvspeed "Vitesse verticale en dehors de [%s,%s]!" trvwxtk "XTK > %s!" trvwnolog "Journalisation en temps-rel arrte" trvwnopos "Positions prcdentes indisponibles" trvwuwps "La route a des points indfinis." trvwchg "Aller au prochain %s" TP "Point de trace" drivesim "simulateur de conduite" startfrom "Dpart depuis..." outofctrl "Hors de contrle" right "Droite" left "Gauche" straight "Tout droit" rthlpdsim "Flches : conduite, changement de vitesse\nEspace : tout droit" forgetGRcs "Oubli du groupe+els" renres "NOUV" chggoal "Changer pour le nouveau but" Ghidden_class Classe Ghidden_subclass "Sous-Classe" Ghidden_lnk_ident "Identifiant de scne" Ghidden_colour Couleur Ghidden_attrs Attributs Ghidden_depth Profondeur Ghidden_state "tat" Ghidden_country Pays Ghidden_facility "Immeuble" Ghidden_city Ville Ghidden_addr Adresse Ghidden_int_road "Croisement de rues" Ghidden_dtyp "Affichage options et type" Ghidden_ete "ETE" Ghidden_display "Affichage?" Ghidden_yes Oui Ghidden_no Non Ghidden_user "Utilisateur" Ghidden_user_symbol "Utilisateur (symbole uniquement)" Ghidden_non_user "Non utilisateur" Ghidden_avn_airport "Aroport" Ghidden_avn_inters "Avn intersection" Ghidden_avn_NDB "NDB" Ghidden_avn_VOR "VOR" Ghidden_avn_airp_rway "Seuil de piste d'aroport" Ghidden_avn_airp_int "Intersection aroport" Ghidden_avn_airp_NDB "Aroport NDB" Ghidden_map_pt "Point de carte" Ghidden_map_area "Zone de carte" Ghidden_map_int "Intersection de carte" Ghidden_map_addr "Adresse de carte" Ghidden_map_line "Ligne de carte" Ghidden_locked "Verrouill" Ghidden_default "Dfaut" Ghidden_black Noir Ghidden_white Blanc Ghidden_red Rouge Ghidden_dark_red "Rouge fonc" Ghidden_green Vert Ghidden_dark_green "Vert fonc" Ghidden_blue Bleu Ghidden_dark_blue "Bleu fonc" Ghidden_yellow Jaune Ghidden_dark_yellow "Jaune fonc" Ghidden_magenta Magenta Ghidden_dark_magenta "Magenta fonc" Ghidden_cyan Cyan Ghidden_dark_cyan "Cyan fonc" Ghidden_light_gray "Gris clair" Ghidden_dark_gray "Gris fonc" Ghidden_line Ligne Ghidden_link Etape Ghidden_net "Rseau" Ghidden_direct Direct Ghidden_snap Snap PRJBMN "Grille BMN autrichienne" PRJCTR "Carta Tecnica Reg (I)" optDEFMAPPROJ "Projection de la carte" optDEFMAPPFRMT "Coordonnes de la carte" optMapGuideVersion "Version de MapGuide" undo "Dfaire" UTMzone zone tfwfile "Ficher TFW" ok Ok GRA Grades newWPatdb "Nouveau WP ..." PRJLamb93 "Lambert 93" PRJLambNTFe "NTF IIet" PRJLambNTF "NTF" NTFzone zone opinprogr "Opration en cours" working "En cours" aborted "Arrt!" errwarn "Erreur/Avertissement(s)!" SYbiker "Cycliste" SYbox_blue "Bote, bleue" SYbox_green "Bote, verte" SYbox_red "Bote, rouge" SYflag_pin_blue "Epingle-Drapeau, bleue" SYflag_pin_green "Epingle-Drapeau, verte" SYflag_pin_red "Epingle-Drapeau, rouge" SYhouse_2 "Maison 2" SYpin_blue "Epingle, bleue" SYpin_green "Epingle, verte" SYpin_red "Epingle, rouge" changegroupsymbol "Changer le symbole" ozimapfile "Fichier Ozi Map" info "Information" climbrate "Vitesse verticale" optUSESLOWOPWINDOW "Fentre de contrle des oprations lentes" optDEFTRECPROTOCOL "Protocole par dfaut" optLNSREACT "Les lignes sur la carte sont cliquable la souris" syhlpbx "Utiliser le bouton droit pour\nrordonnancer les lments de la liste" optDEFMAPPFDATUM "Donnes pour les coordonnes de la carte" mkgrp "Crer un groupe" dispitems "Elments affichs" hiditems "Elments cachs" optAutoNumRts "Numrotation automatique des routes pour le chargement" Ghidden_transparent Transparent Ghidden_temp "Temprature" Ghidden_time "Estampille temporelle" Ghidden_cat Categorie SYopen_24hr "Ouvert 24/24" SYfhs_facility "Etablissement FHS" SYbot_cond "Conditions de fond" SYtide_pred_stn "Station de prvision des courants et mares" SYanchor_prohib "Mouillage interdit" SYbeacon "Balise" SYcoast_guard "Garde-cte" SYreef "Rcif" SYweedbed "Weedbed" SYdropoff "Embarcadre" SYdock "Dock" SYmarina "Marina" SYbait_tackle "Appts et quipement de pche" SYstump "Tronc" SYcntct_smiley "Smiley" SYcntct_ball_cap "Casquette de baseball" SYcntct_big_ears "Grande oreille" SYcntct_spike "Clou" SYcntct_goatee "Bouc" SYcntct_afro "Afro" SYcntct_dreads "Dreadlocks" SYcntct_female1 "Femme 1" SYcntct_female2 "Femme 2" SYcntct_female3 "Femme 3" SYcntct_ranger "Garde forrestier" SYcntct_kung_fu "Kung fu" SYcntct_sumo "Sumo" SYcntct_pirate "Pirate" SYcntct_biker "Cycliste" SYcntct_alien "Alien" SYcntct_bug "Insecte" SYcntct_cat "Chat" SYcntct_dog "Chien" SYcntct_pig "Cochon" SYhydrant "Pompe incendie" SYcircle_blue "Cercle, bleu" SYcircle_green "Cercle, vert" SYcircle_red "Cercle, rouge" SYdiamond_blue "Diamand, bleu" SYoval_blue "Ovale, bleu" SYoval_green "Ovale, vert" SYoval_red "Ovale, rouge" SYrect_blue "Bloc, bleu" SYrect_green "Bloc, vert" SYrect_red "Bloc, rouge" SYsquare_blue "Carr, bleu" SYtriangle_blue "Triangle, bleu" SYtriangle_green "Triangle, vert" SYtriangle_red "Triangle, rouge" SYletter_a_blue "A, bleu" SYletter_a_green "A, vert" SYletter_a_red "A, rouge" SYletter_b_blue "B, bleu" SYletter_b_green "B, vert" SYletter_b_red "B, rouge" SYletter_c_blue "C, bleu" SYletter_c_green "C, vert" SYletter_c_red "C, rouge" SYletter_d_blue "D, bleu" SYletter_d_green "D, vert" SYletter_d_red "D, rouge" SYnumber_0_blue "0, bleu" SYnumber_0_green "0, vert" SYnumber_0_red "0, rouge" SYnumber_1_blue "1, bleu" SYnumber_1_green "1, vert" SYnumber_1_red "1, rouge" SYnumber_2_blue "2, bleu" SYnumber_2_green "2, vert" SYnumber_2_red "2, rouge" SYnumber_3_blue "3, bleu" SYnumber_3_green "3, vert" SYnumber_3_red "3, rouge" SYnumber_4_blue "4, bleu" SYnumber_4_green "4, vert" SYnumber_4_red "4, rouge" SYnumber_5_blue "5, bleu" SYnumber_5_green "5, vert" SYnumber_5_red "5, rouge" SYnumber_6_blue "6, bleu" SYnumber_6_green "6, vert" SYnumber_6_red "6, rouge" SYnumber_7_blue "7, bleu" SYnumber_7_green "7, vert" SYnumber_7_red "7, rouge" SYnumber_8_blue "8, bleu" SYnumber_8_green "8, vert" SYnumber_8_red "8, rouge" SYnumber_9_blue "9, bleu" SYnumber_9_green "9, vert" SYnumber_9_red "9, red" numberfrom0 "Mise zro du compteur" items "Elments" syusrmenu "Menu des symboles spcifiques" cfgsymenu "Configuration du menu des symboles spcifiques" insmnb "Insrer un sous-menu avant" insmna "Insrer un sous-menu aprs" opensbmn "Ouvrir un sous-menu" clssbmn "Fermer un sous-menu" duration "Dure" calrs "Calories" optSUPPORTLAPS "Support pour les tapes" LAP ETP nameLAP "tape" lapsrun "Course" fromfile "depuis un fichier" fromdef "depuis une dfinition" mbaktoload "Fond de map charger" none "aucun" opt_Fonts "Polices de caractre" optICONSIZE "Taille des symboles" optTRNUMBERINTVL "Intervalle pour information des points sur les traces" optTRINFO "Information sur point de trace" nameAL "Almanach" alm_svid "identification du satellite" alm_week "semaine" alm_datatime "temps de rfrence" alm_clockc1 "coefficient de correction de l'horloge s" alm_clockc2 "coefficient de correction de l'horloge s/s" alm_ecc "excentricit" alm_sqrta "racine carre de a" alm_mnanom "anomalie moyenne" alm_argprgee "argument du prige" alm_rightasc "ascension droite" alm_rtrightasc "taxe de ascension droite" alm_inclin "inclinaison" alm_health "sant" lstsqs "Moindres carrs" lstsqsfile "Fichier des moindres carrs" alt_cumula "Dnivell cumul positif" optSHOWFILEITEMS "Affichage par dfaut des donnes lues" totdstng "Distance totale, sans les sauts" tottimeng "Temps total, sans les sauts" SYcross "Croix" SYcross_3p "Croix 3p" mapfitWPs "Affichage des WPs d'ajustement sur la carte" showfitinfo "Affichage des informations d'ajustement" xtcoord "xt" ytcoord "yt" delta "d" residual "rt" rmsxydev "moyenne quadratique ou rms(x,y-deviations)" resstderr "erreur standard residuelle" chgdev "Changement de priphrique" maxalt "Altitude maximum" minalt "Altitude minimum" alt_cumul "Montes cumules" alt_cumuld "Descentes cumules" optSHOWFILEITEMS "Par dfaut, affichage sur la carte des donnes lues" vertgridlines "Lignes verticales" convert "Conversion" split "Fragmentation" bysel "par points choisis" byseg "par segments" openits "Ouvrir %s" uname "Nom d'utilisateur" pword "Mot de passe" remember "Sauvegarder" wptotwitter "Point d'itinraire (WP) vers Twitter" wptotwitternb "Envoi des informations du point WP Twitter (position, datum, altitude, nom, commentaire) avec les tags #GPSMan #waypoint" exportTFW "Exportation du fichier TFW" nametfwfile "Fichier TFW" PRJEOV EOV chgname "Modification du nom" clicktoedit "Cliquer pour modifier" renamethod "Mthode de renommage" operators "Operateurs" keep1st "garder le premier caractre" keep1st_hlp "Garder le premier caractre\nles oprations suivantes portent sur les caractres restants" reset "reset" reset_hlp "Retour au nom initial et effacement des oprations prcdentes" case "changement de casse" case_hlp "Toutes les lettres en minuscule/majuscule" maxlgth "longueur max" maxlgth_hlp "Caractres tronqus la longueur donne" inslt "insertion gauche" inslt_hlp "Chane de insre avant le caractre de gauche" insrt "insertion droite" insrt_hlp "Chane insre la fin" replc "remplacement" replc_hlp "Chaque caractre de la 1re chane sera remplace par\nle caractre correspondant dans la 2nde" delany "effacement" delany_hlp "Tous les caractres de la chane seront effacs du nom" rsub "Substitution par regexp" rsub_hlp "Substitution par expression rgulire\nConsulter le manuel" accifnew "accept comme nouveau" accifnew_hlp "Accepter le rsultation comme tant un nouveau nom" guntilnew "nouveau nom par nombre" guntilnew_hlp "Essaie des valeurs du nombre pour gnrer un nouveau nom" ndigits "Nombre de chiffres" gennames "Gnratrion du nom..." rentest_hlp "Test de la mthode sur le nom" renmove_hlp "Utiliser le bouton Droit pour trier les lignes" tolower "vers minuscules" toupper "vers majuscules" applyto "Appliquer " forall "pour tous" failed "chec" selfont "Slection de la police" default "Dfaut" size "Taille" units "Units" points "points" pixels "pixels" weight "forme" normal "normale" bold "gras" slant "italique" roman "roman" italic "italic" underline "soulign" overstrike "barr" optDEFAULTFONT "Police par dfaut" optFIXEDFONT "Largeur fixe" optMAPFONT "Police pour la carte" optTRAVELFONT "Police pour la navigation" optPLOTFONT "Police pour le dessin" plugin "Greffon" unavailif "Indisponible si" tclcode "Code TCL" PRJSphMerc "Sphrique Mercator" PRJEPSG:3857 "EPSG:3857" PRJEqCyl "Cylindrique quidistante" PRJEPSG:32663 "EPSG:32663" gpTRtoGnuplot2d "Vue de cot (Gnuplot)" gpTRtoGnuplot2d_nb "Envoi de la trace GNUPLOT et affichage du profil d'altitude" gpTRtoGnuplot3d "Perspective (Gnuplot)" gpTRtoGnuplot3d_nb "Envoi de la trace GNUPLOT et affichage du profil 3D" gpParam2d "Paramtres pour Gnuplot 2D-Chart" gpParam3d "Paramtres pour Gnuplot 3D-Chart" gpFilename "Nom du fichier" gpCanwidth "Largeur de la zone de dessin" gpCanheight "Hauteur de la zone de dessin" gpSTotals "Affichage des totaux" gpLeft "Cot gauche" gpRight "Cot droit" gpNone "Sans objet" gpSRests "Affichage des pauses" gpRest "Pause" gpSymText "Symbole+Texte" gpSymTime "Symbole+Heure" gpText "Texte" gpSHours "Affichage des heures" gpTimetop "Heure en haut" gpTimebot "Heure en bas" gpSSpeed "Affichage des vitesses" gpHike "Marche" gpBike "Vlo" gpDrive "Voiture" gpGlide "Planeur" gpLimitDist "Distance max entre WP et trace (km)" gpLimitStat "Longueur minimale sur la trace pour un mme WP (km)" gpDirection "Direction" gpForward "Avant" gpBackward "Arrire" gp2D_hlp "S'il existe un groupe de mme nom que la trace,\n\ les points d'itinraires du groupe seront affichs\n\ en fonction des distances fournies.\n\ Sinon, vous pouvez choisir dans une liste ou annuler." gpGenerated "Produit avec gnuplot par GPSMan" gpModify "Modifier la vue avec la souris. Quitter pour sauver l'image." htCalcHikeTime "Calcul de la dure de la marche" htCalcHikeTime_nb "Calcul de la dure de la marche avec formule de DAV" htHeader "Temps de marche estime (sans les pauses) pour les traces\ en utilisant les formules de \"Deutscher Alpenverein\"\ avec diffrents paramtres" htFooter1 "Capacit fait rfrence une heure." htFooter2 "Le temps de pause propos est de 20 minutes toutes les 2 heures." srShowRest_nb "Affichage des pauses de plus de 5 minutes." srTRTime "Dure de la trace" srTotals "Totaux" optALTHRESHOLD "Seuil d'altitude" optDISPLAYCMD "Commande pour afficher une image" optTERMCMD "Commande pour ouvrir une fentre de saisie de commandes" optMANHTTPADDR "Adresse HTTP du manuel utilisateur" } # the following definitions must be coherent with $TXT array set INVTXT { DMS DMS DMM DMM DDD DDD Grades GRA UTM/UPS UTM/UPS WP WP RT RT TR TR ETP LAP GR GR } # changes by Miguel Filgueiras to RM contribution set TXT(srChainage) $TXT(totdst) set TXT(srShowRest) $TXT(gpSRests) set TXT(gpSym) $TXT(symbol) set TXT(srRest) $TXT(gpRest) gpsman-6.4.4.2/gmsrc/langport.tcl0000644000175000017500000014071512224351120014731 0ustar migmig# # This file is part of: # # gpsman --- GPS Manager: a manager for GPS receiver data # # Copyright (c) 1998-2013 Miguel Filgueiras migfilg@t-online.de # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. # # File: langport.tcl # Last change: 6 October 2013 # # file langengl.tcl is consulted first; no need for duplicating entries here # only 3 chars long names; check also ALLMONTH in file i18n-utf8.tcl set MONTHNAMES "Jan Fev Mar Abr Mai Jun Jul Ago Set Out Nov Dez" set DLUNIT(KM,dist) km set DLUNIT(KM,subdist) m set DLUNIT(KM,speed) km/h set DLUNIT(KM,area) km2 set DLUNIT(NAUTMILE,dist) "ml mar" set DLUNIT(NAUTMILE,subdist) "p" set DLUNIT(NAUTMILE,speed) ns set DLUNIT(NAUTMILE,area) km2 set DLUNIT(STATMILE,dist) "ml ter" set DLUNIT(STATMILE,subdist) "p" set DLUNIT(STATMILE,speed) mph set DLUNIT(STATMILE,area) seco set DLUNIT(M,dist) $DLUNIT(KM,subdist) set DLUNIT(FT,dist) $DLUNIT(STATMILE,subdist) set DTUNIT $DLUNIT($DISTUNIT,dist) set SPUNIT $DLUNIT($DISTUNIT,speed) set ARUNIT $DLUNIT($DISTUNIT,area) set ALUNIT $DLUNIT($ALTUNIT,dist) set MESS(RTcomp) "#\tPT\t\t$DTUNIT\tgraus\t$ALUNIT" set MESS(TRcomp) "#\t\t\t\t$ALUNIT\t$DTUNIT\t$DTUNIT\th:m:s\t$SPUNIT\tgraus" set MESS(WPNearest) "PT\t\t$DTUNIT\tgrau" array set MESS { badscale "Valor errado para escala do mapa" oktoexit "Ok para terminar (dados no guardados perder-se-o)" okclrmap "Ok para apagar o mapa" namelgth "Nome no poder ter mais de %d caracteres" cmmtlgth "Comentrio no poder ter mais de %d caracteres" namevoid "Nome no pode ser vazio" baddate "Data errada; linha" badhdg "Direco errada %s: tem de ser %s ou +/-" badcoord "Coordenada com valor ou formato errado: \"%s\" tem de ser em %s" outofrng "Nmero fora dos limites" UTMZN "Tem de ser uma letra em A..H, J..N, ou P..Z" badstrg "Caracter(es) errado(s)" strgvoid "Tem de ter pelo menos um caracter" nan "\"%s\" no um nmero" written "Escrito por" undefWP "Rota %s tem pontos no definidos; no guardada/exportada" bigRT "Rota %s > mximo; no exportada" unkndatum "Datum desconhecido" badcommdWP "Comando errado ao ler pontos; linha" notabsWP "Ponto mal definido (sem tabulaes); linha" undefinedWP "Referncia a ponto desconhecido: %s" nofieldsWP "Ponto mal definido (faltam campos); linha" excfieldsWP "Ponto mal definido (campos a mais); linha" badWPsRT "Rota com lista errada de pontos; linha" toomuchWPs "Aviso: mais de %d pontos numa rota" badcommdTP "Comando errado ao ler pontos de trajecto; linha" badcommdLP "Comando errado ao ler pontos de LN; linha" badTP "Ponto errado num trajecto; linha" badTPsTR "Trajecto com lista errada de pontos; linha" badLP "Ponto errado em LN; line" badLPsLN "LN com lista errada de pontos; line" noheader "Ficheiro no tem cabealho" loaderr "Erro ao ler ficheiro; linha" unkncommd "Comando desconhecido ao ler ficheiro; linha" noformat "Ficheiro no comea com linha de formato" badformat "Especificao de formato errada" badRT "Rota mal especificada; linha" badRTargs "Parmetros errados para rota; linha" badTR "Trajecto mal especificado; linha" fileact "%s qual ficheiro de %s?" filexists "Ficheiro existente!" GPSok "Ligao ok" toomany "Demasiados %ss (> %d)" cantfgt "No posso esquecer %s: pertence a algo desenhado" cantfgted "No posso esquecer %s: est a ser editado" cantmapRTunkn "Rota no desenhada; ponto desconhecido" cantmapRTed "Rota no desenhada; ponto em edio" cantrun "No posso executar" inprogr "Operao j iniciada" cantread "No posso ler do ficheiro auxiliar" cantwrtopt "No posso escrever no ficheiro de opes" voidRT "Rota sem pontos" activeRT "Rota 0 a rota activa; continuar?" voidTR "Trajecto sem pontos" voidLN "Linha sem pontos" idinuse "Identificador j usado" cantunmap "Impossvel apagar %s; pertence a algo desenhado" askrevert "Voltar aos dados iniciais?" askforget "Esquecer de vez %s?" notimpl "No implementado" forgetall "Esquecer tudo na lista de %ss?" counted "Tem %d %ss na lista" notlisted "Item no listado" wrgval "Valor errado p/" voidGR "Grupo sem elementos" initselfGR "Grupo contem-se a si prprio atravs de" GRelout "Comando para elemento fora de definio de GR; linha" badGRels "Grupo com lista de elementos errada; linha" badcommdGRel "Comando errado ao ler elementos de grupo; linha" notypeforGRel "Elemento sem tipo; linha" badGRel "Definio de elemento errada; linha" check "Tentando ligar" toomanyerr "Erros a mais; desistindo..." getWP "A buscar Pontos" getRT "A buscar Rotas" getTR "A buscar Trajectos" getLAP "A buscar Voltas" getAL "A buscar almanaque" putWP "A pr Pontos" putRT "A pr Rotas" putTR "A pr Trajectos" fillbuffWP "A carregar depsito de PTs" fillbuffRT "A carregar depsito de RTs" noACKNAK "Pacote recebido em vez de ACK/NAK; verifique a ligao ao GPS" badplatform "Esta plataforma no suporta E/S na porta srie" badserial "Sem acesso porta %s" nodata "O receptor no tem %ss" badimage "Ficheiro de imagem no aceite" mapadjust "Coloque os PTs no mapa; carregue depois em Ok" duplicate "%s j escolhido" clrcurrmap "Apagar mapa existente?" mbkbaddatum "Sem datum vlido" mbkbadscale "A escala no pode ser negativa" mbkbadat "Argumentos errados" edityourrisk "Mude sua responsabilidade!" okclrbkmap "Ok para apagar fundo do mapa" okclrbkim "Ok para apagar imagem em" badattrval "Campo opcional invlido (%s): %s" badattr "Nome de campo opcional desconhecido (%s): %s" badSYMBOLcode "Cdigo de smbolo errado" badDISPOPTcode "Cdigo errado de forma de mostrar errado" goingdown "Opes guardadas; recomear" putwhat "Colocar que tipos de dados?" readwhat "Procurar que tipos de dados?" noWPinx "Demasiados PTs para o receptor" noICinx "Demasiados ICs para o receptor" getIC "A buscar cones" serial1 "Prembulo de cabealho errado" serial2 "Recebido comando errado" checksum1 "Soma de verificao do cabealho errada" checksum2 "Soma de verificao de dados errada" receiver "Sem ligao porta!" importonly1 "S pode importar 1 tipo de dados" exportonly1 "S pode exportar 1 tipo de dados" outdatedprefs "Ficheiro de opes tem de ser actualizado" mustchoose1type "Seleccione ao menos 1 tipo de dados" nosuchitems "Nenhum elemento com essa descrio" resultsin "Resultados no Grupo" badWP "Ponto em falta ou por definir" badangle "ngulo tem de ser >0 e <360 graus" georefhow "Mtodo para geo-referenciar" cantsolve "Equaes sem soluo" transfcantscale "Transformao no permite alterar escala" oldfilefmt "Formato antigo; p.f. guardar no formato novo!" unknProj "Projeco desconhecida" unknTransf "Transformao desconhecida" badProjargs "Parmetros de projeco errados" badTransfargs "Parmetros de transformao errados" badfield "Par atributo=valor errado" badattr "Nome de atributo errado" missattrs "Faltam atributo(s)" mbkbadproj "Projeco errada" mbkbadtransf "Transformao errada" notUTMproj "Informao para UTM; continuar com projeco" projchg "Rever parmetros da projeco" badparam "Valor errado para %s" connectedto "Ligado a um %s" recnotsuppd "Modelo no reconhecido" gotprots "Recebida info sobre protocolos" badprots "Info sobre protocolos errada" defprots "A usar tabela de protocolos" nohidden "Esquecer dados ocultos?" badRS "Etapa de rota fora de definio de RT; linha" badWPsRSs "Etapa antes do primeiro ou depois do ltimo PT; linha" windowdestr "A janela foi destruda!" badhidden "Formato errado em valor oculto" replname "Substitua \"%s\" por nome com at %d dos caracteres seguintes: %s" badalt "Valor errado para altitude" baddistunit "Unidade de distncia errada para escala do mapa nas opes" badgridzone "Zona de grelha errada" outofgrid "Posio no coberta pela grelha" timeoffnotint "Diferena horria tem de ser inteira ou terminar em .5" cantchkprot "Este protocolo no permite verificar" mustconn1st "Primeiro verifique a ligao ao receptor" rltmnotsupp "Este protocolo neste receptor no faz registo em tempo real" createdir "Precisa criar a pasta %s e depois recomece" oktomkdir "Posso criar o directrio %s?" projnameabbr " favor dar nome e abreviatura para a projeco a criar" abbrevinuse "Abreviatura j usada" nameinuse "Nome j usado" projinuse "Projeco est a ser usada; alteraes no tero efeito" gridneedsdatum "Definio errada da grelha %s; datum por definir" badgriddatum "O datum para a grelha %s tem de ser %s" cantchggriddatum "Tem de usar o datum %s para esta grelha" gridinuse "Grelha usada por %s, no poder ser apagada; continuar?" gridinusenochg "Grelha usada por %s; alteraes sem efeito" cantwrtprgr "No posso escrever no ficheiro de projeces" cantwrtdtel "No posso escrever no ficheiro de datums" movingWP "Colocar %s com boto esquerdo\nCancelar com boto direito" missingdata "Informao insuficiente!" needs1wp "A rota tem que ter 1 ponto pelo menos" emptypos "Posio com campo(s) vazio(s)" cantwrtsstate "No posso escrever no ficheiro de estado: %s" cantrdsstate "No posso ler do ficheiro de estado: %s" corruptsstate "Ficheiro de estado %s com erros" editrisk "Modifique sua responsabilidade!" savestate "Guardar o estado?" delsstate "Apagar os ficheiros de estado?" badmapinfo "Erros no ficheiro de parmetros de mapa" badMHloc "Posio Maidenhead errada" areais "rea do polgono (que no se intersecta): %.3f%s" areatoosmall "A rea demasiado pequena (<%s km2)" projarea "Calculando a rea projecteda" selfintsct "PTs repetidos: a RT no se pode intersectar!" badinvmdist "Erro de aproximao ao inverter distncia sobre meridiano" badinvproj "Erro de aproximao ao inverter a projeco %s" negdlatlong "Diferena em lat/long no pode ser negativa!" allundef "Nenhum dos PTs do GR est definido" badfloats "H erros nas converses de nmeros decimais; ligar mesmo assim?" noprintcmd "Falta comando para imprimir; definir nas opes" cantexecasroot "GPSMan no pode ser executado pela root" badargtofunc "Argumento errado na funo %s" redefproj "Abreviatura da projeco %s coincide com o de projeco pr-definida, apagando-a; mude a sua definio!" couldntcd "Impossvel mudar para o directrio %s" shpext "Extenso %s errada; ok para usar .shp, .shx, .dbf?" shpcntopen "Impossvel abrir/criar ficheiros Shapefile" shpcntcrtfs "Impossvel criar campos Shapefile .dbf" shpcntwrtfs "Impossvel escrever campos Shapefile .dbf" shpoutmem "Falta memria!" shpemptyfile "Ficheiro vazio" shpwrongfile "Tipo de ficheiro errado" shplessdim "Dimenso no ficheiro menor que a pedida; continuar?" shpbadWPinRT "WP no. %d com coordenadas erradas ignorado na RT %s" errorGTMread "Erro ao ler de ficheiro GTrackMaker" badGTMvers "Verso no suportada do GTrackMaker" badGTMfile "Incio errado no ficheiro GTrackMaker" badGTMcounts "Contador(es) negativos no ficheiro GTrackMaker" badGTMlat "Latitude errada no ficheiro GTrackMaker" badGTMlong "Longitude errada no ficheiro GTrackMaker" badGTMdatum "Datum invlido no ficheiro GTrackMaker" unobscmap "Erro talvez por haver 1 janela/cone sobre o mapa; esperar e voltar a tentar?" cantwrtimg "Erro ao guardar imagem em ficheiro no formato %s" cantsaveRTid "%d RT(s) por salvar: identificador no numrico" cantsaveTRid "%d TR(s) por salvar: identificador no numrico" badtrvconf "Configurao inconsistente substituda por uma vazia" drvsimoff "Simulador de conduo: falta iniciar!" needWP "Simulador de conduo: preciso definir ou ler PTs" chgrecprot " favor seleccionar outro protocolo do receptor" clrtrvlog "Apagar registo da viagem?" frgetGRcs "Esquecer grupo e todos os elementos?!" nmeainuse "Registo em tempo real ou ficheiro a ser lido em NMEA" badfile "Erro ao ler de ficheiro" RTnoWPname "PT de RT dado apenas pelo nome: deixou de ser aceite" distlarge "Distncia demasiado grande!" convres "%s resultante da converso criado com nome %s" outrngproj "Ponto no pode ser projectado!" badconv "Erro na converso do parmetro %s: %s" badprmval "Resultado errado da converso do parmetro %s: %s" timeconsmg "Operao lenta: continuar?" badtimeval "Valor de tempo errado" badLAP "VLT errada; linha" lapncnsdrd "VLT ignorada" undefinedTR "TR no existente" emptymenu "Menu vazio; continuar?" cantwrtsymenu "No posso escrever no ficheiro do menu de smbolos" abbrevhasspaces "Abreviatura no pode ter espaos" needNpoints "Precisa de pelo menos %s pontos!" twotimeoffsets "Mais que uma diferena horria no ficheiro" notimeoffset "Falta diferena horria no ficheiro; usarei 0" baddateas "Data errada: %s" unknownenc "Codificao de caracteres desconhecida: %s" chgbaudto "A mudar baud rate para %s; por favor espere..." busytrylater "Outras operaes em curso; tente mais tarde" baudchgfailed "Mudana de baud rate falhou" obssplit "Resultados de cortar %s com nome \"%s\"" samelgth "As duas sequncias tm de ser do mesmo tamanho" rschkargs "Chamada a regsub deu erro; verifique os argumentos" emptyrmeth "Mtodo de substituio no pode ser vazio" cantwrtdefs "No posso escrever no ficheiro de definies do utilizador" xcantbey "%s no pode ser %s" mustselftfam "Tem de seleccionar uma famlia de tipos" badpluginwhere "Erro em argumento \"onde\" de extenso; deve ser lista de ternos" badpluginparam "Erro nos parmetros de extenso: lista de NOME EXPR, NOME iniciado por _" badpluginparamexec "Ao correr extenso %s, parmetro errado: %s" pluginfailed "Extenso %s falhou com mensagem: %s" loginto "Acesso a %s" cantwrtdir "No posso escrever em %s; p.f. altere as permisses" cantcleandir "No posso limpar o directrio %s" defTERMCMD "A opo com o comando que abre uma janela de terminal tem de ser definida primeiro" gpOutfile "Resultado no ficheiro \"%s\" no directrio corrente." gpQuitgnuplot "Tecla de Entrar (janela de terminal) para sair de gnuplot." gpModgnuplot "Modificar a imagem no janela do gnuplot\ arrastando o rato com boto esquerdo ou do meio.\n\ Depois de fechar a janela do gnuplot o resultado\ ficar no ficheiro \"%s\" no directrio corrente." htResult1 "Trajecto=\"%s\"" htResult2 "Distncia total=%s Subida total=%s Descida total=%s" htResult3 "Tempo total=%s Tempo de descanso=%s(%s) Tempo em movimento=%s" htResult4 "%s Cap. plano=%s Cap. subida=%s Cap. descida=%s Estim. tempo percurso=%s" srResult1 "Perodos de descanso (>5min) do trajecto \"%s\"" badcumuls "Diferena de altitude %s > subida total %s e/ou descida %s; opo de limiar de altitude %s %s devia ser mudada" } set TXT(RTcompflds) "# PT {$DTUNIT} grau {$ALUNIT} etapa etiq" set TXT(TRcompflds) \ "PTR {} {} {} {$ALUNIT} {$DTUNIT} {$DTUNIT} h:m:s {$SPUNIT} grau" set TXT(starttoend) "Incio: ao fim %s $DTUNIT;" set TXT(startmax) "no mx %s $DTUNIT;" set TXT(WPnearflds) "PT {$DTUNIT} grau" set TXT(within) "At (${DTUNIT}s)" set TXT(between) "Entre (${DTUNIT}s)" array set TXT { GMtit "GPS Manager - verso" exit Terminar map Mapa load Lr loadfrm "Lr de" save Guardar saveels "Guardar elementos" saveto "Guardar em" clear Limpar clearall "Limpar tudo" newWP "Novo PT" newRT "Nova RT" newTR "Novo TR" newLN "Nova LN" newGR "Novo GR" import Importar importfrm "Importar de" export Exportar exportels "Exportar elementos" exportto "Exportar para" count Contar trueN "Norte Geogr" automagn "Declin Auto" usrdef "Def Ut" nameWP Ponto nameRT Rota nameTR Traj nameLN Linha nameLP "Ponto de LN" nameGR Grupo namePlot Grfico nameMap Mapa nameRTComp "Clculo para Rota" nameTRComp "Clculo para Trajecto" nameInfo Informao GPSrec "Receptor GPS" turnoff Desligar get Buscar put Colocar all Tudo select Escolher selection Escolha options Opes DMS GMS DMM GMM DDD GGG GRA Grados message Mensagem cancel Cancelar file Ficheiro ovwrt Destrur app Acrescentar online "em linha" offline "sem linha" check Testar create Criar revert Recomear colour cres grey cinzentos mono mono portr "ao alto" landsc "ao baixo" legend Legenda incscale "Inclur escala" more "(cont.)" waypoint Ponto name Nome created "Criado em" cmmt Comentrio withWP "Com este PT:" displ "Desenhar no mapa" startRT "Iniciar RT" route Rota number Nmero numberid "Nmero/Id" insb "Inserir antes" insa "Inserir depois" del Apagar repl "Substitur por" comp Calcular RTcomp "Clculos para rota" savecomp "Guardar clculos" totdst "Distncia total" tottime "Tempo total" totdstng "Distncia total, s/ falhas" tottimeng "Tempo total, s/ falhas" track Trajecto chophd "Cortar cabea" choptl "Cortar cauda" incb "Incluir antes" date Data newdate "Nova data para o ponto seguinte" endprTR "Fim do trajecto anterior" begnxt "Incio do seguinte" date1st "Data para 1o ponto do seguinte" TRcomp "Clculos para trajecto" avgsp "Veloc mdia" maxsp "Veloc max" minsp "Veloc min" lat Lat long Long ze ZE zn ZN eastng x nrthng y zone Zona change Mudar forget Esquecer others Outros opt_Interf "Interface do utilizador" optLANG Lngua optISOLATIN1 "Acentos e cedilha" optDELETE "DEL apaga ltimo caracter" optMWINDOWSCONF "Janela principal" optSERIALBAUD "Baud rate" optGPSREC "Modelo do GPS" opt_GPSRecConf "Parmetros do Receptor" optACCEPTALLCHARS "Aceitar qualquer caracter" optNAMELENGTH "Compr mx p/ nomes" optINTERVAL "Intervalo de amostragem" optCOMMENTLENGTH "Compr mx p/ comentrios" optMAXWPOINTS "No. mx de Pontos" optMAXROUTES "No. mx de Rotas" optMAXWPINROUTE "No. mx de PTs numa Rota" optMAXTPOINTS "No. mx de pontos de Traj" optCREATIONDATE "Rec usa data de criao" optNOLOWERCASE "Rec no usa minsculas" optDEFAULTSYMBOL "Smbolo habitual de PT" optDEFAULTDISPOPT "Forma habitual de mostrar PT" opt_Data "Dados" optEQNAMEDATA "Dados c/ o mesmo nome" optKEEPHIDDEN "Manter dados ocultos" optDatum Datum optTimeOffset "Dif horria" optACCFORMULAE "Frmulas de maior preciso" optASKPROJPARAMS "Rever parmetros da projeco" optBalloonHelp "Bales de ajuda" optTRNUMBERINTVL "Mostrar informao de PT de TR cada" optTRINFO "Informao de PT a mostrar" opt_Formats "Unidades e formatos" optDISTUNIT "Distncia" optUSESLOWOPWINDOW "Janela de controle de operaes lentas" optDEFTRECPROTOCOL "Protocolo habitual" optLNSREACT "LNs no mapa reagem ao rato" KM km NAUTMILE "milha nutica" STATMILE "milha terrestre" FT p optPositionFormat "Formato p/ posies" optDateFormat "Formato p/ datas" opt_Geom "Geometria p/ janelas" opt_MapGeom "Geometria do mapa" optMAPWIDTH "Larg do mapa" optMAPHEIGHT "Alt do mapa" optMAPSCLENGTH "Compr escala do mapa" optMAPSCALE "Escala do mapa" optMAXMENUITEMS "No. mx de itens em menu" optLPOSX "Pos horiz jan de listas" optLPOSY "Pos vert jan de listas" optMPOSX "Pos horiz jan do mapa" optMPOSY "Pos vert jan do mapa" optRPOSX "Pos horiz jan do rec" optRPOSY "Pos vert jan do rec" optEPOSX "Pos horiz janela de erro" optEPOSY "Pos vert janela de erro" optDPOSX "Pos horiz dilogo" optDPOSY "Pos vert dilogo" optDPOSRTMAP "Ajuste janela RT/mapa" optLISTWIDTH "Larg de lista" optLISTHEIGHT "Alt de lista" optCOLOUR Cres optCOLOUR,fg Frente optCOLOUR,bg Fundo optCOLOUR,messbg "Fundo p/ erros" optCOLOUR,confbg "Fundo p/ confirmaes" optCOLOUR,selbg "Fundo p/ seleces" optCOLOUR,dialbg "Fundo p/ perguntas" optCOLOUR,offline "Receptor s/ linha" optCOLOUR,online "Receptor em linha" optCOLOUR,check "Boto seleccionado" optCOLOUR,ballbg "Fundo p/ ajuda" optCOLOUR,ballfg "Frente p/ ajuda" optMAPCOLOUR "Cres no mapa" optMAPCOLOUR,mapsel "Item selecc no mapa" optMAPCOLOUR,WP "Pontos no mapa" optMAPCOLOUR,RT "Rotas no mapa" optMAPCOLOUR,mkRT "Rota definida no mapa" optMAPCOLOUR,TR "Trajectos no mapa" optMAPCOLOUR,TP "Pontos de traj no mapa" optMAPCOLOUR,LN "Linhas no mapa" optMAPCOLOUR,mapleg "Legendas no mapa" optMAPCOLOUR,anim "Animao no mapa" optMAPCOLOUR,emptygrid "Sem imagem" optMAPCOLOUR,fullgrid "Com imagem" opt_Fonts "Tipos de letra" optDEFTRTWIDTH "Espessura RT" optDEFTTRWIDTH "Espessura TR" optDEFTLNWIDTH "Espessura LN" opt_Files "Porta e ficheiros" optDEFSPORT "Porta" optSAVESTATE "Guardar estado ao sair" optDELSTATE "Apagar ficheiros de estado" optPERMS "Permisses de ficheiro" optPAPERSIZE "Tamanho do papel" optPRINTCMD "Comando para imprimir" optMapGuideVersion "Verso do MapGuide" optICONSIZE "Tamanho dos smbolos" red Verm green Verde blue Azul owner Dono permgroup Grupo others Outros fread Lr fwrite Escr fexec Exec YYYYMMDD AAAAMMDD MMDDYYYY MMDDAAAA DDMMMYYYY DDMMMAAAA YYYY-MM-DD AAAA-MM-DD YYYY/MM/DD AAAA/MM/DD mainwd "Janela principal" distazim "Dist e azimute" nearestWPs "PTs prximos" fromto "De %s para %s" degrees graus nameWPDistBear "dist e azimute" nameWPNearest "PTs prximos" inrect "No rectngulo" forthisWP "para este PT" formappedWPs "para PTs no mapa" group Grupo element Elemento insert Inserir joinGR "Juntar Grupo" TRtoRT "Converso de TR para RT" TRtoLN "Converso de TR para LN" TRtoTR "Simplificao de TR" TRRTnpoints "No. de pontos a reter" TRlinedispl "Desenhar resultado" TRTRdispl "Desenhar TR" WP PT TP PT LP PL LAP VLT commrec "Comunicao com receptor" abort Desistir ACKs ACKs NAKs NAKs packets pacotes unnamed "(por definir)" fromTR "Do TR: %s" mapload "Geo-ref imagem" loadmback Ler savemback "Guardar geo-ref" chgmback Alterar clearmback Limpar backgrnd Fundo nameMapBkInfo "Info sobre fundo" nameMapInfo "Parmetros do mapa" mpbkchg "Alterar fundo" mpbkgrcs "Posio na grelha" nameImage Imagem symbol Smbolo SY1st_aid "Primeiros socorros" SYCATaviation Aviao SYCATgeneral Genrico SYCATland Terrestre SYCATwater Aqutico SYMOB "Homem ao mar" SYWP_buoy_white "Bia branca" SYWP_dot "Ponto" SYairport "Aeroporto" SYamusement_park "Parque de diverses" SYanchor "ncora" SYanchor_prohib "ncora proibida" SYavn_danger "Perigo (av)" SYbait_tackle "Isco e equipamento" SYball "Bola" SYbeach "Praia" SYbeacon "Balisa" SYbell "Sino" SYbiker "Ciclista" SYboat "Barco" SYboat_ramp "Rampa p/ barcos" SYborder "Fronteira" SYbot_cond "Condies de fundo" SYbox_blue "Caixa azul" SYbox_green "Caixa verde" SYbox_red "Caixa vermelha" SYbridge "Ponte" SYbuilding "Prdio" SYbuoy_amber "Bia mbar" SYbuoy_black "Bia preta" SYbuoy_blue "Bia azul" SYbuoy_green "Bia verde" SYbuoy_green_red "Bia verde vermelha" SYbuoy_green_white "Bia verde branca" SYbuoy_orange "Bia laranja" SYbuoy_red "Bia vermelha" SYbuoy_red_green "Bia vermelha verde" SYbuoy_red_white "Bia vermelha branca" SYbuoy_violet "Bia violeta" SYbuoy_white "Bia branca" SYbuoy_white_green "Bia branca verde" SYbuoy_white_red "Bia branca vermelha" SYcamping "Campismo" SYcapitol_city "Cidade, estrela" SYcar "Automvel" SYcar_rental "Aluguer de automveis" SYcar_repair "Oficina de automveis" SYcasino "Casino" SYcastle "Castelo" SYcemetery "Cemitrio" SYchapel "Capela" SYchurch "Igreja" SYcircle_blue "Crculo azul" SYcircle_green "Crculo verde" SYcircle_red "Crculo vermelho" SYcircle_x "Crculo com X" SYcivil "Instalaes civis" SYcntct_afro "Lzudo" SYcntct_alien "Extra-terrestre" SYcntct_ball_cap "Bon" SYcntct_big_ears "Orelhudo" SYcntct_biker "Ciclista" SYcntct_bug "Carrapato" SYcntct_cat "Gato" SYcntct_dog "Co" SYcntct_dreads "Tranas" SYcntct_female1 "Mulher 1" SYcntct_female2 "Mulher 2" SYcntct_female3 "Mulher 3" SYcntct_goatee "Pras" SYcntct_kung_fu "Kung fu" SYcntct_pig "Porco" SYcntct_pirate "Pirata" SYcntct_ranger "Ranger" SYcntct_smiley "Sorriso" SYcntct_spike "Espeto" SYcntct_sumo "Sumo" SYcoast_guard "Guarda costeira" SYcross "Mira" SYcross_3p "Mira 3p" SYcrossing "Passadeira" SYdam "Barragem" SYdanger "Perigo" SYdeer "Veado" SYdiamond_blue "Losango azul" SYdiamond_green "Losango verde" SYdiamond_red "Losango vermelho" SYdiver_down_1 "Mergulhador 1" SYdiver_down_2 "Mergulhador 2" SYdock "Doca" SYdollar "Dolar" SYdot "Ponto" SYdrinking_water "gua potvel" SYdropoff "Entrada" SYduck "Pato" SYelevation "Ponto alto" SYexit "Sada" SYexit_no_serv "Sada s/ servios" SYfactory "Fbrica" SYfhs_facility "Instalao FHS" SYfish "Peixe" SYfitness "Ginstica" SYflag "Bandeira" SYflag_pin_blue "Mastro azul" SYflag_pin_green "Mastro verde" SYflag_pin_red "Mastro vermelho" SYfreeway "Via rpida" SYfuel "Gasolina" SYfuel_store "Gasolina & loja" SYgeo_name_land "Nome geogr, terra" SYgeo_name_man "Nome geogr, homem" SYgeo_name_water "Nome geogr, gua" SYgeocache "Geocache" SYgeocache_fnd "Geocache descoberta" SYglider "Asa delta" SYheliport "Heliporto" SYhorn "Buzina" SYhouse "Casa" SYhouse_2 "Casa 2" SYhydrant "Boca de incndio" SYice_skating "Patinagem no gelo" SYinfo "Informao" SYintersection "Interseco" SYis_highway "Auto-estrada" SYknife_fork "Comida" SYladder "Escada" SYlanding "Aterragem" SYlarge_city "Cidade grande" SYlarge_exit_ns "Sada s/ serv, grande" SYlarge_ramp_int "Cruz rampas, grande" SYletter_a_blue "A azul" SYletter_a_green "A verde" SYletter_a_red "A vermelho" SYletter_b_blue "B azul" SYletter_b_green "B verde" SYletter_b_red "B vermelho" SYletter_c_blue "C azul" SYletter_c_green "C verde" SYletter_c_red "C vermelho" SYletter_d_blue "D azul" SYletter_d_green "D verde" SYletter_d_red "D vermelho" SYlevee "Dique" SYlight "Farol" SYlodging "Alojamento" SYmany_fish "Cardume" SYmany_tracks "Muitos caminhos" SYmark_x "Marca, x" SYmedium_city "Cidade mdia" SYmile_marker "Marco" SYmilitary "Instalaes militares" SYmine Mina SYmonument "Monumento" SYmountains "Montanhas" SYmovie "Cinema" SYmug "Caneca" SYmuseum "Museu" SYntl_highway "Auto-estrada nacional" SYnull "(transparente)" SYnull_2 "(vazio)" SYnumber_0_blue "0 azul" SYnumber_0_green "0 verde" SYnumber_0_red "0 vermelho" SYnumber_1_blue "1 azul" SYnumber_1_green "1 verde" SYnumber_1_red "1 vermelho" SYnumber_2_blue "2 azul" SYnumber_2_green "2 verde" SYnumber_2_red "2 vermelho" SYnumber_3_blue "3 azul" SYnumber_3_green "3 verde" SYnumber_3_red "3 vermelho" SYnumber_4_blue "4 azul" SYnumber_4_green "4 verde" SYnumber_4_red "4 vermelho" SYnumber_5_blue "5 azul" SYnumber_5_green "5 verde" SYnumber_5_red "5 vermelho" SYnumber_6_blue "6 azul" SYnumber_6_green "6 verde" SYnumber_6_red "6 vermelho" SYnumber_7_blue "7 azul" SYnumber_7_green "7 verde" SYnumber_7_red "7 vermelho" SYnumber_8_blue "8 azul" SYnumber_8_green "8 verde" SYnumber_8_red "8 vermelho" SYnumber_9_blue "9 azul" SYnumber_9_green "9 verde" SYnumber_9_red "9 vermelho" SYoil_field "Campo de petrleo" SYopen_24hr "Aberto 24 horas" SYoval_blue "Oval azul" SYoval_green "Oval verde" SYoval_red "Oval vermelha" SYparachute "Paraquedas" SYpark "Parque" SYparking "Aparcamento" SYpharmacy "Farmcia" SYphone "Telefone" SYpicnic "Picnic" SYpin_blue "Alfinete azul" SYpin_green "Alfinete verde" SYpin_red "Alfinete vermelho" SYpolice "Polcia" SYpost_office "Correios" SYprivate "Campo privado" SYradio_beacon "Rdio farol" SYramp_int "Cruza/o rampas" SYrect_blue "Oval azul" SYrect_green "Oval verde" SYrect_red "Oval vermelha" SYreef "Recife" SYrestrooms "WC" SYscenic "Panorama" SYschool "Escola" SYseaplane "Base de hidro-avies" SYshopping_cart "Centro comercial" SYshort_tower "Torre baixa" SYshowers "Chuveiros" SYskiing "Ski aqutico" SYskull "Caveira" SYsmall_city "Cidade pequena" SYsnow_skiing "Ski de neve" SYsoft_field "Campo mole" SYsquare_blue "Quadrado azul" SYsquare_green "Quadrado verde" SYsquare_red "Quadrado vermelho" SYst_highway "Auto-estrada estadual" SYstadium "Estdio" SYstore "Loja" SYstreet_int "Cruza/o ruas" SYstump "Escolho" SYsummit "Pico" SYswimming "Natao" SYtake_off "Descolagem" SYtall_tower "Torre alta" SYtheater Teatro SYtide_pred_stn Margrafo SYtoll Portagem SYtow_truck "Pronto-socorro" SYtraceback "Regresso" SYtracks "Caminhos" SYtrail_head "Incio de caminho" SYtree "rvore" SYtriangle_blue "Tringulo azul" SYtriangle_green "Tringulo verde" SYtriangle_red "Tringulo vermelho" SYtruck_stop "Paragem" SYtunnel "Tnel" SYultralight "Ultra-ligeiro" SYus_highway "Auto-estrada EUA" SYweedbed "Algas" SYweight_station Bscula SYwreck "Destroos" SYzoo "Jardim zoolgico" psvisible "S a parte visvel" DISPsymbol "S smbolo" DISPs_name "S & nome" DISPs_comment "S & comentrio" DISPname "S nome" DISPcomment "S comentrio" dispopt Mostrar mapitems "Mostrar no mapa" nameIC cone prod Produto WPCapac "Mximo de Pontos" ICCapac "Mximo de Icones" RTCapac "Mximo de Rotas" TRCapac "Mximo de Trajectos" protcl "Protocolo" ICGraph "Smbolos para cones" WPperRT "Pontos por Rota" notinGR "no no (sub-)grupo" onlyinGR "s os do (sub-)grupo" loadgrels "Ler elementos" importgrels "Importar elementos" about "Sobre o GPSMan..." contrib "Com contribuies de" errorsto "Em caso de erro, contactar:" obsTRToRT "PTs criados pela converso de TR em RT" obsTRsimpl "TR obtido por simplificao" nameLists "Listas" nameData "Dados" MWCmap "Mapa" MWClists "Listas" MWCsingle "Janela nica" search "Procurar" rmrk "NB" closeto "Prximo de" with "Com" srchres "ACHADOS" srchresults "Resultado de procura" database "Base de dados" where "Onde" what "O qu" list "lista" distance "Distncia" fromWP "do Ponto" fromPos "da posio" azimuth "Azimute" any "qualquer" opening "Abertura" suggested "sugesto" another "Outra" srchdd1 "Procura em" srchdd2Data "todos os dados" srchdd2GR "Grupo(s)" from "de" started "iniciado em" transf "Transf Coords" TRNSFAffine "Afim" TRNSFAffineConf "Afim Conforme" TRNSFNoRot "Conf S/ Rot" projection "Projeco" lat0 "Lat central" long0 "Long central" lat1 "Lat 1.o paralelo" lat2 "Lat 2.o paralelo" latF "Lat falsa origem" longF "Long falsa origem" k0 "Factor de escala" PRJUTM "UTM/UPS" PRJTM "Transversa de Mercator" PRJBMN "Grelha Austraca BMN" PRJBNG "Grelha Nac Britnica" PRJBWI "ndias Ocid Britnicas" PRJCMP "Carta Militar Port" PRJCTR "Carta Tcnica Reg (I)" PRJITM "Grelha TM Irlandesa" PRJGKK "Grelha Alem" PRJLCC1 "Lambert Cnica Conf 1" PRJLCC2 "Lambert Cnica Conf 2" PRJKKJP "Grelha Finlandesa Base" PRJKKJY "Grelha Finlandesa Unif" PRJSEG "Grelha Sueca" PRJAPOLY "Policnica Americana" PRJStereogr "Estereogrfica" PRJTWG "Grelha de Taiwan" PRJSOM "Oblqua de Mercator Suia" PRJLV03 "Grelha Suia LV03" PRJIcG "Grelha Islandesa" PRJRDG "Grelha Holandesa" PRJSphMerc "Mercator Esfrica" PRJEqCyl "Cilndrica Equidistante" dontaskagain "Deixar de confirmar" rename "Usar nome diferente" oname "Nome original" never "Nunca" ask "Perguntar" always "Sempre" stage "Etapa" label "Etiqueta" alt "Altitude" locate "Encontrar" animation Animao fast Rpido slow Lento start Incio pause Pausa speed Velocidade centred "centrado" state Estado animinit "no incio/fim" animon "em curso" animpause "em pausa" animabort "sando" realtimelog "Registo de TR em tempo real" stext "Simple Text" simul "simulador" getlog Captar stop Parar dolog Registar show Mostrar hide Esconder posfixerror erro restart Recomear mkTR "Criar TR" PVTflds "# t lat long alt qual EPE EPH EPV vel_x vel_y vel_z rumo" namePVTData Registo mkavgWP "Criar PT mdio" move Recolocar define Definir open Abrir defs "Definies" baseproj "Projeco de base" abbrev Abreviatura grid Grelha use Usar unit Unidade feasting "Dist E falsa" fnorthing "Dist N falsa" bounds Limites easting "Dist E" northing "Dist N" fixeddatum "datum obrigatrio" elevation "Vista lateral" usewps "Usar PTs" chgpfrmt "Mudar formato posio" here Aqui atprevwp "No PT anterior" prevwp "PT anterior" firstwp "Primeiro PT" chglstrs "Editar etapa anterior" chgnxtrs "Editar etapa seguinte" contnend "Acrescentar no fim" closemenu "Fechar menu" ellpsd Elipsoide userdefs "Definies prprias" edmap "Editar no mapa" actual real rtimelogintv "Intervalo de tempo" inca "Incluir depois" invert "Inverter" recwindow "Janela do receptor" no No computations Clculos comparea "Calcular rea" cluster Vizinhos centre Centro mkclusters "Agrupar vizinhos" quadr Quadrngulo dlat "Diferena em latitude" dlong "Diferena em longitude" collcntr "A determinar centros..." compclstr "A agrupar vizinhos..." crtgclstrgrs "A criar grupos..." chgdatum "Mudar datum..." print Imprimir prevctr "Centro anterior" printopt "Opes impresso" chgmfsize "Mudar tamanho das letras" cwpsdef "PTs de controle a definir agora" nextTP "Prximo PTR" generate Gerar width Espessura simplTRto "Simplificar p/" exstlgog "Registo existente" contnsly "Continuamente" animate "animar" animabbrev "anim." noanabbr "s/ anim." notext "s/ legendas" lockscale "fixar escala" zelev "inclinao Z" xyelev "inclinao XY" view "Vista" sideview "Vista lateral" persptv "Perspectiva" optMAPCOLOUR,trvtrk "Seta TRK" optMAPCOLOUR,trvtrn "Setas TRN" optMAPCOLOUR,trvcts "Seta CTS" optMAPCOLOUR,trvcts2 "2a seta CTS" optMAPCOLOUR,trvvel_z "Seta para cima/baixo" optMAPCOLOUR,trvwrnimportant "Aviso importante (nav)" optMAPCOLOUR,trvwrnnormal "Aviso (nav)" optMAPCOLOUR,trvwrninfo "Informao (nav)" optTRAVELFONTSIZE "Tamanho de letra, viagem" travel Viagem notravel "Fim de viagem" travdisplay "Configurar mostrador" travchgdisplay "Mudar para mostrador %s" travdsetup "Configurar mostrador de viagem" navMOB "Homem ao mar (MOB)!" startnav "Navegar" navWP "Ir para PT" goback "Regressar" follow "Seguir %s" exactly "exactamente" fromnrst "do ponto mais prximo" inrvrs "em sentido inverso" forgetgoal "Desistir do objectivo" suspend "Suspender" resume "Recomear" TRVfix "Sinal" TRVhour "Tempo" TRVspeed "Vel" TRVpos "Pos" TRValt "Alt" TRVtrk "TRK" TRVnxtWP "Para" TRVprvWP "De" TRVete "ETE" TRVeta "ETA" TRVvmg "VMG" TRVxtk "XTK" TRVcts "CTS" TRVtrn "TRN" TRVvel_z "Vel vert" TRVtrkcts "TRK, CTS" TRVdist "Dist" TRVc_trkcts "Setas TRK/CTS" TRVc_trn "Setas TRN" TRVc_vel_z "Setas cima/baixo" add "Acrescentar" addlabelled "Acresc com nome" remove "Remover" mindist "Distncia de chegada" chggoal "Objectivo seguinte" chginggoal "Mudana de objectivo" chggoalhlp "Quando mudar de um\nobjectivo para o seguinte\no seguir RT/TR" soon cedo late tarde warnings "Avisos" dowarn "Fazer avisos" warnconf "Configurar avisos" priority Prioridade high alta medium mdia low baixa warnprox "Distncia a PT <" warnanchor "Distncia a PT >" warnspeed "Velocidade >" warntrn "TRN (abs)>" warnvspeed "Vel vertical" warnxtk "XTK (abs)>" fntsize "Tamanho da letra" trvhlpbox "Usar boto direito para reordenar elementos abaixo" trvhlpbxs "Usar boto direito para\nreordenar elementos das listas" trvwarrv "Chegada a %s!" trvwleave "Deixando %s!" trvwspeed "Velocidade > %s!" trvwtrn "TRN > %s!" trvwvspeed "Vel vert fora de [%s,%s]!" trvwxtk "XTK > %s!" trvwnolog "Registo em tempo real desligado!" trvwnopos "No h posies anteriores" trvwuwps "RT tem PT(s) no definidos" trvwchg "Indo para %s" TP TP drivesim "simulador de conduo" startfrom "Comear de..." outofctrl "Sem control!" right Direita left Esquerda straight "Em frente" rthlpdsim "Teclas de seta: guiar, des/acelerar\nEspao: em frente" hiddendata "Dados ocultos" Ghidden_class Classe Ghidden_subclass Sub-classe Ghidden_lnk_ident "Id etapa" Ghidden_colour Cor Ghidden_attrs Atributos Ghidden_depth Profundidade Ghidden_state Estado Ghidden_country Pas Ghidden_facility Facility Ghidden_city Cidade Ghidden_addr Endereo Ghidden_int_road "Cruzamento" Ghidden_dtyp "Mostrar+tipo" Ghidden_ete "ETE" Ghidden_display "Mostrar?" Ghidden_yes Sim Ghidden_no No Ghidden_user "Utilizador" Ghidden_user_symbol "Utilizador (apenas smbolo)" Ghidden_non_user "Interno" Ghidden_avn_airport "Aeroporto" Ghidden_avn_inters "Interseco (av)" Ghidden_avn_NDB "NDB" Ghidden_avn_VOR "VOR" Ghidden_avn_airp_rway "Limite de pista (aeroporto)" Ghidden_avn_airp_int "Interseco (aeroporto)" Ghidden_avn_airp_NDB "NDB (aeroporto)" Ghidden_map_pt "Ponto (mapa)" Ghidden_map_area "rea (mapa)" Ghidden_map_int "Interseco (mapa)" Ghidden_map_addr "Endereo (mapa)" Ghidden_map_line "Linha (mapa)" Ghidden_locked Bloqueado Ghidden_default "Habitual" Ghidden_red Vermelho Ghidden_green Verde Ghidden_blue Azul Ghidden_black Preto Ghidden_dark_red "Vermelho escuro" Ghidden_dark_green "Verde escuro" Ghidden_dark_yellow "Amarelo escuro" Ghidden_dark_blue "Azul escuro" Ghidden_dark_magenta "Magenta escuro" Ghidden_dark_cyan "Ciano escuro" Ghidden_light_gray "Cinzento claro" Ghidden_dark_gray "Cinzento escuro" Ghidden_yellow Amarelo Ghidden_magenta Magenta Ghidden_cyan Ciano Ghidden_white Branco Ghidden_line Linha Ghidden_link Etapa Ghidden_net Rede Ghidden_direct Directo Ghidden_snap Colado Ghidden_transparent Transparente Ghidden_temp Temperatura Ghidden_time "Tempo" Ghidden_cat Categoria renres "NOVOS NOMES" forgetGRcs "Esquecer GR&Els" optDEFMAPPROJ "Projeco do mapa" optDEFMAPPFRMT "Coordenadas no mapa" optDEFMAPPFDATUM "Datum p/ coords no mapa" undo Desfazer UTMzone zona tfwfile "ficheiro TFW" newWPatdb "Novo PT a..." PRJLamb93 "Lambert 93" PRJLambNTFe "NTF IIt" PRJLambNTF "NTF" NTFzone zona loop "Fechar ciclo" crtLN "Criar LN" PRJAEA "Albers Equivalente" PRJLEAC "Lambert Eq Cnica" PRJTAlbers "Teale Albers" polasp "Aspecto polar" north Norte south Sul distunit "Unidade de distncia" altunit "Unidade de altitude" params "Argumentos" dimens "Dimenses" version "Verso" opinprogr "Operao em curso" working "A trabalhar" aborted "Interrompido!" errwarn "Erro/aviso(s)!" changegroupsymbol "Mudar smbolo" ozimapfile "ficheiro Ozi Map" info "Informao" climbrate "Taxa de subida" BGAfeature "Local" BGAfindblty "Facilidade de identificar" BGAairact "Actividade area" dispitems "Items no mapa" hiditems "Items no no mapa" mkgrp "Criar Grupo" optAutoNumRts "Renumerar RTs ao colocar" optSUPPORTLAPS "Suportar voltas" numberfrom0 "Numerador a 1" nameLAP "Volta" duration "Durao" calrs "Calorias" syusrmenu "Alterar menu de smbolos" cfgsymenu "Configurar menu de smbolos" insmnb "Inserir sub-menu antes" insmna "Inserir sub-menu depois" opensbmn "Abrir sub-menu" clssbmn "Fechar sub-menu" syhlpbx "Usar boto direito para\nreordenar elementos da lista" lapsrun Corrida fromfile "de ficheiro" fromdef "de definio" mbaktoload "Carregar mapa" none "nenhum" nameAL "Almanaque" alm_svid "id satlite" alm_week "semana" alm_datatime "data ref dados" alm_clockc1 "coef corr relgio s" alm_clockc2 "coef corr relgio s/s" alm_ecc "excentricidade" alm_sqrta "raz quadr a" alm_mnanom "anomalia mdia" alm_argprgee "arg perigeu" alm_rightasc "asceno recta" alm_rtrightasc "taxa de asc recta" alm_inclin "inclinao" alm_health "sade" lstsqs "Min Quadrados" lstsqsfile "Min Quad ficheiro" mapfitWPs "Mostrar PTs de ajuste no mapa" showfitinfo "Mostrar informao de ajuste" xtcoord "xt" ytcoord "yt" delta "d" residual "rt" rmsxydev "media_quadr(x,y-desvios)" resstderr "erro std residual" chgdev "Alterar porta" alt_cumula "Altitude subida acumulada" alt_cumuld "Altitude descida acumulada" maxalt "Altitude mxima" minalt "Altitude mnima" optSHOWFILEITEMS "Normalmente mostrar no mapa elementos lidos" vertgridlines "Linhas Verticais" convert "Converter" split "Cortar" bysel "por pontos seleccionados" byseg "em segmentos" openits "Abrir %s" chgname "Substituir nomes" clicktoedit "Tocar para editar" renamethod "Mtodo de substituio" operators "Operadores" keep1st "manter 1.o caracter" keep1st_hlp "Manter o 1.o caracter\noperaes seguintes actuam nos restantes" reset "recomear" reset_hlp "Recomear com o nome inicial esquecendo alteraes j feitas" case "mai/minsculas" case_hlp "Todas as letras em maisculas/minsculas" maxlgth "comprimento mx" maxlgth_hlp "Limitar nmero de caracteres correntes" inslt "inserir esquerda" inslt_hlp "A sequncia dada ser inserida antes do 1.o caracter corrente" insrt "inserir direita" insrt_hlp "A sequncia dada ser inserida no fim" replc "substituir" replc_hlp "Cada caracter na 1.a sequncia ser substitudo pelo\ncorrespondente na segunda" delany "apagar todos" delany_hlp "Todos os caracteres na sequncia sero apagados no nome" rsub "substituio com re." rsub_hlp "D a expresso regular e especificao de substituio\npara detalhes ver o manual" accifnew "aceitar se novo" accifnew_hlp "Aceitar o resultado se um nome novo" guntilnew "juntar nmero at novo" guntilnew_hlp "Tentar todos os nmeros at que o nome seja novo" ndigits "N.o de algarismos" gennames "A gerar nomes..." rentest_hlp "Testar este mtodo com o nome dado" renmove_hlp "Usar boto direito para reordenar linhas" tolower "minsculas" toupper "maisculas" applyto "Aplicar a" forall "para todos" selfont "Seleco de tipo" default "Habitual" size "Tamanho" units "Unidades" points "pontos" pixels "pixels" weight "Peso" normal "normal" bold "negrito" slant "Inclinao" roman "romano" italic "itlico" underline "Sublinhado" overstrike "Cortado" optDEFAULTFONT "Tipo de letra, habitual" optFIXEDFONT "Tipo de letra mono-espaado" optMAPFONT "Tipo de letra, mapa" optTRAVELFONT "Tipo de letra, viagem" optPLOTFONT "Tipo de letra, grficos" failed "falhou" plugin "Extenso" unavailif "Indisponvel se" tclcode "Cdigo Tcl" uname "Nome de Utilizador" pword "Cdigo de Acesso" remember "Recordar" wptotwitter "PT para Twitter" wptotwitternb "Enviar a posio, datum, altitude, nome e comentrio de PT para Twitter com marcas #GPSMan #waypoint" exportTFW "Exportar ficheiro TFW" nametfwfile "Ficheiro TFW" gpTRtoGnuplot2d "Vista lateral (Gnuplot)" gpTRtoGnuplot2d_nb "Mostrar grfico de altitude com os dados do Trajecto usando o programa externo GNUPLOT" gpTRtoGnuplot3d "Perspectiva (Gnuplot)" gpTRtoGnuplot3d_nb "Mostrar grfico 3D de altitude com os dados do Trajecto usando o programa externo GNUPLOT" gpParam2d "Parmetros para grfico 2D por Gnuplot" gpParam3d "PParmetros para grfico 3D por Gnuplot" gpFilename "Ficheiro" gpCanwidth "Comprimento da tela" gpCanheight "Altura da tela" gpSTotals "Mostrar totais" gpLeft " esquerda" gpRight " direita" gpNone "Nenhum" gpSRests "Mostrar pausas" gpRest "Pausa" gpSymText "Smbolo+Texto" gpSymTime "Smbolo+Tempo" gpText "Texto" gpSym "Smbolo" gpSHours "Mostrar horas" gpTimetop "Tempo em cima" gpTimebot "Tempo em baixo" gpSSpeed "Mostrar velocidade" gpHike "A p" gpBike "Bicicleta" gpDrive "Carro" gpGlide "Voo" gpLimitDist "Distncia mxima PT a TR (km)" gpLimitStat "Distncia mnima no TR mesmo PT (km)" gpDirection "Direco" gpForward "Frente" gpBackward "Trs" gp2D_hlp "Havendo um grupo com o mesmo nome do TR,\n\ os PTs do grupo sero mostrados,\n\ dependendo das distncias dadas.\n\ Se no houver um grupo assim,\n\ escolher os PTs ou cancelar." gpGenerated "Gerado com Gnuplot por GPSMan" gpModify "Alterar a vista com o rato. Sair para salvar a imagem." htCalcHikeTime "Calcular tempo de percurso" htCalcHikeTime_nb "Calcular tempo de percurso pela frmula da DAV" htHeader "Tempo estimado de percurso (sem pausas) pela frmula da \ \"Deutscher Alpenverein\" com parmetros dados" htFooter1 "Capacidade em uma hora." htFooter2 "Tempo sugerido de pausa de 20min depois de 2 horas (15%)." srShowRest_nb "Mostrar pausas > 5min." srTRTime "Tempo de trajecto" srTotals "Totais" optALTHRESHOLD "Limiar de altitude" optDISPLAYCMD "Comando para mostrar ficheiro de imagem" optTERMCMD "Comando para abrir janela de terminal" optMANHTTPADDR "Endereo HTTP do manual" } # the following definitions must be coherent with $TXT array set INVTXT { GMS DMS GMM DMM GGG DDD Grados GRA UTM/UPS UTM/UPS PT WP RT RT TR TR VLT LAP GR GR p FT } # changes by Miguel Filgueiras to RM contribution set TXT(srChainage) $TXT(totdst) set TXT(srShowRest) $TXT(gpSRests) set TXT(gpSym) $TXT(symbol) set TXT(srRest) $TXT(gpRest) gpsman-6.4.4.2/gmsrc/i18n-utf8.tcl0000644000175000017500000000344412224351120014543 0ustar migmig# # This file is part of: # # gpsman --- GPS Manager: a manager for GPS receiver data # # Copyright (c) 1998-2013 Miguel Filgueiras migfilg@t-online.de # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. # # File: i18n-utf8.tcl # Last change: 6 October 2013 # ##### this is a UTF-8 encoded file; do not change its encoding!!! ## names of known languages in their own language array set TXT { LANGdeutsch Deutsch LANGengl English LANGes Español LANGfr Français LANGid {Bahasa Indonesia} LANGit Italiano LANGnl Nederlands LANGport Português LANGru Русский } ## possible abbreviations for month names in all known languages # English abbreviations must not be deleted set ALLMONTH(1) "Jan Gen jan Ene Янв" set ALLMONTH(2) "Feb Fev feb Фев" set ALLMONTH(3) "Mar MДr mrt Мар" set ALLMONTH(4) "Apr Abr Avr apr Апр" set ALLMONTH(5) "May Mai Mag mei Mei Май" set ALLMONTH(6) "Jun Giu jun Июн" set ALLMONTH(7) "Jul Lug jul Июл" set ALLMONTH(8) "Aug Ago Aou aug Agt Авг" set ALLMONTH(9) "Sep Set sep Сен" set ALLMONTH(10) "Oct Okt Out Ott okt Окт" set ALLMONTH(11) "Nov nov Nop Ноя" set ALLMONTH(12) "Dec Dez Dic dec Des Дек" gpsman-6.4.4.2/gmsrc/setup.tcl0000644000175000017500000015133112224351120014237 0ustar migmig# # This file is part of: # # gpsman --- GPS Manager: a manager for GPS receiver data # # Copyright (c) 1998-2013 Miguel Filgueiras migfilg@t-online.de # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. # # File: setup.tcl # Last change: 6 October 2013 # # Includes contributions by # - Brian Baulch (baulchb _AT_ onthenet.com.au) marked "BSB contribution" # - Matt Martin (matt.martin _AT_ ieee.org) marked "MGM contribution" # - Valere Robin (valere.robin _AT_ wanadoo.fr) marked "VR contribution" # - David Gardner (djgardner _AT_ users.sourceforge.net) marked # "DJG contribution" # # default set up code; may be overridden by a patch file ##### Img library # xbm gives black images set ImgOutFormats {bmp gif jpeg png tiff xpm} ##### initialize interface set NAMEWIDTH [expr $NAMELENGTH+2] set COMMENTWIDTH [expr $COMMENTLENGTH+2] set OBSWIDTH 40 set OBSHEIGHT 3 set DATEWIDTH $DATEW($DateFormat) set DATUMWIDTH 32 set SUBDTUNIT $DLUNIT($DISTUNIT,subdist) # crosshair cursor centre in pixels from lower right corner set CRHAIRx 5 set CRHAIRy 5 proc GlobalOptionsBindings {} { # change some of the default options and bindings of Tcl widgets global COLOUR option add *Frame.borderWidth 0 option add *Frame.relief flat option add *Menubutton.relief raised option add *Menubutton.direction below option add *Menu.tearOff 0 option add *Entry.exportSelection 1 option add *Entry.disabledBackground $COLOUR(bg) option add *Checkbutton.selectColor $COLOUR(check) option add *Radiobutton.selectColor $COLOUR(check) option add *Text.wrap word option add *Text.exportSelection 1 bind Listbox { break } bind Listbox { break } bind Listbox { break } return } proc GMInit {} { # set up main window(s) global MapHeight MapWidth LISTWIDTH LISTHEIGHT COLOUR MAPCOLOUR \ VERSION SRCDIR LPOSX LPOSY MPOSX MPOSY RPOSX RPOSY MAPSCALE MAPDISTS \ MAPDISTVALS MAPSCLENGTH MWINDOWSCONF TYPES RECTYPES MYGPS Temp1 List \ ListInds EdWindow GPSLabel PositionFormat Datum GPSState Map \ MapBounds TXT MESS DISTUNIT DTUNIT DSCALE SUBDTUNIT SUBDSCALE DLUNIT \ MAPDISTUNITS MapScale MpW LsW RcW LsWTit MpWTit RcWTit WConf OVx OVy \ XCoord YCoord MapZone MapProjTitle MapTransfTitle MapPFormat MapRange \ MapWPMoving MapMakingRT MapLoading MapScInitVal MapImageItems \ GetDispl MAPKNOWNPROJS RECPROTOCOLS SYMBOLIMAGE RcMenu GPSProtocol \ GPSProtocolExt RealTimeLogAnim PVTState USvState \ GSHPVersion NoImgLib ImgOutFormats SmallLogo UNIX GMEd FILEFORMAT \ MapScaleButton MapPFDatum AutoNumRts SUPPORTLAPS FixedFont DATUMWIDTH \ GPSProtocolButton RECINFO SERIALPORT RECBAUDS set MapBounds "0 0 $MapWidth $MapHeight" set MapRange(x) $MapWidth ; set MapRange(y) $MapHeight set MapRange(x0) 0 ; set MapRange(y0) 0 set OVx 0 ; set OVy 0 ; set XCoord "" ; set YCoord "" ; set MapZone "" set MapWPMoving -1 ; set MapMakingRT 0 ; set MapLoading 0 set MapImageItems "" option add *Foreground $COLOUR(fg) option add *Background $COLOUR(bg) wm protocol . WM_DELETE_WINDOW { QuitNow } wm title . "$TXT(GMtit) $VERSION" bind . QuitNow set mt [Measure "GPS Manager"] set WConf(datastate) "" switch $MWINDOWSCONF { lists { set gtit .title wm geometry . +$LPOSX+$LPOSY set MpW .mpw.fr ; set LsW .lsw.frls ; set RcW .rcw.fr frame .lsw frame $LsW foreach w ".mpw .rcw" t "MpW RcW" p "M R" z "nameMap GPSrec" { set ${t}Tit "GPS Manager" GMToplevel $w $z +[set ${p}POSX]+[set ${p}POSY] {} \ [list WM_DELETE_WINDOW "lower $w"] {} lower $w . frame [set $t] -borderwidth 10 } button .rcw.tit -textvariable RcWTit -width $mt \ -command "Raise . ; .rcw.tit configure -state normal" bind .rcw.tit "set RcWTit {$TXT(mainwd)}" bind .rcw.tit "set RcWTit {GPS Manager}" frame .mpw.top frame .mpw.top.frNT set ft .mpw.top.frNT # to be filled in by proc ToTravel frame .mpw.top.frT set WConf(travel,fr) .mpw.top.frT set WConf(travel,alt) $ft button $ft.tit -textvariable MpWTit -width $mt \ -command "Raise . ; $ft.tit configure -state normal" bind $ft.tit "set MpWTit {$TXT(mainwd)}" bind $ft.tit "set MpWTit {GPS Manager}" frame .lsw.frmb -borderwidth 2 menubutton .lsw.frmb.dtitle -text Datum -menu .lsw.frmb.dtitle.m menu .lsw.frmb.dtitle.m \ -postcommand "FillDatumMenu .lsw.frmb.dtitle.m ChangeMapDatum" label .lsw.frmb.datum -textvariable Datum \ -width $DATUMWIDTH set t [Measure $TXT(GPSrec)] frame .lsw.frmb.frb frame .lsw.frmb.frb.sep -height 6 -bg $COLOUR(dialbg) -width $t button .lsw.frmb.frb.load -text $TXT(load) \ -command { LoadFile Data ; \ .lsw.frmb.frb.load configure -state normal } set m .lsw.frmb.frb.import.m menubutton .lsw.frmb.frb.import -text $TXT(import) -menu $m menu $m foreach fmt $FILEFORMAT(_type,in,data) { $m add command -label $fmt -command "ImportFile Data $fmt" } button .lsw.frmb.frb.save -text $TXT(save) -state disabled \ -command { SaveFile all Data ; \ .lsw.frmb.frb.save configure -state normal } # based on VR contribution set m .lsw.frmb.frb.export.m menubutton .lsw.frmb.frb.export -text $TXT(export) -menu $m \ -state disabled menu $m foreach fmt $FILEFORMAT(_type,out,data) { $m add command -label $fmt -command "ExportFile all $fmt Data" } #-- button .lsw.frmb.frb.search -text $TXT(search) -state disabled \ -command { Search ; \ .lsw.frmb.frb.search configure -state normal } frame .lsw.frmb.frb.sep2 -height 6 -bg $COLOUR(dialbg) -width $t set WConf(datastate) [list [list \ button [list .lsw.frmb.frb.save .lsw.frmb.frb.export \ .lsw.frmb.frb.search]]] button .lsw.frmb.mpw -text $TXT(nameMap) -width $t \ -command "ToggleWindow .mpw $MPOSX $MPOSY ; \ .lsw.frmb.mpw configure -state normal" set RcMenu .lsw.frmb.rcw.m menubutton .lsw.frmb.rcw -text $TXT(GPSrec) -width $t -menu $RcMenu frame .lsw.frmb.sep -height 6 -bg $COLOUR(dialbg) -width $t button .lsw.frmb.opt -text $TXT(options) -width $t \ -command { SetOptions ; \ .lsw.frmb.opt configure -state normal } } map { wm geometry . +$MPOSX+$MPOSY set MpW .fr ; set LsW .lsw.frbl.frls ; set RcW .rcw.fr frame $MpW -borderwidth 5 foreach w ".lsw .rcw" t "LsW RcW" p "L R" z "nameLists GPSrec" { set ${t}Tit "GPS Manager" GMToplevel $w $z +[set ${p}POSX]+[set ${p}POSY] {} \ [list WM_DELETE_WINDOW "lower $w"] {} lower $w . button $w.tit -textvariable ${t}Tit -width $mt \ -command "Raise . ; $w.tit configure -state normal" bind $w.tit "set ${t}Tit {$TXT(mainwd)}" bind $w.tit "set ${t}Tit {GPS Manager}" } frame .rcw.fr -borderwidth 10 frame .lsw.frbl frame .lsw.frbl.frls -borderwidth 10 frame .lsw.frbl.frb button .lsw.frbl.frb.load -text $TXT(load) \ -command { LoadFile Data ; \ .lsw.frbl.frb.load configure -state normal } set m .lsw.frbl.frb.import.m menubutton .lsw.frbl.frb.import -text $TXT(import) -menu $m menu $m foreach fmt $FILEFORMAT(_type,in,data) { $m add command -label $fmt -command "ImportFile Data $fmt" } button .lsw.frbl.frb.save -text $TXT(save) -state disabled \ -command { SaveFile all Data ; \ .lsw.frbl.frb.save configure -state normal } # based on VR contribution set m .lsw.frbl.frb.export.m menubutton .lsw.frbl.frb.export -text $TXT(export) -menu $m \ -state disabled menu $m foreach fmt $FILEFORMAT(_type,out,data) { $m add command -label $fmt -command "ExportFile all $fmt Data" } #-- button .lsw.frbl.frb.search -text $TXT(search) -state disabled \ -command { Search ; \ .lsw.frbl.frb.search configure -state normal } } } frame $MpW.frm frame $MpW.frm.frmap1 set Map $MpW.frm.frmap1.map canvas $Map -borderwidth 5 -relief groove -confine true \ -scrollregion $MapBounds \ -width $MapWidth -height $MapHeight \ -xscrollincrement 1 -yscrollincrement 1 \ -xscrollcommand "$MpW.frm.frmap1.mhscr set" \ -yscrollcommand "$MpW.frm.frmap1.mvscr set" bind $Map { MapResize } scrollbar $MpW.frm.frmap1.mvscr -command "ScrollMap y" scrollbar $MpW.frm.frmap1.mhscr -command "ScrollMap x" -orient horizontal frame $MpW.frm.frmap3 # need another frame for the map-main-window layout frame $MpW.frm.frmap3.fr3 set fr3 $MpW.frm.frmap3.fr3 canvas $fr3.cv -width $MAPSCLENGTH -height 15 -relief flat label $fr3.cv.val -width 10 -font $FixedFont $fr3.cv create line 0 7.5 $MAPSCLENGTH 7.5 -arrow both \ -fill $MAPCOLOUR(mapsel) $fr3.cv create line 1 0 1 15 -fill $MAPCOLOUR(mapsel) set l [expr $MAPSCLENGTH-1] $fr3.cv create line $l 0 $l 15 -fill $MAPCOLOUR(mapsel) $fr3.cv create window [expr $MAPSCLENGTH/2] 7.5 \ -window $fr3.cv.val menubutton $fr3.mn -text $TXT(change) -menu $fr3.mn.m menu $fr3.mn.m set nf 1 ; set nmd "" ; set MAPDISTVALS "" set u $SUBDTUNIT ; set f $SUBDSCALE ; set ims [lindex $MAPSCALE 0] set imsu [lreplace $MAPSCALE 0 0] # map scale in meters/pixel if { $imsu == [lindex $MAPDISTUNITS($DISTUNIT) 0] } { set ds $DSCALE } else { set ds $SUBDSCALE } set MapScale [expr $ims*$ds*1000.0/$MAPSCLENGTH] foreach d $MAPDISTS { set v [lindex $d 0] if { $v == 1 } { set u $DTUNIT ; set f 1 } set ad [expr $v*$f] ; set t "$v $u" lappend nmd $t ; lappend MAPDISTVALS $ad $fr3.mn.m add radiobutton -label $t -value $t \ -variable MapScaleButton -selectcolor $COLOUR(check) \ -command "MapScaleSet $ad" if { $v == $ims } { # cannot call MapScaleSet yet! set nf 0 ; set MapScInitVal $ad set MapScaleButton $t $fr3.cv.val configure -text $t } } if { $nf } { if { $imsu != $DTUNIT && $imsu != $SUBDTUNIT && \ [lsearch -exact $MAPDISTUNITS($DISTUNIT) $imsu] == -1 } { GMMessage "$MESS(baddistunit): $imsu" } else { GMMessage "$MESS(badscale): $MAPSCALE" } set MapScInitVal 1 ; set t "1 $DTUNIT" set MapScaleButton $t $fr3.cv.val configure -text "1 $DTUNIT" } # labels in map scale menu aligned with km values in $MAPDISTVALS set MAPDISTS $nmd frame $fr3.sep -height 6 -bg $COLOUR(dialbg) -width 5 set mb $fr3.sh menubutton $mb -text $TXT(items) -menu $mb.m menu $mb.m foreach op "loc disp clr" lb "locate displ clear" exc "GR _ GR" \ fp "SelectApplyMapped SelectApplyUnmapped SelectApplyMapped" \ cm "Locate PutMap UnMap" mode "single many many" { set mn $mb.m$op $mb.m add cascade -label $TXT($lb) -menu $mn -state disabled menu $mn foreach wh $TYPES { if { $wh != $exc } { $mn add command -label $TXT(name$wh) \ -command "$fp $wh $mode $cm" } } } $mb.mloc insert 0 command -label $TXT(prevctr) -command LocatePrevious # DJG contribution $mb.m add cascade -label "$TXT(mkgrp)..." -menu $mb.m.mkg menu $mb.m.mkg $mb.m.mkg add command -label $TXT(dispitems) -command "NewGroupFromMap 1" $mb.m.mkg add command -label $TXT(hiditems) -command "NewGroupFromMap 0" #-- set WConf(mapstate) [list [list menu [list [list $mb.m [list 0 2]]]]] lappend WConf(datastate) [list menu [list [list $mb.m 1]]] frame $MpW.frmi set ltypes $TYPES if { $SUPPORTLAPS } { lappend ltypes LAP } switch $MWINDOWSCONF { lists { set WConf(mapdatum) "$MpW.frmi.frcoords.dtitle \ $MpW.frmi.frcoords.ptitle" lappend WConf(mapstate) \ [list button \ [list $MpW.frmi.frmbs.msave $MpW.frmi.frmbs.mprint \ $MpW.frmi.frmbs.mclear $MpW.frmi.frmbs.mft]] set WConf(mapstateback) \ [list [list menu [list \ [list $MpW.frmi.frmbs.mback.m \ [list 1 2 3 4]]]]] set WConf(additemstate) "" set bl [Measure $TXT(backgrnd)] frame $MpW.frmi.frmbs -borderwidth 2 label $MpW.frmi.frmbs.mtitle -text $TXT(map) menubutton $MpW.frmi.frmbs.grid -textvariable MapPFormat \ -width 8 -menu $MpW.frmi.frmbs.grid.m menu $MpW.frmi.frmbs.grid.m -postcommand \ "FillPFormtMenu $MpW.frmi.frmbs.grid.m ChangeMapPFormat" set mb $MpW.frmi.frmbs.grdatum menubutton $mb -textvariable MapPFDatum \ -width $DATUMWIDTH -menu $mb.m menu $mb.m -postcommand "FillDatumMenu $mb.m ChangeMPFDatum" label $MpW.frmi.frmbs.zone -textvariable MapZone -width 4 \ -relief sunken label $MpW.frmi.frmbs.xcoord -textvariable XCoord -width 11 \ -relief sunken label $MpW.frmi.frmbs.ycoord -textvariable YCoord -width 11 \ -relief sunken if { $NoImgLib } { button $MpW.frmi.frmbs.msave -text "$TXT(saveto) PS" \ -command "SaveMap PS ; \ $MpW.frmi.frmbs.msave configure -state normal" \ -state disabled -width $bl } else { set m $MpW.frmi.frmbs.msave.m menubutton $MpW.frmi.frmbs.msave -text "$TXT(saveto)..." \ -menu $m -state disabled -width $bl menu $m $m add command -label PS -command { SaveMap PS } foreach f $ImgOutFormats { $m add command -label $f -command "SaveMap $f" } } button $MpW.frmi.frmbs.mprint -text $TXT(print) \ -command "PrintMap ; \ $MpW.frmi.frmbs.mprint configure -state normal" \ -state disabled -width $bl menubutton $MpW.frmi.frmbs.mback -text $TXT(backgrnd) -width $bl \ -menu $MpW.frmi.frmbs.mback.m set mbmn $MpW.frmi.frmbs.mback.m menu $mbmn # order of entries used in file map.tcl $mbmn add cascade -label $TXT(loadmback) -menu $mbmn.m menu $mbmn.m $mbmn.m add command -label $TXT(fromfile) -command LoadMapBack menu $mbmn.m.defs \ -postcommand [list FillDefsMenu backgrnd $mbmn.m.defs \ LoadMapBack] $mbmn.m add cascade -label $TXT(fromdef) -menu $mbmn.m.defs foreach f [list $TXT(savemback) $TXT(exportTFW) $TXT(chgmback) \ $TXT(clearmback)] \ c {SaveMapBack ExportMapTFW ChangeMapBack ClearMapBack} \ s {normal disabled disabled disabled disabled} { $mbmn add command -label $f -command $c -state $s } button $MpW.frmi.frmbs.mclear -text $TXT(clear) -state disabled \ -width $bl \ -command "ClearMap ; \ $MpW.frmi.frmbs.mclear configure -state normal" button $MpW.frmi.frmbs.mft -text $TXT(optMAPFONT) \ -state disabled -width $bl \ -command "CanvasChangeFont $Map MapFont MapFont; $MpW.frmi.frmbs.mft configure -state normal" frame $MpW.frmi.frcoords -borderwidth 2 menubutton $MpW.frmi.frcoords.dtitle -text Datum \ -menu $MpW.frmi.frcoords.dtitle.m set dm $MpW.frmi.frcoords.dtitle.m menu $dm -postcommand "FillDatumMenu $dm ChangeMapDatum" label $MpW.frmi.frcoords.datum -textvariable Datum \ -width $DATUMWIDTH menubutton $MpW.frmi.frcoords.ptitle -text $TXT(projection) \ -menu $MpW.frmi.frcoords.ptitle.m menu $MpW.frmi.frcoords.ptitle.m \ -postcommand "FillProjsMenu $MpW.frmi.frcoords.ptitle.m \ MAPKNOWNPROJS MapProjectionIs" label $MpW.frmi.frcoords.proj -textvariable MapProjTitle \ -width 20 label $MpW.frmi.frcoords.ttitle -relief raised -text $TXT(transf) label $MpW.frmi.frcoords.transf -textvariable MapTransfTitle \ -width 20 set defsmnbt $MpW.frmi.frcoords.udefs } map { frame $MpW.frm.top -borderwidth 2 frame $MpW.frm.top.frmap0 # to be filled in by proc ToTravel frame $MpW.frm.top.frmapT set WConf(travel,fr) $MpW.frm.top.frmapT set WConf(travel,alt) [set fr0 $MpW.frm.top.frmap0] set gtit $fr0.title menubutton $fr0.db -text $TXT(nameData) -width $mt -menu $fr0.db.m menu $fr0.db.m $fr0.db.m add command -label "$TXT(load) ..." \ -command "LoadFile Data" set m $fr0.db.m.import menu $m $fr0.db.m add cascade -label "$TXT(import) ..." -menu $m foreach fmt $FILEFORMAT(_type,in,data) { $m add command -label $fmt -command "ImportFile Data $fmt" } $fr0.db.m add command -label "$TXT(save) ..." \ -command "SaveFile all Data" -state disabled # VR contribution set m $fr0.db.m.export menu $m $fr0.db.m add cascade -label "$TXT(export) ..." -menu $m \ -state disabled foreach fmt $FILEFORMAT(_type,out,data) { $m add command -label $fmt -command "ExportFile all $fmt Data" } #-- $fr0.db.m add command -label $TXT(nameLists) \ -command "ToggleWindow .lsw $LPOSX $LPOSY" $fr0.db.m add command -label "$TXT(search) ..." -command Search \ -state disabled foreach i $ltypes { set openits [format $TXT(openits) $i] set m $fr0.db.m.e$i $fr0.db.m add cascade -label $TXT(name$i) -menu $m menu $m if { $i == "GR" } { set tits [list $TXT(newGR) $openits $TXT(clearall) \ "$TXT(loadgrels) ..." $TXT(count)] set coms [list NewItem OpenSelItems ClearList \ LoadGREls Count] set sts "normal disabled disabled disabled normal" set im 4 set imp importgrels ; set impst disabled set imppr ImportGREls set acts "save saveels" set prs "SaveFile SaveGREls" set exp exportels ; set exppr ExportGREls } elseif { $i != "LAP" } { set tits [list $TXT(new$i) $openits $TXT(clearall) \ $TXT(count)] set coms [list NewItem OpenSelItems ClearList Count] set sts "normal disabled disabled normal" set im 3 set imp import ; set impst normal set imppr ImportFile set acts save ; set prs SaveFile set exp export ; set exppr ExportFile } else { # LAP set tits [list $openits $TXT(clearall) $TXT(count)] set coms "OpenSelItems ClearList Count" set sts "disabled disabled normal" set im 2 set imp "" ; set impst "" ; set imppr "" set acts save ; set prs SaveFile set exp "" ; set exppr "" } foreach l $tits c $coms s $sts { $m add command -label $l -command "$c $i" -state $s } foreach ip $imp s $impst p $imppr { $m insert $im cascade -label "$TXT($ip) ..." \ -menu $m.$ip -state $s menu $m.$ip foreach fmt $FILEFORMAT(_type,in,$i) { regsub -all { } $fmt {_} gfmt $m.$ip add command -label $fmt -command "$p $i $gfmt" } incr im } foreach a $acts p $prs { $m insert $im cascade -label "$TXT($a) ..." \ -menu $m.$a -state disabled menu $m.$a $m.$a add command -label $TXT(all) -command "$p all $i" $m.$a add command -label "$TXT(select) ..." \ -command "$p select $i" incr im } foreach ep $exp p $exppr { $m insert $im cascade -label "$TXT($ep) ..." \ -menu $m.$ep -state disabled menu $m.$ep foreach fmt $FILEFORMAT(_type,out,$i) { regsub -all { } $fmt {_} gfmt $m.$ep add cascade -label $fmt -menu $m.$ep.f$gfmt menu $m.$ep.f$gfmt $m.$ep.f$gfmt add command -label $TXT(all) \ -command "$p all $gfmt $i" $m.$ep.f$gfmt add command -label "$TXT(select) ..." \ -command "$p select $gfmt $i" } incr im } if { $i == "WP" } { $m insert [expr [$m index end]-1] cascade \ -label $TXT(chgname) -menu $m.ren -state disabled menu $m.ren menu $m.ren.m -postcommand \ [list FillDefsMenu renamethod $m.ren.m WPChangeNames] $m.ren add cascade -label $TXT(use) -menu $m.ren.m $m.ren add command -label $TXT(define) \ -command "WPChangeNames \[Define renamethod\]" } } set RcMenu $fr0.rcw.m menubutton $fr0.rcw -text $TXT(GPSrec) -width $mt -menu $RcMenu menubutton $fr0.map -text $TXT(nameMap) -width $mt -menu $fr0.map.m menu $fr0.map.m # order of entries used in file map.tcl (proc SetMapBounds) if { $NoImgLib } { $fr0.map.m add command -label "$TXT(saveto) PS" \ -command { SaveMap PS } -state disabled } else { set m $fr0.map.mapsave $fr0.map.m add cascade -label "$TXT(saveto)..." -menu $m \ -state disabled menu $m $m add command -label PS -command { SaveMap PS } foreach f $ImgOutFormats { $m add command -label $f -command "SaveMap $f" } } $fr0.map.m add command -label $TXT(print) -command PrintMap \ -state disabled $fr0.map.m add cascade -label $TXT(backgrnd) -menu $fr0.map.mback menu $fr0.map.mback $fr0.map.mback add cascade -label $TXT(loadmback) \ -menu $fr0.map.mback.m menu $fr0.map.mback.m $fr0.map.mback.m add command -label $TXT(fromfile) \ -command LoadMapBack menu $fr0.map.mback.m.defs \ -postcommand [list FillDefsMenu backgrnd \ $fr0.map.mback.m.defs LoadMapBack] $fr0.map.mback.m add cascade -label $TXT(fromdef) \ -menu $fr0.map.mback.m.defs foreach f [list $TXT(savemback) $TXT(exportTFW) $TXT(chgmback) \ $TXT(clearmback)] \ c {SaveMapBack ExportMapTFW ChangeMapBack ClearMapBack} \ s {disabled disabled disabled disabled} { $fr0.map.mback add command -label $f -command $c -state $s } $fr0.map.m add command -label $TXT(clear) -command ClearMap \ -state disabled $fr0.map.m add command -label $TXT(optMAPFONT) \ -command "CanvasChangeFont $Map MapFont MapFont" set defsmnbt $fr0.udefs button $fr0.options -text $TXT(options) -width $mt \ -command "SetOptions ; \ $fr0.options configure -state normal" frame $MpW.frm.frmap3.fr4 -borderwidth 1 -bg $COLOUR(messbg) set fr4 $MpW.frm.frmap3.fr4 menubutton $fr4.datum -textvariable Datum -menu $fr4.datum.m \ -width $DATUMWIDTH menu $fr4.datum.m \ -postcommand "FillDatumMenu $fr4.datum.m ChangeMapDatum" menubutton $fr4.proj -textvariable MapProjTitle -width 20 \ -menu $fr4.proj.m menu $fr4.proj.m \ -postcommand "FillProjsMenu $fr4.proj.m \ MAPKNOWNPROJS MapProjectionIs" label $fr4.transf -textvariable MapTransfTitle -relief raised \ -width 20 frame $MpW.frm.frmap3.fr5 -borderwidth 1 -bg $COLOUR(messbg) set fr5 $MpW.frm.frmap3.fr5 menubutton $fr5.grid -textvariable MapPFormat -width 8 \ -menu $fr5.grid.m menu $fr5.grid.m \ -postcommand "FillPFormtMenu $fr5.grid.m ChangeMapPFormat" label $fr5.zone -textvariable MapZone -width 4 -relief sunken label $fr5.xcoord -textvariable XCoord -width 11 -relief sunken label $fr5.ycoord -textvariable YCoord -width 11 -relief sunken menubutton $fr5.grdat -textvariable MapPFDatum \ -width $DATUMWIDTH -menu $fr5.grdat.m menu $fr5.grdat.m \ -postcommand "FillDatumMenu $fr5.grdat.m ChangeMPFDatum" set WConf(mapdatum) "$fr4.datum $fr4.proj" lappend WConf(mapstate) \ [list menu [list [list $fr0.map.m [list 0 1 3 4]]]] set WConf(mapstateback) \ [list [list menu [list \ [list $fr0.map.mback [list 1 2 3 4]]]]] set WConf(additemstate) $fr0.db.m.e lappend WConf(datastate) \ [list menu [list [list $fr0.db.m [list 2 3 5]]]] \ [list button [list .lsw.frbl.frb.save \ .lsw.frbl.frb.export \ .lsw.frbl.frb.search]] } } set mn $defsmnbt.mn menubutton $defsmnbt -text $TXT(defs) -menu $mn menu $mn $mn add cascade -label $TXT(projection) -menu $mn.proj menu $mn.proj $mn.proj add command -label $TXT(define) -command DefineProjection menu $mn.proj.mn \ -postcommand "FillProjsMenu $mn.proj.mn UProjs OpenUserProjection" $mn.proj add cascade -label "$TXT(open)..." -menu $mn.proj.mn foreach t {datum ellpsd backgrnd renamethod plugin} { $mn add separator $mn add cascade -label $TXT($t) -menu $mn.$t menu $mn.$t $mn.$t add command -label $TXT(define) -command "Define $t" menu $mn.$t.mn -postcommand [list FillDefsMenu $t $mn.$t.mn \ [list Inspect $t]] $mn.$t add cascade -label "$TXT(open)..." -menu $mn.$t.mn } # menu used for plug-ins (see array PLGSWelcomed, plugins.tcl) menu $mn.plugin.exec $mn.plugin add cascade -label "$TXT(use)..." -menu $mn.plugin.exec $mn add separator $mn add command -label $TXT(syusrmenu) -command SymbolCustomMenu if { $SmallLogo == "" } { menubutton $gtit -text "GPS Manager" -menu $gtit.m } else { menubutton $gtit -image $SmallLogo -menu $gtit.m } menu $gtit.m $gtit.m add command -label $TXT(about) -command About $gtit.m add command -label $TXT(exit) -command QuitNow set tw [Measure $TXT(nameWP)] set bw [Measure $TXT(clear)] foreach i $ltypes { set openits [format $TXT(openits) $i] set EdWindow($i) .gm$i ; set ListInds($i) "" set GMEd($i,Show) 0 set n $TXT(name$i) set List($i) $LsW.frl$i.frl.box frame $LsW.frl$i -borderwidth 2 frame $LsW.frl$i.frb menubutton $LsW.frl$i.frb.file -text $n -width $tw \ -menu $LsW.frl$i.frb.file.m menu $LsW.frl$i.frb.file.m frame $LsW.frl$i.frl listbox $LsW.frl$i.frl.box -height $LISTHEIGHT -width $LISTWIDTH \ -yscrollcommand "$LsW.frl$i.frl.bscr set" \ -selectmode single -exportselection 1 # SH contribution: no such bindings in non-unix systems if { $UNIX } { bind $LsW.frl$i.frl.box { focus %W } bind $LsW.frl$i.frl.box "focus $LsW" } bind $LsW.frl$i.frl.box "OpenListItem $i" bind $LsW.frl$i.frl.box { ScrollListIndex %W %A } scrollbar $LsW.frl$i.frl.bscr -command "$LsW.frl$i.frl.box yview" # BSB contribution: wheelmouse scrolling Mscroll $LsW.frl$i.frl.box # order of menu entries is used elsewhere! if { $i == "GR" } { set tits [list $TXT(newGR) $openits $TXT(clearall) \ "$TXT(load) ..." "$TXT(loadgrels) ..." $TXT(count)] set coms "NewItem OpenSelItems ClearList LoadFile LoadGREls Count" set sts "normal disabled disabled normal disabled normal" set im 5 set imp importgrels ; set impst disabled set imppr ImportGREls set acts "save saveels" set prs "SaveFile SaveGREls" set exp exportels ; set exppr ExportGREls } elseif { $i != "LAP" } { set tits [list $TXT(new$i) $openits $TXT(clearall) \ "$TXT(load) ..." $TXT(count)] set coms "NewItem OpenSelItems ClearList LoadFile Count" set sts "normal disabled disabled normal normal" set im 4 set imp import ; set impst normal set imppr ImportFile set acts save ; set prs SaveFile set exp export ; set exppr ExportFile } else { # LAP set tits [list $openits $TXT(clearall) "$TXT(load) ..." \ $TXT(count)] set coms "OpenSelItems ClearList LoadFile Count" set sts "disabled disabled normal normal" set im 3 set imp "" ; set impst "" ; set imppr "" set acts save ; set prs SaveFile set exp "" ; set exppr "" } set m $LsW.frl$i.frb.file.m foreach l $tits c $coms s $sts { $m add command -label $l -command "$c $i" -state $s } foreach ip $imp s $impst p $imppr { $m insert $im cascade -label "$TXT($ip) ..." -menu $m.$ip -state $s menu $m.$ip foreach fmt $FILEFORMAT(_type,in,$i) { $m.$ip add command -label $fmt -command "$p $i $fmt" } incr im } foreach a $acts p $prs { $m insert $im cascade -label "$TXT($a) ..." \ -menu $m.$a -state disabled menu $m.$a $m.$a add command -label $TXT(all) -command "$p all $i" $m.$a add command -label "$TXT(select) ..." -command "$p select $i" incr im } foreach ep $exp p $exppr { $m insert $im cascade -label "$TXT($ep) ..." \ -menu $m.$ep -state disabled menu $m.$ep foreach fmt $FILEFORMAT(_type,out,$i) { $m.$ep add cascade -label $fmt -menu $m.$ep.f$fmt menu $m.$ep.f$fmt $m.$ep.f$fmt add command -label $TXT(all) \ -command "$p all $fmt $i" $m.$ep.f$fmt add command -label "$TXT(select) ..." \ -command "$p select $fmt $i" } incr im } if { $i == "WP" } { $m insert [expr [$m index end]-1] cascade -label $TXT(chgname) \ -menu $m.ren -state disabled menu $m.ren menu $m.ren.m -postcommand [list FillDefsMenu \ renamethod $m.ren.m WPChangeNames] $m.ren add cascade -label $TXT(use) -menu $m.ren.m $m.ren add command -label $TXT(define) \ -command "WPChangeNames \[Define renamethod\]" } } foreach t $TYPES { bind $LsW.frl$t.frl.box \ "ToggleDisplayItem $t \[%W nearest %y\]" } frame $RcW.frgps -borderwidth 2 if { $MYGPS == "Garmin" } { global MyProdDescr set MyProdDescr $TXT(GPSrec) label $RcW.frgps.title -width 40 -textvariable MyProdDescr } else { label $RcW.frgps.title -text $TXT(GPSrec) } # receiver window; create and fill also receiver menu # changes here should be reflected in procs DisableGPS and EnableGPs # in file gpsinfo.tcl menu $RcMenu $RcMenu add command -label $TXT(recwindow) \ -command "ToggleWindow .rcw $RPOSX $RPOSY" $RcMenu add separator menu $RcMenu.dev menu $RcMenu.pm $RcMenu add cascade -label $TXT(optDEFSPORT) -menu $RcMenu.dev $RcMenu add cascade -label $TXT(protcl) -menu $RcMenu.pm frame $RcW.frgps.dev -borderwidth 2 -bg $COLOUR(messbg) set fdev $RcW.frgps.dev # changing device when not connected label $fdev.tdev -text $TXT(optDEFSPORT) entry $fdev.dev -width 14 -textvariable SERIALPORT $RcMenu.dev add command -label $TXT(chgdev) -command GPSChangeDevice # changing baud rate when connected if { $MYGPS == "Garmin" } { menubutton $fdev.baud -text $TXT(optSERIALBAUD) \ -menu $fdev.baud.mn -state disabled menu $fdev.baud.mn $RcMenu.dev add cascade -label $TXT(optSERIALBAUD) \ -menu $RcMenu.dev.baud -state disabled menu $RcMenu.dev.tbaud foreach b $RECBAUDS { $fdev.baud.mn add command -label $b -command "GPSChangeBaud $b" $RcMenu.dev.tbaud add command -label $b -command "GPSChangeBaud $b" } } frame $RcW.frgps.prt -borderwidth 2 -bg $COLOUR(messbg) set fprt $RcW.frgps.prt menubutton $fprt.title -text $TXT(protcl) -menu $fprt.title.m menu $fprt.title.m set GPSProtocolExt $TXT($GPSProtocol) foreach p $RECPROTOCOLS($MYGPS) { $fprt.title.m add command -label $TXT($p) \ -command "GPSChangeProtocol $p" $RcMenu.pm add radiobutton -label $TXT($p) -value $p \ -variable GPSProtocolButton -selectcolor $COLOUR(check) \ -command "GPSChangeProtocol $p" } set GPSProtocolButton $GPSProtocol label $fprt.prot -textvariable GPSProtocolExt -width 16 if { $MYGPS != "Magellan" } { frame $RcW.frgps.rlt -borderwidth 2 -bg $COLOUR(messbg) set frlt $RcW.frgps.rlt label $frlt.title -text $TXT(realtimelog) menu $RcMenu.rtm $RcMenu add cascade -label $TXT(realtimelog) -menu $RcMenu.rtm $RcMenu.rtm add command -label $TXT(getlog) \ -command GPSRealTimeLogOnOff $RcMenu.rtm add command -label $TXT(dolog) -command { set PVTState on } $RcMenu.rtm add checkbutton -label $TXT(animation) \ -offvalue 0 -onvalue 1 -variable RealTimeLogAnim \ -selectcolor $COLOUR(check) # Travel entry added below if Garmin button $frlt.onoff -text $TXT(getlog) -width 10 \ -command "GPSRealTimeLogOnOff ; \ $frlt.onoff configure -state normal" button $frlt.show -text $TXT(dolog) \ -command "set PVTState on ; $frlt.show configure -state normal" button $frlt.anim -text $TXT(animation) \ -command "set RealTimeLogAnim 1 ; \ $frlt.anim configure -state normal" set WConf(realtime) [list $frlt.onoff [list $RcMenu.rtm 0]] set WConf(realtimetype) "button menuentry" grid configure $frlt.title -row 0 -column 0 -columnspan 2 -sticky news grid configure $frlt.onoff -row 1 -column 0 -rowspan 2 -sticky ew grid configure $frlt.show -row 1 -column 1 -sticky news grid configure $frlt.anim -row 2 -column 1 -sticky news if { $MYGPS == "Garmin" } { $RcMenu.rtm add separator $RcMenu.rtm add command -label $TXT(travel) -command ToTravel button $frlt.trv -text $TXT(travel) \ -command "$frlt.trv configure -state normal ; ToTravel" grid configure $frlt.trv -row 3 -column 0 -columnspan 2 } } else { set WConf(realtime) "" set WConf(realtimetype) "" } frame $RcW.frgps.bs -borderwidth 2 set GPSState offline ; set GPSLabel $TXT(offline) set r [Measure "Turn Off"] button $RcW.frgps.bs.state -textvariable GPSLabel -fg $COLOUR(offline) \ -width $r \ -command { CheckGPS ; $RcW.frgps.bs.state configure -state normal } bind $RcW.frgps.bs.state { set GPSLabel $TXT(check) } bind $RcW.frgps.bs.state { set GPSLabel $TXT($GPSState) } $RcMenu add command -accelerator $TXT(check) \ -image $SYMBOLIMAGE(diamond_red) -command CheckGPS button $RcW.frgps.bs.off -text $TXT(turnoff) -state disabled -width $r \ -command TurnOff $RcMenu add command -label $TXT(turnoff) -state disabled \ -command TurnOff set r [Measure $TXT(nameLAP)] frame $RcW.frget -borderwidth 2 frame $RcW.frget.frget1 # the following frame only children are the buttons for types in $RECTYPES frame $RcW.frget.frget2 label $RcW.frget.frget1.title -text $TXT(get) # the following menu only entries are for types in $RECTYPES menu $RcMenu.gm set gmlst "" $RcMenu add cascade -label $TXT(get) -state disabled -menu $RcMenu.gm checkbutton $RcW.frget.frget1.displ -text $TXT(mapitems) \ -variable GetDispl -onvalue 1 -offvalue 0 \ -selectcolor $COLOUR(check) # the following frame only children are the buttons for types in $RECTYPES frame $RcW.frput -borderwidth 2 label $RcW.frput.title -text $TXT(put) # the following menu only entries are for types in $RECTYPES menu $RcMenu.ptm set ptmlst "" $RcMenu add cascade -label $TXT(put) -state disabled -menu $RcMenu.ptm set gmix 0 ; set ptmix 0 foreach i $RECTYPES { set n $TXT(name$i) button $RcW.frget.frget2.get$i -text $n -width $r -state disabled \ -command "GetFromGPS $i ; \ $RcW.frget.frget2.get$i configure -state normal" $RcMenu.gm add command -label $n -command "GetFromGPS $i" \ -state disabled lappend gmlst rec,getmn,$i $gmix incr gmix # BSB contribution: no IC put button if { $i != "IC" && $i != "LAP" } { menubutton $RcW.frput.put$i -text $n -width $r -state disabled \ -menu $RcW.frput.put$i.m menu $RcW.frput.put$i.m $RcW.frput.put$i.m add command -label $TXT(all) \ -command "PutOnGPS all $i" $RcW.frput.put$i.m add command -label "$TXT(select) ..." \ -command "PutOnGPS select $i" menu $RcMenu.ptm.m$i $RcMenu.ptm add cascade -label $n -menu $RcMenu.ptm.m$i \ -state disabled lappend ptmlst rec,putmn,$i $ptmix incr ptmix $RcMenu.ptm.m$i add command -label $TXT(all) \ -command "PutOnGPS all $i" $RcMenu.ptm.m$i add command -label "$TXT(select) ..." \ -command "PutOnGPS select $i" if { $AutoNumRts && $i == "RT" } { $RcW.frput.put$i.m add command -label $TXT(numberfrom0) \ -command ResetAutoNumberRT $RcMenu.ptm.m$i add command -label $TXT(numberfrom0) \ -command ResetAutoNumberRT } } } # other information types that can be got from the receiver foreach i $RECINFO { set n $TXT(name$i) button $RcW.frget.frget2.get$i -text $n -width $r -state disabled \ -command "GetFromGPS $i ; \ $RcW.frget.frget2.get$i configure -state normal" $RcMenu.gm add command -label $n -command "GetFromGPS $i" \ -state disabled lappend gmlst rec,getmn,$i $gmix incr gmix } array set WConf $gmlst array set WConf $ptmlst set WConf(rec,getbs) [winfo children $RcW.frget.frget2] set WConf(rec,putbs) [Delete [winfo children $RcW.frput] $RcW.frput.title] # BSB contribution if { $MYGPS == "Lowrance" } { frame $RcW.frinfo -borderwidth 2 frame $RcW.frinfo1 -borderwidth 2 label $RcW.frinfo.tprod -relief raised -width 10 -text $TXT(prod) label $RcW.frinfo.prod -width 16 -textvariable Prod label $RcW.frinfo.twp -relief raised -width 19 -text $TXT(WPCapac) label $RcW.frinfo.wp -width 6 -textvariable MAX(WP) label $RcW.frinfo.trt -relief raised -width 16 -text $TXT(RTCapac) label $RcW.frinfo.rt -width 6 -textvariable MAX(RT) label $RcW.frinfo.tic -relief raised -width 16 -text $TXT(ICCapac) label $RcW.frinfo.ic -width 6 -textvariable MAX(IC) label $RcW.frinfo1.tprt -relief raised -width 10 -text $TXT(protcl) label $RcW.frinfo1.prt -width 16 -textvariable Protv label $RcW.frinfo1.ticg -relief raised -width 16 -text $TXT(ICGraph) label $RcW.frinfo1.icg -width 6 -textvariable MAXICG label $RcW.frinfo1.ttr -relief raised -width 16 -text $TXT(TRCapac) label $RcW.frinfo1.tr -width 6 -textvariable MAX(TR) label $RcW.frinfo1.twr -relief raised -width 19 -text $TXT(WPperRT) label $RcW.frinfo1.wr -width 6 -textvariable MAXWPINROUTE } # end of BSB contribution # packing if { $MWINDOWSCONF == "map" } { set c -1 foreach b \ "$gtit $fr0.db $fr0.rcw $fr0.map $defsmnbt $fr0.options" { grid $b -row 0 -column [incr c] -ipadx 3 } grid $fr0 pack $MpW.frm.top } grid $Map -row 0 -column 0 -sticky nesw grid $MpW.frm.frmap1.mvscr -row 0 -column 1 -sticky ns grid $MpW.frm.frmap1.mhscr -row 1 -column 0 -sticky ew grid rowconfigure $MpW.frm.frmap1 0 -weight 1 grid columnconfigure $MpW.frm.frmap1 0 -weight 1 grid $fr3.cv -row 0 -column 0 -sticky nesw grid $fr3.mn -row 0 -column 1 -sticky nesw -padx 2 grid $fr3.sep -row 0 -column 2 -sticky nesw -padx 10 grid $fr3.sh -row 0 -column 3 -sticky nesw -padx 5 foreach i $ltypes { pack $LsW.frl$i.frl.box $LsW.frl$i.frl.bscr -side left \ -fill y -expand 1 pack $LsW.frl$i.frb.file -side top -pady 5 pack $LsW.frl$i.frb $LsW.frl$i.frl -side top \ -fill y -expand 1 pack $LsW.frl$i -side left -fill y } switch $MWINDOWSCONF { lists { grid $fr3 pack $MpW.frm.frmap3 -pady 2 -side bottom # must be the last one to be packed under $MpW.frm pack $MpW.frm.frmap1 -expand 1 -fill both pack $defsmnbt $MpW.frmi.frcoords.transf \ $MpW.frmi.frcoords.ttitle $MpW.frmi.frcoords.proj \ $MpW.frmi.frcoords.ptitle $MpW.frmi.frcoords.datum \ $MpW.frmi.frcoords.dtitle -pady 2 -side bottom pack $MpW.frmi.frmbs.mtitle $MpW.frmi.frmbs.grid \ $MpW.frmi.frmbs.grdatum \ $MpW.frmi.frmbs.zone $MpW.frmi.frmbs.xcoord \ $MpW.frmi.frmbs.ycoord $MpW.frmi.frmbs.msave \ $MpW.frmi.frmbs.mprint $MpW.frmi.frmbs.mback \ $MpW.frmi.frmbs.mclear $MpW.frmi.frmbs.mft -pady 5 pack $MpW.frmi.frcoords -side top pack $MpW.frmi.frmbs -side bottom pack $MpW.frm -side left -fill y -fill both -expand 1 pack $MpW.frmi -side left -fill y } map { grid $fr4.datum -row 0 -column 0 -sticky nesw grid $fr4.proj -row 0 -column 1 -sticky nesw -padx 3 grid $fr4.transf -row 0 -column 2 -sticky nesw -padx 3 grid $fr5.grid -row 0 -column 0 -sticky nesw grid $fr5.zone -row 0 -column 1 -sticky nesw -padx 3 grid $fr5.xcoord -row 0 -column 2 -sticky nesw -padx 3 grid $fr5.ycoord -row 0 -column 3 -sticky nesw -padx 3 grid $fr5.grdat -row 1 -column 0 -columnspan 4 -sticky nesw grid $fr3 -row 0 -column 0 grid $fr4 -row 1 -column 0 grid $fr5 -row 0 -column 1 -rowspan 2 -padx 10 pack $MpW.frm.frmap3 -pady 2 -side bottom # must be the last one to be packed under $MpW.frm pack $MpW.frm.frmap1 -expand 1 -fill both pack $MpW.frm -expand 1 -fill both pack $MpW -expand 1 -fill both pack .lsw.frbl.frb.load .lsw.frbl.frb.import .lsw.frbl.frb.save \ .lsw.frbl.frb.export .lsw.frbl.frb.search -side left -padx 3 pack .lsw.frbl.frb $LsW -side top -pady 3 pack .lsw.tit .lsw.frbl -side top -pady 5 } } grid $RcW.frgps.dev.tdev $RcW.frgps.dev.dev if { $MYGPS == "Garmin" } { grid $RcW.frgps.dev.baud -columnspan 2 } pack $RcW.frgps.prt.title $RcW.frgps.prt.prot -side left pack $RcW.frgps.bs.state $RcW.frgps.bs.off -side left -pady 2 if { $MYGPS != "Magellan" } { pack $RcW.frgps.title $RcW.frgps.dev $RcW.frgps.prt $RcW.frgps.rlt \ $RcW.frgps.bs -side top -pady 5 } else { pack $RcW.frgps.title $RcW.frgps.dev $RcW.frgps.prt $RcW.frgps.bs \ -side top -pady 5 } pack $RcW.frget.frget1.title $RcW.frget.frget1.displ -side left -padx 5 foreach i [concat $RECTYPES $RECINFO] { pack $RcW.frget.frget2.get$i -side left -pady 2 } pack $RcW.frget.frget1 $RcW.frget.frget2 -side top pack $RcW.frput.title -side top # BSB contribution: no IC put button foreach i $RECTYPES { if { $i != "IC" && $i != "LAP" } { pack $RcW.frput.put$i -side left -pady 2 } } switch $MWINDOWSCONF { lists { pack .lsw.frmb.dtitle .lsw.frmb.datum -pady 2 -side top pack .lsw.frmb.frb.sep .lsw.frmb.frb.load .lsw.frmb.frb.import \ .lsw.frmb.frb.save .lsw.frmb.frb.export .lsw.frmb.frb.search \ .lsw.frmb.frb.sep2 -side top -pady 3 -fill x pack .lsw.frmb.frb -pady 20 -side top pack .lsw.frmb.opt -pady 5 -side bottom pack .lsw.frmb.sep -pady 5 -side bottom -fill x pack .lsw.frmb.rcw .lsw.frmb.mpw -pady 5 -side bottom pack $LsW .lsw.frmb -side left -fill y pack $gtit .lsw -side top -pady 3 grid .mpw.top.frNT.tit -row 0 -column 0 grid .mpw.top.frNT pack .mpw.top $MpW -side top -pady 3 } map { pack $RcW.frgps $RcW.frget $RcW.frput -side top -pady 5 pack .rcw.tit $RcW -side top -pady 3 # BSB contribution if { $MYGPS == "Lowrance" } { pack $RcW.frinfo1 -side bottom -pady 5 pack $RcW.frinfo1.tprt $RcW.frinfo1.prt $RcW.frinfo1.twr \ $RcW.frinfo1.wr $RcW.frinfo1.ticg $RcW.frinfo1.icg \ $RcW.frinfo1.ttr $RcW.frinfo1.tr -side left -pady 2 pack $RcW.frinfo -side bottom -pady 5 pack $RcW.frinfo.tprod $RcW.frinfo.prod $RcW.frinfo.twp \ $RcW.frinfo.wp $RcW.frinfo.trt $RcW.frinfo.rt \ $RcW.frinfo.tic $RcW.frinfo.ic -side left -pady 2 } # end of BSB contribution } } SetMapBindings AttachPlugIns . # saved state if { [file readable $USvState] } { RestoreState } return } proc About {} { # create modal dialog for displaying information about GPSMan # single button: OK; binding: return global EPOSX EPOSY TXT set gs [grab current] GMToplevel .about message +$EPOSX+$EPOSY {} \ [list WM_DELETE_WINDOW [list DestroyRGrabs .about $gs]] \ [list [list DestroyRGrabs .about $gs]] AboutInfo .about frame .about.fr.bt button .about.fr.ok -text $TXT(ok) -command [list DestroyRGrabs .about $gs] pack .about.fr.ok pack .about.fr -side top -pady 5 RaiseWindow .about update idletasks grab .about return } ##### initializing variables and quitting proc GMStart {} { # initialize (most) global variables global Index Number Storage File Proc FDDatum \ TYPES PROCTYPES CursorsChanged MapWidth MapHeight MAPW2 MAPH2 \ AzimuthDegrees MapEmpty DataDefault DataIndex PositionFormat \ DEFAULTSYMBOL DEFAULTDISPOPT Datum EMPTYSTR Anim \ BalloonX BalloonY USERDIR RealTimeLogOn \ RealTimeLogAnim PVTState USvState USvData USvMap \ BITMAPS SERIALPORT DEFSPORT tcl_platform DEFTRTWIDTH DEFTTRWIDTH \ DEFTLNWIDTH GPSProtocol RECPROTOCOLS GetDispl UNIX MAPCOLOUR \ MapFont MAPFONT Travelling Travel TRAVELFONT NAMEWIDTH \ MapMeasure DEFMAPPROJ DEFMAPPFRMT ALTUNIT AltUnit GMEd PlotWNo \ FILEFORMAT DEFTRECPROTOCOL MapPFDatum DEFMAPPFDATUM \ RealTimeGettingFix MAPWIDTH MAPHEIGHT GFShowInfo FromTimeOffset \ RecCanChgBaud PlotFont PLOTFONT ReplNames # BSB contribution: globals needed for Lowrance receivers global UnusedICInx UnusedWPInx MAX MYGPS GlobalOptionsBindings # I/O port if { $UNIX && $SERIALPORT == "" } { set SERIALPORT $DEFSPORT } # receiver supports changing baud rate when connected set RecCanChgBaud 0 if { $MYGPS == "Garmin" } { set GPSProtocol $DEFTRECPROTOCOL if { [regsub {^usb=} $SERIALPORT "" p] } { # I/O port given as command argument set SERIALPORT $p set GPSProtocol garmin_usb } } else { set GPSProtocol [lindex $RECPROTOCOLS($MYGPS) 0] } set GetDispl 0 # data-base set Number(Data) 0 # the first element in Storage(_) must be identifier storage # and the last one the display state # WPNum needed only for Lowrance receivers # WPRoute is set separately because cannot be edited # WPAlt and TPalt are lists with altitude in metres, # altitude in user unit and user unit (as $ALTUNIT); # empty list stands for undefined, last 2 elements may # be missing if user unit is metre # ??MBack is name of map background definition to load when item # is displayed and the map is empty; empty string means undefined; # not valid for GR and LAP set Storage(WP) {WPName WPNum WPCommt WPObs WPPFrmt WPPosn WPDatum WPDate WPSymbol WPDispOpt WPAlt WPMBack WPHidden WPDispl} set DataDefault(WP) [list "" -1 "" "" $PositionFormat "" $Datum \ "" $DEFAULTSYMBOL $DEFAULTDISPOPT "" "" "" 0] set Storage(RT) {RTIdNumber RTCommt RTObs RTWPoints RTStages RTWidth RTColour RTMBack RTDispl} set DataDefault(RT) [list "" "" "" "" "" $DEFTRTWIDTH $MAPCOLOUR(RT) "" 0] set stRS {RScommt RSlabel RShidden} set DataDefault(RS) [list "" "" ""] set Storage(TR) {TRName TRObs TRDatum TRTPoints TRSegStarts TRHidden TRWidth TRColour TRMBack TRDispl} set DataDefault(TR) [list "" "" $Datum "" "" "" $DEFTTRWIDTH \ $MAPCOLOUR(TR) "" 0] set stTP {TPlatd TPlongd TPlatDMS TPlongDMS TPdate TPsecs TPalt TPdepth} set DataDefault(TP) [list "" "" "" "" "01-Jan-1988 00:00:00" 0 "" ""] set Storage(LN) {LNName LNObs LNDatum LNPFrmt LNLPoints LNSegStarts \ LNWidth LNColour LNMBack LNDispl} set DataDefault(LN) [list "" "" $Datum $PositionFormat "" "" $DEFTLNWIDTH \ $MAPCOLOUR(LN) "" 0] set stLP {LPposn LPalt} set DataDefault(LP) [list "" ""] set Storage(GR) {GRName GRObs GRConts GRDispl} set DataDefault(GR) [list "" "" "" 0] # LAPs should be considered here, just in case support for them is asked # during the current session set types $TYPES ; set ptypes $PROCTYPES lappend types LAP ; lappend ptypes GMLap # LAPName is formatted date and is not to be edited # LAPStart is the time stamp (list with formatted date and secs) # LAPDispl is here only for uniformity; it should be always 0 set Storage(LAP) {LAPName LAPObs LAPStart LAPDur LAPDist LAPBegPosn LAPEndPosn LAPCals LAPTRIx LAPPFrmt LAPDatum LAPDispl} set DataDefault(LAP) [list "" "" "" 0 0 "" "" 0 "" $PositionFormat \ $Datum 0] foreach wh $types proc $ptypes { set Index($wh) 0 ; set Number($wh) 0 ; set Proc($wh) $proc set k 0 foreach da $Storage($wh) { set DataIndex($da) $k ; incr k } } foreach d "RS TP LP" { set k 0 foreach da [set st$d] { set DataIndex($da) $k ; incr k } } set GMEd(TR,ptname) TP set GMEd(LN,ptname) LP # files set filetypes {WP RT TR LN LAP GR Data WPDistBear WPNearest RTComp TRComp Map Plot MapBkInfo Image PVTData Info tfwfile} foreach t $filetypes { set File($t) "" } set FDDatum "" set USvState [file join $USERDIR sstate] set USvData [file join $USERDIR sdata] set USvMap [file join $USERDIR smap] set FromTimeOffset "" # foreign formats set FILEFORMAT(_type,in,data) [set FILEFORMAT(_type,out,data) ""] foreach t $TYPES { set FILEFORMAT(_type,in,$t) [set FILEFORMAT(_type,out,$t) ""] } foreach fmt $FILEFORMAT(names) { if { $fmt == "GPSMan" || \ ( ! [catch {set dep $FILEFORMAT($fmt,depends)}] && \ ! [eval $dep] ) } { continue } if { [catch {set ts $FILEFORMAT($fmt,types)}] } { foreach "in_ts out_ts" $FILEFORMAT($fmt,io_types) { break } } { set in_ts [set out_ts $ts] } if { ! [catch {set FILEFORMAT($fmt,GREls)}] } { lappend in_ts GR ; lappend out_ts GR } if { $FILEFORMAT($fmt,filetype) == "data" } { foreach m $FILEFORMAT($fmt,mode) { lappend FILEFORMAT(_type,$m,data) $fmt } } foreach m $FILEFORMAT($fmt,mode) { foreach t [set ${m}_ts] { lappend FILEFORMAT(_type,$m,$t) $fmt } } } foreach i [array names FILEFORMAT _type,*] { set FILEFORMAT($i) [lsort -dictionary $FILEFORMAT($i)] } # real-time and travel/navigation set RealTimeLogOn 0 ; set RealTimeLogAnim 0 ; set RealTimeGettingFix 0 set PVTState abort set Travelling 0 if { [set Travel(font) $TRAVELFONT] == "default" } { set Travel(font) $TkDefaultFont } array set Travel { tosave {conf,1 conf,2 travel,cdsp font warn warn,* mindist offroad chggparam chggwparam chggix} conf,1 {lab+fix lab+speed c_trkcts c_trn c_vel_z lab+hour lab+alt lab+nxtWP lab+prvWP lab+dist lab+vmg lab+ete lab+eta lab+xtk lab+cts} conf,2 {lab+fix lab+speed c_trkcts lab+hour lab+pos lab+alt lab+trk c_vel_z} travel,cdsp 1 warn 1 warn,prox 0 warn,prox,wpn "" warn,prox,dst 1 warn,prox,level medium warn,anchor 0 warn,anchor,wpn "" warn,anchor,dst 1 warn,anchor,level medium warn,speed 0 warn,speed,max 50 warn,speed,level high warn,vspeed 0 warn,vspeed,min -6 warn,vspeed,max 6 warn,vspeed,level medium warn,trn 0 warn,trn,max 60 warn,trn,level low warn,xtk 0 warn,xtk,max 5 warn,xtk,level low mindist 0.1 offroad 0 chggparam 0.8 chggwparam 0.9 chggix 2 } trace variable Travel(chggix) w TravelChgGParam set Travel(elsizes) "4 4 8 23 5 4 $NAMEWIDTH $NAMEWIDTH 9 9 4 4 4 4 4" array set Travel { els {fix speed hour pos alt trk nxtWP prvWP ete eta vmg xtk cts trn dist} cvss {c_trkcts c_trn c_vel_z} trav,els {fix speed hour pos alt trk} trav,cvels {{c_vel_z vel_z}} displays {1 2} warnings {prox anchor speed trn vspeed xtk} nav 0 nav,els {nxtWP prvWP ete eta vmg xtk cts trn dist} nav,cvels {{c_trkcts cts}} nav,over land nav,datum {WGS 84} nav,maxdtime 5 posns {} prevtime -1 prevposn {} warncancel {} nav,pmode 1 nav,pnear 0 nav,prvrs 0 chggvals {0.95 0.9 0.8 0.7 0.6} chggwvals {0.98 0.95 0.9 0.8 0.7} chggmaxix 4 } # conditions for issuing warnings and their contents # variables assumed to be defined in the context of execution, # apart from $TXT(): # $posn, $datum, $speed (user units), $vel_z (m/s), $trn (-180..180), # $xtk (signed, user units) # any of these, except $posn, $datum, may be "" for undefined array set Travel { warn:prox,cond { [ComputeDist $posn $Travel(warn,prox,pos) $datum] < $Travel(warn,prox,dst) } warn:prox,cont {[format $TXT(trvwarrv) $Travel(warn,prox,wpn)]} warn:anchor,cond { [ComputeDist $posn $Travel(warn,anchor,pos) $datum] > $Travel(warn,anchor,dst) } warn:anchor,cont {[format $TXT(trvwleave) $Travel(warn,anchor,wpn)]} warn:speed,cond { $speed != {} && $speed > $Travel(warn,speed,max) } warn:speed,cont {[format $TXT(trvwspeed) $Travel(warn,speed,max)]} warn:trn,cond { $trn != {} && abs($trn) > $Travel(warn,trn,max) } warn:trn,cont {[format $TXT(trvwtrn) $Travel(warn,trn,max)]} warn:vspeed,cond { $vel_z != {} && ($vel_z < $Travel(warn,vspeed,min) || $vel_z > $Travel(warn,vspeed,max)) } warn:vspeed,cont {[format $TXT(trvwvspeed) $Travel(warn,vspeed,min) $Travel(warn,vspeed,max)]} warn:xtk,cond { $xtk != {} && abs($xtk) > $Travel(warn,xtk,max) } warn:xtk,cont {[format $TXT(trvwxtk) $Travel(warn,xtk,max)]} } # map set MapEmpty 1 ; set MapMeasure "" set MapWidth $MAPWIDTH ; set MapHeight $MAPHEIGHT set MAPW2 [expr $MapWidth/2.0] ; set MAPH2 [expr $MapHeight/2.0] set Anim(number) 0 foreach x "high medium low" y "important normal info" { set MAPCOLOUR(trvwrn$x) $MAPCOLOUR(trvwrn$y) } if { [set MapFont $MAPFONT] == "default" } { set MapFont $TkDefaultFont } MapProjectionIs $DEFMAPPROJ # order is important here set MapPFDatum $DEFMAPPFDATUM ChangeMapPFormat $DEFMAPPFRMT if { [set PlotFont $PLOTFONT] == "default" } { set PlotFont $TkDefaultFont } # varia set ReplNames(busy) 0 set GFShowInfo 1 set AltUnit $ALTUNIT set PlotWNo 0 set CursorsChanged 0 set BalloonX 0 ; set BalloonY 0 set EMPTYSTR "" set a 0 foreach b "N NE E SE S SW W NW" { set AzimuthDegrees($b) $a ; incr a 45 } set BITMAPS {brokenline} InitBitmaps # initializations depending on receiver brand # BSB contribution if { $MYGPS != "Lowrance" } { StartGPS } else { set UnusedWPInx 0 for {set i 1} {$i < $MAX(WP)} {incr i} { lappend UnusedWPInx $i } set UnusedICInx 0 for {set i 1} {$i < $MAX(WP)} {incr i} { lappend UnusedICInx $i } } return } proc QuitNow {} { global MESS TXT SAVESTATE switch $SAVESTATE { never { if { ! [GMConfirm $MESS(oktoexit)] } { return } } ask { switch [GMSelect $MESS(savestate) \ [list $TXT(ok) $TXT(no) $TXT(cancel)] "ok no cancel"] { ok { SaveState } cancel { return } } } always { SaveState } } GPSBye exit 0 } gpsman-6.4.4.2/gmsrc/command_parse.tcl0000644000175000017500000007103112224351117015713 0ustar migmig# # This file is part of: # # gpsman --- GPS Manager: a manager for GPS receiver data # # Copyright (c) 1998-2013 Miguel Filgueiras migfilg@t-online.de # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. # # File: command_parse.tcl # Last change: 6 October 2013 # # this file is only source-ed in command-line mode ##### parsing command line ### after source-ing options file ### before source-ing main.tcl and other files! ##### parse command line set COMMAND(USAGE) {Usage: gpsman [PREFIXES] COMMAND [ARGS] PREFIXES -dev DEVICE device for serial port -log produce a log file of serial communication -rec Garmin | Lowrance | Magellan brand of receiver (only Garmin works) -prefs PATH path to preferences file -prot Garmin | Garmin_USB | NMEA | SText | simul receiver protocol COMMANDS [ARGS] is available | connected show help | version | formats | protocols | projections | datums | transfs | symbols haslib gpsmanshp | Img | TclCurl getwrite IN-TYPES FORMAT [OUT-PARAMS] [OUT-TYPES] PATH readput FORMAT [IN-PARAMS] [IN-TYPES] PATH [OUT-TYPES] (-rec not allowed!) translate IN-FORMAT [IN-PARAMS] [IN-TYPES] IN-PATH [HOW-PARAMS] \ OUT-FORMAT [OUT-PARAMS] [OUT-TYPES] OUT-PATH where HOW-PARAMS can be itoffset=DHOUR: time offset to use in input file in GPSMan format, defaults to time offset given in file otoffset=DHOUR: time offset to use in output file in GPSMan format defaults to time offset selected in the options getrtimelog PATH [INTERVAL] getfix PATH [TIMEOUT] getalmanac PATH project LATD LONGD DATUM PROJECTION [PARAMS] (no PREFIXES; DATUM used for projection if PARAMS do not give one) georef IMGPATH TRANSF LATD LONGD LATD LONGD [LATD LONGD] DATUM \ X Y X Y [X Y] PROJECTION [PARAMS] (no PREFIXES; DATUM used for projection if PARAMS do not give one) geopicts IN-FORMAT [IN-PARAMS] IN-TYPE IN-PATH [PROC-PARAMS] \ [OUT-FORMAT] [OUT-PARAMS] OUT-PATH PICT-PATHS where IN-TYPE: TR | GR (for WPs in GR) PROC-PARAMS: [id=ID] [date=DMODE] [dh=DHOUR] ID: identifier of item in data file, default is last read DMODE: pict|exif|fmod date from picture EXIF (default), EXIF file, or file last modified time DHOUR: difference in hours to apply to file dates to get TR dates OUT-FORMAT: GPX OUT-PARAMS may include: datum=DATUM sy=SYMBOL prefix=STRING STRING: is prefix for WP names, default is P source PATH read FORMAT [PARAMS] [TYPES] PATH if not in script launches interface exec PATH for use in scripts only: write FORMAT [PARAMS] [TYPES] PATH get TYPES put TYPES start travel (only with Garmin receiver) } set COMMAND(script) 0 proc BadCommandLine {} { # parse command line # this must be called before source-ing main.tcl and other files! # result will be stored on COMMAND array # changes in commands accepted must be reflected on $COMMAND(USAGE) above # return 1 on error global argv COMMAND SERIALPORT GPSREC MAPKNOWNTRANSFS MAPTRANSFNPTS if { ! $COMMAND(script) } { array set COMMAND { prefsfile "" rec 0 log 0 prot "" command 1 } } set pargs 0 while 1 { set opt [lindex $argv 0] switch -- $opt { -dev { set pos 1 set SERIALPORT [lindex $argv 1] set argv [lreplace $argv 0 1] } -log { set pos 2 set COMMAND(log) 1 set argv [lreplace $argv 0 0] } -rec { # not to be used with either readput or -prefs # or after -prot if { $COMMAND(prefsfile) != "" || \ $COMMAND(prot) != "" } { puts stderr "Cannot use -rec with readput, -prefs or -prot" return 1 } set pos 4 set GPSREC [lindex $argv 1] set argv [lreplace $argv 0 1] if { [lsearch {Garmin Lowrance Magellan} $GPSREC] == -1 } { puts stderr "Bad receiver brand $GPSREC" return 1 } set COMMAND(rec) 1 } -prefs { # not to be used with -rec if { $COMMAND(rec) } { puts stderr "Cannot use -prefs with -rec" return 1 } set pos 8 set COMMAND(prefsfile) [lindex $argv 1] set argv [lreplace $argv 0 1] } -prot { set pos 16 set COMMAND(prot) [CmdParseProt [lindex $argv 1]] if { $COMMAND(prot) == "" } { return 1 } set argv [lreplace $argv 0 1] } default { break } } # no repeated options if { $pargs & $pos } { puts stderr "Repeated option $opt" return 1 } incr pargs $pos } set cmd [lindex $argv 0] if { $pargs != 0 && \ ( $COMMAND(script) || \ [lsearch -exact "project georef" $cmd] != -1 ) } { puts stderr "No prefix options allowed in this command" return 1 } if { $cmd == "readput" && $COMMAND(rec) } { puts stderr "Option -rec cannot be used with readput" return 1 } set argv [lreplace $argv 0 0] set nargs [llength $argv] switch -- $cmd { is { set what [lindex $argv 0] switch -- $what { available { set COMMAND(name) available return "-0" } connected { # for the time being this is only supported for # Garmin receivers if { $GPSREC != "Garmin" } { puts stderr "Not a Garmin receiver" return 1 } set cmd checkconn } default { puts stderr "Unknown argument $what; use \"show help\"" return 1 } } } show { set showwhat \ {help version formats projections protocols datums transfs symbols} set what [lindex $argv 0] if { [lsearch $showwhat $what] == -1 } { puts stderr "Unknown argument $what; use \"show help\"" return 1 } set COMMAND(what) $what } haslib { set what [lindex $argv 0] if { [lsearch "gpsmanshp Img TclCurl" $what] == -1 } { puts stderr "Unknown argument $what; use \"show help\"" return 1 } set COMMAND(what) $what } getwrite { # IN-TYPES FORMAT [PARAMS] [OUT-TYPES] PATH # for the time being this is only supported for Garmin receivers if { $GPSREC != "Garmin" } { puts stderr "Not a Garmin receiver" return 1 } foreach "in_ts tail" [CmdParseTypes $argv] {} if { [llength $tail] < 2 || \ [set in_ts [CmdRecTypes get $in_ts]] == "" } { puts stderr "Missing arguments" return 1 } if { [set fmt [CmdFFormat [lindex $tail 0]]] == "" } { return 1 } foreach "out_ps out_ts tail" \ [CmdParseParamsTypes [lreplace $tail 0 0]] {} if { $out_ts == "" } { set out_ts $in_ts } if { [llength $tail] != 1 || [set COMMAND(path) $tail] == "" } { puts stderr "Bad output path: $tail" return 1 } if { [CmdFileFmtParamsTypes out $fmt $out_ps $out_ts] == 0 || \ [CmdIncompatibleTypes $in_ts $COMMAND(filetypes)] } { return 1 } set COMMAND(rectypes) $in_ts } readput { # FORMAT [PARAMS] [IN-TYPES] PATH [OUT-TYPES] # for the time being this is only supported for Garmin receivers if { $GPSREC != "Garmin" } { puts stderr "Not a Garmin receiver" return 1 } # no -rec option if { $COMMAND(rec) } { puts stderr "Option -rec not allowed with readput" return 1 } if { [set fmt [CmdFFormat [lindex $argv 0]]] == "" } { return 1 } foreach "in_ps in_ts tail" \ [CmdParseParamsTypes [lreplace $argv 0 0]] {} if { [set COMMAND(path) [lindex $tail 0]] == "" } { puts stderr "Missing output path" return 1 } if { [CmdFileFmtParamsTypes in $fmt $in_ps $in_ts] == 0 } { return 1 } foreach "out_ts tail" [CmdParseTypes [lreplace $tail 0 0]] {} if { $out_ts == "" } { set out_ts $COMMAND(filetypes) } if { $tail != "" } { puts stderr "Extra arguments after types" return 1 } if { [set out_ts [CmdRecTypes put $out_ts]] == "" || \ [CmdIncompatibleTypes $COMMAND(filetypes) $out_ts] } { return 1 } set COMMAND(rectypes) $out_ts } translate { # IN-FORMAT [IN-PARAMS] [IN-TYPES] IN-PATH [HOW-PARAMS] # OUT-FORMAT [OUT-PARAMS] [OUT-TYPES] OUT-PATH # see proc CmdBadTranslateHowParams for HOW-PARAMS if { $nargs < 4 } { puts stderr "Missing arguments" return 1 } if { [set infmt [CmdFFormat [lindex $argv 0]]] == "" } { return 1 } foreach "in_ps in_ts tail" \ [CmdParseParamsTypes [lreplace $argv 0 0]] {} if { [set COMMAND(inpath) [lindex $tail 0]] == "" } { puts stderr "Missing input path" return 1 } if { [CmdFileFmtParamsTypes in $infmt $in_ps $in_ts] == 0 } { return 1 } set COMMAND(infmt) $COMMAND(format) set tail [lreplace $tail 0 0] foreach "params tail" [CmdParseParams $tail] { break } if { [set outfmt [CmdFFormat [lindex $tail 0]]] == "" || \ [set params \ [CmdBadTranslateHowParams $params $infmt $outfmt]] \ == 0 } { return 1 } set COMMAND(params) $params foreach "out_ps out_ts tail" \ [CmdParseParamsTypes [lreplace $tail 0 0]] {} if { $out_ts == "" } { set out_ts $COMMAND(filetypes) } set COMMAND(intypes) $COMMAND(filetypes) if { [llength $tail] != 1 } { puts stderr "Extra/missing arguments after output types" return 1 } if { [set COMMAND(path) $tail] == "" } { puts stderr "Missing output path" return 1 } if { [CmdFileFmtParamsTypes out $outfmt $out_ps $out_ts] == 0 || \ [CmdIncompatibleTypes $COMMAND(intypes) \ $COMMAND(filetypes)] } { return 1 } } getrtimelog { # PATH [INTERVAL] # for the time being this is only supported for Garmin receivers if { $GPSREC != "Garmin" } { puts stderr "Not a Garmin receiver" return 1 } if { [set COMMAND(path) [lindex $argv 0]] == "" } { puts stderr "Missing output path" return 1 } if { $nargs > 2 || [set COMMAND(interv) \ [CmdParseInteger [lindex $argv 1] 2]] < 0 } { puts stderr "Expecting a number in seconds" return 1 } } getfix { # PATH [TIMEOUT] # for the time being this is only supported for Garmin receivers if { $GPSREC != "Garmin" } { puts stderr "Not a Garmin receiver" return 1 } if { [set COMMAND(path) [lindex $argv 0]] == "" } { puts stderr "Missing output path" return 1 } if { $nargs > 2 || [set COMMAND(timeout) \ [CmdParseInteger [lindex $argv 1] 0]] < 0 } { puts stderr "Expecting a number in seconds" return 1 } } getalmanac { # PATH # for the time being this is only supported for Garmin receivers if { $GPSREC != "Garmin" } { puts stderr "Not a Garmin receiver" return 1 } if { $nargs != 1 } { puts stderr "Extra/missing arguments" return 1 } set COMMAND(path) [lindex $argv 0] } start { # travel [INTERVAL] if { [lindex $argv 0] != "travel" } { puts stderr "Unknown argument [lindex $argv 0]" return 1 } if { $GPSREC != "Garmin" } { puts stderr "Not a Garmin receiver" return 1 } if { $nargs > 2 || [set COMMAND(interv) \ [CmdParseInteger [lindex $argv 1] 2]] < 0 } { puts stderr "Expecting a number in seconds" return 1 } set cmd starttravel set COMMAND(command) 0 } project { # LATD LONGD DATUM PROJECTION [PARAMS] # making only a preliminary check on the correction of the # arguments as projections.tcl was not yet loaded if { $nargs < 4 } { puts stderr "Missing arguments" return 1 } foreach "latd longd" $argv { break } foreach p "latd longd" { set x [set $p] if { ! [regexp {^-?[0-9]+(\.[0-9]+)?$} $x] } { puts stderr "Bad coordinate $x" return 1 } set COMMAND($p) $x } set i 1 foreach p "ptsdatum proj" { if { [set COMMAND($p) [lindex $argv [incr i]]] == "" } { puts stderr "Missing $p argument" return 1 } } foreach "params tail" \ [CmdParseParams [lrange $argv [incr i] end]] { break } if { $tail != "" } { puts stderr "Extra arguments after attibute=value pairs" return 1 } set COMMAND(params) $params } georef { # IMGPATH TRANSF LATD LONGD LATD LONGD [LATD LONGD] DATUM # X Y X Y [X Y] PROJ [PARAMS] # making only a preliminary check on the correction of the # arguments as projections.tcl is not yet loaded set COMMAND(image) [lindex $argv 0] set COMMAND(transf) [set tr [lindex $argv 1]] if { $nargs < 12 } { puts stderr "Missing arguments" return 1 } if { [lsearch -exact $MAPKNOWNTRANSFS $tr] == -1 } { puts stderr "Unknown transformation $tr" return 1 } if { $tr == "NoRot" } { # not using 3 points as when doing this by hand set npts 2 } else { set npts $MAPTRANSFNPTS($tr) } set COMMAND(npts) $npts set i 1 for { set p 0 } { $p < $npts } { incr p } { foreach pp "lat long" { set x [lindex $argv [incr i]] if { ! [regexp {^-?[0-9]+(\.[0-9]+)?$} $x] } { puts stderr "Bad coordinate $x" return 1 } set COMMAND($p,$pp) $x } } if { [set COMMAND(ptsdatum) [lindex $argv [incr i]]] == "" } { puts stderr "Missing ptsdatum argument" return 1 } for { set p 0 } { $p < $npts } { incr p } { foreach pp "x y" { set x [lindex $argv [incr i]] if { ! [regexp {^-?[0-9]+(\.[0-9]+)?$} $x] } { puts stderr "Bad coordinate $x" return 1 } set COMMAND($p,$pp) $x } } if { [set COMMAND(proj) [lindex $argv [incr i]]] == "" } { puts stderr "Missing projection" return 1 } foreach "params tail" \ [CmdParseParams [lrange $argv [incr i] end]] { break } if { $tail != "" } { puts stderr "Extra arguments after attibute=value pairs" return 1 } set COMMAND(params) $params } geopicts { # IN-FORMAT [IN-PARAMS] [IN-TYPE] IN-PATH [PROC-PARAMS] \ # [OUT-FORMAT] [OUT-PARAMS] OUT-PATH PICT-PATHS # see proc CmdBadGeoPictsParams for PROC-PARAMS and OUT-PARAMS # IN-TYPE: TR | GR (for WPs in GR) # OUT-FORMAT: GPX if { $nargs < 4 } { puts stderr "Missing arguments" return 1 } if { [set infmt [CmdFFormat [lindex $argv 0]]] == "" } { return 1 } foreach "in_ps in_ts tail" \ [CmdParseParamsTypes [lreplace $argv 0 0]] {} if { [CmdFileFmtParamsTypes in $infmt $in_ps $in_ts TR GR] == 0 } { return 1 } if { [set COMMAND(inpath) [lindex $tail 0]] == "" } { puts stderr "No input path" return 1 } set COMMAND(infmt) $COMMAND(format) set COMMAND(intypes) $COMMAND(filetypes) set tail [lreplace $tail 0 0] foreach "params tail" [CmdParseParams $tail] { break } if { [set outfmt [CmdFFormat [lindex $tail 0]]] != "GPX" } { puts stderr "Output format for geopicts must be GPX" return 1 } foreach "out_ps tail" [CmdParseParams [lreplace $tail 0 0]] {} foreach "out_ps params" \ [CmdBadGeoPictsParams $params $out_ps] { break } if { $out_ps == "error" || \ [CmdFileFmtParamsTypes out $outfmt $out_ps ""] == 0 } { return 1 } if { [set COMMAND(path) [lindex $tail 0]] == "" } { puts stderr "No output path" return 1 } if { [set picts [lreplace $tail 0 0]] == "" } { puts stderr "No picture files given" return 1 } lappend params __picts $picts set COMMAND(params) $params } source { # PATH if { $nargs != 1 } { puts stderr "Missing/extra arguments" return 1 } set COMMAND(path) $argv } read { # FORMAT [PARAMS] [TYPES] PATH # if not in a script, lauches graphical interface after reading if { [set fmt [CmdFFormat [lindex $argv 0]]] == "" } { puts stderr "Missing file format" return 1 } foreach "in_ps in_ts tail" \ [CmdParseParamsTypes [lreplace $argv 0 0]] {} if { [set COMMAND(path) [lindex $tail 0]] == "" } { puts stderr "Missing input path" return 1 } if { [CmdFileFmtParamsTypes in $fmt $in_ps $in_ts] == 0 } { return 1 } if { ! $COMMAND(script) } { set COMMAND(command) 0 # make path absolute to avoid problems with cd's set COMMAND(path) [file normalize $COMMAND(path)] } } exec { # PATH if { $nargs != 1 } { puts stderr "Missing/extra arguments" return 1 } set COMMAND(path) $argv } write { # FORMAT [PARAMS] [TYPES] PATH # for use in scripts only if { ! $COMMAND(script) } { puts stderr "Command to be used only in a script" return 1 } if { [set fmt [CmdFFormat [lindex $argv 0]]] == "" } { return 1 } foreach "out_ps out_ts tail" \ [CmdParseParamsTypes [lreplace $argv 0 0]] {} if { [llength $tail] != 1 } { puts stderr "Missing/extra arguments before path" return 1 } if { [set COMMAND(path) $tail] == "" } { puts stderr "Missing output path" return 1 } if { [CmdFileFmtParamsTypes out $fmt $out_ps $out_ts] == 0 } { return 1 } } get { # TYPES # for use in scripts only # for the time being this is only supported for Garmin receivers if { ! $COMMAND(script) } { puts stderr "Command to be used only in a script" return 1 } if { $GPSREC != "Garmin" } { puts stderr "Not a Garmin receiver" return 1 } foreach "in_ts tail" [CmdParseTypes $argv] {} if { $tail != "" } { puts stderr "Extra arguments after types" return 1 } set COMMAND(rectypes) $in_ts } put { # TYPES # for use in scripts only # for the time being this is only supported for Garmin receivers if { ! $COMMAND(script) } { puts stderr "Command to be used only in a script" return 1 } if { $GPSREC != "Garmin" } { puts stderr "Not a Garmin receiver" return 1 } # no -rec option if { $COMMAND(rec) } { puts stderr "Option -rec not allowed with put" return 1 } foreach "out_ts tail" [CmdParseTypes $argv] {} if { $tail != "" } { puts stderr "Extra arguments after types" return 1 } set COMMAND(rectypes) $out_ts } default { puts stderr "Bad command name $cmd; use \"show help\"" return 1 } } set COMMAND(name) $cmd return 0 } proc CmdParseProt {prot} { # translate external form of protocol # return "" on error global RECPROTS GPSREC if { [catch {set p $RECPROTS($GPSREC,$prot)}] } { puts stderr "Bad receiver protocol $prot" return "" } return $p } proc CmdParseTypes {lst} { # find element(s) at the beginning of $lst corresponding to item types: # either a single "all", or a subset of {WP, RT, TR, LN, LAP, GR} # LAP is accepted only if $SUPPORTLAPS is set # GR will be accepted later only if the format is "GPSMan" # (note that $TYPES is not defined yet!) # return pair with list of types and rest of list set pstslst [CmdParseParamsTypes $lst] if { [lindex $pstslst 0] != "" } { return [list "" $lst] } return [lreplace $pstslst 0 0] } proc CmdParseParams {lst} { # find element(s) at the beginning of $lst corresponding to # parameters in the form NAME=VALUE # return pair with list of parameters (with alternating lhs and rhs), # and rest of list set ps "" while { [regexp {^(.+)=(.+)$} [lindex $lst 0] x lhs rhs] } { lappend ps $lhs $rhs set lst [lreplace $lst 0 0] } return [list $ps $lst] } proc CmdParseParamsTypes {lst} { # find element(s) at the beginning of $lst corresponding to # parameters in the form NAME=VALUE, followed by item types: # either a single "all", or a subset of {WP, RT, TR, LAP, LN, GR} # LAP is accepted here only if $SUPPORTLAPS is set # GR will be accepted later only if the format is "GPSMan" # (note that $TYPES is not defined yet!) # return triple with list of parameters (with alternating lhs and rhs), # list of types and rest of list global SUPPORTLAPS set ps "" while { [regexp {^(.+)=(.+)$} [lindex $lst 0] x lhs rhs] } { lappend ps $lhs $rhs set lst [lreplace $lst 0 0] } if { [lindex $lst 0] == "all" } { set ts all ; set lst [lreplace $lst 0 0] } else { set ts "" if { $SUPPORTLAPS } { set ats "WP RT TR LN LAP GR" } else { set ats "WP RT TR LN GR" } while { [lsearch -exact $ats [lindex $lst 0]] != -1 } { lappend ts [lindex $lst 0] ; set lst [lreplace $lst 0 0] } } return [list $ps $ts $lst] } proc CmdParseInteger {val default} { # parse non-negative integer in $val or if it is "" return $default # return -1 on error if { $val == "" } { return $default } if { ! [regexp {^[1-9][0-9]*$} $val] } { return -1 } return $val } proc CmdRecTypes {how lst} { # interpret list of item types to be get/put from/into receiver # $how in {get, put} # $lst may be either "all", or non-empty subset of $TYPES-{LN, GR} # LAP is accepted only if $SUPPORTLAPS is set and $how=="get" # (note that $TYPES is not defined yet!) # return "" on error, otherwise list of types as non-empty subset # of $TYPES-{LN, GR} global SUPPORTLAPS if { $lst == "all" } { if { $SUPPORTLAPS && $how == "get" } { return "WP RT TR LAP" } else { return "WP RT TR" } } else { foreach t $lst { switch -- $t { LN - GR { puts stderr "Cannot get/put LNs or GRs" return "" } LAP { if { ! $SUPPORTLAPS || $how == "put" } { puts stderr "LAP not supported; check the preferences!" return "" } } } } } return $lst } proc CmdFFormat {fmt} { # check that $fmt is a valid name for a file format, as # used in the FILEFORMAT array or all in lowercase # return name as used in FILEFORMAT or "" on error global FILEFORMAT foreach n $FILEFORMAT(names) { if { $fmt == $n || $fmt == [string tolower $n] } { return $n } } puts stderr "Unknown file format name: $fmt" return "" } proc CmdFileFmtParamsTypes {how fmt pars ts args} { # check that $fmt is a valid file format for I/O operation on file # with given parameters (values not checked here) and item types # and, if $args!="", that item types are in $args or default to a # subset of them # $how in {in, out} # $pars is list with each parameter name followed by corresponding value # $ts is either "all", or subset of $TYPES # LAP is only accepted if $SUPPORTLAPS is set # set COMMAND(filetypes), COMMAND(format), COMMAND($how,params) # the latter in the same format as $pars but with all parameters in # the order given by $FILEFORMAT($fmt,$how,params) # return 0 on error global FILEFORMAT COMMAND SUPPORTLAPS # compatibility with older versions if { [regexp {^Shapefile_([23])D$} $fmt x dim] } { set fmt Shapefile lappend pars dim $dim } # check mode and dependencies if { [catch {set mode $FILEFORMAT($fmt,mode)}] || \ ! [regexp $how $mode] || \ ! ( [catch {set depok $FILEFORMAT($fmt,depends)}] || \ [eval $depok] ) } { puts stderr "Bad/unvailable format: $fmt" return 0 } # check parameter names (values only checked before execution) # set default values for missing parameters, return error if # there is no default for a missing parameter if { ! [catch {set pnames $FILEFORMAT($fmt,$how,params)}] } { if { [catch {set pds $FILEFORMAT($fmt,$how,pdefts)}] } { set pds "" } set ps "" foreach n $pnames dv $pds { if { [set ix [lsearch -exact $pars $n]] == -1 || \ $ix & 1 != 0 } { if { $dv == "ERROR" } { puts stderr "Missing value for $n" return 0 } if { [regexp {^global:(.+)$} $dv m dvv] } { global $dvv set dv [set $dvv] } lappend ps $n $dv } else { lappend ps $n [lindex $pars [expr $ix+1]] set pars [lreplace $pars $ix [expr $ix+1]] } } if { $pars != "" } { puts stderr "Unknown parameters: $pars" return 0 } set pars $ps } elseif { $pars != "" } { puts stderr "No parameters allowed for this format" return 0 } # check types if { [catch {set fts $FILEFORMAT($fmt,types)}] } { if { $how == "in" } { set e 0 } else { set e 1 } set fts [lindex $FILEFORMAT($fmt,io_types) $e] } switch $FILEFORMAT($fmt,filetype) { unique { if { $ts != "" && $ts != "all" && $ts != $fts } { puts stderr "Bad type(s) $ts; should be $fts" return 0 } } single { if { $ts == "all" || [llength $ts] != 1 || \ [lsearch -exact $fts $ts] == -1 } { puts stderr "Bad type(s) $ts; should be one of $fts" return 0 } set fts $ts } data { if { $ts != "" && $ts != "all" } { set fs "" foreach f $ts { if { [lsearch -exact $fts $f] == -1 } { puts stderr "Bad type(s) $ts; cannot contain $f" return 0 } lappend fs $f } set fts $fs } } } if { [set ix [lsearch -exact $fts LAP]] != -1 && ! $SUPPORTLAPS } { set fts [lreplace $fts $ix $ix] } if { $args != "" } { foreach t $fts { if { [lsearch $args $t] == -1 } { puts stderr "Bad type $t; should be one of $args" return 0 } } } set COMMAND(format) $fmt set COMMAND($how,params) $pars set COMMAND(filetypes) $fts return 1 } proc CmdIncompatibleTypes {in_ts out_ts} { # check compatibility of input and output types # the only possible "conversion" is from RT to WP, and GR to anything # return 1 on error if { $in_ts == $out_ts || [lsearch $in_ts GR] != -1 } { return 0 } foreach o $out_ts { if { [lsearch $in_ts $o] == -1 && \ ( $o != "WP" || [lsearch $in_ts RT] == -1 ) } { puts stderr "Output type $o incompatible with input type(s) $in_ts" return 1 } } return 0 } proc CmdBadTranslateHowParams {pps infmt outfmt} { # check the transformation parameters of the translate command that may # impose constraints on the input- and output-formats # HOW-PARAMS can be # itoffset=DHOUR: time offset to use in input file in GPSMan format, # defaults to time offset given in file # otoffset=DHOUR: time offset to use in output file in GPSMan format # defaults to time offset selected in the options # return 0 on error or list with transformation parameters if any set tprs "" foreach "lhs rhs" $pps { switch -- $lhs { itoffset - otoffset { if { [catch {set bad [expr abs($rhs) > 14]}] } { puts stderr "Bad time offset in: $lhs=$rhs" return 0 } if { $infmt != "GPSMan" || $outfmt != "GPSMan" } { puts stderr "Time offset changes only in GPSMan files" return 0 } } } lappend tprs $lhs $rhs } return $tprs } proc CmdBadGeoPictsParams {pps outps} { # check the processing- and output-parameters of the geopict command # the output-parameters may contain paramaters needed by the output format # PROC-PARAMS: [id=ID] [date=DMODE] [dh=DHOUR] # ID: identifier of item in data file, default is last read in # DMODE: pict|exif|fmod date from picture EXIF (default), EXIF # file, or file last modified time # DHOUR: difference in hours to apply to file dates to get TR dates # OUT-PARAMS: apart from those needed by $fmt # [datum=DATUM] [sy=SYMBOL] [prefix=STRING] # STRING: defaults to "P" # return "error" or pair with list of format parameters and # list with all other parameters global COMMAND set ops "" foreach "lhs rhs" $pps { switch -- $lhs { id { if { $rhs == "" } { puts stderr "Empty item identifier" return error } } date { if { [lsearch -exact {exif fmod pict} $rhs] == -1 } { puts stderr "Bad mode for date; must be fmod, exif or pict" return error } } dh { if { ! [regexp {^-?[1-9][0-9]?$} $rhs] || abs($rhs) > 23 } { puts stderr "Bad hour difference; must be integer -23..23" return error } if { $COMMAND(intypes) != "TR" } { puts stderr "Hour difference only meaningful with a track" } } default { puts stderr "Unknown parameter $lhs" return error } } lappend ops $lhs $rhs } set fps "" foreach "lhs rhs" $outps { # all unrecognised parameters are left as format paramters switch -- $lhs { datum - sy - prefix { # only possible check at this stage if { $rhs == "" } { puts stderr "Empty argument to $lhs" return error } } default { lappend fps $lhs $rhs continue } } lappend ops $lhs $rhs } return [list $fps $ops] } gpsman-6.4.4.2/gmsrc/wrtdials.tcl0000644000175000017500000045574112224351120014744 0ustar migmig# # This file is part of: # # gpsman --- GPS Manager: a manager for GPS receiver data # # Copyright (c) 1998-2013 Miguel Filgueiras migfilg@t-online.de # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. # # File: wrtdials.tcl # Last change: 6 October 2013 # # Includes contributions by # - Brian Baulch (baulchb _AT_ onthenet.com.au) marked "BSB contribution" # - Alessandro Palmas (alpalmas _AT_ tin.it) marked "AP contribution" # - Stefan Heinen (stefan.heinen _AT_ djh-freeweb.de) marked "SH contribution" # - Martin Buck (m _AT_ rtin-buck.de) marked "MB contribution" # - Jean H Theoret (ve2za _AT_ rac.ca) marked "JHT contribution" # - Benoit Steiner (benetsteph _AT_ free.fr) marked "BS contribution" # - Rudolf Martin (rudolf.martin _AT_ gmx.de) marked "RM contribution" # # BSB contribution: WPNum field accomodated proc GMWPoint {index options data} { # create dialog window for editing/showing data of WP with given index # $index is -1 if this is a new WP # $options is a list of buttons to display; # an empty list means no editing; supported options are: # cancel, create, change, revert, forget # change and forget assume $index != -1 # see proc GMButton for further details # if $options is empty, $index cannot be -1 as this is not a new WP # the only button is OK, and only binding: return to destroy # order of elements in $data list reflects order in $Storage(WP) # which is used below # return window path global GMEd MapLoading COLOUR DPOSX DPOSY NAMEWIDTH COMMENTWIDTH \ CREATIONDATE OBSWIDTH OBSHEIGHT TXT ICONWIDTH ICONHEIGHT \ MAXMENUITEMS DISPOPTS ChangedPosn UNIX ALUNIT foreach "name num commt obs pformt posn datum date symbol dispopt \ alt mbak hidden displ" $data {} if { $options != "" } { if { [winfo exists .gmWP] } { Raise .gmWP ; bell ; return .gmWP } set ed 1 ; set st normal set w .gmWP set GMEd(WP,Index) $index ; set GMEd(WP,Num) $num set GMEd(WP,Datum) $datum ; set GMEd(WP,Displ) $displ set GMEd(WP,Symbol) $symbol ; set GMEd(WP,DispOpt) $dispopt set GMEd(WP,Alt) $alt ; set GMEd(WP,MBack) $mbak set GMEd(WP,Hidden) $hidden # this will be set to 1 if the user edits the position entries # and will contain current position (possibly "") otherwise; # use of this variable assumes a single .gmWP window at a time! set ChangedPosn $posn # this depends on Storage(WP) set GMEd(WP,Data) $data set GMEd(WP,MapChg) 0 set x $DPOSX ; set y $DPOSY } else { set ed 0 ; set st disabled set w .gmWPsh$index if { [winfo exists $w] } { destroy $w } incr GMEd(WP,Show) set x [expr $DPOSX+45*(1+$GMEd(WP,Show) % 5)] set y [expr $DPOSY+45*(1+$GMEd(WP,Show) % 5)] } GMToplevel $w waypoint +$x+$y {} {} {} if { ! $UNIX } { # SH contribution focus $w } if { ! $ed } { wm protocol $w WM_DELETE_WINDOW "destroy $w" bind $w "destroy $w" } else { wm protocol $w WM_DELETE_WINDOW { GMButton WP cancel } } frame $w.fr -relief flat -borderwidth 5 -bg $COLOUR(dialbg) frame $w.fr.fr1 -relief flat -borderwidth 0 label $w.fr.fr1.ntitle -text "$TXT(name):" entry $w.fr.fr1.id -width $NAMEWIDTH -exportselection 1 ShowTEdit $w.fr.fr1.id $name $ed label $w.fr.fr1.dtitle -text "$TXT(created):" entry $w.fr.fr1.date -width 18 -exportselection 1 ShowTEdit $w.fr.fr1.date $date $ed if { $ed } { ShowPosnDatum $w.fr $pformt [list $posn] GMWPChangeDatum GMEd \ GMEd(WP,Datum) $st $ed ChangedPosn } else { ShowPosnDatum $w.fr $pformt [list $posn] "" "" $datum $st 0 nil } frame $w.fr.fr11 -relief flat -borderwidth 0 label $w.fr.fr11.atit -text "$TXT(alt) ($ALUNIT):" entry $w.fr.fr11.alt -width 7 -exportselection 1 set valt [UserAltitude $alt] ShowTEdit $w.fr.fr11.alt $valt $ed frame $w.fr.fr2 -relief flat -borderwidth 0 label $w.fr.fr2.ctitle -text "$TXT(cmmt):" entry $w.fr.fr2.commt -width $COMMENTWIDTH -exportselection 1 ShowTEdit $w.fr.fr2.commt $commt $ed if { $hidden != "" } { button $w.fr.fr2.hidd -text $TXT(hiddendata) \ -command "$w.fr.fr2.hidd configure -state normal ; \ ShowHiddenData WP {$hidden}" } frame $w.fr.fr3 -relief flat -borderwidth 0 label $w.fr.fr3.obstit -text "$TXT(rmrk):" text $w.fr.fr3.obs -wrap word -width $OBSWIDTH -height $OBSHEIGHT \ -exportselection true $w.fr.fr3.obs insert 0.0 $obs $w.fr.fr3.obs configure -state $st TextBindings $w.fr.fr3.obs frame $w.fr.fr4 -relief flat -borderwidth 0 menubutton $w.fr.fr4.symb -text $TXT(symbol) -relief raised \ -direction below -menu $w.fr.fr4.symb.m -state $st set mw $w.fr.fr4.symb.m menu $mw -tearoff 0 FillSymbolsMenu $mw ChangeWPSymbol canvas $w.fr.fr4.symbim -width $ICONWIDTH -height [expr $ICONHEIGHT+2] foreach "syim sytxt" [SymbolImageName $symbol] {} $w.fr.fr4.symbim create image 1 5 -anchor nw -image $syim label $w.fr.fr4.symbname -text $sytxt menubutton $w.fr.fr4.dispopt -text $TXT(dispopt): -relief raised \ -direction below -menu $w.fr.fr4.dispopt.m -state $st set mw $w.fr.fr4.dispopt.m menu $mw -tearoff 0 foreach opt $DISPOPTS { $mw add command -label $TXT(DISP$opt) -command "ChangeWPDispOpt $opt" } label $w.fr.fr4.dispo -text $TXT(DISP$dispopt) -width 15 frame $w.fr.fr5 CreateMBackWidgets WP $w.fr.fr5 $mbak $ed # frame used for plug-ins (see array PLGSWelcomed, plugins.tcl) frame $w.fr.fr6 button $w.fr.fr6.route -text $TXT(nameRT) \ -command "ShowRTForWP $index" menubutton $w.fr.fr6.comp -text $TXT(comp) -relief raised \ -direction below -menu $w.fr.fr6.comp.m menu $w.fr.fr6.comp.m -tearoff 0 menu $w.fr.fr6.comp.m.mothers -tearoff 0 $w.fr.fr6.comp.m add command -label $TXT(distazim) \ -command "ChItemsCall WP single GMCompDistBearWP $w $ed" $w.fr.fr6.comp.m add command -label $TXT(nearestWPs) \ -command "GMWPNearest $w $ed" button $w.fr.fr6.newat -text $TXT(newWPatdb) \ -command "CreateWPAtDistBear $index" frame $w.fr.frsel -relief flat -borderwidth 0 -background $COLOUR(selbg) frame $w.fr.frdw if { $ed } { checkbutton $w.fr.frdw.displayed -text $TXT(displ) \ -variable GMEd(WP,Displ) -onvalue 1 -offvalue 0 \ -selectcolor $COLOUR(check) if { $MapLoading != 0 } { $w.fr.frdw.displayed configure -state disabled } set c -1 set b $w.fr.frsel.b foreach e $options { button $b$e -text $TXT($e) \ -command "$b$e configure -state normal ; GMButton WP $e" grid $b$e -row 0 -column [incr c] -padx 3 } } else { checkbutton $w.fr.frdw.displayed -text $TXT(displ) \ -selectcolor $COLOUR(check) -state disabled if { $displ } { $w.fr.frdw.displayed select } button $w.fr.frsel.b -text $TXT(ok) -command "destroy $w" pack $w.fr.frsel.b } pack $w.fr -side top grid $w.fr.fr1.ntitle -row 0 -column 0 -sticky nesw grid $w.fr.fr1.id -row 0 -column 1 -sticky nesw if { $CREATIONDATE } { grid $w.fr.fr1.dtitle -row 1 -column 0 -sticky nesw grid $w.fr.fr1.date -row 1 -column 1 -sticky nesw } grid $w.fr.fr11.atit -row 0 -column 0 -sticky nesw grid $w.fr.fr11.alt -row 0 -column 1 -sticky nesw set r 0 if { $hidden != "" } { grid $w.fr.fr2.hidd -row 0 -column 0 -sticky nesw incr r } grid $w.fr.fr2.ctitle -row $r -column 0 -sticky nesw grid $w.fr.fr2.commt -row $r -column 1 -sticky nesw grid $w.fr.fr3.obstit -row 0 -column 0 -sticky nesw grid $w.fr.fr3.obs -row 0 -column 1 -sticky nesw set c -1 foreach x "symb symbim symbname dispopt dispo" { grid $w.fr.fr4.$x -row 0 -column [incr c] -sticky nesw -padx 3 } set c -1 foreach x "route comp newat" { grid $w.fr.fr6.$x -row 0 -column [incr c] -sticky nesw -padx 10 } pack $w.fr.frdw.displayed set r -1 set d 2 foreach x "fr1 frp frd fr11 fr2 fr3 fr4 fr5 fr6 frdw frsel" \ y "$d $d 0 0 $d 0 $d $d $d $d $d" { if { $y == 0 } { grid $w.fr.$x -row [incr r] -column 0 -sticky nesw } else { grid $w.fr.$x -row [incr r] -column 0 -sticky nesw -pady $y } } AttachPlugIns $w update idletasks return $w } # BSB contribution: indices in GMEd(WP,Data) affected by new WPNum field proc RevertWP {} { # reset data in WP edit window to initial values # this depends on Storage(WP) global GMEd INVTXT ChangedPosn POSTYPE set data $GMEd(WP,Data) .gmWP.fr.fr1.id delete 0 end .gmWP.fr.fr1.id insert 0 [lindex $data 0] .gmWP.fr.fr2.commt delete 0 end .gmWP.fr.fr2.commt insert 0 [lindex $data 2] .gmWP.fr.fr3.obs delete 1.0 end .gmWP.fr.fr3.obs insert 1.0 [lindex $data 3] set pft $POSTYPE($INVTXT([.gmWP.fr.frp.pfmt cget -text])) set opf [lindex $data 4] ; set t $POSTYPE($opf) set p [lindex $data 5] if { $pft == $t } { RevertPos .gmWP.fr.frp.frp1 $opf $t $p } else { RedrawPos .gmWP.fr.frp.frp1 $opf $p ChangedPosn normal } set ChangedPosn $p set GMEd(WP,Datum) [lindex $data 6] .gmWP.fr.fr1.date delete 0 end .gmWP.fr.fr1.date insert 0 [lindex $data 7] ChangeWPSymbol [lindex $data 8] ChangeWPDispOpt [lindex $data 9] .gmWP.fr.fr11.alt delete 0 end .gmWP.fr.fr11.alt insert 0 [UserAltitude [lindex $data 10]] set GMEd(WP,MBack) [lindex $data 11] # hidden: lindex $data 12 set GMEd(WP,Displ) [lindex $data end] if { $GMEd(WP,Displ) } { .gmWP.fr.frdw.displayed select } else { .gmWP.fr.frdw.displayed deselect } return } proc GMWPCheck {} { # check validity of data in WP edit window # this depends on Storage(WP) global GMEd INVTXT KEEPHIDDEN MESS # BSB contribution: WPNum set r [CheckEntries GMMessage nil "{.gmWP.fr.fr1.id CheckName} \ {.gmWP.fr.fr2.commt CheckComment} {.gmWP.fr.fr1.date CheckDate}"] if { $r == "nil" } { return nil } set p [PosnGetCheck .gmWP.fr.frp.frp1 $GMEd(WP,Datum) GMMessage \ ChangedPosn] if { $p == "nil" } { return nil } set valt [string trim [.gmWP.fr.fr11.alt get]] if { [set alt [AltitudeList $valt]] == "nil" } { GMMessage $MESS(badalt) return nil } if { $GMEd(WP,Hidden) != "" } { switch $KEEPHIDDEN { never { set GMEd(WP,Hidden) "" } always { } ask { if { [GMConfirm $MESS(nohidden)] } { set GMEd(WP,Hidden) "" } } } } lappend r $GMEd(WP,Symbol) $GMEd(WP,DispOpt) $alt $GMEd(WP,MBack) \ $GMEd(WP,Hidden) $GMEd(WP,Displ) set nb [CheckNB [.gmWP.fr.fr3.obs get 0.0 end]] set GMEd(WP,MapChg) 1 set r [linsert $r 2 $nb $INVTXT([.gmWP.fr.frp.pfmt cget -text]) \ $p $GMEd(WP,Datum)] # BSB contribution return [linsert $r 1 $GMEd(WP,Num)] } proc ShowRTForWP {ix} { # let user select and open RT having WP of given index global WPRoute TXT LISTWIDTH if { $ix == -1 } { return } set rtname [GMChooseFrom single [list $TXT(select) $TXT(nameRT)] \ $LISTWIDTH $WPRoute($ix) $WPRoute($ix)] if { $rtname == "" } { return } if { [set ix [IndexNamed RT $rtname]] != -1 } { OpenItem RT $ix } else { bell } return } proc GMWPChangeDatum {datum args} { # change datum of WP being edited # $args is not used but is needed as this is called-back from a menu ChangeDatum $datum GMEd GMEd(WP,Datum) ChangedPosn .gmWP.fr.frp normal return } proc ChangeWPSymbol {symbol args} { # change symbol of WP being edited # $args not used, but called back like this global GMEd set GMEd(WP,Symbol) $symbol foreach "syim sytxt" [SymbolImageName $symbol] {} set w .gmWP $w.fr.fr4.symbim delete all $w.fr.fr4.symbim create image 1 5 -anchor nw -image $syim $w.fr.fr4.symbname configure -text $sytxt return } proc ChangeWPDispOpt {opt} { # change display option of WP being edited global GMEd TXT set GMEd(WP,DispOpt) $opt .gmWP.fr.fr4.dispo configure -text $TXT(DISP$opt) return } proc GMCompDistBearWP {window editing wp2} { # create dialog to show distance and bearing from WP of a edit/show # window to another WP with name $wp2 global GMEd WPPosn WPDatum DPOSX DPOSY COLOUR MESS TXT DSCALE DTUNIT \ FixedFont set w ${window}.topcdb if { [winfo exists $w] } { Raise $w ; bell ; return } set wp1 [$window.fr.fr1.id get] if { $editing } { set p1 [PosnGetCheck $window.fr.frp.frp1 $GMEd(WP,Datum) GMMessage \ ChangedPosn] if { $p1 == "nil" } { return } set d1 $GMEd(WP,Datum) if { $wp1 == "" } { set wp1 "(???)" } } else { set ix1 [IndexNamed WP $wp1] set p1 $WPPosn($ix1) ; set d1 $WPDatum($ix1) } set ix2 [IndexNamed WP $wp2] set p2 $WPPosn($ix2) ; set d2 $WPDatum($ix2) set db [CompDistBearDatums $p1 $d1 $p2 $d2] set dist [format "%8.2f" [expr [lindex $db 0]*$DSCALE]] set bear [format "%5d" [lindex $db 1]] GMToplevel $w distazim +[expr $DPOSX+100]+[expr $DPOSY+100] {} \ [list WM_DELETE_WINDOW "destroy $w"] {} frame $w.fr -relief flat -borderwidth 5 -bg $COLOUR(dialbg) label $w.fr.fromto -text [format $TXT(fromto) $wp1 $wp2] frame $w.fr.fr1 -relief flat -borderwidth 0 label $w.fr.fr1.dist -text "$dist $DTUNIT" -width 15 -font $FixedFont \ -anchor w label $w.fr.fr1.bear -text "$bear $TXT(degrees)" -width 15 \ -font $FixedFont -anchor w frame $w.fr.frsel -relief flat -borderwidth 0 button $w.fr.frsel.save -text "$TXT(save) ..." \ -command "SaveFile comp WPDistBear $w ; \ $w.fr.frsel.save configure -state normal" button $w.fr.frsel.ok -text $TXT(ok) -command "destroy $w" pack $w.fr -side top pack $w.fr.fr1.dist $w.fr.fr1.bear -side top -pady 2 pack $w.fr.frsel.save $w.fr.frsel.ok -side left -padx 5 pack $w.fr.fromto $w.fr.fr1 $w.fr.frsel -side top return } proc GMWPNearest {window editing} { # create dialog to show nearest WPs to WP of given edit/show window # actually compute distances and bearings to all other WPs and sort # by increasing distance global GMEd WPName WPPosn WPDatum DPOSX DPOSY COLOUR MESS TXT LsW \ DSCALE FixedFont set w ${window}.topcn if { [winfo exists $w] } { Raise $w ; bell ; return } set wp1 [$window.fr.fr1.id get] if { $editing } { set p1 [PosnGetCheck $window.fr.frp.frp1 $GMEd(WP,Datum) GMMessage \ ChangedPosn] if { $p1 == "nil" } { return } set d1 $GMEd(WP,Datum) ; set ix1 -1 if { $wp1 == "" } { set wp1 "(???)" } } else { set ix1 [IndexNamed WP $wp1] set p1 $WPPosn($ix1) ; set d1 $WPDatum($ix1) } GMToplevel $w distazim +[expr $DPOSX+100]+[expr $DPOSY+100] {} \ [list WM_DELETE_WINDOW "destroy $w"] {} frame $w.fr -relief flat -borderwidth 5 -bg $COLOUR(dialbg) label $w.fr.from -text [format $TXT(fromto) $wp1 ""] frame $w.fr.fr1 -relief flat -borderwidth 0 frame $w.fr.fr1.frtits -relief flat -borderwidth 0 label $w.fr.fr1.frtits.fill -width 2 -font $FixedFont frame $w.fr.fr1.frbx -relief flat -borderwidth 0 set h [$LsW.frlWP.frl.box size] if { $h > 15 } { set h 15 } foreach b "xn xd xb" m "8 8 4" t $TXT(WPnearflds) { label $w.fr.fr1.frtits.tit$b -width $m -text $t -font $FixedFont listbox $w.fr.fr1.frbx.b$b -height $h -width $m -relief flat \ -yscrollcommand "$w.fr.fr1.frbx.bscr set" \ -selectmode single -exportselection false -font $FixedFont bind $w.fr.fr1.frbx.b$b { set n [[winfo parent %W].bxn get [%W nearest %y]] if { $n != "" } { OpenItem WP [IndexNamed WP $n] } } bind $w.fr.fr1.frbx.b$b { set n [[winfo parent %W].bxn get [%W nearest %y]] if { $n != "" } { ToggleDisplayNamed WP $n } } bind $w.fr.fr1.frbx.b$b { MultSelect [winfo parent %W] [%W nearest %y] {bxn bxd bxb} } } # BSB contribution: wheelmouse scrolling set boxes [list $w.fr.fr1.frbx.bxn $w.fr.fr1.frbx.bxd $w.fr.fr1.frbx.bxb] scrollbar $w.fr.fr1.frbx.bscr -command [list ScrollMany $boxes] Mscroll $boxes set wpixs [array names WPName] if { [lindex $wpixs 100] != "" } { set slow 1 set slowid [SlowOpWindow $TXT(comp)] } else { set slow 0 SetCursor . watch } SetDatumData $d1 set i 0 foreach ix2 $wpixs { if { $wp1 != $WPName($ix2) } { if { $slow && [SlowOpAborted] } { destroy $w SlowOpFinish $slowid "" return } set p2 $WPPosn($ix2) ; set d2 $WPDatum($ix2) if { $d1 != $d2 } { set p2 [ToDatum [lindex $p2 0] [lindex $p2 1] $d2 $d1] } set db [ComputeDistBearFD $p1 $p2] set d [expr [lindex $db 0]*$DSCALE] set dist [format "%8.2f" $d] set bear [format "%4d" [lindex $db 1]] if { $i } { set i0 0 ; set in $i while { 1 } { set z [expr int(($in-$i0)/2)+$i0] if { [set m [$w.fr.fr1.frbx.bxd get $z]] > $d } { if { $z==0 || \ [$w.fr.fr1.frbx.bxd get [expr $z-1]] <= $d } { break } set in $z } elseif { $m < $d } { if { $z==[expr $in-1] } { set z end break } set i0 $z } else { break } } } else { set z 0 } $w.fr.fr1.frbx.bxn insert $z $WPName($ix2) $w.fr.fr1.frbx.bxd insert $z $dist $w.fr.fr1.frbx.bxb insert $z $bear incr i } } if { $slow } { SlowOpFinish $slowid "" } else { ResetCursor . } frame $w.fr.frsel -relief flat -borderwidth 0 button $w.fr.frsel.save -text "$TXT(save) ..." \ -command "SaveFile comp WPNearest $w ; \ $w.fr.frsel.save configure -state normal" button $w.fr.frsel.ok -text $TXT(ok) -command "destroy $w" pack $w.fr -side top pack $w.fr.fr1.frtits.titxn $w.fr.fr1.frtits.titxd \ $w.fr.fr1.frtits.titxb $w.fr.fr1.frtits.fill -side left -fill y pack $w.fr.fr1.frbx.bxn $w.fr.fr1.frbx.bxd $w.fr.fr1.frbx.bxb \ $w.fr.fr1.frbx.bscr -side left -fill y pack $w.fr.frsel.save $w.fr.frsel.ok -side left -padx 5 pack $w.fr.fr1.frtits $w.fr.fr1.frbx -side top -fill y -pady 1 pack $w.fr.from $w.fr.fr1 $w.fr.frsel -side top -pady 3 return } proc GMRoute {index options data} { # create dialog window for editing/showing data of RT with given index # including computed distances and bearings # $index is -1 if this is a new RT # $options is a list of buttons to display; # an empty list means no editing; supported options are: # cancel, create, change, revert, forget # change and forget assume $index != -1 # see proc GMButton for further details # if $options is empty, $index cannot be -1 as this is not a new RT # the only button is OK, and only binding: return to destroy # an editing window created when $MapMakingRT is true will have some # of its buttons disabled # order of elements in $data list reflects order in $Storage(RT) # which is used below # return window path global GMEd DPOSX DPOSY DPOSRTMAP COLOUR LISTHEIGHT NAMEWIDTH \ COMMENTWIDTH OBSWIDTH OBSHEIGHT TXT DTUNIT MapMakingRT MapLoading \ Map MapWidth UNIX FixedFont foreach "number commt obs wps stages width colour mbak displ" $data {} if { $options != "" } { if { [winfo exists .gmRT] } { Raise .gmRT ; bell ; return .gmRT } set ed 1 ; set st normal ; set stmm normal if { $MapMakingRT } { set stmm disabled set x [expr [winfo rootx $Map]+$MapWidth+$DPOSRTMAP] } else { set x $DPOSX } set y $DPOSY set w .gmRT set GMEd(RT,Index) $index ; set GMEd(RT,Width) $width set GMEd(RT,Colour) $colour ; set GMEd(RT,MBack) $mbak set GMEd(RT,WPoints) $wps ; set GMEd(RT,Displ) $displ set GMEd(RT,MapChg) 0 # this depends on Storage(RT) set GMEd(RT,Data) $data # GMEd(RT,windows) is a list of windows that should be closed # when the route is changed such as the plot windows created by # procs Hgraph and HG3D (elevation.tcl) # It should be accessed by calling proc ManageAuxWindows set GMEd(RT,windows) {} } else { set ed 0 ; set st disabled ; set stmm disabled set w .gmRTsh$index if { [winfo exists $w] } { destroy $w } incr GMEd(RT,Show) set x [expr $DPOSX+50*(1+$GMEd(RT,Show) % 5)] set y [expr $DPOSY+50*(1+$GMEd(RT,Show) % 5)] } GMToplevel $w route +$x+$y {} {} {} if { ! $UNIX } { # SH contribution if {$MapMakingRT} {lower $w $Map} {focus $w} } if { ! $ed } { wm protocol $w WM_DELETE_WINDOW "destroy $w" bind $w "destroy $w" } else { wm protocol $w WM_DELETE_WINDOW { GMButton RT cancel } } frame $w.fr -relief flat -borderwidth 5 -bg $COLOUR(dialbg) frame $w.fr.fr1 -relief flat -borderwidth 0 label $w.fr.fr1.ntitle -text "$TXT(numberid):" entry $w.fr.fr1.id -width 10 -exportselection 1 ShowTEdit $w.fr.fr1.id $number $ed frame $w.fr.fr2 -relief flat -borderwidth 0 label $w.fr.fr2.ctitle -text "$TXT(cmmt):" entry $w.fr.fr2.commt -width $COMMENTWIDTH -exportselection 1 ShowTEdit $w.fr.fr2.commt $commt $ed frame $w.fr.fr21 -relief flat -borderwidth 0 label $w.fr.fr21.obstit -text "$TXT(rmrk):" text $w.fr.fr21.obs -wrap word -width $OBSWIDTH -height $OBSHEIGHT \ -exportselection true $w.fr.fr21.obs insert 0.0 $obs $w.fr.fr21.obs configure -state $st TextBindings $w.fr.fr21.obs frame $w.fr.fr3 -relief flat -borderwidth 0 frame $w.fr.fr3.fr31 -relief flat -borderwidth 0 set frb $w.fr.fr3.fr31 frame $frb.frtits -relief flat -borderwidth 0 label $frb.frtits.fill -width 2 -font $FixedFont frame $frb.frbx -relief flat -borderwidth 0 set boxes "" foreach b "xn ox xd xb xda xsc xsl" \ m "4 $NAMEWIDTH 8 4 9 $COMMENTWIDTH $NAMEWIDTH" \ t $TXT(RTcompflds) { lappend boxes $frb.frbx.b$b label $frb.frtits.tit$b -width $m -text $t -font $FixedFont listbox $frb.frbx.b$b -height 15 -width $m -relief flat \ -yscrollcommand "$frb.frbx.bscr set" \ -selectmode extended -exportselection false -font $FixedFont bind $frb.frbx.b$b <> \ "MultExtSelect $frb.frbx.b$b {bxn box bxd bxb bxda bxsc bxsl}" bind $frb.frbx.b$b { set n [[winfo parent %W].box get [%W nearest %y]] if { $n != "" } { ToggleDisplayNamed WP $n } } } foreach b "xn ox xd xb xda" { bind $frb.frbx.b$b { set n [[winfo parent %W].box get [%W nearest %y]] if { $n != "" } { OpenItem WP [IndexNamed WP $n] } } } foreach b "xsc xsl" { bind $frb.frbx.b$b { set p [winfo parent %W] if { [set i [%W nearest %y]] < [$p.box size]-1 && \ [$p.box get $i] != "" } { GMRTStage $p $i } } } # $boxes defined in the foreach loop that creates them if { $ed } { set GMEd(RT,boxes) $boxes } # BSB contribution: wheelmouse scrolling scrollbar $frb.frbx.bscr -command [list ScrollMany $boxes] Mscroll $boxes set i 1 ; set n [llength $wps] set td 0 ; set tddef 1 foreach wp $wps nxt [lreplace $wps 0 0] stg $stages { $frb.frbx.bxn insert end [format "%3d." $i] incr i $frb.frbx.box insert end $wp set d [GMRTDistBearDAltWP $frb.frbx end 0 $wp $nxt] if { $d != "---" } { set td [expr $td+$d] } else { set tddef 0 } # $stg may be "" $frb.frbx.bxsc insert end [lindex $stg 0] $frb.frbx.bxsl insert end [lindex $stg 1] } frame $frb.frt -relief flat -borderwidth 0 if { $tddef } { set td [format "%8.2f" $td] } else { set td "---" } label $frb.frt.tit -text [format $TXT(totdst) $DTUNIT] label $frb.frt.tt -text $td frame $w.fr.fr3.frbt -relief flat -borderwidth 0 label $w.fr.fr3.frbt.title -text $TXT(nameWP) foreach a "insb insa repl" { button $w.fr.fr3.frbt.$a -text $TXT($a) -state $stmm \ -command "ChItemsCall WP single GMRTChange $a" } button $w.fr.fr3.frbt.del -text $TXT(del) -state $stmm \ -command { GMRTChange del } frame $w.fr.fr3.frbt.sep -height 6 -bg $COLOUR(dialbg) \ -relief flat -borderwidth 0 menubutton $w.fr.fr3.frbt.chg -text $TXT(change) -relief raised \ -direction right -menu $w.fr.fr3.frbt.chg.m -state $stmm menu $w.fr.fr3.frbt.chg.m -tearoff 0 $w.fr.fr3.frbt.chg.m add command -label $TXT(invert) \ -command { GMRTChange inv } $w.fr.fr3.frbt.chg.m add command -label $TXT(chophd) \ -command { GMRTChange chh } $w.fr.fr3.frbt.chg.m add command -label $TXT(choptl) \ -command { GMRTChange cht } foreach a "incb inca" { $w.fr.fr3.frbt.chg.m add command -label $TXT($a) \ -command "ChItemsCall RT single GMRTChange $a" } $w.fr.fr3.frbt.chg.m add command -label $TXT(clear) \ -command { GMRTChange clear } button $w.fr.fr3.frbt.edmap -text $TXT(edmap) -state $stmm \ -command "$w.fr.fr3.frbt.edmap configure -state normal ; \ MapEditRT" menubutton $w.fr.fr3.frbt.cnv -text $TXT(convert) -relief raised \ -direction right -menu $w.fr.fr3.frbt.cnv.m menu $w.fr.fr3.frbt.cnv.m -tearoff 0 $w.fr.fr3.frbt.cnv.m add command -label $TXT(mkTR) -command "RTToTR $w" $w.fr.fr3.frbt.cnv.m add command -label $TXT(split) \ -command "SplitPolyLine RT sel $w $ed $index" menubutton $w.fr.fr3.frbt.comp -text $TXT(computations) -relief raised \ -direction right -menu $w.fr.fr3.frbt.comp.m menu $w.fr.fr3.frbt.comp.m -tearoff 0 $w.fr.fr3.frbt.comp.m add command -label "$TXT(savecomp) ..." \ -command "SaveFile comp RTComp $w" $w.fr.fr3.frbt.comp.m add command -label "$TXT(comparea) ..." \ -command "ComputeArea $w" frame $w.fr.frsel -relief flat -borderwidth 0 # frame used for plug-ins (see array PLGSWelcomed, plugins.tcl) frame $w.fr.frdw set mn $w.fr.frdw.mw.m menubutton $w.fr.frdw.mw -text $TXT(width) -relief raised \ -direction below -menu $mn -state $st menu $mn -tearoff 0 button $w.fr.frdw.b -text $TXT(Colour) -relief raised \ -command "ChooseColour GMEd GMEd(RT,Colour) $w.fr.frdw $w" \ -state $st label $w.fr.frdw.bc -relief groove -background $colour -width 2 frame $w.fr.frmb CreateMBackWidgets RT $w.fr.frmb $mbak $ed if { $ed } { checkbutton $w.fr.frdw.displayed -text $TXT(displ) \ -variable GMEd(RT,Displ) -onvalue 1 -offvalue 0 \ -selectcolor $COLOUR(check) foreach i "1 2 3 4 5 6 7 8" { $mn add command -label $i -command "set GMEd(RT,Width) $i" } label $w.fr.frdw.wv -width 3 -textvariable GMEd(RT,Width) if { $MapLoading != 0 } { foreach i "displayed mw" { $w.fr.frdw.$i configure -state disabled } } set b $w.fr.frsel.b foreach e $options { button $b$e -text $TXT($e) \ -command "$b$e configure -state normal ; GMButton RT $e" pack $b$e -side left } } else { checkbutton $w.fr.frdw.displayed -text $TXT(displ) -state disabled \ -selectcolor $COLOUR(check) if { $displ } { $w.fr.frdw.displayed select } label $w.fr.frdw.wv -width 3 -text $width button $w.fr.frsel.b -text $TXT(ok) -command "destroy $w" pack $w.fr.frsel.b } # AP contribution ; changed by MF set mn $w.fr.fr3.frbt.hgraph.m menubutton $w.fr.fr3.frbt.hgraph -text $TXT(elevation) -relief raised \ -menu $mn menu $mn -tearoff 0 if { $ed } { $mn add command -label $TXT(sideview) \ -command "ManageAuxWindows RT add \[GMRTHgraph $w\]" $mn add command -label $TXT(persptv) \ -command "ManageAuxWindows RT add \[RTHG3D $w\]" } else { $mn add command -label $TXT(sideview) -command "GMRTHgraph $w" $mn add command -label $TXT(persptv) -command "RTHG3D $w" } pack $w.fr -side top pack $w.fr.fr1.ntitle $w.fr.fr1.id -side left -padx 3 pack $w.fr.fr2.ctitle $w.fr.fr2.commt -side left -padx 3 pack $w.fr.fr21.obstit $w.fr.fr21.obs -side left -padx 3 pack $frb.frtits.titxn $frb.frtits.titox $frb.frtits.titxd \ $frb.frtits.titxb $frb.frtits.titxda $frb.frtits.titxsc \ $frb.frtits.titxsl $frb.frtits.fill -side left -fill y eval pack $boxes $frb.frbx.bscr -side left -fill y pack $frb.frt.tit $frb.frt.tt -side left pack $frb.frtits $frb.frbx -side top -fill y -pady 1 pack $frb.frt -side top -fill y -pady 5 # AP contribution: hgraph button pack $w.fr.fr3.frbt.title $w.fr.fr3.frbt.insb \ $w.fr.fr3.frbt.insa $w.fr.fr3.frbt.del \ $w.fr.fr3.frbt.repl $w.fr.fr3.frbt.sep \ $w.fr.fr3.frbt.chg $w.fr.fr3.frbt.edmap \ $w.fr.fr3.frbt.cnv $w.fr.fr3.frbt.comp \ $w.fr.fr3.frbt.hgraph -side top -pady 3 -fill x pack $frb $w.fr.fr3.frbt -side left -padx 5 pack $w.fr.frdw.displayed $w.fr.frdw.mw -side left -padx 3 pack $w.fr.frdw.wv -side left -padx 0 pack $w.fr.frdw.b -side left -padx 10 pack $w.fr.frdw.bc -side left -padx 0 pack $w.fr.fr1 $w.fr.fr2 $w.fr.fr21 $w.fr.fr3 $w.fr.frdw -side top -pady 5 pack $w.fr.frmb -side top pack $w.fr.frsel -side top -pady 5 AttachPlugIns $w update idletasks return $w } proc GMRouteMapEdit {} { # change RT edit window when the RT is to be edited on the map global Map MapWidth DPOSRTMAP DPOSY UNIX set x [expr [winfo rootx $Map]+$MapWidth+$DPOSRTMAP] wm geometry .gmRT +$x+$DPOSY foreach b "insb insa repl chg edmap" { .gmRT.fr.fr3.frbt.$b configure -state disabled } foreach i "displayed mw b" { .gmRT.fr.frdw.$i configure -state disabled } if { ! $UNIX } { # SH contribution lower .gmRT $Map } return } proc GMRouteMapEditEnd {} { # change RT edit window when the RT stops being edited on the map # assume the RT has changed global RT set GMEd(RT,MapChg) 1 foreach b "insb insa repl chg edmap" { .gmRT.fr.fr3.frbt.$b configure -state normal } foreach i "displayed mw b" { .gmRT.fr.frdw.$i configure -state normal } return } proc GMRouteSelect {i} { # select $i-th WP in RT edit window # $i may be an integer from 0, or "end" set frbx .gmRT.fr.fr3.fr31.frbx foreach b "bxn box bxd bxb" { $frbx.$b selection clear 0 end $frbx.$b selection set $i } foreach b "bxda bxsc bxsl" { $frbx.$b selection clear 0 end } return } proc RevertRT {} { # reset data in RT edit window to initial values # this depends on Storage(RT) global GMEd MapMakingRT if { $MapMakingRT } { MapCancelRT dontask dontclose } set GMEd(RT,MapChg) 0 ; set data $GMEd(RT,Data) .gmRT.fr.fr1.id delete 0 end .gmRT.fr.fr1.id insert 0 [lindex $data 0] .gmRT.fr.fr2.commt delete 0 end .gmRT.fr.fr2.commt insert 0 [lindex $data 1] .gmRT.fr.fr21.obs delete 1.0 end .gmRT.fr.fr21.obs insert 1.0 [lindex $data 2] set frb .gmRT.fr.fr3.fr31 foreach box $GMEd(RT,boxes) { $box delete 0 end } set wps $GMEd(RT,WPoints) ; set stages [lindex $data 4] set i 1 ; set n [llength $wps] set td 0 ; set tddef 1 foreach wp $wps nxt [lrange $wps 1 end] st $stages { $frb.frbx.bxn insert end [format "%3d." $i] incr i $frb.frbx.box insert end $wp set d [GMRTDistBearDAltWP $frb.frbx end 0 $wp $nxt] if { $d != "---" } { set td [expr $td+$d] } else { set tddef 0 } # $st may be "" $frb.frbx.bxsc insert end [lindex $st 0] $frb.frbx.bxsl insert end [lindex $st 1] } if { $tddef } { set td [format "%8.2f" $td] } else { set td "---" } $frb.frt.tt configure -text $td set GMEd(RT,Width) [lindex $data 5] set GMEd(RT,Colour) [lindex $data 6] .gmRT.fr.frdw.bc configure -background $GMEd(RT,Colour) set GMEd(RT,MBack) [lindex $data 7] if { [set d [lindex $data end]] && ! $GMEd(RT,Displ) } { PutMapRT $GMEd(RT,Index) } if { [set GMEd(RT,Displ) $d] } { .gmRT.fr.frdw.displayed select } else { .gmRT.fr.frdw.displayed deselect } # assume that data in the window changed ManageAuxWindows RT close_all return } proc GMRTCheck {} { # check validity of data in RT edit window # this depends on Storage(RT) global GMEd MAXWPINROUTE MESS TXT DataIndex set r [CheckEntries GMMessage nil [list {.gmRT.fr.fr2.commt CheckComment}]] set n [.gmRT.fr.fr3.fr31.frbx.box size] if { $n == 0 } { GMMessage $MESS(voidRT) set r nil } elseif { $n > $MAXWPINROUTE && \ ![GMConfirm [format $MESS(toomany) $TXT(nameWP) $MAXWPINROUTE]] } { set r nil } if { [set id [.gmRT.fr.fr1.id get]] == "" } { GMMessage $MESS(namevoid) return nil } if { $id == 0 && ! [GMConfirm $MESS(activeRT)] } { return nil } if { $r != "nil" } { set r [linsert $r 0 $id] set nb [CheckNB [.gmRT.fr.fr21.obs get 0.0 end]] set stages [GMRTStages .gmRT.fr.fr3.fr31.frbx] if { ! $GMEd(RT,MapChg) && \ ( $stages != [lindex $GMEd(RT,Data) 4] || \ $GMEd(RT,Width) != [lindex $GMEd(RT,Data) 5] || \ $GMEd(RT,Colour) != [lindex $GMEd(RT,Data) 6] ) } { set GMEd(RT,MapChg) 1 } lappend r [.gmRT.fr.fr3.fr31.frbx.box get 0 end] $stages \ $GMEd(RT,Width) $GMEd(RT,Colour) $GMEd(RT,MBack) $GMEd(RT,Displ) set r [linsert $r 2 $nb] } return $r } proc GMRTStage {sfr i} { # edit stage from frame $sfr at position $i of listbox in RT edit window global TXT DPOSX DPOSY COLOUR COMMENTWIDTH NAMEWIDTH GMEd if { $i == [$sfr.bxn size] } { return } set w .gmRS if { [winfo exists $w] } { Raise $w ; bell ; return } set GMEd(RT,RSgrabs) [set gs [grab current]] GMToplevel $w stage +$DPOSX+$DPOSY .gmRT \ [list WM_DELETE_WINDOW [list DestroyRGrabs $w $gs]] {} frame $w.fr -relief flat -borderwidth 5 -bg $COLOUR(dialbg) label $w.fr.title -text "[$sfr.box get $i]-[$sfr.box get [expr $i+1]]" frame $w.fr.fr1 -relief flat -borderwidth 0 label $w.fr.fr1.ctitle -text "$TXT(cmmt):" entry $w.fr.fr1.commt -width $COMMENTWIDTH -exportselection 1 ShowTEdit $w.fr.fr1.commt [$sfr.bxsc get $i] 1 label $w.fr.fr1.ltitle -text "$TXT(label):" entry $w.fr.fr1.label -width $NAMEWIDTH -exportselection 1 ShowTEdit $w.fr.fr1.label [$sfr.bxsl get $i] 1 frame $w.fr.bs -relief flat -borderwidth 0 button $w.fr.bs.ok -text $TXT(ok) -command "GMRTStageFinish $sfr $i" button $w.fr.bs.cancel -text $TXT(cancel) \ -command [list DestroyRGrabs $w $gs] grid config $w.fr.fr1.ctitle -column 0 -row 0 -sticky w grid config $w.fr.fr1.commt -column 1 -row 0 -sticky w grid config $w.fr.fr1.ltitle -column 0 -row 1 -sticky w grid config $w.fr.fr1.label -column 1 -row 1 -sticky w pack $w.fr.bs.ok $w.fr.bs.cancel -side left -pady 5 pack $w.fr.title $w.fr.fr1 $w.fr.bs -side top -pady 5 pack $w.fr -side top update idletasks grab $w RaiseWindow $w return } proc GMRTStageFinish {sfr i} { # change RT stage as in corresponding edit window # (see proc GMRTStage for the details) global GMEd set efr .gmRS.fr.fr1 $sfr.bxsc insert $i [string trim [$efr.commt get]] $sfr.bxsl insert $i [string trim [$efr.label get]] foreach b "bxsc bxsl" { $sfr.$b delete [expr $i+1] ; $sfr.$b selection set $i } DestroyRGrabs .gmRS $GMEd(RT,RSgrabs) return } proc GMRTStages {w} { # get information on stages from frame $w in RT edit window # return "" if no information found set sts "" ; set noinfo 1 ; set lstbut1 [expr [$w.box size]-2] foreach sc [$w.bxsc get 0 $lstbut1] sl [$w.bxsl get 0 $lstbut1] { set sc [string trim $sc] ; set sl [string trim $sl] if { $sc != "" || $sl != "" } { set noinfo 0 set st [list $sc $sl] } else { set st "" } lappend sts $st } if { $noinfo } { return "" } return $sts } proc GMRTChange {how args} { # perform edit operations on RT # $how is one of # insb insert WP before first selected WP in list or at the beginning # insa insert WP after last selected WP in list or at the end # repl replace the first selected WP by another one # del delete all selected WPs # inv invert RT # chh chop head: delete all WPs from first to first selected # inclusive or just the first one if there is no selection # cht chop tail: delete all WPs from last selected to end or only # last one # incb include RT before first selected or at beginning # inca include RT after last selected or at end # clear clear all WPs # $args # for $how in {insb, insa, repl}, is the name of the other WP # for $how==del, if making RT on map and in answer to event on map # is either 0 or "sel" for previous; otherwise (Delete button # in RT window), is "" # for $how in {incb, inca}, is the name of the other RT # in other cases, is "" # if making RT on map there must be more than one WP global GMEd MapMakingRT MapRTLast RTWPoints RTStages set GMEd(RT,MapChg) 1 set frbx .gmRT.fr.fr3.fr31.frbx # more than one WP can now be selected set sel [lsort -integer -increasing [$frbx.box curselection]] set sel0 [lindex $sel 0] ; set sell [lindex $sel end] switch $how { insb { set owp [lindex $args 0] if { $sel0 != "" } { set nxt [expr $sel0+1] } else { set nxt [set sel0 0] } set tddef 1 if { $sel0 != 0 } { set p [expr $sel0-1] set wpp [$frbx.box get $p] set d [GMRTDistBearDAltWP $frbx $p 1 $wpp $owp] if { $d == "---" } { set tddef 0 } } set d [GMRTDistBearDAltWP $frbx $sel0 0 $owp [$frbx.box get $sel0]] if { $d == "---" } { set tddef 0 } $frbx.box insert $sel0 $owp $frbx.bxn insert end [format %3d. [$frbx.box size]] GMRTConfigTDist $frbx .gmRT.fr.fr3.fr31.frt $tddef $frbx.bxsc insert $sel0 "" ; $frbx.bxsl insert $sel0 "" if { $nxt } { $frbx.bxn selection clear $sel0 end foreach ix $sel { if { $ix >= $sel0 } { incr ix $frbx.bxn selection set $ix } } } } insa { set owp [lindex $args 0] set tddef 1 if { $sel == "" || \ [set last [expr [$frbx.bxn size]-1]] == $sell } { set sell [set nxt end] set wpnxt "" } else { set nxt [expr $sell+1] set wpnxt [$frbx.box get $nxt] } if { [set cwp [$frbx.box get $sell]] == "" } { set d "---" ; set tddef 0 } else { set d [GMRTDistBearDAltWP $frbx $sell 1 $cwp $owp] if { $d == "---" } { set tddef 0 } } set d [GMRTDistBearDAltWP $frbx $nxt 0 $owp $wpnxt] if { $d == "---" } { set tddef 0 } $frbx.box insert $nxt $owp $frbx.bxn insert end [format %3d. [$frbx.box size]] GMRTConfigTDist $frbx .gmRT.fr.fr3.fr31.frt $tddef $frbx.bxsc insert $nxt "" ; $frbx.bxsl insert $nxt "" if { $sell == "end" } { set sell [expr [$frbx.box size]-2] } foreach b {bxd bxb bxda} { $frbx.$b selection clear $nxt if { $sell >= 0 } { $frbx.$b selection set $sell } } if { $nxt != "end" } { $frbx.bxn selection clear $nxt end foreach ix $sel { if { $ix > $nxt } { incr ix -1 $frbx.bxn selection set $ix } } } } repl { set owp [lindex $args 0] if { $sel0 == {} } { return } ReplaceWPInRTWindow $sel0 $frbx .gmRT.fr.fr3.fr31.frt $owp 1 } del { set last [expr [$frbx.bxn size]-1] if { $MapMakingRT } { # if called in answer to event on the map # $args may be "0" (delete 1st WP) for "sel" (delete selected) # otherwise $args=="" if { $MapRTLast == 0 } { bell ; return } if { $MapRTLast == 1 } { .gmRT.fr.fr3.frbt.del configure -state disabled } # as there were at least 2 WPs, $prev will be set below # unless the 1st WP is being deleted if { [lindex $args 0] == 0 } { set sel 0 } elseif { $sel == "" } { BUG "no selected WP to delete" } set delwp [$frbx.box get $sel] } elseif { $sel == {} } { return } set tddef 1 foreach sl [lsort -integer -decreasing $sel] { if { $sl > 0 } { set p [expr $sl-1] set prev [$frbx.box get $p] if { $sl == $last } { $frbx.bxd delete $p ; $frbx.bxd insert $p "========" $frbx.bxb delete $p ; $frbx.bxb insert $p "===" $frbx.bxsc delete $p ; $frbx.bxsl delete $p } else { set d [GMRTDistBearDAltWP $frbx $p 1 $prev \ [$frbx.box get [expr $sl+1]]] if { $d == "---" } { set tddef 0 } } } foreach b "ox xd xb xda xsc xsl" { $frbx.b$b delete $sl $frbx.b$b selection clear 0 end } $frbx.bxn delete end if { $MapMakingRT } { if { $sel == 0 } { MapDelRT1st $delwp } else { MapDelRTPrevious $prev $delwp } } } $frbx.bxn selection clear 0 end GMRTConfigTDist $frbx .gmRT.fr.fr3.fr31.frt $tddef } inv { if { [set lstbut1 [expr [$frbx.bxn size]-2]] < 0 } { return } set wps [$frbx.box get 0 end] set stcs [$frbx.bxsc get 0 $lstbut1] set stls [$frbx.bxsl get 0 $lstbut1] set ds [$frbx.bxd get 0 $lstbut1] set bs [$frbx.bxb get 0 $lstbut1] set das [$frbx.bxda get 0 $lstbut1] foreach b "ox xd xb xda xsc xsl" { $frbx.b$b delete 0 end } foreach w $wps { $frbx.box insert 0 $w } $frbx.bxd insert 0 "========" ; $frbx.bxb insert 0 "===" foreach d $ds b $bs da $das { if { $b > 179 } { set b [expr $b-180] } else { set b [expr 180+$b] } $frbx.bxd insert 0 $d ; $frbx.bxb insert 0 [format %4d $b] if { $da != "" } { set da [format %7.1f [expr -$da]] } $frbx.bxda insert 0 $da } foreach stc $stcs stl $stls { $frbx.bxsc insert 0 $stc ; $frbx.bxsl insert 0 $stl } foreach b "xn ox xd xb xda xsc xsl" { $frbx.b$b selection clear 0 end } } clear { foreach b "xn ox xd xb xda xsc xsl" { $frbx.b$b delete 0 end } GMRTConfigTDist $frbx .gmRT.fr.fr3.fr31.frt 1 } chh { # chop head: delete WPs from first to first selected, or first one if { $sel == "" } { set sel0 0 } foreach b "ox xd xb xda xsc xsl" { $frbx.b$b delete 0 $sel0 } $frbx.bxn delete [$frbx.box size] end $frbx.bxn selection clear 0 end foreach sl $sel { if { $sl > $sel0 } { set sl [expr $sl-$sel0-1] $frbx.bxn selection set $sl } } GMRTConfigTDist $frbx .gmRT.fr.fr3.fr31.frt 1 } cht { # chop tail: delete all WPs from last selected to end, or last one if { $sel == "" } { set sell end } foreach b "xn ox xd xb xda xsc xsl" { $frbx.b$b delete $sell end $frbx.b$b yview end } foreach b "xd xb xda xsc xsl" v "======== ==== {} {} {}" { $frbx.b$b delete end ; $frbx.b$b insert end $v $frbx.b$b yview end } GMRTConfigTDist $frbx .gmRT.fr.fr3.fr31.frt 1 } incb { # include RT before first selected or first if { [set ixrt [IndexNamed RT [lindex $args 0]]] == -1 } { return } if { $sel == "" } { set sel0 0 } set wps $RTWPoints($ixrt) set tddef 1 if { $sel0 != 0 } { set pr [expr $sel0-1] set wp [$frbx.box get $pr] set d [GMRTDistBearDAltWP $frbx $pr 1 $wp [lindex $wps 0]] if { $d == "---" } { set tddef 0 } } set nwps [lrange $wps 1 end] ; lappend nwps [$frbx.box get $sel0] set i [$frbx.bxn size] foreach wp $wps nxt $nwps stg $RTStages($ixrt) { incr i $frbx.bxn insert end [format "%3d." $i] $frbx.box insert $sel0 $wp set d [GMRTDistBearDAltWP $frbx $sel0 0 $wp $nxt] if { $d == "---" } { set tddef 0 } # $stg may be "" $frbx.bxsc insert end [lindex $stg 0] $frbx.bxsl insert end [lindex $stg 1] incr sel0 } GMRTConfigTDist $frbx .gmRT.fr.fr3.fr31.frt $tddef foreach b "xn ox xd xb xda xsc xsl" { $frbx.b$b selection clear 0 end } } inca { # include RT after last selected or at end if { [set ixrt [IndexNamed RT [lindex $args 0]]] == -1 } { return } set i [$frbx.bxn size] if { $sel == "" } { set sell [expr $i-1] } set wps $RTWPoints($ixrt) set wp [$frbx.box get $sell] set d [GMRTDistBearDAltWP $frbx $sell 1 $wp [lindex $wps 0]] if { $d == "---" } { set tddef 0 } else { set tddef 1 } set nwps [lrange $wps 1 end] if { $sell < $i-1 } { lappend nwps [$frbx.box get [expr $sell+1]] } foreach wp $wps nxt $nwps stg $RTStages($ixrt) { incr i ; incr sell $frbx.bxn insert end [format "%3d." $i] $frbx.box insert $sell $wp set d [GMRTDistBearDAltWP $frbx $sell 0 $wp $nxt] if { $d == "---" } { set tddef 0 } # $stg may be "" $frbx.bxsc insert $sell [lindex $stg 0] $frbx.bxsl insert $sell [lindex $stg 1] } GMRTConfigTDist $frbx .gmRT.fr.fr3.fr31.frt $tddef foreach b "xn ox xd xb xda xsc xsl" { $frbx.b$b selection clear 0 end } } } ManageAuxWindows RT close_all return } proc ReplaceWPInRTWindow {i frbx frt wpn recomp} { # replace WP at position $i in boxes framed by $frbx by WP named $wpn # $frt is the frame where the total distance is shown # $recomp is set if distances must be recalculated, in which case # edited WP is assumed to have already been stored in the data-base # selection state is kept set selected [$frbx.box selection includes $i] $frbx.box insert $i $wpn $frbx.box delete [expr $i+1] if { $recomp } { set tddef 1 if { $i > 0 } { set p [expr $i-1] set d [GMRTDistBearDAltWP $frbx $p 1 [$frbx.box get $p] $wpn] if { $d == "---" } { set tddef 0 } } if { $i < [expr [$frbx.bxn size]-1] } { set p [expr $i+1] set d [GMRTDistBearDAltWP $frbx $i 1 $wpn [$frbx.box get $p]] if { $d == "---" } { set tddef 0 } } GMRTConfigTDist $frbx $frt $tddef } if { $selected } { foreach b "xn ox xd xb xda xsc xsl" { $frbx.b$b selection set $i } } return } proc GMRTDistBearDAltWP {fr i del wp1 wp2} { # compute distance, bearing and difference in altitude between two WPs # and insert them in listboxes under $fr at index $i, deleting previous # value if $del is set; $wp2 can be "" # (see GMRoute for structure of $fr and listboxes) # return distance or "---" if could not compute it, or 0 if $wp2 is "" global DSCALE ALSCALE WPAlt set da "" if { $wp2 != "" } { set db [CompWPDistBear $wp1 $wp2] set d [lindex $db 0] if { $d != "---" } { set d [expr $d*$DSCALE] set pd [format %8.2f $d] set db [format %4d [lindex $db 1]] } else { set db "---" ; set pd "--------" } if { [set ix1 [IndexNamed WP $wp1]] != -1 && \ [set ix2 [IndexNamed WP $wp2]] != -1 && \ [set a1 [lindex $WPAlt($ix1) 0]] != {} && \ [set a2 [lindex $WPAlt($ix2) 0]] != {} } { set da [format "%7.1f" [expr ($a2-$a1)/$ALSCALE]] } } else { set d 0 ; set pd "========" ; set db "====" } if { $del } { $fr.bxd delete $i ; $fr.bxb delete $i ; $fr.bxda delete $i } $fr.bxd insert $i $pd ; $fr.bxb insert $i $db $fr.bxda insert $i $da return $d } proc GMRTConfigTDist {frbx frt def} { # compute and configure total distance if expected to be defined # $frbx is frame for listboxes with distances # $frt is the frame for the total distance label # $def is 1 if distance is expected to be defined if { $def } { set td 0 foreach d [$frbx.bxd get 0 end] { if { [string first "---" $d] == 0 } { $frt.tt configure -text "---" break } if { $d != "========" } { set td [expr $td+$d] } } $frt.tt configure -text [format %8.2f $td] } else { $frt.tt configure -text "---" } return } proc ChangeWPInRTWindows {oldname newname recomp} { # replace name of WP in RT windows and/or recompute distances # a WP name may occur several times # $recomp is set if distances must be recalculated, in which case # edited WP is assumed to have already been stored in the data-base # change data on RT being edited if WP belongs to it and was renamed global GMEd set diffname [string compare $oldname $newname] if { [winfo exists .gmRT] && $diffname } { # window update is done below # this depends on Storage(RT) set wps [lindex $GMEd(RT,Data) 3] ; set chg 0 foreach i [lsearch -exact -all $wps $oldname] { set wps [lreplace $wps $i $i $newname] incr chg } if { $chg } { set GMEd(RT,Data) [lreplace $GMEd(RT,Data) 3 3 $wps] } } set ws [winfo children .] while { [set i [lsearch -glob $ws ".gmRT*"]] != -1 } { set w [lindex $ws $i] set ws [lrange $ws [expr $i+1] end] set frbx $w.fr.fr3.fr31.frbx foreach i [lsearch -exact -all [$frbx.box get 0 end] $oldname] { ReplaceWPInRTWindow $i $frbx $w.fr.fr3.fr31.frt $newname $recomp } } return } proc RTToTR {w} { # make a TR from the RT in window $w global WPPosn WPAlt WPDatum Datum EdWindow MESS TXT set tpfs "latd longd latDMS longDMS" set tpfsa "alt latd longd latDMS longDMS" set tps "" foreach wpn [$w.fr.fr3.fr31.frbx.box get 0 end] { if { [set wpix [IndexNamed WP $wpn]] != -1 } { set p $WPPosn($wpix) set p [lindex [FormatPosition [lindex $p 0] [lindex $p 1] \ $WPDatum($wpix) DMS $Datum] 0] set p [lrange $p 0 3] if { [set a $WPAlt($wpix)] != "" } { lappend tps [FormData TP $tpfsa [linsert $p 0 $a]] } else { lappend tps [FormData TP $tpfs $p] } } } if { $tps == "" } { bell ; return } if { [winfo exists $EdWindow(TR)] } { set name [NewName TR] set data [FormData TR "Name Datum TPoints" [list $name $Datum $tps]] CreateItem TR $data GMMessage [format $MESS(convres) $TXT(TR) $name] } else { set opts "create revert cancel" GMTrack -1 $opts [FormData TR "Datum TPoints" [list $Datum $tps]] } return } proc ComputeArea {w} { # compute area of polygon whose boundary is the RT in window $w # the RT cannot intersect itself; in particular its WPs cannot occur # twice except for the 1st one that can appear also as last one # only this particular case is checked # computation is either based on a spherical approximation, or, if that # has precision problems (too small areas), done by projecting on the # plane and calculating the area of projected polygon; the projection # used for this is the Transverse Mercator, or the Universal Polar # Stereographic for absolute latitudes above ca. 80 degrees global MESS ASCALE ARUNIT set wps [$w.fr.fr3.fr31.frbx.box get 0 end] if { [lindex $wps 0] == [lindex $wps end] } { set wps [lreplace $wps end end] } if { [set n [llength $wps]] < 3 } { GMMessage $MESS(missingdata) return } set wpixs [Apply $wps IndexNamed WP] set os [lreplace $wpixs 0 0] foreach ix $wpixs { foreach ixn $os { if { $ix == $ixn } { GMMessage $MESS(selfintsct) return } } set os [lreplace $os 0 0] } if { [set area [SphericalArea $wpixs]] < 0 } { GMMessage $MESS(projarea) set area [ProjectedArea $wpixs] if { $area < 0.001 } { GMMessage [format $MESS(areatoosmall) 0.001] return } } GMMessage [format $MESS(areais) [expr $area*$ASCALE] $ARUNIT] return } proc GMTrack {index options data} { # create dialog window for editing/showing data of TR with given index # $options is a list of buttons to display; # $index is -1 if this is a new TR # an empty list means no editing; supported options are: # cancel, create, change, revert, forget # change and forget assume $index != -1 # see proc GMButton for further details # if $options is empty, $index cannot be -1 as this is not a new TR # the only button is OK, and only binding: return to destroy # order of elements in $data list reflects order in $Storage(TR) # which is used below # return window path global GMEd MapLoading DPOSX DPOSY COLOUR LISTHEIGHT COMMENTWIDTH \ DATEWIDTH OBSWIDTH OBSHEIGHT TXT DATUMWIDTH foreach "name obs datum tps segsts hidden width colour mbak displ" $data {} set ed 0 ; set st disabled if { $options != "" } { if { [winfo exists .gmTR] } { Raise .gmTR ; bell ; return .gmTR } set ed 1 ; set st normal set w .gmTR set GMEd(TR,Index) $index ; set GMEd(TR,Displ) $displ set GMEd(TR,Datum) $datum ; set GMEd(TR,TPs) $tps set GMEd(TR,Hidden) $hidden ; set GMEd(TR,MapChg) 0 set GMEd(TR,SgSts) $segsts ; set GMEd(TR,Width) $width set GMEd(TR,Colour) $colour ; set GMEd(TR,MBack) $mbak # this depends on Storage(TR) set GMEd(TR,Data) $data # GMEd(TR,windows) is a list of windows that should be closed # when the track is changed such as the computation window and # the plot windows created by procs Hgraph and HG3D (elevation.tcl) # It should be accessed by calling proc ManageAuxWindows set GMEd(TR,windows) {} set x $DPOSX set y $DPOSY } else { set w .gmTRsh$index if { [winfo exists $w] } { destroy $w } incr GMEd(TR,Show) set x [expr $DPOSX+50*((1+$GMEd(TR,Show)) % 5)] set y [expr $DPOSY+50*((1+$GMEd(TR,Show)) % 5)] } GMToplevel $w track +$x+$y {} {} {} if { ! $ed } { wm protocol $w WM_DELETE_WINDOW "destroy $w" bind $w "destroy $w" } else { wm protocol $w WM_DELETE_WINDOW { GMButton TR cancel } } frame $w.fr -relief flat -borderwidth 5 -bg $COLOUR(dialbg) frame $w.fr.fr1 -relief flat -borderwidth 0 label $w.fr.fr1.ntitle -text "$TXT(name):" entry $w.fr.fr1.id -width $DATEWIDTH -exportselection 1 ShowTEdit $w.fr.fr1.id $name $ed frame $w.fr.fr2 -relief flat -borderwidth 0 label $w.fr.fr2.obstit -text "$TXT(rmrk):" text $w.fr.fr2.obs -wrap word -width $OBSWIDTH -height $OBSHEIGHT \ -exportselection true $w.fr.fr2.obs insert 0.0 $obs $w.fr.fr2.obs configure -state $st TextBindings $w.fr.fr2.obs frame $w.fr.frd -relief flat -borderwidth 0 menubutton $w.fr.frd.dttitle -text Datum -relief raised \ -direction below -menu $w.fr.frd.dttitle.m -state $st menu $w.fr.frd.dttitle.m -tearoff 0 if { $ed } { FillDatumMenu $w.fr.frd.dttitle.m GMTRChangeDatum label $w.fr.frd.datum -text $GMEd(TR,Datum) \ -textvariable GMEd(TR,Datum) \ -width $DATUMWIDTH } else { label $w.fr.frd.datum -text $datum -width $DATUMWIDTH } if { $hidden != "" } { button $w.fr.hidd -text $TXT(hiddendata) \ -command "$w.fr.hidd configure -state normal ; \ ShowHiddenData TR {$hidden}" } frame $w.fr.fr3 -relief flat -borderwidth 0 frame $w.fr.fr3.frbx -relief flat -borderwidth 0 set boxes "" foreach b "n d lat long alt dep seg" m "5 $DATEWIDTH 12 12 7 7 1" { listbox $w.fr.fr3.frbx.bx$b -height 15 -width $m -relief flat \ -yscrollcommand "$w.fr.fr3.frbx.bscr set" \ -selectmode extended -exportselection false lappend boxes $w.fr.fr3.frbx.bx$b bind $w.fr.fr3.frbx.bx$b <> \ "MultExtSelect $w.fr.fr3.frbx.bx$b {bxn bxd bxlat bxlong bxalt bxdep bxseg}" bind $w.fr.fr3.frbx.bx$b \ { MarkPoint TR [winfo toplevel %W] [%W nearest %y] } } if { $ed } { set GMEd(TR,boxes) $boxes bind $w.fr.fr3.frbx.bxseg { GMToggleSegStart TR %W [%W nearest %y] ManageAuxWindows TR close_all } } # BSB contribution: wheelmouse scrolling scrollbar $w.fr.fr3.frbx.bscr -command [list ScrollMany $boxes] Mscroll $boxes FillTPs $w $tps $segsts frame $w.fr.fr3.frbt -relief flat -borderwidth 0 button $w.fr.fr3.frbt.chh -text $TXT(chophd) -state $st \ -command { GMTRChange chh } button $w.fr.fr3.frbt.cht -text $TXT(choptl) -state $st \ -command { GMTRChange cht } foreach a "incb app" { button $w.fr.fr3.frbt.$a -text $TXT($a) -state $st \ -command "ChItemsCall TR single GMTRChange $a" } # MB contribution button $w.fr.fr3.frbt.del -text $TXT(del) -state $st \ -command { GMTRChange del } #---- button $w.fr.fr3.frbt.clear -text $TXT(clear) -state $st \ -command { GMTRChange clear } frame $w.fr.fr3.frbt.sep -height 6 -bg $COLOUR(dialbg) \ -relief flat -borderwidth 0 button $w.fr.fr3.frbt.anim -text $TXT(animation) -command "GMTRAnimate $w" button $w.fr.fr3.frbt.comp -text $TXT(comp) -command "GMTRCompute $w" set mnc $w.fr.fr3.frbt.cnv.m menubutton $w.fr.fr3.frbt.cnv -text $TXT(convert) -relief raised \ -direction right -menu $mnc menu $mnc -tearoff 0 $mnc add command -label $TXT(mkavgWP) -command "GMTRtoWP $w" set mn $mnc.mnsm $mnc add cascade -label $TXT(simplTRto) -menu $mn menu $mn -tearoff 0 foreach wh "RT TR LN" { $mn add command -label $TXT(name$wh) -command "GMTRtoLine $wh $w" } $mnc add cascade -label $TXT(split) -menu $mnc.mns menu $mnc.mns -tearoff 0 $mnc.mns add command -label $TXT(bysel) \ -command "SplitPolyLine TR sel $w $ed $index" $mnc.mns add command -label $TXT(byseg) \ -command "SplitPolyLine TR segm $w $ed $index" frame $w.fr.frsel -relief flat -borderwidth 0 # frame used for plug-ins (see array PLGSWelcomed, plugins.tcl) frame $w.fr.frdw set mn $w.fr.frdw.mw.m menubutton $w.fr.frdw.mw -text $TXT(width) -relief raised \ -direction below -menu $mn -state $st menu $mn -tearoff 0 button $w.fr.frdw.b -text $TXT(Colour) -relief raised \ -command "ChooseColour GMEd GMEd(TR,Colour) $w.fr.frdw $w" \ -state $st label $w.fr.frdw.bc -relief groove -background $colour -width 2 frame $w.fr.frmb CreateMBackWidgets TR $w.fr.frmb $mbak $ed if { $ed } { checkbutton $w.fr.frdw.displayed -text $TXT(displ) \ -variable GMEd(TR,Displ) -onvalue 1 -offvalue 0 \ -selectcolor $COLOUR(check) foreach i "1 2 3 4 5 6 7 8" { $mn add command -label $i -command "set GMEd(TR,Width) $i" } label $w.fr.frdw.wv -width 3 -textvariable GMEd(TR,Width) if { $MapLoading != 0 } { foreach i "displayed mw" { $w.fr.frdw.$i configure -state disabled } } set b $w.fr.frsel.b foreach e $options { button $b$e -text $TXT($e) \ -command "$b$e configure -state normal ; GMButton TR $e" pack $b$e -side left } } else { checkbutton $w.fr.frdw.displayed -text $TXT(displ) -state disabled \ -selectcolor $COLOUR(check) if { $displ } { $w.fr.frdw.displayed select } label $w.fr.frdw.wv -width 3 -text $width button $w.fr.frsel.b -text $TXT(ok) -command "destroy $w" pack $w.fr.frsel.b } pack $w.fr -side top pack $w.fr.fr1.ntitle $w.fr.fr1.id -side left -padx 3 pack $w.fr.fr2.obstit $w.fr.fr2.obs -side left -padx 3 pack $w.fr.frd.dttitle $w.fr.frd.datum -side left -padx 3 eval pack $boxes $w.fr.fr3.frbx.bscr -side left -fill y # includes MB contribution pack $w.fr.fr3.frbt.chh $w.fr.fr3.frbt.cht $w.fr.fr3.frbt.incb \ $w.fr.fr3.frbt.app $w.fr.fr3.frbt.del $w.fr.fr3.frbt.clear \ $w.fr.fr3.frbt.sep $w.fr.fr3.frbt.anim $w.fr.fr3.frbt.comp \ $w.fr.fr3.frbt.cnv -side top -pady 2 -fill x pack $w.fr.fr3.frbx $w.fr.fr3.frbt -side left -padx 5 pack $w.fr.frdw.displayed $w.fr.frdw.mw -side left -padx 3 pack $w.fr.frdw.wv -side left -padx 0 pack $w.fr.frdw.b -side left -padx 10 pack $w.fr.frdw.bc -side left -padx 0 if { $hidden != "" } { pack $w.fr.fr1 $w.fr.fr2 $w.fr.frd -side top -pady 5 pack $w.fr.hidd -side top -pady 2 pack $w.fr.fr3 $w.fr.frdw -side top -pady 5 pack $w.fr.frmb -side top pack $w.fr.frsel -side top -pady 5 } else { pack $w.fr.fr1 $w.fr.fr2 $w.fr.frd $w.fr.fr3 $w.fr.frdw -side top \ -pady 5 pack $w.fr.frmb -side top pack $w.fr.frsel -side top -pady 5 } AttachPlugIns $w update idletasks return $w } proc RevertTR {} { # reset data in TR edit window to initial values # this depends on Storage(TR) global GMEd set GMEd(TR,MapChg) 0 ; set data $GMEd(TR,Data) .gmTR.fr.fr1.id delete 0 end .gmTR.fr.fr1.id insert 0 [lindex $data 0] .gmTR.fr.fr2.obs delete 1.0 end .gmTR.fr.fr2.obs insert 1.0 [lindex $data 1] foreach box $GMEd(TR,boxes) { $box delete 0 end } foreach e "Datum TPs SgSts" v [lrange $data 2 4] { set GMEd(TR,$e) $v } # hidden attributes: [lindex $GMEd(TR,Data) 5] foreach e "Width Colour MBack Displ" v [lrange $data 6 end] { set GMEd(TR,$e) $v } FillTPs .gmTR $GMEd(TR,TPs) $GMEd(TR,SgSts) .gmTR.fr.frdw.bc configure -background $GMEd(TR,Colour) if { $GMEd(TR,Displ) } { .gmTR.fr.frdw.displayed select } else { .gmTR.fr.frdw.displayed deselect } # assume that data in the window changed ManageAuxWindows TR close_all return } proc GMTRCheck {} { # check validity of data in TR edit window # this depends on Storage(TR) global GMEd MESS KEEPHIDDEN set id [.gmTR.fr.fr1.id get] if { ! [CheckString GMMessage $id] } { focus .gmTR.fr.fr1.id return nil } if { [llength $GMEd(TR,TPs)] == 0 } { GMMessage $MESS(voidTR) return nil } if { $GMEd(TR,Hidden) != "" } { switch $KEEPHIDDEN { never { set GMEd(TR,Hidden) "" } always { } ask { if { [GMConfirm $MESS(nohidden)] } { set GMEd(TR,Hidden) "" } } } } if { ! $GMEd(TR,MapChg) && \ ( $GMEd(TR,Width) != [lindex $GMEd(TR,Data) 6] || \ $GMEd(TR,Colour) != [lindex $GMEd(TR,Data) 7] ) } { set GMEd(TR,MapChg) 1 } set r [list $id [CheckNB [.gmTR.fr.fr2.obs get 0.0 end]]] foreach e "Datum TPs SgSts Hidden Width Colour MBack Displ" { lappend r $GMEd(TR,$e) } return $r } proc GMTRNewDate {tpsa tpsb} { # create dialog window to get new date for the first point of a TR ($tpsa) # when appending it to a another one ($tpsb) global DATEWIDTH EPOSX EPOSY COLOUR TempTR GMEd TXT FixedFont set l [set na [llength $tpsa]] if { $na > 4 } { set na 4 } set tpsa [lrange $tpsa [expr $l-$na] end] set l [set nb [llength $tpsb]] if { $nb > 4 } { set nb 4 } set tpsb [lrange $tpsb 0 [expr $nb-1]] GMToplevel .gmTRnd date +$EPOSX+$EPOSY .gmTR \ {WM_DELETE_WINDOW {set TmpTR cnc}} \ { {set TmpTR ok}} frame .gmTRnd.fr -relief flat -borderwidth 5 -bg $COLOUR(selbg) label .gmTRnd.fr.tit -text $TXT(newdate) -relief sunken set ll [Measure "$TXT(endprTR):"] frame .gmTRnd.fr.frbxp -relief flat -borderwidth 0 label .gmTRnd.fr.frbxp.tit -text "$TXT(endprTR):" -width $ll listbox .gmTRnd.fr.frbxp.bxt -width $DATEWIDTH -height 4 \ -exportselection 0 -font $FixedFont bind .gmTRnd.fr.frbxp.bxt { .gmTRnd.fr.frbxp.bxt selection clear 0 end } listbox .gmTRnd.fr.frbxp.bxl -width 8 -height 4 -exportselection 0 \ -font $FixedFont bind .gmTRnd.fr.frbxp.bxl { .gmTRnd.fr.frbxp.bxl selection clear 0 end } set dst 0 foreach tp $tpsa nxt [lrange $tpsa 1 end] { .gmTRnd.fr.frbxp.bxt insert end [lindex $tp 4] if { $nxt != "" } { set d [ComputeDist $tp $nxt $GMEd(TR,Datum)] set dst [expr $dst+$d] .gmTRnd.fr.frbxp.bxl insert end [format "%8.2f" $d] } } set d [ComputeDist [lindex $tpsa end] [lindex $tpsb 0] $GMEd(TR,Datum)] .gmTRnd.fr.frbxp.bxl insert end [format "%8.2f" $d] set tl [lindex [lindex $tpsa end] 5] if { $dst != 0 } { set t [expr $tl-[lindex [lindex $tpsa 0] 5]] set ns [expr round($t*$d/$dst)+$tl] } else { set ns $tl } frame .gmTRnd.fr.frbxn -relief flat -borderwidth 0 label .gmTRnd.fr.frbxn.tit -text "$TXT(begnxt):" -width $ll listbox .gmTRnd.fr.frbxn.bxt -width $DATEWIDTH -height 4 \ -exportselection 0 -font $FixedFont bind .gmTRnd.fr.frbxn.bxt { .gmTRnd.fr.frbxn.bxt selection clear 0 end } listbox .gmTRnd.fr.frbxn.bxl -width 8 -height 4 -exportselection 0 \ -font $FixedFont bind .gmTRnd.fr.frbxn.bxl { .gmTRnd.fr.frbxn.bxl selection clear 0 end } foreach tp $tpsb nxt [lrange $tpsb 1 end] { .gmTRnd.fr.frbxn.bxt insert end [lindex $tp 4] if { $nxt != "" } { set d [ComputeDist $tp $nxt $GMEd(TR,Datum)] .gmTRnd.fr.frbxn.bxl insert end [format "%8.2f" $d] } } frame .gmTRnd.fr.fe -relief flat -borderwidth 0 label .gmTRnd.fr.fe.tit -text "$TXT(date1st):" entry .gmTRnd.fr.fe.en -width $DATEWIDTH -exportselection 1 .gmTRnd.fr.fe.en insert 0 [DateFromSecs $ns] TextBindings .gmTRnd.fr.fe.en frame .gmTRnd.fr.bs -relief flat -borderwidth 0 button .gmTRnd.fr.bs.ok -text $TXT(ok) -command { set TempTR ok } button .gmTRnd.fr.bs.cnc -text $TXT(cancel) -command { set TempTR cnc } pack .gmTRnd.fr.frbxp.tit .gmTRnd.fr.frbxp.bxt .gmTRnd.fr.frbxp.bxl \ -side left -fill y pack .gmTRnd.fr.frbxn.tit .gmTRnd.fr.frbxn.bxt .gmTRnd.fr.frbxn.bxl \ -side left -fill y pack .gmTRnd.fr.fe.tit .gmTRnd.fr.fe.en -side top -pady 3 pack .gmTRnd.fr.bs.ok .gmTRnd.fr.bs.cnc -side left -pady 5 pack .gmTRnd.fr.tit .gmTRnd.fr.frbxp .gmTRnd.fr.frbxn .gmTRnd.fr.fe \ .gmTRnd.fr.bs -side top -pady 5 pack .gmTRnd.fr -side top update idletasks set gs [grab current] grab .gmTRnd RaiseWindow .gmTRnd while 1 { tkwait variable TempTR switch $TempTR { cnc { set res -1 break } ok { set fn [string trim [.gmTRnd.fr.fe.en get] " "] set d [CheckConvDate $fn] if { $d != "" } { set res $d break } } } } DestroyRGrabs .gmTRnd $gs update idletasks return $d } proc GMTRChange {how args} { # perform edit operations on TR GMPolyChange TR $how $args ManageAuxWindows TR close_all return } proc GMTRAnimate {window} { # launch animation for TR in edit/show window global GMEd TRTPoints TRDatum TXT MESS set name [$window.fr.fr1.id get] if { $window == ".gmTR" } { set tps $GMEd(TR,TPs) if { $tps == "" } { GMMessage $MESS(voidTR) return } set datum $GMEd(TR,Datum) } else { set ixt [IndexNamed TR $name] set tps $TRTPoints($ixt) ; set datum $TRDatum($ixt) } InitAnimation TR "$TXT(nameTR): $name" $tps $datum return } proc GMTRCompute {window} { # create dialog to show results of computation for TR of edit/show window global DPOSX DPOSY COLOUR GMEd TRTPoints TRSegStarts TRDatum TXT MESS \ DTUNIT SPUNIT ALUNIT DSCALE FixedFont DATEWIDTH ALTHRESHOLD set w ${window}.topc if { [winfo exists $w] } { Raise $w ; bell ; return } if { $window == ".gmTR" } { set edit 1 ManageAuxWindows TR add $w set tps $GMEd(TR,TPs) if { $tps == "" } { GMMessage $MESS(voidTR) return } set segsts $GMEd(TR,SgSts) set datum $GMEd(TR,Datum) } else { set edit 0 set ixt [IndexNamed TR [$window.fr.fr1.id get]] set tps $TRTPoints($ixt) ; set segsts $TRSegStarts($ixt) set datum $TRDatum($ixt) } if { [lindex $tps 1000] != "" && ! [GMConfirm $MESS(timeconsmg)] } { return } SetCursor . watch GMToplevel $w TRcomp +[expr $DPOSX+100]+[expr $DPOSY+100] {} {} {} frame $w.fr -relief flat -borderwidth 5 -bg $COLOUR(dialbg) frame $w.fr.fr1 -relief flat -borderwidth 0 label $w.fr.fr1.ntitle -text "$TXT(name): [$window.fr.fr1.id get]" frame $w.fr.fr3 -relief flat -borderwidth 0 frame $w.fr.fr3.frtits -relief flat -borderwidth 0 label $w.fr.fr3.frtits.fill -width 2 -font $FixedFont frame $w.fr.fr3.frbx -relief flat -borderwidth 0 set h [$window.fr.fr3.frbx.bxn size] if { $h > 15 } { set h 15 } set boxes "" foreach b "xn xd xlat xlong al xl tl dt sp bg" \ m "5 $DATEWIDTH 12 12 7 8 8 8 6 4" t $TXT(TRcompflds) { label $w.fr.fr3.frtits.tit$b -width $m -text $t -font $FixedFont listbox $w.fr.fr3.frbx.b$b -height $h -width $m -relief flat \ -yscrollcommand "$w.fr.fr3.frbx.bscr set" \ -selectmode single -exportselection false -font $FixedFont lappend boxes $w.fr.fr3.frbx.b$b bind $w.fr.fr3.frbx.b$b { MultSelect [winfo parent %W] [%W nearest %y] \ {bxn bxd bxlat bxlong bal bxl btl bdt bsp bbg} } } # $boxes computed in the previous loop # BSB contribution: wheelmouse scrolling scrollbar $w.fr.fr3.frbx.bscr -command [list ScrollMany $boxes] Mscroll $boxes # distance from first TP, its maximum and index of corresponding TP set d0 0 ; set mxd0 0 ; set ismxd0 "" # total distance (chainage) / total time including segment gaps set td 0 ; set tt 0 # proposed RM contribution: display chainage instead of # sum of distance from start to next; 1 of 4 # this line should be commented out set sd [format "%8.3f" $td] # total distance without segment gaps set tdng 0 ; set ttng 0 # extreme speed values and indices of corresponding TPs set mxsp 0 ; set mnsp 1e70 ; set imx 0 ; set imn 0 # lists of: total distance and speed; seconds, altitude and start # segment flag; seconds and speed set speeds "" ; set salts "" ; set sspeeds "" SetDatumData $datum set tp0 [lindex $tps 0] # AP contribution #====== #get start point alt and put it in lllist with 0 km. # MF change: inserted start segment flag set lll [list [list 0.0 [UserAltitude [lindex $tp0 6]] 0]] # MF change: moved computation of $tmp3D $tmp3D2 to next foreach set tmp3D "" ; set tmp3D2 "" # 3D elevation graph: call HG3D $tmp3D $tmp3D2 $datum #====== set secs2 [lindex $tp0 5] set nsgst [lindex $segsts 0] ; set segsts [lreplace $segsts 0 0] set endsegm 0 set i 1 # BS contribution: definition variable # RM change variablename set cumula 0 set cumula_temp 0 #====== # MF contribution: also for cumulative descent set cumuld 0 ; set cumuld_temp 0 #====== set maxalt -1e10 ; set minalt 1e10 set imaxalt 0; set iminalt 0 # RM contribution: searching for rest periods set limit_resttime 300 ; # 5min set limit_restdist [expr 0.050*$DSCALE] ; # 50m set limit_restspeed [expr 0.3*$DSCALE] ; # 0.3kph set trt 0 ; # total resttime set tmt 0 ; # total time in motion set rest "" ; # list with index, chainage, tracktime, resttime #====== foreach tp $tps nxt [lreplace $tps 0 0] { # $tp altitude in user units and time-stamp in seconds if { [set al [UserAltitude [lindex $tp 6]]] != "" } { if { $al > $maxalt } { set maxalt $al set imaxalt $i } if { $al < $minalt } { set minalt $al set iminalt $i } } set secs $secs2 # $tp starts a new segment if the previous TP ended one set newsegm $endsegm lappend salts [list $secs $al $newsegm] # AP contribution (MF: from above) lappend tmp3D [list [lindex $tp 0] [lindex $tp 1] $datum] lappend tmp3D2 [list $al] #--- if { $nsgst == $i } { # $nxt starts a new segment, so $tp ends one set endsegm 1 set nsgst [lindex $segsts 0] ; set segsts [lreplace $segsts 0 0] } else { set endsegm 0 } if { $nxt != "" } { # proposed RM contribution: display chainage instead of # sum of distance from start to next; 2 of 4 # this line should be uncommented: # set sd [format "%8.3f" $td] set db [ComputeDistBearFD $tp $nxt] # distance to next in user units set d [expr [lindex $db 0]*$DSCALE] # total distance(chainage) set td [expr $td+$d] # bearing to next in degrees set b [format "%4d" [lindex $db 1]] # time difference to next in seconds set dt [expr [set secs2 [lindex $nxt 5]]-$secs] # distance from start to next in user units set d0 [expr [ComputeDistFD $tp0 $nxt]*$DSCALE] # maximum distance from first to next if { $d0 > $mxd0 } { set mxd0 $d0 ; set ismxd0 [expr $i+1] } elseif { $d0 == $mxd0 } { lappend ismxd0 [expr $i+1] } # AP contribution #======= set al2 [UserAltitude [lindex $nxt 6]] # MF change: add start segment flag for $nxt lappend lll [list $td $al2 $endsegm] #======= # RM contribution: searching for rest periods if { $dt != 0 } { # compute speed from current to next set sp [expr 3600.0*$d/$dt] } else { set sp 0 } if { $dt > $limit_resttime && $sp < $limit_restspeed && \ $d < $limit_restdist } { incr trt $dt; lappend rest [list $i $sd $tt $dt] } #======= # BS contribution # with MF change to cover cumulative descent # RM change: altitude threshold # MF change: using global option if { $al != "" && $al2 != "" } { if { $al2 > $al } { # upward set cumula_temp [expr $cumula_temp+$al2-$al] if { $cumuld_temp >= $ALTHRESHOLD } { set cumuld [expr $cumuld+$cumuld_temp] } else { # discard amount set cumula [expr $cumula-$cumuld_temp] } set cumuld_temp 0 } elseif { $al2 < $al } { # downward if { $cumula_temp >= $ALTHRESHOLD } { set cumula [expr $cumula+$cumula_temp] } else { # discard amount set cumuld [expr $cumuld-$cumula_temp] } set cumula_temp 0 set cumuld_temp [expr $cumuld_temp+$al-$al2] } } #======= # while $lll was updated with values for $nxt, $salts was # updated with values for $tp if { $endsegm } { # speed is meaningless set sp "======" } else { if { $dt != 0 } { # compute speed from current to next set sp [expr 3600*$d/$dt] lappend speeds [list $td $sp] lappend sspeeds [list $secs $sp] if { $sp > $mxsp } { set mxsp $sp ; set imx $i } if { $sp < $mnsp } { set mnsp $sp ; set imn $i } set sp [format "%6.2f" $sp] } else { set sp "======" } set tdng [expr $tdng+$d] ; incr ttng $dt } incr tt $dt set d [format "%8.2f" $d] # proposed RM contribution: display chainage instead of # sum of distance from start to next; 3 of 4 # next line should be commented out set sd [format "%8.2f" $td] set dt [FormatTime $dt] } else { set d "========" ; set dt "========" set sp "======" ; set b "====" # proposed RM contribution: display chainage instead of # sum of distance from start to next; 4 of 4 # next line should be replaced by # set sd [format "%8.3f" $td] set sd "========" } foreach box $boxes \ v [list [format "%4d." $i] [lindex $tp 4] \ [lindex $tp 2] [lindex $tp 3] $al $d $sd $dt $sp $b] { $box insert end $v } incr i } # AP contribution #======= #From this point on you can call: #Hgraph $lll #======= # BS contribution set cumula [expr $cumula+$cumula_temp] #======= # MF contribution: same for descent set cumuld [expr $cumuld+$cumuld_temp] #======= set td [format "%8.2f" $td] ; set tdng [format "%8.2f" $tdng] if { $tt == 0 } { set avsp "======" set mxp "======" ; set mnsp "======" set avspmot "======" } else { set avsp [format "%6.2f" [expr 3600*$td/$tt]] set mxsp [format "%6.2f" $mxsp] ; set mnsp [format "%6.2f" $mnsp] # RM contribution: avg speed in motion set tmt [expr $tt-$trt] set avspmot [format "%6.2f" [expr 3600*$td/$tmt]] #======= } set tt [FormatTime $tt] ; set ttng [FormatTime $ttng] set trt [FormatTime $trt] ; set tmt [FormatTime $tmt] set d0 [format "%8.2f" $d0] ; set mxd0 [format "%8.2f" $mxd0] frame $w.fr.fr3.frt -relief flat -borderwidth 0 label $w.fr.fr3.frt.td -text "$TXT(totdst): $td $DTUNIT" label $w.fr.fr3.frt.tt -text "$TXT(tottime): $tt" if { $tdng != $td || $ttng != $tt } { set gaps 1 frame $w.fr.fr3.frtng -relief flat -borderwidth 0 label $w.fr.fr3.frtng.td -text "$TXT(totdstng): $tdng $DTUNIT" label $w.fr.fr3.frtng.tt -text "$TXT(tottimeng): $ttng" } else { set gaps 0 } frame $w.fr.fr3.frsp -relief flat -borderwidth 0 label $w.fr.fr3.frsp.avg -text "$TXT(avgsp): $avsp $SPUNIT" label $w.fr.fr3.frsp.max -text "$TXT(maxsp): $mxsp (@$imx)" label $w.fr.fr3.frsp.min -text "$TXT(minsp): $mnsp (@$imn)" # RM contribution: $w.fr.fr3.frrest frame $w.fr.fr3.frrest -relief flat -borderwidth 0 label $w.fr.fr3.frrest.avg -text "$TXT(avgspmot): $avspmot $SPUNIT" label $w.fr.fr3.frrest.trt -text "$TXT(totresttime): $trt" if { $maxalt > -1e10 } { set hasalt 1 set maxalt [expr int(round($maxalt))] set minalt [expr int(round($minalt))] frame $w.fr.fr3.frmxnalt -relief flat -borderwidth 0 label $w.fr.fr3.frmxnalt.mx \ -text "$TXT(maxalt): $maxalt $ALUNIT (@$imaxalt)" label $w.fr.fr3.frmxnalt.mn \ -text "$TXT(minalt): $minalt $ALUNIT (@$iminalt)" # MF contribution: frame for cummulative ascent and descent # only used if there is altitude information and if the computed # values are compatible with the extreme altitude values set altdiff [expr $maxalt-$minalt] if { $cumula < $altdiff || $cumuld < $altdiff } { DisplayInfo [format $MESS(badcumuls) \ $altdiff $cumula $cumuld $ALTHRESHOLD $ALUNIT] set hascumul 0 } else { set hascumul 1 # MF change: cumulative ascent/descent valid independently of time set cumula [format "%6.0f" $cumula] set cumuld [format "%6.0f" $cumuld] frame $w.fr.fr3.frcad -relief flat -borderwidth 0 label $w.fr.fr3.frcad.cumuld \ -text "$TXT(alt_cumuld): $cumuld $ALUNIT" #======= # BS contribution label $w.fr.fr3.frcad.cumula \ -text "$TXT(alt_cumula): $cumula $ALUNIT" #====== # RM contribution: label $w.fr.fr3.frcad.thresh \ -text "($TXT(optALTHRESHOLD): $ALTHRESHOLD $ALUNIT)" } } else { set hasalt 0 } frame $w.fr.fr3.frd0 -relief flat -borderwidth 0 label $w.fr.fr3.frd0.toend -text [format $TXT(starttoend) $d0] label $w.fr.fr3.frd0.max -text "[format $TXT(startmax) $mxd0] (@$ismxd0)" frame $w.fr.frsel -relief flat -borderwidth 0 button $w.fr.frsel.save -text "$TXT(save) ..." \ -command "SaveFile comp TRComp $w ; \ $w.fr.frsel.save configure -state normal" button $w.fr.frsel.ok -text $TXT(ok) -command "destroy $w" # AP contribution; changed by MF #----- if { [llength $lll] < 3 } { set elevstate disabled } else { set elevstate normal } # menu used for plug-ins (see array PLGSWelcomed, plugins.tcl) set mn $w.fr.frsel.hgraph.mn menubutton $w.fr.frsel.hgraph -text $TXT(namePlot) -relief raised \ -menu $mn menu $mn -tearoff 0 # menu used for plug-ins (see array PLGSWelcomed, plugins.tcl) set mn1 $mn.el $mn add cascade -label $TXT(elevation) -menu $mn1 -state $elevstate menu $mn1 -tearoff 0 if { $edit } { $mn1 add command -label "$TXT(sideview)/$TXT(TRVdist)" \ -command "ManageAuxWindows TR add \[Hgraph {$lll} elevation\]" $mn1 add command -label "$TXT(sideview)/$TXT(TRVhour)" -command \ "ManageAuxWindows TR add \[Hgraph {$salts} elevation time\]" $mn1 add command -label $TXT(persptv) -command \ "ManageAuxWindows TR add \[HG3D {$tmp3D} {$tmp3D2} {$datum}\]" $mn1 add command -label $TXT(climbrate) -command \ "ManageAuxWindows TR add \[Hgraph {$salts} climbrate time\]" $mn add command -label "$TXT(speed)/$TXT(TRVdist)" \ -command "ManageAuxWindows TR add \[Hgraph {$speeds} speed\]" $mn add command -label "$TXT(speed)/$TXT(TRVhour)" \ -command "ManageAuxWindows TR add \[Hgraph {$sspeeds} speed time\]" } else { $mn1 add command -label "$TXT(sideview)/$TXT(TRVdist)" \ -command "Hgraph {$lll} elevation" $mn1 add command -label "$TXT(sideview)/$TXT(TRVhour)" \ -command "Hgraph {$salts} elevation time" $mn1 add command -label $TXT(persptv) \ -command "HG3D {$tmp3D} {$tmp3D2} {$datum}" $mn1 add command -label $TXT(climbrate) \ -command "Hgraph {$salts} climbrate time" $mn add command -label "$TXT(speed)/$TXT(TRVdist)" \ -command "Hgraph {$speeds} speed" $mn add command -label "$TXT(speed)/$TXT(TRVhour)" \ -command "Hgraph {$sspeeds} speed time" } #----- # menu used for plug-ins (see array PLGSWelcomed, plugins.tcl) set mn $w.fr.frsel.more.mn menubutton $w.fr.frsel.more -text $TXT(more) -relief raised \ -menu $mn menu $mn -tearoff 0 # menu used for plug-ins (see array PLGSWelcomed, plugins.tcl) pack $w.fr -side top pack $w.fr.fr1.ntitle -side left pack $w.fr.fr3.frtits.titxn $w.fr.fr3.frtits.titxd \ $w.fr.fr3.frtits.titxlat $w.fr.fr3.frtits.titxlong \ $w.fr.fr3.frtits.tital $w.fr.fr3.frtits.titxl $w.fr.fr3.frtits.tittl \ $w.fr.fr3.frtits.titdt $w.fr.fr3.frtits.titsp $w.fr.fr3.frtits.titbg \ $w.fr.fr3.frtits.fill -side left eval pack $boxes $w.fr.fr3.frbx.bscr -side left -fill y pack $w.fr.fr3.frt.td $w.fr.fr3.frt.tt -side left -padx 5 if { $gaps } { pack $w.fr.fr3.frtng.td $w.fr.fr3.frtng.tt -side left -padx 5 } pack $w.fr.fr3.frsp.avg $w.fr.fr3.frsp.max $w.fr.fr3.frsp.min \ -side left -padx 3 # RM contribution: $w.fr.fr3.frrest pack $w.fr.fr3.frrest.avg $w.fr.fr3.frrest.trt \ -side left -padx 3 pack $w.fr.fr3.frd0.toend $w.fr.fr3.frd0.max -side left -padx 2 pack $w.fr.fr3.frtits $w.fr.fr3.frbx -side top -fill y -pady 1 # BS contribution: $w.fr.fr3.frcad.cumul # MF change: using frame for cummulative ascent and descent and showing # altitude information only when available if { $hasalt } { pack $w.fr.fr3.frmxnalt.mx $w.fr.fr3.frmxnalt.mn -side left -padx 5 if { $hascumul } { pack $w.fr.fr3.frcad.cumula $w.fr.fr3.frcad.cumuld \ $w.fr.fr3.frcad.thresh -side left -padx 5 } pack $w.fr.fr3.frt -side top -fill y -pady 5 if { $gaps } { pack $w.fr.fr3.frtng -side top -fill y -pady 5 } if { $hascumul } { pack $w.fr.fr3.frsp $w.fr.fr3.frrest $w.fr.fr3.frmxnalt \ $w.fr.fr3.frcad $w.fr.fr3.frd0 -side top -fill y -pady 5 } else { pack $w.fr.fr3.frsp $w.fr.fr3.frrest $w.fr.fr3.frmxnalt \ $w.fr.fr3.frd0 -side top -fill y -pady 5 } } else { pack $w.fr.fr3.frt -side top -fill y -pady 5 if { $gaps } { pack $w.fr.fr3.frtng -side top -fill y -pady 5 } pack $w.fr.fr3.frsp $w.fr.fr3.frrest $w.fr.fr3.frd0 \ -side top -fill y -pady 5 } # AP contribution: hgraph button pack $w.fr.frsel.hgraph $w.fr.frsel.more $w.fr.frsel.save $w.fr.frsel.ok \ -side left -padx 5 pack $w.fr.fr1 $w.fr.fr3 $w.fr.frsel -side top AttachPlugIns $w ResetCursor . return } proc GMLine {index options data} { # create dialog window for editing/showing data of LN with given index # $options is a list of buttons to display; # $index is -1 if this is a new LN # an empty list means no editing; supported options are: # cancel, create, change, revert, forget # change and forget assume $index != -1 # see proc GMButton for further details # if $options is empty, $index cannot be -1 as this is not a new TR # the only button is OK, and only binding: return to destroy # order of elements in $data list reflects order in $Storage(LN) # which is used below # return window path global GMEd MapLoading DPOSX DPOSY COLOUR LISTHEIGHT COMMENTWIDTH \ OBSWIDTH OBSHEIGHT DATEWIDTH TXT DATUMWIDTH foreach "name obs datum pformt lps segsts width colour mbak displ" $data {} set ed 0 ; set st disabled if { $options != "" } { if { [winfo exists .gmLN] } { Raise .gmLN ; bell ; return .gmLN } set ed 1 ; set st normal set w .gmLN set GMEd(LN,Index) $index ; set GMEd(LN,Displ) $displ set GMEd(LN,Datum) $datum ; set GMEd(LN,PFrmt) $pformt set GMEd(LN,LPs) $lps ; set GMEd(LN,SgSts) $segsts set GMEd(LN,Colour) $colour ; set GMEd(LN,Width) $width set GMEd(LN,MapChg) 0 ; set GMEd(LN,MBack) $mbak # this depends on Storage(LN) set GMEd(LN,Data) $data set x $DPOSX set y $DPOSY } else { set w .gmLNsh$index if { [winfo exists $w] } { destroy $w } incr GMEd(LN,Show) set x [expr $DPOSX+50*((1+$GMEd(LN,Show)) % 5)] set y [expr $DPOSY+50*((1+$GMEd(LN,Show)) % 5)] } GMToplevel $w nameLN +$x+$y {} {} {} if { ! $ed } { wm protocol $w WM_DELETE_WINDOW "destroy $w" bind $w "destroy $w" } else { wm protocol $w WM_DELETE_WINDOW { GMButton LN cancel } } frame $w.fr -relief flat -borderwidth 5 -bg $COLOUR(dialbg) frame $w.fr.fr1 -relief flat -borderwidth 0 label $w.fr.fr1.ntitle -text "$TXT(name):" entry $w.fr.fr1.id -width $DATEWIDTH -exportselection 1 ShowTEdit $w.fr.fr1.id $name $ed frame $w.fr.fr2 -relief flat -borderwidth 0 label $w.fr.fr2.obstit -text "$TXT(rmrk):" text $w.fr.fr2.obs -wrap word -width $OBSWIDTH -height $OBSHEIGHT \ -exportselection true $w.fr.fr2.obs insert 0.0 $obs $w.fr.fr2.obs configure -state $st TextBindings $w.fr.fr2.obs frame $w.fr.frdpf -relief flat -borderwidth 0 menubutton $w.fr.frdpf.dttitle -text Datum -relief raised \ -direction below -menu $w.fr.frdpf.dttitle.m -state $st menu $w.fr.frdpf.dttitle.m -tearoff 0 menubutton $w.fr.frdpf.pfmt -text $TXT($pformt) -relief raised -width 8 \ -direction below -menu $w.fr.frdpf.pfmt.m -state $st menu $w.fr.frdpf.pfmt.m -tearoff 0 if { $ed } { FillDatumMenu $w.fr.frdpf.dttitle.m GMLNChangeDatum label $w.fr.frdpf.datum -text $GMEd(LN,Datum) \ -textvariable GMEd(LN,Datum) -width $DATUMWIDTH $w.fr.frdpf.pfmt configure -textvariable GMEd(LN,PFrmt) FillPFormtMenu $w.fr.frdpf.pfmt.m GMLNChangePFormt } else { label $w.fr.frdpf.datum -text $datum -width $DATUMWIDTH } frame $w.fr.fr3 -relief flat -borderwidth 0 frame $w.fr.fr3.frbx -relief flat -borderwidth 0 set boxes "" foreach b "n pos alt seg" m "5 30 7 1" { listbox $w.fr.fr3.frbx.bx$b -height 15 -width $m -relief flat \ -yscrollcommand "$w.fr.fr3.frbx.bscr set" \ -selectmode extended -exportselection false lappend boxes $w.fr.fr3.frbx.bx$b bind $w.fr.fr3.frbx.bx$b <> \ "MultExtSelect $w.fr.fr3.frbx.bx$b {bxn bxpos bxalt bxseg}" } if { $ed } { set GMEd(LN,boxes) $boxes foreach box $boxes { bind $box { GMLinePoint [%W nearest %y] } } bind $w.fr.fr3.frbx.bxseg { GMToggleSegStart LN %W [%W nearest %y] } } scrollbar $w.fr.fr3.frbx.bscr -command [list ScrollMany $boxes] Mscroll $boxes FillLPs $w $lps $segsts frame $w.fr.fr3.frbt -relief flat -borderwidth 0 button $w.fr.fr3.frbt.chh -text $TXT(chophd) -state $st \ -command { GMLNChange chh } button $w.fr.fr3.frbt.cht -text $TXT(choptl) -state $st \ -command { GMLNChange cht } foreach a "incb app" { button $w.fr.fr3.frbt.$a -text $TXT($a) -state $st \ -command "ChItemsCall LN single GMLNChange $a" } button $w.fr.fr3.frbt.loop -text $TXT(loop) -state $st \ -command { GMLNChange loop } button $w.fr.fr3.frbt.del -text $TXT(del) -state $st \ -command { GMLNChange del } button $w.fr.fr3.frbt.clear -text $TXT(clear) -state $st \ -command { GMLNChange clear } frame $w.fr.fr3.frbt.sep -height 6 -bg $COLOUR(dialbg) \ -relief flat -borderwidth 0 set mnc $w.fr.fr3.frbt.cnv.m menubutton $w.fr.fr3.frbt.cnv -text $TXT(convert) -relief raised \ -direction right -menu $mnc menu $mnc -tearoff 0 $mnc add command -label $TXT(mkTR) -command "LNToTR $w" $mnc add cascade -label $TXT(split) -menu $mnc.mns menu $mnc.mns -tearoff 0 $mnc.mns add command -label $TXT(bysel) \ -command "SplitPolyLine LN sel $w $ed $index" $mnc.mns add command -label $TXT(byseg) \ -command "SplitPolyLine LN segm $w $ed $index" frame $w.fr.frsel -relief flat -borderwidth 0 # frame used for plug-ins (see array PLGSWelcomed, plugins.tcl) frame $w.fr.frdw set mn $w.fr.frdw.mw.m menubutton $w.fr.frdw.mw -text $TXT(width) -relief raised \ -direction below -menu $mn -state $st menu $mn -tearoff 0 button $w.fr.frdw.b -text $TXT(Colour) -relief raised \ -command "ChooseColour GMEd GMEd(LN,Colour) $w.fr.frdw $w" \ -state $st label $w.fr.frdw.bc -relief groove -background $colour -width 2 frame $w.fr.frmb CreateMBackWidgets LN $w.fr.frmb $mbak $ed if { $ed } { checkbutton $w.fr.frdw.displayed -text $TXT(displ) \ -variable GMEd(LN,Displ) -onvalue 1 -offvalue 0 \ -selectcolor $COLOUR(check) foreach i "1 2 3 4 5 6 7 8" { $mn add command -label $i -command "set GMEd(LN,Width) $i" } label $w.fr.frdw.wv -width 3 -textvariable GMEd(LN,Width) if { $MapLoading != 0 } { foreach i "displayed mw b" { $w.fr.frdw.$i configure -state disabled } } set b $w.fr.frsel.b foreach e $options { button $b$e -text $TXT($e) \ -command "$b$e configure -state normal ; GMButton LN $e" pack $b$e -side left } } else { checkbutton $w.fr.frdw.displayed -text $TXT(displ) -state disabled \ -selectcolor $COLOUR(check) if { $displ } { $w.fr.frdw.displayed select } label $w.fr.frdw.wv -width 3 -text $width button $w.fr.frsel.b -text $TXT(ok) -command "destroy $w" pack $w.fr.frsel.b } pack $w.fr -side top pack $w.fr.fr1.ntitle $w.fr.fr1.id -side left -padx 3 pack $w.fr.fr2.obstit $w.fr.fr2.obs -side left -padx 3 pack $w.fr.frdpf.dttitle $w.fr.frdpf.datum -side left -padx 3 pack $w.fr.frdpf.pfmt -side left -padx 10 eval pack $boxes $w.fr.fr3.frbx.bscr -side left -fill y pack $w.fr.fr3.frbt.chh $w.fr.fr3.frbt.cht $w.fr.fr3.frbt.incb \ $w.fr.fr3.frbt.app $w.fr.fr3.frbt.loop $w.fr.fr3.frbt.del \ $w.fr.fr3.frbt.clear $w.fr.fr3.frbt.sep \ $w.fr.fr3.frbt.cnv -side top -pady 2 -fill x pack $w.fr.fr3.frbx $w.fr.fr3.frbt -side left -padx 5 pack $w.fr.frdw.displayed $w.fr.frdw.mw -side left -padx 3 pack $w.fr.frdw.wv -side left -padx 0 pack $w.fr.frdw.b -side left -padx 10 pack $w.fr.frdw.bc -side left -padx 0 pack $w.fr.fr1 $w.fr.fr2 $w.fr.frdpf $w.fr.fr3 $w.fr.frdw -side top -pady 5 pack $w.fr.frmb -side top pack $w.fr.frsel -side top -pady 5 AttachPlugIns $w update idletasks return $w } proc RevertLN {} { # reset data in LN edit window to initial values # this depends on Storage(LN) global GMEd set GMEd(LN,MapChg) 0 ; set data $GMEd(LN,Data) foreach box $GMEd(LN,boxes) { $box delete 0 end } .gmLN.fr.fr1.id delete 0 end .gmLN.fr.fr1.id insert 0 [lindex $data 0] .gmLN.fr.fr2.obs delete 1.0 end .gmLN.fr.fr2.obs insert 1.0 [lindex $data 1] foreach e "Datum PFrmt LPs SgSts Width Colour MBack Displ" \ v [lreplace $data 0 1] { set GMEd(LN,$e) $v } FillLPs .gmLN $GMEd(LN,LPs) $GMEd(LN,SgSts) .gmLN.fr.frdw.bc configure -background $GMEd(LN,Colour) if { $GMEd(LN,Displ) } { .gmLN.fr.frdw.displayed select } else { .gmLN.fr.frdw.displayed deselect } return } proc GMLNCheck {} { # check validity of data in LN edit window # this depends on Storage(LN) global GMEd MESS set id [.gmLN.fr.fr1.id get] if { ! [CheckString GMMessage $id] } { focus .gmLN.fr.fr1.id return nil } if { [llength $GMEd(LN,LPs)] < 2 } { GMMessage $MESS(voidLN) return nil } if { ! $GMEd(LN,MapChg) && \ ( $GMEd(LN,Width) != [lindex $GMEd(LN,Data) 6] || \ $GMEd(LN,Colour) != [lindex $GMEd(LN,Data) 7] ) } { set GMEd(LN,MapChg) 1 } set r [list $id [CheckNB [.gmLN.fr.fr2.obs get 0.0 end]]] foreach e "Datum PFrmt LPs SgSts Width Colour MBack Displ" { lappend r $GMEd(LN,$e) } return $r } proc GMLNChange {how args} { # perform edit operations on LN # $how is either one of the operations supported by GMPolyChange, or # loop add first point as last global GMEd switch $how { loop { set boxes $GMEd(LN,boxes) set bxn [lindex $boxes 0] if { [set n [$bxn size]] < 2 } { return } lappend GMEd(LN,LPs) [lindex $GMEd(LN,LPs) 0] $bxn insert end [format "%4d." [incr n]] foreach box [lreplace $boxes 0 0] { $box insert end [$box get 0] } } default { GMPolyChange LN $how $args } } return } proc GMLPChangeDatum {datum args} { # change datum of LP being edited # $args is not used but is needed as this is called-back from a menu ChangeDatum $datum GMEd GMEd(LP,Datum) nil .gmLP.fr.fr1.frp normal return } proc GMLinePoint {i} { # edit LP at position $i of listboxes in LN edit window # assume that the LN datum is kept compatible with LN position format global GMEd TXT INVTXT DPOSX DPOSY COLOUR ALUNIT if { [set lp [lindex $GMEd(LN,LPs) $i]] == "" } { return } foreach "posn alt" [lindex $GMEd(LN,LPs) $i] { break } if { $posn == "" } { return } set w .gmLP if { [winfo exists $w] } { Raise $w ; bell ; return } set pformt $GMEd(LN,PFrmt) set datum [set GMEd(LP,Datum) $GMEd(LN,Datum)] GMToplevel $w nameLP +$DPOSX+$DPOSY .gmLN \ [list WM_DELETE_WINDOW "destroy $w"] \ { {set GMEd(temp) 1 ; break}} frame $w.fr -relief flat -borderwidth 5 -bg $COLOUR(dialbg) label $w.fr.title -text $TXT(nameLP) frame $w.fr.fr1 -relief flat -borderwidth 0 ShowPosnDatum $w.fr.fr1 $pformt [list $posn] GMLPChangeDatum GMEd \ GMEd(LP,Datum) normal 1 nil frame $w.fr.fr11 -relief flat -borderwidth 0 label $w.fr.fr11.atit -text "$TXT(alt) ($ALUNIT):" entry $w.fr.fr11.alt -width 7 -exportselection 1 set valt [UserAltitude $alt] ShowTEdit $w.fr.fr11.alt $valt 1 frame $w.fr.frb -relief flat -borderwidth 0 button $w.fr.frb.ok -text $TXT(ok) -command "set GMEd(temp) 1" button $w.fr.frb.cnc -text $TXT(cancel) -command "set GMEd(temp) 0" pack $w.fr.fr11.atit $w.fr.fr11.alt -side left -padx 3 pack $w.fr.fr1.frp $w.fr.fr1.frd -side top -pady 3 pack $w.fr.frb.ok $w.fr.frb.cnc -side left pack $w.fr.title $w.fr.fr1 $w.fr.fr11 $w.fr.frb -side top -pady 5 pack $w.fr update idletasks set gs [grab current] grab $w raise $w while 1 { tkwait variable GMEd(temp) if { $GMEd(temp) == 0 } { set ok 0 ; break } set p [PosnGetCheck $w.fr.fr1.frp.frp1 $GMEd(LP,Datum) GMMessage nil] if { $p == "nil" } { continue } set valt [string trim [$w.fr.fr11.alt get]] if { [set alt [AltitudeList $valt]] != "nil" } { set ok 1 ; break } GMMessage $MESS(badalt) } if { $ok } { # this depends on what proc ShowPosnDatum does! set pf $INVTXT([$w.fr.fr1.frp.pfmt cget -text]) if { $pf != $pformt || $GMEd(LP,Datum) != $datum } { # LN datum is always compatible with LN position format set p [lindex [FormatPosition [lindex $p 0] [lindex $p 1] \ $GMEd(LP,Datum) $pformt $datum] 0] } set lp [list $p $alt] set GMEd(LN,LPs) [lreplace $GMEd(LN,LPs) $i $i $lp] foreach "x boxp boxa" $GMEd(LN,boxes) { break } set selected [$boxp selection includes $i] $boxp delete $i ; $boxp insert $i [lrange $p 2 end] $boxa delete $i ; $boxa insert $i [UserAltitude $alt] if { $selected } { foreach b $GMEd(LN,boxes) { $b selection set $i } } } DestroyRGrabs $w $gs update idletasks return } proc GMLNChangeDatum {datum args} { # change datum of LN being edited # $args not used but needed for call-back # this may fail if the current position format requires a fixed datum global GMEd MESS if { $datum == [set od $GMEd(LN,Datum)] || \ ( [lindex $GMEd(LN,LPs) 200] != "" && \ ! [GMConfirm $MESS(timeconsmg)] ) } { return } SetCursor . watch if { [set pts [ChangeLPsDatum $GMEd(LN,LPs) $od $datum $GMEd(LN,PFrmt)]] \ == -1 } { ResetCursor . return } set box [lindex $GMEd(LN,boxes) 1] set sel [$box curselection] $box delete 0 end foreach lp $pts { $box insert end [lrange [lindex $lp 0] 2 end] } foreach s $sel { $box selection set $s } foreach box $GMEd(LN,boxes) { $box see 0 } set GMEd(LN,LPs) $pts set GMEd(LN,Datum) $datum ResetCursor . return } proc ChangeLPsPFormt {lps pformt dvar dvref} { # change position format of a LN list of points # $dvar is global variable or array name containg current datum # $dvref is corresponding variable or array(element) name to use # in changing the datum if needs be global $dvar set odatum [set $dvref] if { [set gdatum [BadDatumFor $pformt $odatum Ignore]] != 0 } { set $dvref $gdatum return [ChangeLPsDatum $lps $odatum $gdatum $pformt] } set l "" foreach lp $lps { foreach "latd longd" [lindex $lp 0] { break } set p [lindex [FormatPosition $latd $longd $odatum $pformt $odatum] 0] lappend l [lreplace $lp 0 0 $p] } return $l } proc GMLNChangePFormt {pformt} { # change position format of LN being edited global GMEd TXT MESS if { $pformt == $GMEd(LN,PFrmt) || \ ( [lindex $GMEd(LN,LPs) 200] != "" && \ ! [GMConfirm $MESS(timeconsmg)] ) } { return } SetCursor . watch set pts [ChangeLPsPFormt $GMEd(LN,LPs) $pformt GMEd GMEd(LN,Datum)] set box [lindex $GMEd(LN,boxes) 1] set sel [$box curselection] $box delete 0 end foreach lp $pts { $box insert end [lrange [lindex $lp 0] 2 end] } foreach s $sel { $box selection set $s } foreach box $GMEd(LN,boxes) { $box see 0 } set GMEd(LN,LPs) $pts set GMEd(LN,PFrmt) $TXT($pformt) ResetCursor . return } proc FillLPs {w lps sgsts} { # insert LPs with segments $sgsts, in listboxes in LN edit/show # window $w set i 0 ; set nxt [lindex $sgsts 0] foreach lp $lps { if { $nxt == $i } { set seg "@" set sgsts [lreplace $sgsts 0 0] set nxt [lindex $sgsts 0] } else { set seg "" } incr i $w.fr.fr3.frbx.bxn insert end [format "%4d." $i] $w.fr.fr3.frbx.bxpos insert end [lrange [lindex $lp 0] 2 end] $w.fr.fr3.frbx.bxalt insert end [UserAltitude [lindex $lp 1]] $w.fr.fr3.frbx.bxseg insert end $seg } return } proc LNToTR {w} { # make a TR from the LN in window $w global GMEd LNLPoints LNDatum LNPFrmt LNSegStarts EdWindow TXT MESS set tpfsa "alt latd longd latDMS longDMS" set tps "" if { $w == ".gmLN" } { if { [set lps $GMEd(LN,LPs)] == "" } { GMMessage $MESS(voidLN) return } set datum $GMEd(LN,Datum) ; set pformt $GMEd(LN,PFrmt) set sgsts $GMEd(LN,SgSts) } else { set ix [IndexNamed LN [$w.fr.fr1.id get]] set lps $LNLPoints($ix) ; set datum $LNDatum($ix) set pformt $LNPFrmt($ix) ; set sgsts $LNSegStarts($ix) } foreach lp $lps { foreach "p alt" $lp { break } if { $pformt != "DMS" } { set p [FormatLatLong [lindex $p 0] [lindex $p 1] DMS] } set p [lrange $p 0 3] lappend tps [FormData TP $tpfsa [linsert $p 0 $alt]] } if { $tps == "" } { bell ; return } if { [winfo exists $EdWindow(TR)] } { set name [NewName TR] set data [FormData TR "Name Datum TPoints SegStarts" \ [list $name $datum $tps $sgsts]] CreateItem TR $data GMMessage [format $MESS(convres) $TXT(TR) $name] } else { set opts "create revert cancel" GMTrack -1 $opts [FormData TR "Datum TPoints SegStarts" \ [list $datum $tps $sgsts]] } return } proc GMLap {index options data} { # create dialog window for editing/showing data of LAP with given index # $options is a list of buttons to display; # $index is never -1, as LAPs cannot be created # an empty list means no editing; supported options are: # cancel, change, revert, forget # change and forget assume $index != -1, always true here # see proc GMButton for further details # if $options is empty, $index cannot be -1 as this is not a new LAP # the only button is OK, and only binding: return to destroy # the only things that can be changed in a LAP are the name, the # remark, the position format and the datum # order of elements in $data list reflects order in $Storage(LAP) # which is used below # return window path global GMEd DPOSX DPOSY COLOUR LISTHEIGHT COMMENTWIDTH \ OBSWIDTH OBSHEIGHT DATEWIDTH TXT SUBDSCALE DTUNIT SPUNIT \ ChangedLAPPos1 ChangedLAPPos2 foreach \ "name obs start dur dist begpos endpos cals trix pformt datum displ" \ $data {} set ed 0 ; set st disabled if { $options != "" } { if { [winfo exists .gmLAP] } { Raise .gmLAP ; bell ; return .gmLAP } set ed 1 ; set st normal set w .gmLAP set GMEd(LAP,Index) $index set GMEd(LAP,Datum) $datum ; set GMEd(LAP,PFrmt) $pformt # for uniformity, meaningless set GMEd(LAP,MapChg) 0 ; set GMEd(LAP,Displ) $displ # this depends on Storage(LAP) set GMEd(LAP,Data) $data set ChangedLAPPos1 $begpos ; set ChangedLAPPos2 $endpos set x $DPOSX set y $DPOSY } else { set w .gmLAPsh$index if { [winfo exists $w] } { destroy $w } incr GMEd(LAP,Show) set x [expr $DPOSX+50*((1+$GMEd(LAP,Show)) % 5)] set y [expr $DPOSY+50*((1+$GMEd(LAP,Show)) % 5)] } if { $start != "" && $dur != "" } { foreach "startdate startsecs" $start { break } set dsecs [TimeToSecs $dur] set enddate [DateFromSecs [expr $startsecs+round($dsecs)]] if { $dist != "" } { set dist [expr $dist*$SUBDSCALE] set avgspeed [format "%.2f $SPUNIT" [expr 3600.0*$dist/$dsecs]] set dist [format "%.3f $DTUNIT" $dist] } else { set avgspeed "" } } else { foreach v "startdate enddate avgspeed" { set $v "" } } GMToplevel $w nameLAP +$x+$y {} {} {} if { ! $ed } { wm protocol $w WM_DELETE_WINDOW "destroy $w" bind $w "destroy $w" } else { wm protocol $w WM_DELETE_WINDOW { GMButton LAP cancel } } frame $w.fr -relief flat -borderwidth 5 -bg $COLOUR(dialbg) frame $w.fr.fr1 -relief flat -borderwidth 0 label $w.fr.fr1.id -text "$TXT(name): $name" frame $w.fr.fr2 -relief flat -borderwidth 0 label $w.fr.fr2.obstit -text "$TXT(rmrk):" text $w.fr.fr2.obs -wrap word -width $OBSWIDTH -height $OBSHEIGHT \ -exportselection true $w.fr.fr2.obs insert 0.0 $obs $w.fr.fr2.obs configure -state $st TextBindings $w.fr.fr2.obs set frtm $w.fr.frtm frame $frtm -relief flat -borderwidth 0 label $frtm.strt -text "$TXT(start): $startdate" label $frtm.dur -text "$TXT(duration): $dur" label $frtm.end -text "$TXT(stop): $enddate" set frdi $w.fr.frdi frame $frdi -relief flat -borderwidth 0 label $frdi.dst -text "$TXT(distance): $dist" label $frdi.spd -text "$TXT(avgsp): $avgspeed" label $frdi.cls -text "$TXT(calrs): $cals" if { $ed } { ShowPosnDatum $w.fr $pformt [list $begpos $endpos] GMLAPChangeDatum \ GMEd GMEd(LAP,Datum) disabled 1 =ChangedLAPPos $w.fr.frp.pfmt configure -state normal $w.fr.frd.dttitle configure -state normal } else { ShowPosnDatum $w.fr $pformt [list $begpos $endpos] "" "" $datum $st \ 0 nil } set frtr $w.fr.frtr frame $frtr -relief flat -borderwidth 0 label $frtr.tit -text "$TXT(nameTR):" if { $trix < 253 && [set trixix [IndexNamed TR $trix]] != -1 } { set trst normal } else { set trst disabled ; set trixix -1 } button $frtr.tr -text $trix -command "OpenItem TR $trixix" -state $trst button $frtr.disp -text $TXT(displ) -command "GMLAPDisplayTR $trixix" \ -state $trst frame $w.fr.frsel -relief flat -borderwidth 0 if { $ed } { set b $w.fr.frsel.b foreach e $options { button $b$e -text $TXT($e) \ -command "$b$e configure -state normal ; GMButton LAP $e" pack $b$e -side left } } else { button $w.fr.frsel.b -text $TXT(ok) -command "destroy $w" pack $w.fr.frsel.b } pack $w.fr -side top pack $w.fr.fr1.id -side left -padx 3 pack $w.fr.fr2.obstit $w.fr.fr2.obs -side left -padx 3 set r -1 foreach x "strt dur end" { grid $frtm.$x -row [incr r] -column 0 -sticky w } set r -1 foreach x "dst spd cls" { grid $frdi.$x -row [incr r] -column 0 -sticky w } pack $frtr.tit $frtr.tr -side left -padx 0 pack $frtr.disp -side left -padx 5 grid $w.fr.fr1 -row 0 -column 0 -columnspan 2 grid $w.fr.fr2 -row 1 -column 0 -columnspan 2 -pady 5 grid $w.fr.frtm -row 2 -column 0 -pady 5 grid $w.fr.frdi -row 2 -column 1 -pady 5 -padx 10 grid $w.fr.frp -row 3 -column 0 -columnspan 2 -pady 5 grid $w.fr.frd -row 4 -column 0 -columnspan 2 -pady 5 grid $w.fr.frtr -row 5 -column 0 -columnspan 2 -pady 5 grid $w.fr.frsel -row 6 -column 0 -columnspan 2 -pady 5 update idletasks return $w } proc GMLAPCheck {} { # check validity of data in LAP edit window # this depends on Storage(LAP) # return "nil" on error global GMEd INVTXT ChangedLAPPos1 ChangedLAPPos2 set nb [CheckNB [.gmLAP.fr.fr2.obs get 0.0 end]] set data $GMEd(LAP,Data) set r [lreplace $data 1 1 $nb] set r [lreplace $r 5 6 $ChangedLAPPos1 $ChangedLAPPos2] return [lreplace $r 9 10 $INVTXT([.gmLAP.fr.frp.pfmt cget -text]) \ $GMEd(LAP,Datum)] } proc RevertLAP {} { # reset data in LAP edit window to initial values # this depends on Storage(LAP) global GMEd INVTXT POSTYPE set data $GMEd(LAP,Data) .gmLAP.fr.fr2.obs delete 1.0 end .gmLAP.fr.fr2.obs insert 1.0 [lindex $data 1] set pft $POSTYPE($INVTXT([.gmLAP.fr.frp.pfmt cget -text])) set opf [lindex $data 9] ; set t $POSTYPE($opf) set p1 [lindex $data 5] ; set p2 [lindex $data 6] if { $pft == $t } { RevertPos .gmLAP.fr.frp.frp1 $opf $t $p1 RevertPos .gmLAP.fr.frp.frp2 $opf $t $p2 } else { RedrawPos .gmLAP.fr.frp.frp1 $opf $p1 ChangedPosn1 disabled RedrawPos .gmLAP.fr.frp.frp2 $opf $p2 ChangedPosn2 disabled } set GMEd(LAP,PFormt) $opf set GMEd(LAP,Datum) [lindex $data 10] return } proc GMLAPChangeDatum {datum args} { # change datum of LAP being edited # $args is not used but is needed as this is called-back from a menu ChangeDatum $datum GMEd GMEd(LAP,Datum) =ChangedLAPPos .gmLAP.fr.frp normal return } proc GMLAPDisplayTR {ix} { # display existing TR associated to LAP # $ix is a valid TR index global TRDispl if { ! $TRDispl($ix) } { PutMap TR $ix } return } proc GMGroup {index options data} { # create dialog window for editing/showing data of GR with given index # $index is -1 if this is a new GR # $options is a list of buttons to display; # an empty list means no editing; supported options are: # cancel, create, change, revert, forget # change and forget assume $index != -1 # see proc GMButton for further details # if $options is empty, $index cannot be -1 as this is not a new GR # the only button is OK, and only binding: return to destroy # otherwise a button "Forget GR&Contents" is always created # order of elements in $data list reflects order in $Storage(GR) # which is used below # return window path global GMEd MapLoading DPOSX DPOSY COLOUR LISTHEIGHT COMMENTWIDTH \ OBSWIDTH OBSHEIGHT TXT TYPES SUPPORTLAPS set gtypes $TYPES if { $SUPPORTLAPS } { lappend gtypes LAP } foreach "name obs conts displ" $data {} set ed 0 ; set st disabled if { $options != "" } { if { [winfo exists .gmGR] } { Raise .gmGR ; bell ; return .gmGR } set ed 1 ; set st normal set w .gmGR set GMEd(GR,Index) $index ; set GMEd(GR,Displ) $displ set GMEd(GR,MapChg) 0 set GMEd(GR,types) $gtypes # this depends on Storage(GR) set GMEd(GR,Data) $data set x $DPOSX set y $DPOSY } else { set w .gmGRsh$index if { [winfo exists $w] } { destroy $w } incr GMEd(GR,Show) set x [expr $DPOSX+50*(1+$GMEd(GR,Show) % 5)] set y [expr $DPOSY+50*(1+$GMEd(GR,Show) % 5)] } toplevel $w wm title $w "$TXT(group)/GPS Manager" wm geometry $w +$x+$y if { ! $ed } { wm protocol $w WM_DELETE_WINDOW "destroy $w" bind $w "destroy $w" } else { wm protocol $w WM_DELETE_WINDOW { GMButton GR cancel } } frame $w.fr -relief flat -borderwidth 5 -bg $COLOUR(dialbg) frame $w.fr.fr1 -relief flat -borderwidth 0 label $w.fr.fr1.ntitle -text "$TXT(name):" entry $w.fr.fr1.id -width $COMMENTWIDTH -exportselection 1 ShowTEdit $w.fr.fr1.id $name $ed frame $w.fr.fr2 -relief flat -borderwidth 0 label $w.fr.fr2.obstit -text "$TXT(rmrk):" text $w.fr.fr2.obs -wrap word -width $OBSWIDTH -height $OBSHEIGHT \ -exportselection true $w.fr.fr2.obs insert 0.0 $obs $w.fr.fr2.obs configure -state $st TextBindings .gmGR.fr.fr2.obs frame $w.fr.fr3 -relief flat -borderwidth 0 frame $w.fr.fr3.frbx -relief flat -borderwidth 0 foreach b "bxn bxw box" m "4 4 $COMMENTWIDTH" { listbox $w.fr.fr3.frbx.$b -height 15 -width $m -relief flat \ -yscrollcommand "$w.fr.fr3.frbx.bscr set" \ -selectmode extended -exportselection false bind $w.fr.fr3.frbx.$b \ "GRActItem $w.fr.fr3.frbx.$b %y open" bind $w.fr.fr3.frbx.$b \ "GRActItem $w.fr.fr3.frbx.$b %y toggle" bind $w.fr.fr3.frbx.$b <> \ "MultExtSelect $w.fr.fr3.frbx.$b {bxn bxw box}" } # BSB contribution: wheelmouse scrolling set boxes [list $w.fr.fr3.frbx.box $w.fr.fr3.frbx.bxw $w.fr.fr3.frbx.bxn] scrollbar $w.fr.fr3.frbx.bscr -command [list ScrollMany $boxes] Mscroll $boxes set i 1 foreach p $conts { set wh [lindex $p 0] foreach e [lindex $p 1] { $w.fr.fr3.frbx.box insert end $e if { [IndexNamed $wh $e] == -1 } { $w.fr.fr3.frbx.box itemconfigure end \ -foreground $COLOUR(ballfg) } $w.fr.fr3.frbx.bxw insert end $TXT($wh) $w.fr.fr3.frbx.bxn insert end [format "%3d." $i] incr i } } frame $w.fr.fr3.frbt -relief flat -borderwidth 0 label $w.fr.fr3.frbt.title -text $TXT(element) foreach wh $gtypes { button $w.fr.fr3.frbt.ins$wh -relief raised \ -text "$TXT(insert) $TXT(name$wh)" -state $st \ -command "GMGRChange ins$wh ; \ $w.fr.fr3.frbt.ins$wh configure -state normal" } foreach a "del repl" { button $w.fr.fr3.frbt.$a -text $TXT($a) -state $st \ -command "GMGRChange $a" } frame $w.fr.fr3.frbt.sep -height 6 -bg $COLOUR(dialbg) \ -relief flat -borderwidth 0 button $w.fr.fr3.frbt.join -text $TXT(joinGR) -state $st \ -command "ChItemsCall GR single GMGRChange join" menu $w.fr.fr3.frbt.join.m -tearoff 0 button $w.fr.fr3.frbt.clear -text $TXT(clear) -state $st \ -command { GMGRChange clr } set uwpsm $w.fr.fr3.frbt.uwps.m menubutton $w.fr.fr3.frbt.uwps -text $TXT(usewps) -relief raised \ -direction right -menu $uwpsm menu $uwpsm -tearoff 0 $uwpsm add command -label $TXT(mkavgWP) \ -command "GMGRtoWP $w" $uwpsm add cascade -label $TXT(chgname) -menu $uwpsm.ren menu $uwpsm.ren menu $uwpsm.ren.m -postcommand \ [list FillDefsMenu renamethod $uwpsm.ren.m [list GMGRRenameWPs $w]] $uwpsm.ren add cascade -label $TXT(use) -menu $uwpsm.ren.m $uwpsm.ren add command -label $TXT(define) \ -command "GMGRRenameWPs $w \[Define renamethod\]" # JHT contribution: Change group waypoint symbol (menu item) $uwpsm add cascade -label $TXT(changegroupsymbol) \ -menu $uwpsm.symbol menu $uwpsm.symbol -tearoff 0 FillSymbolsMenu $uwpsm.symbol ChangeGroupSymbol #--- $uwpsm add cascade -label $TXT(chgpfrmt) \ -menu $uwpsm.mpf menu $uwpsm.mpf -tearoff 0 FillPFormtMenu $uwpsm.mpf GMGRChangeWPPFormt {} $w $uwpsm add cascade -label $TXT(chgdatum) \ -menu $uwpsm.mdat menu $uwpsm.mdat -tearoff 0 FillDatumMenu $uwpsm.mdat GMGRChangeWPDatum $uwpsm add command -label $TXT(mkclusters) \ -command "MakeClusters $w" frame $w.fr.frsel -relief flat -borderwidth 0 # frame used for plug-ins (see array PLGSWelcomed, plugins.tcl) frame $w.fr.frdw if { $ed } { checkbutton $w.fr.frdw.displayed -text $TXT(displ) \ -variable GMEd(GR,Displ) -onvalue 1 -offvalue 0 \ -selectcolor $COLOUR(check) if { $MapLoading != 0 } { $w.fr.frds.displayed configure -state disabled } set b $w.fr.frsel.b foreach e $options { button $b$e -text $TXT($e) \ -command "$b$e configure -state normal ; GMButton GR $e" pack $b$e -side left } button ${b}fgc -text $TXT(forgetGRcs) -command GRForgetConts pack ${b}fgc -side left -before $b$e } else { checkbutton $w.fr.frdw.displayed -text $TXT(displ) \ -state disabled -selectcolor $COLOUR(check) if { $displ } { $w.fr.frdw.displayed select } button $w.fr.frsel.bok -text $TXT(ok) -command "destroy $w" pack $w.fr.frsel.bok -side left } pack $w.fr -side top pack $w.fr.fr1.ntitle $w.fr.fr1.id -side left -padx 3 pack $w.fr.fr2.obstit $w.fr.fr2.obs -side left -padx 3 set f $w.fr.fr3.frbx pack $f.bxn $f.bxw $f.box $f.bscr -side left -fill y set f $w.fr.fr3.frbt pack $f.title -side top -pady 2 -fill x foreach wh $gtypes { pack $f.ins$wh -side top -pady 2 -fill x } pack $f.del $f.repl $f.sep $f.join $f.clear $w.fr.fr3.frbt.uwps \ -side top -pady 2 -fill x pack $w.fr.fr3.frbx $w.fr.fr3.frbt -side left -padx 5 pack $w.fr.frdw.displayed pack $w.fr.fr1 $w.fr.fr2 $w.fr.fr3 \ $w.fr.frdw $w.fr.frsel -side top -pady 5 AttachPlugIns $w update idletasks return $w } proc GRActItem {box y act} { # action on GR item # $box is the listbox causing action # $act in {open, toggle} global INVTXT COLOUR set p [winfo parent $box] ; set ixl [$box nearest $y] set n [$p.box get $ixl] set wh $INVTXT([$p.bxw get $ixl]) if { $n != "" } { if { [set ix [IndexNamed $wh $n]] != -1 } { set cl fg switch $act { open { OpenItem $wh $ix } toggle { ToggleDisplayNamed $wh $n } } } else { set cl ballfg } $p.box itemconfigure $ixl -foreground $COLOUR($cl) } return } proc RevertGR {} { # reset data in GR edit window to initial values # this depends on Storage(GR) global GMEd TXT set data $GMEd(GR,Data) .gmGR.fr.fr1.id delete 0 end .gmGR.fr.fr1.id insert 0 [lindex $GMEd(GR,Data) 0] .gmGR.fr.fr2.obs delete 0.0 end .gmGR.fr.fr2.obs insert 0.0 [lindex $data 1] .gmGR.fr.fr3.frbx.box delete 0 end .gmGR.fr.fr3.frbx.bxw delete 0 end .gmGR.fr.fr3.frbx.bxn delete 0 end set i 1 foreach p [lindex $data 2] { set wh [lindex $p 0] foreach e [lindex $p 1] { .gmGR.fr.fr3.frbx.box insert end $e .gmGR.fr.fr3.frbx.bxw insert end $TXT($wh) .gmGR.fr.fr3.frbx.bxn insert end [format "%3d." $i] incr i } } if { [set GMEd(GR,Displ) [lindex $data 3]] } { .gmGR.fr.frdw.displayed select } else { .gmGR.fr.frdw.displayed deselect } return } proc NotWellFounded {gr1 gr2} { global GRConts if { $gr1 == $gr2 } { return 1 } if { [set ix [IndexNamed GR $gr2]] != -1 } { foreach p $GRConts($ix) { if { [lindex $p 0] == "GR" } { foreach g [lindex $p 1] { if { [NotWellFounded $gr1 $g] } { return 1 } } } } } return 0 } proc GMGRCheck {} { # check validity of data in GR edit window # this depends on Storage(GR) global GMEd MESS INVTXT TYPES set id [.gmGR.fr.fr1.id get] if {! [CheckString GMMessage $id] } { focus .gmGR.fr.fr1.id return nil } if { [.gmGR.fr.fr3.frbx.box size] == 0 } { GMMessage $MESS(voidGR) return nil } set types $TYPES ; lappend types LAP foreach wh $types { set es($wh) "" } foreach twh [.gmGR.fr.fr3.frbx.bxw get 0 end] \ e [.gmGR.fr.fr3.frbx.box get 0 end] { lappend es($INVTXT($twh)) $e } if { $GMEd(GR,Index) != -1 && $id == [lindex $GMEd(GR,Data) 0] } { foreach g $es(GR) { if { [NotWellFounded $id $g] } { GMMessage "$MESS(initselfGR) $g" return nil } } } set cs "" foreach wh $types { if { $es($wh) != "" } { lappend cs [list $wh $es($wh)] } } return [list $id [CheckNB [.gmGR.fr.fr2.obs get 0.0 end]] $cs \ $GMEd(GR,Displ)] } proc GRInsert {wh list} { # insert elements in group being edited # $wh is type of elements whose names are in $list # GR well-foundedness will be checked when creating/changing global TXT INVTXT if { $list == "" || ! [winfo exists .gmGR] } { return } set n [.gmGR.fr.fr3.frbx.box size] for { set i 0 } { $i < $n } { incr i } { if { $INVTXT([.gmGR.fr.fr3.frbx.bxw get $i]) == $wh } { break } } set f $i while { $i<$n && $INVTXT([.gmGR.fr.fr3.frbx.bxw get $i]) == $wh } { incr i } set l $i foreach name $list { set ok 1 for { set k $f } { $k < $l } { incr k } { if { [.gmGR.fr.fr3.frbx.box get $k] == $name } { bell ; set ok 0 } } if { $ok } { foreach b "bxn box bxw" k "end $i $i" \ m [list [format "%3d." [expr $n+1]] $name $TXT($wh)] { .gmGR.fr.fr3.frbx.$b insert $k $m .gmGR.fr.fr3.frbx.$b selection clear 0 end } incr i ; incr n } } return } proc GRForgetConts {} { # forget a group being edited and all its contents global GMEd INVTXT MESS if { ! [GMConfirm $MESS(frgetGRcs)] || \ ! [winfo exists .gmGR] } { return } set id [.gmGR.fr.fr1.id get] if { [.gmGR.fr.fr3.frbx.box size] != 0 } { foreach wh $GMEd(GR,types) { set es_$wh "" } foreach twh [.gmGR.fr.fr3.frbx.bxw get 0 end] \ e [.gmGR.fr.fr3.frbx.box get 0 end] { lappend es_$INVTXT($twh) $e } if { $GMEd(GR,Index) != -1 && $id == [lindex $GMEd(GR,Data) 0] } { foreach g $es_GR { if { [NotWellFounded $id $g] } { GMMessage "$MESS(initselfGR) $g" return } } } foreach g $es_GR { foreach p [GRGetElements $g] { set wh [lindex $p 0] set es_$wh [concat [lindex $p 1] [set es_$wh]] } } foreach wh $GMEd(GR,types) { if { [set l [set es_$wh]] != "" } { set l [lsort $l] ; set prev "" while { $l != "" } { set n [lindex $l 0] ; set l [lreplace $l 0 0] if { $n != $prev } { set prev $n if { [set ix [IndexNamed $wh $n]] != -1 && \ [Forget $wh $ix] } { CloseItemWindows $wh $ix } } } } } } destroy .gmGR if { $GMEd(GR,Index) != -1 } { Forget GR $GMEd(GR,Index) } return } proc GMGRChange {how args} { # perform edit operations on GR # $how is one of # ins$wh insert item of type $wh (in {WP, RT, TR, GR, LAP?}) # del delete all selected items # repl replace first selected item by another one of same type # join join (set union) other GR # clr set to void # $args is the name of the new item for $how in {join} # Note that GMGRMapChg is not affected: changes in a mapped GR will not # affect mapping of its old or new elements global GRConts Number INVTXT set sel [.gmGR.fr.fr3.frbx.box curselection] switch -glob $how { ins* { regsub ins $how "" wh if { $Number($wh) > 0 } { GRInsert $wh [Apply [ChooseItems $wh] NameOf $wh] } } repl { # GR well-foundedness will be checked when creating/changing if { [set sel [lindex $sel 0]] == "" } { return } set wh $INVTXT([.gmGR.fr.fr3.frbx.bxw get $sel]) if { [set ix [ChooseItems $wh single]] == "" } { return } set new [NameOf $wh $ix] foreach e [.gmGR.fr.fr3.frbx.box get 0 end] \ ewh [.gmGR.fr.fr3.frbx.bxw get 0 end] { if { $wh == $INVTXT($ewh) && $new == $e } { bell return } } .gmGR.fr.fr3.frbx.box insert $sel $new .gmGR.fr.fr3.frbx.box delete [expr $sel+1] .gmGR.fr.fr3.frbx.box selection set $sel } del { if { $sel == "" } { return } foreach s [lsort -integer -decreasing $sel] { .gmGR.fr.fr3.frbx.box delete $s .gmGR.fr.fr3.frbx.bxw delete $s .gmGR.fr.fr3.frbx.bxn delete end } .gmGR.fr.fr3.frbx.bxw selection clear 0 end .gmGR.fr.fr3.frbx.bxn selection clear 0 end } join { foreach p $GRConts([IndexNamed GR [lindex $args 0]]) { GRInsert [lindex $p 0] [lindex $p 1] } } clr { .gmGR.fr.fr3.frbx.box delete 0 end .gmGR.fr.fr3.frbx.bxw delete 0 end .gmGR.fr.fr3.frbx.bxn delete 0 end } } return } proc GRGetElements {gr} { # collect all elements in GR $gr, recursively # assume GR is not being edited and that all GRs are well-founded # return list of pairs with type and list names of elements global GRConts TYPES SUPPORTLAPS set gtypes $TYPES if { $SUPPORTLAPS } { lappend gtypes LAP } if { [set ix [IndexNamed GR $gr]] == -1 } { return "" } foreach wh $gtypes { set es_$wh "" } set grs "" foreach p $GRConts($ix) { set wh [lindex $p 0] set es_$wh [lindex $p 1] if { $wh == "GR" } { set grs [set es_$wh] } } foreach g $grs { foreach p [GRGetElements $g] { set wh [lindex $p 0] set es_$wh [concat [lindex $p 1] [set es_$wh]] } } set ps "" foreach wh $gtypes { if { [set es_$wh] != "" } { lappend ps [list $wh [set es_$wh]] } } return $ps } proc GMGRCollectWPs {window} { # collect all WPs in GR shown in $window, recursively # return "void", "error" (a message is issued), or list of indices of WPs global TYPES INVTXT GMEd GMember MESS set id [$window.fr.fr1.id get] if { $window == ".gmGR" } { if { [.gmGR.fr.fr3.frbx.box size] == 0 } { return void } set gtypes $TYPES ; lappend gtypes LAP foreach wh $gtypes { set es($wh) "" } foreach twh [.gmGR.fr.fr3.frbx.bxw get 0 end] \ e [.gmGR.fr.fr3.frbx.box get 0 end] { lappend es($INVTXT($twh)) $e } if { $GMEd(GR,Index) != -1 && $id == [lindex $GMEd(GR,Data) 0] } { foreach g $es(GR) { if { [NotWellFounded $id $g] } { GMMessage "$MESS(initselfGR) $g" return "error" } } } catch {unset GMember} foreach wp $es(WP) { set GMember([IndexNamed WP $wp]) 1 } set grixs "" foreach gr $es(GR) { lappend grixs [IndexNamed GR $gr] } if { $grixs != "" } { GRsElsCollect $grixs 1 WP } set ixs [array names GMember] catch {unset GMember} } else { set grix [IndexNamed GR $id] set ixs [GRsElements $grix 1 WP] } return $ixs } proc GMGRCollectWPNames {window} { # collect all WP names in GR shown in $window (not recursively) # return list of names possibly empty global TXT INVTXT set names {} foreach twh [$window.fr.fr3.frbx.bxw get 0 end] \ name [$window.fr.fr3.frbx.box get 0 end] { if { $INVTXT($twh) == "WP" } { lappend names $name } } return $names } # JHT contribution: Change group waypoint symbol (gang edit) proc ChangeGroupSymbol {newsymbol window} { # change the symbol of all WPs in GR shown in $window global MESS EdWindow WPSymbol WPDispl regexp {^(\.[^.]+)\.} $window match window switch [set ixs [GMGRCollectWPs $window]] { void { GMMessage $MESS(voidGR) ; return } error { return } } if { $ixs == "" } { bell ; return } foreach ix $ixs { if { $WPSymbol($ix) != $newsymbol } { set WPSymbol($ix) $newsymbol UpdateItemWindows WP $ix if { $WPDispl($ix) } { ChangeMapWPSymbol $ix $newsymbol } } } return } proc GMGRChangeWPPFormt {pformt window} { # change the position format of all WPs in GR shown in $window # this may cause the datum of some WPs to be changed # nothing is done on WPs for which $pformt is invalid global MESS EdWindow WPPosn WPDatum WPPFrmt switch [set ixs [GMGRCollectWPs $window]] { void { GMMessage $MESS(voidGR) ; return } error { return } } if { $ixs == "" } { bell ; return } foreach ix $ixs { if { [set of $WPPFrmt($ix)] != $pformt } { foreach "la lo" $WPPosn($ix) { break } foreach "p pfmt datum" \ [FormatPosition $la $lo $WPDatum($ix) $pformt ""] { break } if { $pfmt != $of && [lindex $p 2] != "--" } { set WPPosn($ix) $p ; set WPPFrmt($ix) $pfmt set WPDatum($ix) $datum UpdateItemWindows WP $ix } } } return } proc GMGRChangeWPDatum {datum menu} { # change the datum of all WPs in GR shown in top-level window with $menu # fails silently for each WP whose position format is a grid requiring # a different datum global MESS EdWindow WPPosn WPDatum WPPFrmt regexp {^(\.[^.]+)\.} $menu match window switch [set ixs [GMGRCollectWPs $window]] { void { GMMessage $MESS(voidGR) ; return } error { return } } if { $ixs == "" } { bell ; return } foreach ix $ixs { if { [set od $WPDatum($ix)] != $datum } { set pfmt $WPPFrmt($ix) if { [BadDatumFor $pfmt $datum Ignore] != 0 } { continue } set p $WPPosn($ix) set WPPosn($ix) [lindex [FormatPosition [lindex $p 0] \ [lindex $p 1] $od $pfmt $datum] 0] set WPDatum($ix) $datum UpdateItemWindows WP $ix } } return } proc GMToggleSegStart {wh w ix} { # toggle segment start flag at index $ix in listbox $w of edit window # $wh in {TR, LN} global GMEd if { $ix <= 0 || $ix >= [$w size] } { return } if { [$w get $ix] == "" } { set seg "@" set GMEd($wh,SgSts) [lsort -integer -increasing \ [linsert $GMEd($wh,SgSts) 0 $ix]] } else { set seg "" if { [set k [lsearch -exact $GMEd($wh,SgSts) $ix]] == -1 } { return } set GMEd($wh,SgSts) [lreplace $GMEd($wh,SgSts) $k $k] } set selected [$w selection includes $ix] $w delete $ix ; $w insert $ix $seg if { $selected } { $w selection set $ix } set GMEd($wh,MapChg) 1 return } proc ChopPolyline {wh whpt ix1 ixn} { # delete all points in polyline in range $ix1 to $ixn (indices from 0) # and may extend to the end # $wh in {TR, LN} # $whpt in {TP, LP} depending on $wh # adjust segments and keep selections global GMEd set boxes $GMEd($wh,boxes) set bxn [lindex $boxes 0] set sel [$bxn curselection] set n [$bxn size] if { $ixn == "end" } { set ixn [expr $n-1] } # MB contribution if { $ix1 == "end" } { set ix1 [expr $n-1] } #--- set dn [expr $ixn-$ix1+1] if { $ix1 == $ixn } { set fd end } else { set fd [expr $n-$dn] } foreach box [lreplace $boxes 0 0] { $box delete $ix1 $ixn $box see $ix1 } set ixnn [expr $ixn+1] if { $ix1 == 0 } { # make sure new first point is not marked as starting a segment set bxseg [lindex $boxes end] $bxseg delete 0 ; $bxseg insert 0 "" if { [lsearch -exact $sel $ixnn] != -1 } { $bxseg selection set 0 } } $bxn selection clear $ix1 $ixn $bxn delete $fd end $bxn see $ix1 foreach sl $sel { if { $sl > $ixn } { $bxn selection set [expr $sl-$dn] } } if { [set GMEd($wh,${whpt}s) [lreplace $GMEd($wh,${whpt}s) $ix1 $ixn]] \ == "" } { set GMEd($wh,SgSts) "" } else { set sgs "" ; incr ixn foreach sp $GMEd($wh,SgSts) { if { $sp < $ix1 } { lappend sgs $sp } elseif { $sp > $ixn && $sp > $dn } { lappend sgs [expr $sp-$dn] } } set GMEd($wh,SgSts) $sgs } return } proc SplitPolyLine {wh how w ed ix} { # split a polyline into similar items # $wh in {RT, TR, LN} # $how in {sel, segm}: split using selected points or segment starters # $w window with poolyline to split # $ed set if $w is edit window # $ix index of item to split (may be -1 if $ed) # create a group with the new items # there is a local variable Datum not to be confused with the global one! global GMEd RTIdNumber RTStages RTWidth RTColour RTMBack TRName TRDatum \ TRTPoints TRSegStarts TRWidth TRColour TRMBack LNName LNDatum LNPFrmt \ LNLPoints LNSegStarts LNWidth LNColour LNMBack GRName MESS TXT set newixs "" if { $wh == "RT" } { # $how must be "sel" set box $w.fr.fr3.fr31.frbx.box if { [set sel [$box curselection]] == "" || \ [set wpns [$box get 0 end]] == "" } { bell ; return } if { $ed } { set Stages [GMRTStages $w.fr.fr3.fr31.frbx] foreach t "Width Colour MBack" { set $t $GMEd(RT,$t) } set orgname [$w.fr.fr1.id get] } else { foreach t "IdNumber Stages Width Colour MBack" { set $t [set RT[set t]($ix)] } set orgname $IdNumber } set fs "IdNumber WPoints Stages Width Colour MBack" foreach p [MakeSplit [list $wpns $Stages] $sel] { foreach "wps sts" $p {} if { [llength $wps] > 1 } { set id [NewName RT] set data [FormData RT $fs \ [list $id $wps $sts $Width $Colour $MBack]] CreateItem RT $data SetWPRoute $id $wps lappend newits $id } } } else { # TR or LN set pre [string index $wh 0] set fs "Name Datum ${pre}Points Width Colour MBack" if { $wh == "LN" } { set line 1 lappend fs PFrmt } else { set line 0 } if { $ed } { set ptsref "${pre}Ps" foreach t "Datum $ptsref SgSts Width Colour MBack" { set $t $GMEd($wh,$t) } if { $line } { set PFrmt $GMEd($wh,PFrmt) } set SegStarts $SgSts set orgname [$w.fr.fr1.id get] } else { set ptsref "${pre}Points" foreach t "Name Datum $ptsref SegStarts Width Colour MBack" { set $t [set $wh[set t]($ix)] } if { $line } { set PFrmt $LNPFrmt($ix) } set orgname $Name } if { [set pts [set $ptsref]] == "" } { bell ; return } if { $how == "sel" } { set box $w.fr.fr3.frbx.bxn set sel [$box curselection] set segs 1 lappend fs SegStarts set del 0 set sgstnxt [lindex $SegStarts 0] set SegStarts [lreplace $SegStarts 0 0] } else { set sel $SegStarts set segs 0 } if { $sel == "" } { bell ; return } foreach xps [MakeSplit [list $pts] $sel] { set xps [lindex $xps 0] if { [set nxps [llength $xps]] > 1 } { set name [NewName $wh] set dt [list $name $Datum $xps $Width $Colour $MBack] if { $line } { lappend dt $PFrmt } if { $segs } { set xsegs "" while { [set ns [expr $sgstnxt-$del]] < $nxps } { if { $ns > 0 } { lappend xsegs $ns } if { [set sgstnxt [lindex $SegStarts 0]] == "" } { break } set SegStarts [lreplace $SegStarts 0 0] } lappend dt $xsegs incr del $nxps } set data [FormData $wh $fs $dt] CreateItem $wh $data lappend newits $name if { $segs && $sgstnxt == "" } { set fs [Delete $fs SegStarts] set segs 0 } } elseif { $segs && $nxps == 1 } { if { $sgstnxt-$del == 0 } { if { [set sgstnxt [lindex $SegStarts 0]] == "" } { set fs [Delete $fs SegStarts] set segs 0 } else { set SegStarts [lreplace $SegStarts 0 0] } } incr del } } } if { $newits != "" } { set obs [format $MESS(obssplit) $wh $orgname] set grix [CreateGRFor split $obs [list [list $wh $newits]]] GMMessage [format $MESS(convres) $TXT(GR) $GRName($grix)] } return } proc GMPolyChange {wh how args} { # perform edit operations on polyline # $wh in {TR, LN} # $how is one of # chh chop head: delete all points from the beginning to first # selected or only the first one # cht chop tail: delete all points from the last selected to end # or only the last one # incb include a similar polyline at the beginning # app append a polyline (to end, of course) # loop add first point to end # del delete all selected points # clear delete all points # $args has the name of the other polyline when $how is in {incb, app} global TRTPoints TRSegStarts TRDatum LNLPoints LNSegStarts LNDatum \ LNPFrmt GMEd EdWindow set whpt $GMEd($wh,ptname) set GMEd($wh,MapChg) 1 set boxes $GMEd($wh,boxes) set bxn [lindex $boxes 0] set sel [lsort -integer -increasing [$bxn curselection]] set sel0 [lindex $sel 0] ; set sell [lindex $sel end] switch $how { chh { if { [$bxn size] == 0 } { return } if { $sel == "" } { set sel0 0 } ChopPolyline $wh $whpt 0 $sel0 } cht { if { [$bxn size] == 0 } { return } if { $sel == "" } { set sell end } ChopPolyline $wh $whpt $sell end } incb { set name [lindex [lindex $args 0] 0] if { [set ix [IndexNamed $wh $name]] != -1 } { set pts [set ${wh}${whpt}oints($ix)] set sgs [set ${wh}SegStarts($ix)] set datum [set ${wh}Datum($ix)] foreach box $boxes { $box selection clear 0 end } set dboxes [lreplace $boxes 0 0] set npts [$bxn size] ; set ins 0 switch $wh { TR { if { $GMEd($wh,Datum) != $datum } { set pts [ChangeTPsDatum $pts $dat $GMEd($wh,Datum)] } if { $npts == 0 } { FillTPs $EdWindow($wh) $pts $sgs set GMEd($wh,${whpt}s) $pts set GMEd($wh,SgSts) $sgs return } if { [set d [GMTRNewDate $pts $GMEd(TR,TPs)]] == -1 } { return } set d [expr [lindex $d 1]- \ [lindex [lindex $GMEd(TR,TPs) 0] 5]] foreach tp $pts { incr npts $bxn insert end [format "%4d." $npts] foreach box $dboxes \ v [list [lindex $tp 4] \ [lindex $tp 2] [lindex $tp 3] \ [UserAltitude [lindex $tp 6]] \ [lindex $tp 7] \ ""] { $box insert $ins $v } incr ins } set l $pts foreach tp $GMEd(TR,TPs) { set ns [expr [lindex $tp 5]+$d] set nd [DateFromSecs $ns] lappend l [lreplace $tp 4 5 $nd $ns] .gmTR.fr.fr3.frbx.bxd delete $ins .gmTR.fr.fr3.frbx.bxd insert $ins $nd incr ins } set pts $l } LN { if { $GMEd($wh,Datum) != $datum } { set pts [ChangeLPsDatum $pts $datum \ $GMEd($wh,Datum) $GMEd(LN,PFrmt)] } elseif { $LNPFrmt($ix) != $GMEd(LN,PFrmt) } { set GMEd(temp) $GMEd($wh,Datum) set pts [ChangeLPsPFormt $pts $GMEd(LN,PFrmt) \ GMEd GMEd(temp)] } if { $npts == 0 } { FillLPs $EdWindow($wh) $pts $sgs set GMEd($wh,${whpt}s) $pts set GMEd($wh,SgSts) $sgs return } foreach lp $pts { incr npts $bxn insert end [format "%4d." $npts] foreach box $dboxes \ v [list [lrange [lindex $lp 0] 2 end] \ [UserAltitude [lindex $lp 1]] \ ""] { $box insert $ins $v } incr ins } set pts [concat $pts $GMEd($wh,${whpt}s)] } } set GMEd($wh,${whpt}s) $pts set usgs "" foreach sp $GMEd($wh,SgSts) { lappend usgs [expr $sp+$ins] } set GMEd($wh,SgSts) [concat $sgs $usgs] set bxseg [lindex $boxes end] foreach sp $sgs { $bxseg delete $sp $bxseg insert $sp "@" } } } app { set name [lindex [lindex $args 0] 0] if { [set ix [IndexNamed $wh $name]] != -1 } { set pts [set ${wh}${whpt}oints($ix)] set sgs [set ${wh}SegStarts($ix)] set datum [set ${wh}Datum($ix)] foreach box $boxes { $box selection clear 0 end } set dboxes [lreplace $boxes 0 0] set ins [set npts [$bxn size]] switch $wh { TR { if { $GMEd($wh,Datum) != $datum } { set pts [ChangeTPsDatum $pts $dat $GMEd($wh,Datum)] } if { $npts == 0 } { FillTPs $EdWindow($wh) $pts $sgs set GMEd($wh,${whpt}s) $pts set GMEd($wh,SgSts) $sgs return } if { [set d [GMTRNewDate $GMEd(TR,TPs) $pts]] == -1 } { return } set d [expr [lindex $d 1]- \ [lindex [lindex $pts 0] 5]] set l $GMEd(TR,TPs) foreach tp $pts { incr ins set ns [expr [lindex $tp 5]+$d] set nd [DateFromSecs $ns] lappend l [lreplace $tp 4 5 $nd $ns] foreach box $boxes \ v [list [format "%4d." $ins] \ $nd \ [lindex $tp 2] [lindex $tp 3] \ [UserAltitude [lindex $tp 6]] \ [lindex $tp 7] \ ""] { $box insert end $v } } set GMEd(TR,TPs) $l } LN { if { $GMEd($wh,Datum) != $datum } { set pts [ChangeLPsDatum $pts $datum \ $GMEd($wh,Datum) $GMEd(LN,PFrmt)] } elseif { $LNPFrmt($ix) != $GMEd(LN,PFrmt) } { set GMEd(temp) $GMEd($wh,Datum) set pts [ChangeLPsPFormt $pts $GMEd(LN,PFrmt) \ GMEd GMEd(temp)] } if { $npts == 0 } { FillLPs $EdWindow($wh) $pts $sgs set GMEd($wh,${whpt}s) $pts set GMEd($wh,SgSts) $sgs return } foreach lp $pts { incr ins foreach box $boxes \ v [list [format "%4d." $ins] \ [lrange [lindex $lp 0] 2 end] \ [UserAltitude [lindex $lp 1]] \ ""] { $box insert end $v } } set GMEd(LN,LPs) [concat $GMEd(LN,LPs) $pts] } } set bxseg [lindex $boxes end] foreach sp $sgs { lappend GMEd($wh,SgSts) [set i [expr $sp+$npts]] $bxseg delete $i $bxseg insert $i "@" } } } del { # MB contribution if { [$bxn size] == 0 } { return } if { $sel == "" } { set sel 0 } # MF change: $sel is now a list foreach sl [lsort -integer -decreasing $sel] { ChopPolyline $wh $whpt $sl $sl } } clear { if { [$bxn size] == 0 } { return } ChopPolyline $wh $whpt 0 end } } return } proc GMButton {wh button} { # callback to button when editing item of type $wh (in $TYPES or "LAP") # $button in {cancel, create, change, revert, forget} global Storage EdWindow WPRoute RTIdNumber RTWPoints \ GRConts GMEd MESS TXT MapMakingRT DataIndex set w $EdWindow($wh) set ids [lindex $Storage($wh) 0] global $ids switch $button { cancel { destroy $w if { $MapMakingRT && $wh == "RT" } { MapCancelRT dontask dontclose } } create { if { $MapMakingRT && $wh == "RT" } { MapFinishRTLastWP } set data [GM${wh}Check] if { $data != "nil" } { if { ! [CheckArrayElement $ids [lindex $data 0]] } { # new name set ix [CreateItem $wh $data] if { $wh == "RT" } { SetWPRoute [lindex $data 0] [lindex $data 3] } if { $GMEd($wh,Displ) } { PutMap $wh $ix } destroy $w } else { GMMessage $MESS(idinuse) focus $w.fr.fr1.id return } } } change { # $GMEd($wh,Index) assumed > -1 if { $MapMakingRT && $wh == "RT" } { MapFinishRTLastWP } set data [GM${wh}Check] if { $data != "nil" } { set ix $GMEd($wh,Index) set oldname [set [set ids]($ix)] set newname [lindex $data 0] set diffname [string compare $oldname $newname] set mapped [lindex $GMEd($wh,Data) end] set tomap $GMEd($wh,Displ) if { $diffname } { if { [CheckArrayElement $ids $newname] } { GMMessage $MESS(idinuse) focus $w.fr.fr1.id return } } if { $wh == "RT" } { set oldwps $GMEd(RT,WPoints) set rtwps [lindex $data 3] set newwps [Subtract $rtwps $oldwps] set keptwps [Subtract $rtwps $newwps] set delwps [Subtract $oldwps $keptwps] UnsetWPRoute $oldname $delwps if { $diffname } { RenameWPRoute $oldname $newname $keptwps SetWPRoute $newname $newwps } else { SetWPRoute $oldname $newwps } } if { $mapped } { if { $tomap } { SetItem $wh $ix $data if { $GMEd($wh,MapChg) } { MoveOnMap $wh $ix $oldname $diffname $newname } } elseif { [UnMap $wh $ix] } { SetItem $wh $ix $data } else { GMMessage [format $MESS(cantunmap) $TXT(name$wh)] return } } else { SetItem $wh $ix $data if { $tomap } { PutMap $wh $ix } } if { $diffname } { ListDelete $wh $ix ; ListAdd $wh $ix if { $wh == "WP" } { foreach rt $WPRoute($ix) { set ixrt [IndexNamed RT $rt] set i [lsearch -exact $RTWPoints($ixrt) $oldname] set RTWPoints($ixrt) \ [lreplace $RTWPoints($ixrt) $i $i $newname] } } foreach grix [array names GRConts] { set i 0 foreach p $GRConts($grix) { if { [lindex $p 0] == $wh } { set es [lindex $p 1] if { [lsearch -exact $es $newname] == -1 \ && [set j [lsearch -exact $es $oldname]] \ != -1 } { set GRConts($grix) [lreplace \ $GRConts($grix) $i $i \ [list $wh [lreplace $es $j $j \ $newname]]] UpdateItemWindows GR $grix } break } incr i } } } if { $wh == "WP" } { if { $GMEd(WP,MapChg) } { ChangeWPInRTWindows $oldname $newname 1 } elseif { $diffname } { ChangeWPInRTWindows $oldname $newname 0 } } destroy $w } } revert { if { [GMConfirm $MESS(askrevert)] } { Revert$wh } } forget { # $GMEd($wh,Index) assumed > -1 if { [GMConfirm [format $MESS(askforget) $TXT(name$wh)]] && \ [Forget $wh $GMEd($wh,Index)] } { destroy $w } } } return } # track utilities proc GMTRChangeDatum {datum args} { # change datum of TR being edited # $args is not used but is needed as this is called-back from a menu global GMEd MESS if { $GMEd(TR,Datum) == $datum || \ ( [lindex $GMEd(TR,TPs) 200] != "" && \ ! [GMConfirm $MESS(timeconsmg)] ) } { return } SetCursor . watch set GMEd(TR,TPs) [ChangeTPsDatum $GMEd(TR,TPs) $GMEd(TR,Datum) $datum] set sel [.gmTR.fr.fr3.frbx.bxn curselection] foreach n "n d lat long" { .gmTR.fr.fr3.frbx.bx$n delete 0 end } FillTPs .gmTR $GMEd(TR,TPs) $GMEd(TR,SgSts) foreach sl $sel { foreach n "n d lat long" { .gmTR.fr.fr3.frbx.bx$n selection set $sl } } set GMEd(TR,Datum) $datum ResetCursor . return } proc FillTPs {w tps sgsts} { # insert TPs with segments $sgsts, in listboxes in TR edit/show window $w set i 0 ; set nxt [lindex $sgsts 0] foreach tp $tps { if { $nxt == $i } { set seg "@" set sgsts [lreplace $sgsts 0 0] set nxt [lindex $sgsts 0] } else { set seg "" } incr i $w.fr.fr3.frbx.bxn insert end [format "%4d." $i] $w.fr.fr3.frbx.bxd insert end [lindex $tp 4] $w.fr.fr3.frbx.bxlat insert end [lindex $tp 2] $w.fr.fr3.frbx.bxlong insert end [lindex $tp 3] $w.fr.fr3.frbx.bxalt insert end [UserAltitude [lindex $tp 6]] $w.fr.fr3.frbx.bxdep insert end [lindex $tp 7] $w.fr.fr3.frbx.bxseg insert end $seg } return } proc MarkPoint {wh w ix} { # use a position at index $ix in listbox of window $w to create # a new WP # $wh in {TR, PVT} # ==TR: use TP with given index in TR edit/show window # ==PVT: use point in real-time track log window (Garmin) global GMEd TRTPoints CREATIONDATE PVTPosns switch $wh { TR { set dat [$w.fr.frd.datum cget -text] if { $w == ".gmTR" } { set p [lindex $GMEd(TR,TPs) $ix] } else { set ixt [IndexNamed TR [$w.fr.fr1.id get]] set p [lindex $TRTPoints($ixt) $ix] } if { $p == "" } { return } set alt [lindex $p 6] } PVT { if { [set p [lindex $PVTPosns $ix]] == "" } { return } set dat "WGS 84" set alt [$w.fri.frtbx.bxalt get $ix] } } set opts "create revert cancel" if { $CREATIONDATE } { GMWPoint -1 $opts [FormData WP "PFrmt Posn Datum Alt Date" \ [list DMS $p $dat $alt [Now]]] } else { GMWPoint -1 $opts [FormData WP "Commt PFrmt Posn Datum Alt" \ [list [DateCommt [Now]] DMS $p $dat $alt]] } return } ### varia proc ShowPosnDatum {w pformt posns dproc dvar dvref st ed chgvorp} { # show position format menu, position and datum under parent window $w # $pformt is position format # $posns is a list of position representations # $dproc is proc to be called when changing datum (if editing is allowed) # $dvar is name of global variable or array with datum if editing, # or empty string if not editing # $dvref is the reference to the datum variable or array(element) to # be set if editing, or the datum name if not # $st is state of editable widgets # $ed is 1 if edition is allowed # $chgvorp is either "nil" or: # - if there is a single position, the name of global variable to # set to 1 if the user types in any entry and that contains the # current position otherwise; see procs ChangePFormt and # PosnGetCheckEmpty # - else, "=PREFIX" describing global variables used in the same # way for each position; each name has the prefix followed by the # number from 1 of the position # frames $w.frp and $w.frd are created that should be packed by the caller # there will be frames $w.frp.frp1, $w.frp.frp2, ... with the widgets for # each position # widgets created here are used elsewhere global TXT DATUMWIDTH frame $w.frp -relief flat -borderwidth 0 # path to this menubutton used elsewhere menubutton $w.frp.pfmt -text $TXT($pformt) -relief raised -width 8 \ -direction below -menu $w.frp.pfmt.m -state $st menu $w.frp.pfmt.m -tearoff 0 if { $ed } { FillPFormtMenu $w.frp.pfmt.m ChangePFormt {} $dvar $dvref $w.frp \ $chgvorp $st } pack $w.frp.pfmt -side left -padx 3 FillPos $w.frp $pformt $posns $st $chgvorp frame $w.frd -relief flat -borderwidth 0 menubutton $w.frd.dttitle -text Datum -relief raised \ -direction below -menu $w.frd.dttitle.m -state $st menu $w.frd.dttitle.m -tearoff 0 if { $ed } { global $dvar FillDatumMenu $w.frd.dttitle.m $dproc label $w.frd.datum -text [set $dvref] -textvariable $dvref \ -width $DATUMWIDTH } else { label $w.frd.datum -text $dvref \ -width $DATUMWIDTH } pack $w.frd.dttitle $w.frd.datum -side left -padx 3 return } ## opening and updating edit/show windows proc OpenItem {wh index} { # edit or display item with given index; $wh in $TYPES or "LAP" global EdWindow Proc GMEd MESS TXT if { $index == -1 } { GMMessage $MESS(notlisted) ; return "" } set w $EdWindow($wh) if { [winfo exists $w] } { if { $GMEd($wh,Index) == $index } { Raise $w ; bell return "" } else { set w [$Proc($wh) $index "" [ItemData $wh $index]] } } elseif { $wh != "LAP" } { set w [$Proc($wh) $index "change revert create forget cancel" \ [ItemData $wh $index]] } else { # LAPs cannot be created set w [$Proc($wh) $index "change revert forget cancel" \ [ItemData $wh $index]] } return $w } proc OpenSelItems {wh} { # select and open items of given type # $wh in $TYPES foreach ix [ChooseItems $wh] { OpenItem $wh $ix } return } proc UpdateItemWindows {wh ix} { # redraw edit/show windows for item of type $wh and index $ix global EdWindow Proc GMEd CMDLINE if { $CMDLINE } { return } set w $EdWindow($wh) if { [winfo exists $w] && $GMEd($wh,Index) == $ix } { destroy $w if { $wh == "LAP" } { set opts "change revert forget cancel" } else { set opts "change revert create forget cancel" } $Proc($wh) $ix $opts [ItemData $wh $ix] } if { [winfo exists .gm${wh}sh$ix] } { $Proc($wh) $ix "" [ItemData $wh $ix] } return } proc UpdateWPsInWindows {wh ixs oldnames newnames} { # update edit/show windows for items of type $wh in {RT, GR} after # a renaming of WPs and corresponding changes in the data-base # $ixs is list of indices of the items in show windows # a WP name in a RT may occur several times # update edit window if the item there was changed or is not yet defined global EdWindow GMEd RTWPoints GRConts if { [winfo exists [set w $EdWindow($wh)]] } { if { [set ix $GMEd($wh,Index)] == -1 || \ [lsearch -exact $ixs $ix] != -1 } { if { $wh == "RT" } { # this depends on Storage(RT) set dwps [lindex $GMEd(RT,Data) 3] set frbx .gmRT.fr.fr3.fr31.frbx set wwps [$frbx.box get 0 end] } else { # this depends on Storage(GR) set cs [lindex $GMEd(GR,Data) 2] foreach {ics dwps} [GRWPNames $cs] {} set wwps [GMGRCollectWPNames $w] } if { $dwps != {} } { foreach {chg dwps} \ [ListReplace $dwps $oldnames $newnames] {} if { $chg } { if { $wh == "RT" } { set GMEd(RT,Data) [lreplace $GMEd(RT,Data) 3 3 $dwps] } else { set dwps [lsort -dictionary $dwps] set cs [lreplace $cs $ics $ics [list WP $dwps]] set GMEd(GR,Data) [lreplace $GMEd(GR,Data) 2 2 $cs] } } } if { $wwps != {} } { foreach {chg wwps} \ [ListReplace $wwps $oldnames $newnames] {} if { $chg } { ReplaceWPsInWindow $wh $w $wwps } } } } # update show windows foreach ix $ixs { set w .gm${wh}sh$ix if { [winfo exists $w] } { if { $wh == "RT" } { set newwps $RTWPoints($ix) } else { set newwps [lindex [GRWPNames $GRConts($ix)] 1] } ReplaceWPsInWindow $wh $w $newwps } } return } proc ReplaceWPsInWindow {wh w names} { # replace all WPs in edit/show window of item of type $wh in {RT, GR} # by the given ones # do nothing if $names is empty global TXT if { $names == {} || ! [winfo exists $w] } { return } if { $wh == "RT" } { set frbx $w.fr.fr3.fr31.frbx $frbx.box delete 0 end foreach name $names { $frbx.box insert end $name } foreach b "xn xd xb xda xsc xsl" { $frbx.b$b selection clear 0 end } return } # GR set wptxt $TXT(WP) set frbx $w.fr.fr3.frbx foreach b {bxn bxw box} { $frbx.$b selection clear 0 end } # clear old WPs set is [lsort -integer -decreasing \ [lsearch -exact -all [$frbx.bxw get 0 end] $wptxt]] foreach i $is { $frbx.bxn delete end end $frbx.bxw delete $i $i $frbx.box delete $i $i } # insert new set n [$frbx.box size] foreach name [lsort -dictionary -decreasing $names] { $frbx.bxn insert end [format "%3d." [incr n]] $frbx.bxw insert 0 $wptxt $frbx.box insert 0 $name } return } proc CloseItemWindows {wh ix} { # close edit/show windows for item of type $wh and index $ix that has # been forgotten global EdWindow Proc GMEd set w $EdWindow($wh) if { [winfo exists $w] && $GMEd($wh,Index) == $ix } { destroy $w } if { [winfo exists .gm${wh}sh$ix] } { destroy .gm${wh}sh$ix } return } proc SetDisplShowWindow {wh ix sel} { # set display check-button in show window according to $sel # for item of type $wh and index $ix # $sel in {select, deselect} if { [winfo exists .gm${wh}sh$ix] } { set w .gm${wh}sh$ix $w.fr.frdw.displayed configure -state normal $w.fr.frdw.displayed $sel $w.fr.frdw.displayed configure -state disabled } return } ### displaying hidden information proc ShowHiddenData {wh hidden} { # display hidden information for an item of type $wh (in {WP, TR}) # assume there is a proc HiddenData with arguments $wh and $hidden # that returns list of pairs with name of field and its value (in # a suitable form for displaying) global TXT DPOSX DPOSY COLOUR if { [set fvs [HiddenData $wh $hidden]] == "" } { bell ; return } set w .shidden if { [winfo exists $w] } { destroy $w } GMToplevel $w hiddendata +$DPOSX+$DPOSY . \ [list WM_DELETE_WINDOW "destroy $w"] \ [list "destroy $w"] frame $w.fr -relief flat -borderwidth 5 -bg $COLOUR(dialbg) label $w.fr.tit -text $TXT(hiddendata) frame $w.fr.fri -relief flat -borderwidth 0 set r 0 foreach p $fvs { foreach x $p c "0 1" { label $w.fr.fri.x${r}_$c -text $x -anchor w \ -width [expr 2+[string length $x]] grid $w.fr.fri.x${r}_$c -row $r -column $c -sticky w } incr r } button $w.fr.ok -text $TXT(ok) -command "destroy $w" foreach x "tit fri ok" { grid $w.fr.$x -pady 5 } grid $w.fr update idletasks return } ### creating WP at given distante and bearing from another one proc CreateWPAtDistBear {ix} { # create WP at given distante (in user-selected unit) and bearing from # WP with index $ix # fail if the WP edit window exists for a different WP global EdWindow GMEd WPatdist WPatbear WPPosn WPDatum WPPFrmt TXT MESS \ INVTXT CREATIONDATE DTUNIT DSCALE if { [winfo exists $EdWindow(WP)] } { if { $GMEd(WP,Index) != $ix } { bell ; return } # valid coordinates? set p [PosnGetCheck .gmWP.fr.frp.frp1 $GMEd(WP,Datum) GMMessage \ ChangedPosn] if { $p == "nil" } { return } set pformt $INVTXT([.gmWP.fr.frp.pfmt cget -text]) set datum $GMEd(WP,Datum) set ed 1 } else { set p $WPPosn($ix) ; set datum $WPDatum($ix) set pformt $WPPFrmt($ix) set ed 0 } # get distance and bearing while 1 { if { ! [GMChooseParams $TXT(newWPatdb) "WPatdist WPatbear" \ [list "=$TXT(distance) ($DTUNIT)" "=$TXT(azimuth)"]] } { return } if { [CheckFloat GMMessage $WPatdist] && \ [CheckNumber GMMessage $WPatbear] } { if { $WPatbear >= 360 } { GMMessage $MESS(badangle) continue } break } } foreach "lat long" [CoordsAtDistBear $p [expr $WPatdist/$DSCALE] \ $WPatbear $datum] {} foreach "p pformt datum" \ [FormatPosition $lat $long $datum $pformt ""] { break } if { $ed } { destroy $EdWindow(WP) } set opts "create revert cancel" if { $CREATIONDATE } { GMWPoint -1 $opts [FormData WP "PFrmt Posn Datum Date" \ [list $pformt $p $datum [Now]]] } else { GMWPoint -1 $opts [FormData WP "Commt PFrmt Posn Datum" \ [list [DateCommt [Now]] $pformt $p $datum]] } return } ### utilities for dealing with map backgrounds in item edit/show windows proc CreateMBackWidgets {wh fr mbak ed} { # create widgets for showing/editing map background associated to item # $wh in {WP, RT, TR, LN} # $fr frame to be populated # $mbak current map background name # $ed flag set if editing is enabled global TXT COMMENTWIDTH label $fr.tit -text "$TXT(mbaktoload):" -width 25 if { $ed } { menubutton $fr.mb -textvariable GMEd($wh,MBack) -menu $fr.mb.m \ -width $COMMENTWIDTH -relief raised menu $fr.mb.m -postcommand [list FillDefsMenu backgrnd $fr.mb.m \ [list ChangeMBack $wh] "($TXT(none))" "---"] } else { menubutton $fr.mb -text $mbak -state disabled -width $COMMENTWIDTH \ -relief raised } pack $fr.tit $fr.mb -side left return } proc ChangeMBack {wh mbak args} { # called after a new map background was selected for item # $args not used (but needed because of callback) global TXT GMEd if { $mbak == "($TXT(none))" } { set mbak "" } set GMEd($wh,MBack) $mbak return } ### managing auxiliary windows that are made inconsistent by edit operations proc ManageAuxWindows {wh op args} { # keep track of and operate on auxiliary windows # $wh in {RT, TR} # $op is one of # add: $args is a list with a list of windows to be managed # close_all: destroy all managed windows # the global GMEd($wh,windows) is used and should be initialised to {} # before any call to this procedure # proc CloseWindows (util.tcl) is called to destroy managed windows global GMEd switch $op { add { foreach w [lindex $args 0] { lappend GMEd($wh,windows) $w } } close_all { CloseWindows $GMEd($wh,windows) set GMEd($wh,windows) {} } } return }gpsman-6.4.4.2/gmsrc/isolatin1.tcl0000644000175000017500000000663512224351120015010 0ustar migmig# # This file is part of: # # gpsman --- GPS Manager: a manager for GPS receiver data # # Copyright (c) 1998-2013 Miguel Filgueiras migfilg@t-online.de # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. # # File: isolatin1.tcl # Last change: 6 October 2013 # ### ISO Latin1 characters; mainly from procs written by Lus Damas # consulting this file may cause problems in non-western Linux installations proc ISOBindings {w} { # set bindings to force isolatin1 character interpretation global tcl_platform if { $tcl_platform(platform) == "windows" } { # no dead keys in MS-Windows, it seems set binds {{asciitilde ~ {a } {c } {n } {o } {A } {C } {N } {O }} {quoteright ' {a } {e } {i } {o } {u } {A } {E } {I } {O } {U }} {asciicircum ^ {a } {e } {o }} {quoteleft ` {a } {e }}} } else { # not supported: # dead_diaresis set binds {{asciitilde ~ {a } {c } {n } {o } {asciitilde } {A } {C } {N } {O }} {dead_cedilla {c } {C }} {dead_tilde ~ {a } {c } {n } {o } {dead_tilde } {A } {C } {N } {O }} {quoteright ' {a } {c } {e } {i } {o } {u } {A } {C } {E } {I } {O } {U }} {dead_acute ' {a } {e } {i } {o } {u } {A } {E } {I } {O } {U }} {apostrophe ' {a } {e } {i } {o } {u } {A } {E } {I } {O } {U }} {dead_circumflex ^ {A } {a } {E } {e } {I } {i } {O } {o } {U } {u }} {asciicircum ^ {A } {a } {E } {e } {I } {i } {O } {o } {U } {u }} {grave ` {A } {a } {E } {e } {I } {i } {O } {o } {U } {u }} {dead_grave ` {A } {a } {E } {e } {I } {i } {O } {o } {U } {u }} {quotedbl \\\" {a } {e } {i } {o } {u } {s } {quotedbl } {A } {E } {I } {O } {U }} {slash / {a } {e } {o } {A } {E } {O }} } } foreach k $binds { set keysym [lindex $k 0] bind $w "$w insert insert [lindex $k 1] ; break" foreach p [lrange $k 2 end] { bind $w \ "ReplaceChar $w [lindex $p 1] ; break" } } return } proc ReplaceChar {w char} { # replace last char in entry or text widget $w by $char switch [winfo class $w] { Entry { if { [set ix [expr [$w index insert]-1]] < 0 } { return } $w delete $ix $w insert insert $char } Text { if { ! [regexp {^([0-9]+)\.([0-9]+)$} [$w index insert] a l c] || \ $c == 0 } { return } $w delete $l.[expr $c-1] $w insert insert $char } } return } gpsman-6.4.4.2/gmsrc/magellan.tcl0000644000175000017500000011260512224351120014660 0ustar migmig# # This file is part of: # # gpsman --- GPS Manager: a manager for GPS receiver data # # Copyright (c) 1998-2013 Miguel Filgueiras migfilg@t-online.de # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. # # File: magellan.tcl # Last change: 6 October 2013 # # This file contributed by Matt Martin (matt.martin _AT_ ieee.org) # Copyright (c) 2003 Matt Martin (matt.martin _AT_ ieee.org) # based on garmin.tcl # # Changes by Miguel Filgueiras marked "MF change" # # logging the communication: see serial.tcl set MasterClock 0 #### no configurable values below this line! set PDTYPE(Header) {word word word byte} set PDTYPE(CMD) {string} set PDTYPE(ACK) {word} set PDTYPE(NAK) {word} set PDTYPE("PMGNVER") {string string string} set PDTYPE(WP) {magpos int string string string string } set PDTYPE(WPIN) {magpos string string string string string string string string } set PDTYPE(TR) {magpos int string hmss string string dmy } set PDTYPE(TRIN) {dms dms float char string char string string } set PDTYPE(RTIN) {string string string string string string string string} set PDTYPE(RTs) {int int string int string string } set PDTYPE(RT) {int int string int string string string string } set MAG_SYMTAB [list WP_dot \ square_green \ house \ avn_vortac \ airport \ amusement_park \ casino \ car_repair\ boat \ camping \ exit \ 1st_aid \ avn_vordme \ buoy\ fuel\ deer\ golf\ lodging\ fish\ large_city\ light\ capitol_city\ boat_ramp\ medium_city\ museum\ danger\ park\ store\ knife_fork\ mountains\ diver_down_1\ RV_park\ military\ scenic\ small_city\ oil_field\ stadium\ info\ truck_stop\ drinking_water\ wreck\ zoo] #"#"# state of the communication set Request idle set Jobs "" set SInState idle set SInPacketState start set SOutBusy 0 set SRecACKs 0 set SRecNAKs 0 set SInSum 0 set PkInState idle set PkLastData "" set NoInProc 1 set GetPVT 0 set STextPVT 0 ##### link layer proc MakeMagPacket {pid tvals} { global SInState SOutBusy PID ACK NAK \ SOutPID SOutBData SOutDSum SOutBPID SOutSize set SOutBData [concat [split "PMGN$pid" ""] "" [PackData $tvals] ] if { [set SOutSize [llength $SOutBData]] > 255 } { Log "SP> too much data ($SOutSize>255)" return } Log "SP> sending packet $pid with:" if { $pid=="CMD" } { set cmdname [lindex $tvals 1] if { $cmdname=="HANDON" || $cmdname=="HANDOFF"} { set SOutBusy 0 } } set SOutDSum 0 foreach ch $SOutBData { binary scan $ch "c" v set SOutDSum [expr $SOutDSum ^ $v] # Log "SP> $ch $v csum is $SOutDSum" } set SOutBData [concat "\$" $SOutBData "*" [split [format "%02X" $SOutDSum]] "\\r" "\\n" ] return $SOutBData } proc SendPacket {pid tvals} { # initialize a send packet action # wait for termination of a previous similar operation # $pid is the packet identifier name # $tvals is a pair with a list of types and a list of values # uses the following global variable that may be reset elsewhere: # $SOutBusy a flag set if a packet is being sent; it is # cleared by DoSendPacket (for ACK/NAK packets) # or by ProcACKNAK (after a valid ACK is received) global SInState SOutBusy PID ACK NAK \ SOutPID SOutBData SOutDSum SOutBPID SOutSize tdebug "SendPacket $pid $tvals, SOutBusy is $SOutBusy" while { $SOutBusy } { tdebug "waiting in sp" after 50 "SendPacket $pid {$tvals}" return } if { [catch {set SOutBPID $pid}] } { Log "SP> bad PID: $pid" return } set SOutBusy 1 ; set SOutPID $pid MakeMagPacket $pid $tvals DoSendPacket return } proc DoSendPacket {} { # do the actual sending of the packet initiated by SendPacket; # wait for termination of get operations in progress unless the # packet is an ACK/NAK one # this proc may be called for re-sending the packet if a NAK is # received global SInPacketState SInState SOutBusy RPID DLE DLECHR ETX ACK NAK \ SOutPID SOutBData SOutDSum SOutBPID SOutSize SRLFILE #if { $SOutBPID!="CSM" && "$SInState" == "get" } { # Wait for checksum # after 50 DoSendPacket # return #} tdebug "in dsp, running is $SOutBPID, $SOutBData" if { $SOutBPID!="CSM" && $SOutBPID!="placeholder" } { set SInPacketState start ; set SInState put } tdebug "DSP> sending packet $SOutPID, $SOutBData " foreach b $SOutBData { puts -nonewline $SRLFILE "$b" } flush $SRLFILE Log "DSP> size=$SOutSize, checksum=$SOutDSum [format "%2X" $SOutDSum]" if { $SOutBPID=="CSM" || $SOutBData=="HANDON" || $SOutBData=="HANDOFF"} { # No more output expected set SOutBusy 0 } tdebug "dsp done, soutbusy is $SOutBusy" return } proc SendACKNAK {checksum} { # send an ACK or NAK packet # $what is either ACK or NAK # $pid is packet id name to not-/acknowledge global PID PDTYPE SOutBusy #NAK is currently unsupported... set SOutBusy 0 SendPacket "CSM" [list {string} [format "%02X" $checksum]] return } proc ProcACKNAK {pid data} { # process incoming ACK or NAK packet # $pid is packet id name of the packet (in {ACK, NAK, error}) # $data is its data # after sending a packet, in case of an ACK for a packet id different # from the one sent, or a NAK the packet will be re-sent; if an error # (expecting an ACK/NAK but got a different packet id) the state is # reset; otherwise the packet is assumed to have been received # successfully and SentPacket is called global SOutBusy SOutPID SOutBPID SRecACKs SRecNAKs PDTYPE MESS \ PkLastPID set PkLastPID -1 switch $pid { "PMGNCSM" { set bpid "CSM" #[UnPackData $data $PDTYPE(ACK)] incr SRecACKs if { $SOutBusy } { SentPacket $SOutPID set SOutBusy 0 } else { Log "PAN> ACK for $bpid when output is idle" set SOutBusy 0 } } NAK { set bpid [UnPackData $data $PDTYPE(NAK)] if { $SOutBusy } { incr SRecNAKs Log "PAN> NAK number $SRecNAKs" if { $bpid != $SOutBPID } { Log "PAN> NAK for wrong packet $bpid, expected $SOutPID" } DoSendPacket } else { Log "PAN> NAK for $bpid when output is idle" } } default { # $SOutBusy must be 1 #GMMessage $MESS(noACKNAK) Log "PAN> $pid when sending $SOutPID; resending" DoSendPacket #Log "PAN> $pid when sending $SOutPID; resetting" #ResetSerial } } return } proc ProcChar {char} { # process character seen in the serial port # the following global variables control what is going on: # $SInState in {idle, get, put} # when idle, discards all input unless $GetPVT is set # the difference between get and put is that the put-state # only expects ACK/NAK packets and always calls ProcACKNAK, # while the get-state calls either ProcInPacket or ProcACKNAK # PVT data packets are always processed by ProcInPacket # $SInPacketState in {block, start, got1stDLE, gotPID} # a packet is considered finished only when a single DLE # followed by a ETX is read in; the packet size is used # only for checking the consistency of the data # $Jobs should be set to "", and will be a list of # background jobs started for $Request # $GetPVT is set if PVT data packets are expected global SInBuffer SInState SInPacketState SInSum SInCount GetPVT \ Jobs SeenDLE PacketID PacketData NotACKNAK PID RPID DLE ETX \ Polling PacketDone GotCSum csum if { [binary scan $char "c" dec] != 1 } { Log "PC> scan failed: char=$char" return } set dec [expr ($dec+0x100)%0x100] tdebug "PC> got $dec $char; state=$SInState, $SInPacketState" if { "$SInState" == "idle" && ! $GetPVT } { Log "PC> idle: discarded $dec" ; return } switch $SInPacketState { block { Log "PC> bug: called when blocked!" } start { if { $char == "$" } { set PacketID "" set PacketDone 0 set GotCSum 0 set SInSum 0 } elseif { $char != "," } { set SInSum [expr $SInSum ^ $dec] append PacketID $char } else { Log "command header complete for $PacketID " set SInPacketState gotPID set SInSum [expr $SInSum ^ $dec] if { $PacketID != "PMGNCSM" } { set NotACKNAK 1 } else { set NotACKNAK 0 } } } gotPID { if { $PacketDone } { if { $GotCSum>1 } { Log "PC> got checksum $csum" if { $char == "\n" } { Log "sentcsum is $csum vs $SInSum, notacknak is $NotACKNAK" if { $csum == $SInSum } { set SInPacketState block set PacketData $SInBuffer #[lrange $SInBuffer 1 $size] if { $NotACKNAK } { ProcInPacket $PacketID "$PacketData" SendACKNAK $csum } else { ProcACKNAK $PacketID "$PacketData" } } else { if { $NotACKNAK } { Log "Checksum Error!" SendACKNAK $csum } } set SInPacketState start set SInBuffer "" } else { Log "skipping char $dec" } } else { scan $char "%x" dec set csum [expr $csum*0x10+$dec] incr GotCSum 1 } } elseif { $char == "*" } { set PacketDone 1 set csum 0 } else { lappend SInBuffer $char set SInSum [expr $SInSum ^ $dec] } } } return } ##### application layer: input proc ProcInPacket {pid data} { # process incoming packet # $pid is packet identifier name # $data is list of bytes (as TCL characters) # uses the following global variables that may be set elsewhere: # $PkInState should be set externally either to idle (discarding # packets) or to name of protocol the incoming packet is # is expected to conform to # $GetPVT is set if PVT data packets are expected global PkInState PkInPrevState PkInData PkInRTsData PkInCount CurrPSPID \ PDTYPE SPckts A001TOut GetPVT PkLastPID PkLastData Jobs set pidstr [concat $pid ] tdebug "for $PkInState processing packet $pidstr with data $data" if { $pidstr == "PMGNVER"} { EndInProt $pidstr [UnPackData $data {string string string} ] } set PkLastPID $pid ; set PkLastData $data incr SPckts switch $PkInState { idle { Log "PP> discarding $pid packet" } N/A { Log "PP> asking for non-available protocol" set PkInState idle } "WP" { # WayPoint data if { [GoodPID $pid "PMGNWPL"] } { lappend PkInData [UnPackData $data $PDTYPE(WPIN)] } else { # probably last packet ... EndOfTranfer $pid $data RT "WP" $PkInData } } "RT" { # Routes if { [GoodPID $pid "PMGNRTE"] } { lappend PkInData [UnPackData $data $PDTYPE(RTIN) ] } else { # trouble EndOfTranfer $pid $data RT "RT" $PkInData } } "TR" { # Track Data if { [GoodPID $pid "PMGNTRK"]} { lappend PkInData [UnPackData $data {dms dms float char string char string string }] } else { # probably last packet ... EndOfTranfer $pid $data RT "TR" $PkInData } } default { Log "$PkInState not supported" set PkInState idle } } return } proc EndOfTranfer {pid data wh prot recs} { # end of transfer after records for protocol $prot # $recs is data collected from the records global PkInData tdebug "EOT $pid $data" if { [GoodPID $pid "PMGNCMD"] } { if { [GoodCMD [UnPackData $data string] "END"] } { EndInProt $prot $recs set PkInState idle } } else { # only for debuggin, kill this ! EndInProt $prot $recs set PkInState idle } return } proc GoodPID {pid wanted} { # check that packet id name is what is wanted if { "$pid" != "$wanted" } { BadPacket "PID $pid instead of $wanted" return 0 } return 1 } proc GoodCMD {cmd wanted} { # check that command code is what is wanted if { $cmd != $wanted } { BadPacket "CMD $cmd not good for $wanted" return 0 } return 1 } ### application layer: output proc SendData {type args} { # start transfer to receiver # first packet sent will hopefully be ACK-ed, what will fire up # (in sequence) ProcChar, ProcACKNAK, SentPacket # $type in {product, abort, turnOff, get, put, start, stop} # $args void unless # $type==get: in {WP RT TR PosnData DtTmData}; not yetin {AL Prx} # $type==put: 1st arg in {WP RT TR PosnData DtTmData}; not yet # in {AL Prx} # 2nd arg is list of indices # $type in {start, stop}: in {PVT} global PDTYPE PkInState SOutBusy CurrPSPID CMD Command CommArgs \ PkOutState PkOutData PkOutCount PkOutStart PkOutWhat \ PkOutSaved RTWPoints RTStages TRTPoints PkInData TRtot RTIdNumber set Command $type ; set CommArgs $args switch $type { product { # query product type SendPacket CMD [list $PDTYPE(CMD) "VERSION"] tdebug "back from version query" # setup GPS for handshaking SendPacket CMD [list $PDTYPE(CMD) "HANDON"] #SendPacket CMD [list $PDTYPE(CMD) "TON"] } abort { tdebug "Sending stop cmd" set SOutBusy 0 SendPacket CMD [list $PDTYPE(CMD) "END"] SendPacket CMD [list $PDTYPE(CMD) "STOP"] tdebug "Finished Sending stop cmd" } turnOff { SendPacket CmdData [list int $CMD(TurnOff)] # the receiver may not send an ACK before turning off } start { # $args in {PVT} SendPacket CmdData [list int $CMD(Start$args)] } stop { # $args in {PVT} SendPacket CMD [list $PDTYPE(CMD) "END"] } get { # $args in {WP RT TR PosnData DtTmData}; not implemented: {AL Prx} set getwhat [lindex $args 0] #puts "get got $getwhat" switch $getwhat { WP { SendPacket CMD [list $PDTYPE(CMD) "WAYPOINT" ] set PkInData "" } RT { SendPacket CMD [list $PDTYPE(CMD) "ROUTE"] set PkInData "" } TR { SendPacket CMD [list $PDTYPE(CMD) "TRACK,2"] set PkInData "" } } } put { set putwhat [lindex $args 0] if { "$putwhat" == "Prx" || "$putwhat" == "AL" } { Log "put $putwhat not implemented" return } tdebug "putwhat is $putwhat" set PkOutWhat $putwhat switch $putwhat { WP { set ixs [lindex $args 1] ; set n [llength $ixs] set PkOutStart XfrWP set PkOutData $ixs ; set PkOutCount $n set PkOutState WP set PkOutSaved "" SentPacket Records } TR { set ixs [lindex $args 1] set n 0 foreach tr $ixs { incr n [llength $TRTPoints($tr)] } set PkOutStart XfrTR set PkOutData $ixs ; set PkOutCount $n set PkOutState TR SentPacket Records } RT { set ixs [lindex $args 1] set wpl "" # count total # of route points, make a list of WPs set TRtot 0 set PkOutSaved "" foreach rt $ixs { # Make sure the ID is a number if { ! [CheckNumber Ignore $RTIdNumber($rt)] } { continue } lappend PkOutSaved $rt incr TRtot [expr ([llength $RTWPoints($rt)]+1)/2] foreach wp $RTWPoints($rt) { set wpn [IndexNamed WP $wp] if { [lsearch -exact $wpl $wpn] == -1 } { lappend wpl $wpn } } } # send the waypoints first set PkOutData $wpl set PkOutCount [llength $wpl] set PkOutState WP set PkOutWhat WP # initiat WP send sequence SentPacket Records } } } } return } proc SentPacket {pid} { # deal with continuation after a packet has been successfully sent global Command CommArgs PkInState CurrPSPID SInState \ PkOutState PkOutWhat PkOutCount PkOutData PkOutStart PkOutSaved \ CMD RTWPoints RTStages Jobs Request SPckts RPID TRtot incr SPckts Log "StP> packet for $pid sent" switch $pid { CMD { switch $Command { get { Log "Command is $CommArgs" if { "$PkInState" != "idle" } { lappend Jobs [after 50 "SentPacket $pid"] return } set PkInState $CommArgs #$CurrPSPID($CommArgs) set SInState get } abort { if { [string first check $Request] != 0 } { # called this way so that it may cancel pending jobs after 0 AbortComm } } stop { EndOutProt $PkOutStart } default { # do nothing (?); should it report to layer above? } } } Records { if { $PkOutCount == 0 } { SendPacket XfrCmpl [list int $CMD($PkOutStart)] } else { incr PkOutCount -1 switch $PkOutWhat { WP { SendPacket WPL [PrepData] } RT { set PkOutSaved "" SendPacket RTE [PrepData] } TR { set PkOutSaved "" SendPacket TRK [PrepData] } default { } } } } WPL { if { $PkOutCount == 0 } { # see if we have any remaining route data (send after last WP) if { [llength $PkOutSaved] } { # Set up to send routes # not the best way to structure this, but it works set PkOutStart XfrRT set PkOutData $PkOutSaved set PkOutSaved "" # pull total # of route points from temp storage set PkOutCount $TRtot set PkOutState RT set PkOutWhat RT # now send out the route def SentPacket Records #SendPacket RTE [PrepData] } else { SendData stop } } else { incr PkOutCount -1 SendPacket WPL [PrepData] } } TRK { if { $PkOutCount == 0 } { SendData stop } else { incr PkOutCount -1 SendPacket TRK [PrepData] } } RTE { if { $PkOutCount == 0 } { SendData stop } else { incr PkOutCount -1 SendPacket RTE [PrepData] } } } return } proc PrepData {} { # prepare WPs, RTs, or TRs data to be transferred to receiver global PkOutState PkOutData PkOutSaved PDTYPE \ WPName WPCommt WPPosn WPDatum WPDate WPSymbol WPDispOpt WPAlt \ WPHidden RTIdNumber RTCommt TRName TRDatum TRTPoints TRHidden \ DataIndex RTWPoints TRcnt TRtot TRnum switch $PkOutState { WP { set ix [lindex $PkOutData 0] set PkOutData [lreplace $PkOutData 0 0] return [PrepMagWPData $ix] } TR { if { "$PkOutSaved" != "" } { set p [lindex $PkOutSaved 0] set PkOutSaved [lreplace $PkOutSaved 0 0] set new 0 } else { # select a new track and covert all of its points set ix [lindex $PkOutData 0] #set PkOutData [lreplace $PkOutData 0 0] set p [lindex $TRTPoints($ix) 0] set PkOutSaved [lreplace $TRTPoints($ix) 0 0] if { "$TRDatum($ix)" != "WGS 84" } { # MF change: calling FormatPosition instead of ConvertDatum set tmpp [lindex [FormatPosition [lindex $p 0] \ [lindex $p 1] $TRDatum($ix) \ DDD "WGS 84"] 0] set p [concat $tmpp [lrange $p 4 end]] set PkOutSaved [ChangeTPsDatum $PkOutSaved \ $TRDatum($ix) "WGS 84"] } } return [PrepMagTRData $p] } RT { set pktype RT # still working through one route if { "$PkOutSaved" != "" } { incr TRcnt set PkOutSaved [lreplace $PkOutSaved 0 1] } if { "$PkOutSaved" == "" } { # go to the next route set ix [lindex $PkOutData 0] set TRtot [expr ([llength $RTWPoints($ix)] + 1) / 2] set TRcnt 1 set TRnum $ix set PkOutData [lreplace $PkOutData 0 0] set PkOutSaved [Apply "$RTWPoints($ix)" IndexNamed WP] } return [PrepMagRTdata [lindex $PkOutSaved 0] [lindex $PkOutSaved 1] $TRtot $TRcnt $TRnum ] } } } proc get_mag_symnum {symname} { global MAG_SYMTAB set sn [lsearch -exact $MAG_SYMTAB $symname] if {$sn < 26} { set sc [format "%c" [expr $sn + 97]] } else { set sc [format "a%c" [expr $sn + 71]] } return $sc } proc PrepMagWPData {ix } { global DISPOPTCODE MAG_SYMTAB WPName WPCommt WPPosn WPDatum WPDate WPSymbol WPDispOpt WPAlt \ WPHidden RTIdNumber RTCommt TRName TRDatum TRTPoints TRHidden \ DataIndex RTWPoints TRcnt TRtot TRnum PDTYPE set p $WPPosn($ix) if { "$WPDatum($ix)" != "WGS 84" } { # MF change: calling FormatPosition instead of ConvertDatum set p [lindex [FormatPosition [lindex $p 0] [lindex $p 1] \ $WPDatum($ix) DDD "WGS 84"] 0] } # figure out the symbol code set sn [lsearch -exact $MAG_SYMTAB $WPSymbol($ix)] if {$sn < 26} { set sc [format "%c" [expr $sn + 97]] } else { set sc [format "a%c" [expr $sn + 71]] } set alt $WPAlt($ix) if { "$alt" == "" } { set alt 0 } else { set alt [expr round($alt)] } # set this to proper return vals return [list $PDTYPE(WP) [list $p $alt "M" $WPName($ix) $WPCommt($ix) $sc ]] } proc PrepMagTRData { p } { global DISPOPTCODE MAG_SYMTAB DataIndex TRcnt TRtot TRnum PDTYPE set dt [lindex $p $DataIndex(TPsecs)] set depth [lindex $p $DataIndex(TPdepth)] set alt [expr int([lindex $p $DataIndex(TPalt)])] return [list $PDTYPE(TR) \ [list $p $alt M $dt A "" $dt ] ] } proc PrepMagRTdata { t u TRtot TRcnt TRnum } { global WPName WPSymbol PDTYPE RTIdNumber # Set up a pair of route points for transmission set p $WPName($t) set psym [get_mag_symnum $WPSymbol($t)] set pktype RT if { $u == ""} { set pktype RTs return [list $PDTYPE($pktype) \ [list $TRtot $TRcnt c $RTIdNumber($TRnum) $p $psym]] } else { set q $WPName($u) set qsym [get_mag_symnum $WPSymbol($u)] return [list $PDTYPE($pktype) \ [list $TRtot $TRcnt c $RTIdNumber($TRnum) \ $p $psym $q $qsym]] } } ### data types proc UnPackData {data types} { # convert from list of bytes (as TCL characters) to list of elements # conforming to the types in the list $types # delete leading and trailing spaces of strings and char arrays global PacketDataRest PDTSIZE tcl_platform set vals "" foreach t $types { switch -glob $t { char { set n 2 binary scan [join [lrange $data 0 0] ""] "a1" x } boolean - byte { set n 1 binary scan [join [lrange $data 0 0] ""] "c" x set x [expr ($x+0x100)%0x100] } int { set n 2 binary scan [join [lrange $data 0 1] ""] "s" x } word { set n 2 binary scan [join [lrange $data 0 1] ""] "s" x set x [expr ($x+0x10000)%0x10000] } long - longword { # longword cannot be represented in Tcl as unsigned! set n 4 binary scan [join [lrange $data 0 3] ""] "i" x } float { set x 0 set tmpstr [SubString $data] set n [string length $tmpstr] incr n scan $tmpstr "%f" x } double { # this only works with machines following the # IEEE standard floating point representation set n 8 if { "$tcl_platform(byteOrder)" == "littleEndian" } { binary scan [join [lrange $data 0 7] ""] "d" x } else { set id "" foreach k "7 6 5 4 3 2 1 0" { lappend id [lindex $data $k] } binary scan [join $id ""] "d" x } } string { set x "" ; set n 0 set size [llength $data] while { $n < $size } { set c [lindex $data $n] incr n #binary scan $c c d #if { $d == 0 } { break } if { $c == "," } { break } append x $c } set x [string trim $x " "] # not sure that this is really needed: # regsub -all {:} $x "" x } charray=* { regsub charray= $t "" n set x "" for { set i 0 } { $i < $n } { incr i } { set c [lindex $data $i] binary scan $c c d if { $d == 0 } { set c " " } append x $c } set x [string trim $x " "] # not sure that this is really needed: # regsub -all {:} $x "" x } bytes=* { # result is list of bytes regsub bytes= $t "" n set x "" for { set i 0 } { $i < $n } { incr i } { set c [lindex $data $i] binary scan $c c v lappend x [expr ($v+0x100)%0x100] } } starray=* { # return list of lists with structure fields regsub starray= $t "" ets set ts [split $ets ","] set x "" while { "$data" != "" } { lappend x [UnPackData $data $ts] set data $PacketDataRest } set n 0 } dms { # return float from DMS notation set tmpstr [SubString $data] set n [string length $tmpstr] # get NSEW set dircode [join [lrange $data [expr $n + 1] [expr $n + 1] ] ""] # Are we in pos or negative direction ? set dirsign 1 switch $dircode { "N" { set deglen 2 } "S" { set deglen 2 set dirsign -1 } "E" { set deglen 3 } "W" { set deglen 3 set dirsign -1 } } set tmin 0 set tdeg 0 scan [string range $tmpstr 0 [expr $deglen - 1]] "%f" tdeg scan [string range $tmpstr $deglen $n] "%f" tmin incr n 3 set x 0 set x [expr ( $tdeg + $tmin / 60.0 ) * $dirsign ] } magpos { # return lat/long in degrees scan [join [lrange $data 0 1] ""] "%f" ldeg scan [join [lrange $data 2 8] ""] "%f" lmin set la [expr $ldeg + $lmin / 60.0 ] if { [lrange $data 9 9] == "S"} { set la [expr -1 * $la] } scan [join [lrange $data 11 13] ""] "%f" ldeg scan [join [lrange $data 14 20] ""] "%f" lmin set lo [expr $ldeg + $lmin / 60.0 ] if { [lrange $data 21 21] == "W"} { set lo [expr -1 * $lo] } set x "$la $lo" set n 22 } radian { # return lat/long in degrees set la [expr [UnPackData $data double]* \ 57.29577951308232087684] set lo [expr [UnPackData [lrange $data 8 15] double]* \ 57.29577951308232087684] set x "$la $lo" set n 16 } unused=* { regsub unused= $t "" n set x UNUSED } union=* { # can only appear if $data is a singleton and types in the # union are all of different lengths; no checks on this regsub union= $t "" l set size [llength $data] foreach ut [split $l ,] { if { $PDTSIZE($ut) == $size } { return [UnPackData $data $ut] } } Log "no types of size $size in $t; using byte" return [UnPackData $data byte] } ignored { set PacketDataRest "" return $vals } default { Log "unimplemented data type when unpacking: $t" set n 1 ; set x 0 } } lappend vals $x set data [lrange $data $n end] } set PacketDataRest $data return $vals } proc SubString {data} { # Pull a string from a list of chars, terminated by a comma set sbstr "" ; set n 0 set size [llength $data] while { $n < $size } { set c [lindex $data $n] incr n if { $c == "," } { break } append sbstr $c } return [join $sbstr ""] } proc PackData {tvals} { # convert from a pair with a list of types and a list of values into a # list of bytes (as TCL characters) return [split [DataToStr [lindex $tvals 0] [lindex $tvals 1]] ""] } proc DataToStr {types vals} { # convert from list of elements conforming to the types in $types to # a TCL string global tcl_platform set data "" foreach t $types v $vals { append data "," switch -glob $t { char { append data [binary format "a" $v] } boolean - byte { append data [binary format "c" $v] } word - int { append data [format "%i" $v] } longword - long { append data [binary format "i" $v] } float { append data [format "%f" $v] } double { # this only works with machines following the # IEEE standard floating point representation set s [binary format "d" $v] if { "$tcl_platform(byteOrder)" != "littleEndian" } { set l [split "$s" ""] set s "" foreach k "7 6 5 4 3 2 1 0" { append s [lindex $l $k] } } append data $s } string { append data [binary format "a*" $v] } charray=* { regsub charray= $t "" n append data [binary format "A$n" $v] } dmy { append data [DateFromSecsFmt $v DDMMYY] } hmss { set s [expr $v%60] ; set x [expr ($v-$s)/60] set mn [expr $x%60] ; set h [expr (($x-$mn)/60)%24 ] set fv [expr $s+$mn*100+$h*10000] append data [format "%09.2f" $fv] } bytes=* { # $v is list of bytes regsub bytes= $t "" n foreach e $v { append data [binary format "c" $e] if { [incr n -1] == 0 } { break } } # complete with 0s if not enough data while { $n > 0 } { append data [binary format "c" 0] incr n -1 } } starray=* { # $v must be a list of lists with structure fields regsub starray= $t "" ets set ts [split $ets ","] foreach st $v { append data [DataToStr $ts $st] } } magpos { set lat [lindex $v 0] append data [format "%02d" [expr abs(int($lat))]] append data [format "%06.3f" [expr abs($lat - int($lat)) * 60.0 ]] if {$lat > 0} { append data ",N," } else { append data ",S," } set long [lindex $v 1] append data [format "%03d" [expr abs(int($long))]] append data [format "%06.3f" [expr abs($long - int($long)) * 60.0 ]] if {$long < 0} { append data ",W" } else { append data ",E" } } ignored { # just to ensure a non-empty packet data append data [binary format "c" 0] } default { Log "unimplemented data type when packing: $t" } } } return $data } ##### upper level proc EndInProt {pid data} { # deal with end of input protocol # $pid in {A000 A001 A010 A100 A200 A201 A300 A500 A600 A700} (cf. # ProcInPacket) but {A010 A500} not supported here # global $Request==get$wh where $wh in {WP RT TR PosnData DtTmData} # (cf. SendData) # ==check=$args where 1st arg should be executed as # connection is ok global Request Jobs MESS TXT MyProdId MyProdDescr MyProdVersion tdebug " at endinprot $pid" switch $pid { "PMGNVER" { # Product Data # kill timeout alarm after cancel [lindex $Jobs 0] Log "EIP> product data=$data" set MyProdId [lindex $data 0] set MyProdVersion [lindex $data 1] ; set descr [lindex $data 2] set MyProdDescr [format $MESS(connectedto) $descr] set SInState idle EndConnCheck gotprots return } } CloseInProgrWindow ResetSerial switch -glob $Request { get* { regsub get $Request "" wh SetCursor . watch if { "[lindex $data 0]" != "" } { InData$wh $data # MF change EndWPRenaming } else { GMMessage [format $MESS(nodata) $TXT($wh)] } ResetCursor . } default { Log ">EIP: wrong request ($Request)" } } set Jobs "" return } proc InDataWP {data} { InDataWPRT $data WPData return } proc AddMagWPT {d} { global GetDispl set name [lindex $d 0] ; set ix [IndexNamed WP $name] if { ! [CheckName Ignore $name] } { if { [set name [AskForName $name]] == "" } { return "" } # MF change: add remark with old name set d [AddOldNameToObs WP $d $name] set d [lreplace $d 0 0 $name] } # MF change: name may be replaced in StoreWP set name [StoreWP $ix $name $d $GetDispl] return $name } proc InDataWPRT {data pid} { # add WPs data from receiver to database # return list of names of WPs global CurrPSPID GetSet set wps "" foreach d [ConvWPData $data ] { #if { "$GetSet(WP)" == "" || [lsearch -exact $GetSet(WP) $ix] != -1 } { set name [AddMagWPT $d] if {$name == "" } {continue} lappend wps $name #} } return $wps } proc ConvWPData {data} { # convert WPs data got from receiver into list of lists suitable for # use with SetItem global PositionFormat CREATIONDATE DATAFOR MAG_SYMTAB # MF change: no need for position type in proc CreatePos set r "" set fs {Name Posn Alt Commt Symbol} set ps {4 0 2 5 6} # MF change: using FormatPosition instead of CreatePos, needs position # format in $all and $cnsts if { $CREATIONDATE } { set all [linsert $fs 0 Datum PFrmt Date] set cnsts [list "WGS 84" "" [Now]] } else { set all [linsert $fs 0 Datum PFrmt] set cnsts [list "WGS 84" ""] } foreach d $data { set vs $cnsts foreach f $fs p $ps { set v [lindex $d $p] switch $f { Posn { # MF change: using FormatPosition instead of CreatePos foreach "latd longd" $v { break } foreach "v pfmt datum" \ [FormatPosition $latd $longd "WGS 84" \ $PositionFormat "" DDD] { break } set vs [lreplace $vs 0 1 $datum $pfmt] } Symbol { #set v 1st_aid set vx 71 binary scan $v cc v vx # subtract the letter a set v [lindex $MAG_SYMTAB [expr $v - 97 + $vx - 71 ]] } DispOpt { set v [NameForCodeOf DISPOPT $v] } Alt { scan $v "%f" v } } lappend vs $v } lappend r [FormData WP $all $vs] } return $r } proc InDataRT {data} { # add RT data from receiver to database # $data is a list with in turn # RT header data as returned by UnPackData # list of WP data or list with in turn WP data and RS data global CurrPSPID GetDispl GetSet MESS #set hpid $CurrPSPID(RTHeader) # route summary data table of contents set fs "IdNumber Obs WPoints" while { "$data" != "" } { # get the next data point set wpd [lindex $data 0] # entry 1 means new route if {[lindex $wpd 1] == 1} { # new route set id [lindex $wpd 3] ; set ix [IndexNamed RT $id] # store the route ID number in list of route summary data set r [list $id] set wps "" set wpcnt 0 } # lines remaining set remlines [expr [lindex $wpd 0] - [lindex $wpd 1]] # process the waypoint names set linedat [lrange $wpd 4 7] while { "$linedat" != ""} { incr wpcnt if { "[lindex $linedat 0]" != "" } { lappend wps [lindex $linedat 0] #lappend wps [IndexNamed WP [lindex $linedat 0]] } set linedat [lreplace $linedat 0 1] } if {! $remlines} { # end of route lappend r $wpcnt $wps set d [FormData RT $fs $r] StoreRT $ix $id $d $wps $GetDispl } set data [lreplace $data 0 0] } return } proc ConvRSData {data pid} { # convert RT stage data got from receiver into list using FormData switch $pid { D210 { return [FormData RS "commt hidden" \ [list [lindex $data 2] [HiddenGet D210 $data]]] } } } proc InDataTR {data} { # add TRs data from receiver to database # $data is a list of pairs with kind (in {header, data}) and list of # values global CurrPSPID GetDispl # $trs is a list of pairs with TR header info and list of TP info where # the former is a pair with field names and values, and the latter is # a list obtained by FormData set trs "" ; set tps "" foreach p $data { set vals $p set tpp [ConvTPData $vals] if { [lindex $tpp 0] == 1 && "$tps" != "" } { lappend trs [list "" $tps] set tps "" } lappend tps [lindex $tpp 1] } if { "$tps" != "" } { lappend trs [list "" $tps] } foreach tr $trs { set phdr [lindex $tr 0] set fs [lindex $phdr 0] ; set vs [lindex $phdr 1] if { [set k [lsearch -exact $fs Name]] == -1 } { lappend fs Name ; lappend vs [set id [NewName TR]] } else { set id [lindex $vs $k] } lappend fs Datum TPoints ; lappend vs "WGS 84" [lindex $tr 1] StoreTR [IndexNamed TR $id] $id [FormData TR $fs $vs] $GetDispl } return } proc ConvTPData {data} { # convert TP data # return pair with flag indicating a new TR, and list obtained by FormData set fs "" ; set vs "" #set p [ConvMagPos $data] # MF change: replacing call to CreatePos by call to FormatLatLong set p [FormatLatLong [lindex $data 0] [lindex $data 1] DMS] set dl [ConvMagDate [lindex $data 4] [lindex $data 7]] set alt [lindex $data 2] lappend fs latd longd latDMS longDMS alt date secs set tpdata [FormData TP $fs [concat $vs $p $alt $dl]] # is this new flag (set to 1) really needed ? return [list 0 $tpdata] } proc ConvMagPos {indat} { #Take input strings/values and return lat/long in degrees(+-) set la [lindex $indat 0 ] if { [lrange $indat 1 1] == "S"} { set la [expr -1 * $la] } set lo [lindex $indat 2 ] if { [lrange $indat 3 3] == "W"} { set lo [expr -1 * $lo] } return [list $la $lo] } proc ConvMagDate {gt gd} { # converts Magellan date (seconds since 1990.01.01 00:00:00) into list # with date in current format and seconds since beginning of $YEAR0 # (assumed a leap year < 1990) #set secs [expr int($gt * 60.0)] global DateFormat set day 0 scan [string range $gd 0 1] %d day set mon 0 scan [string range $gd 2 3] %d mon set yr 0 scan [string range $gd 4 5] %d yr incr yr 2000 set hr 0 scan [string range $gt 0 1] %d hr set mn 0 scan [string range $gt 2 3] %d mn set sec 0 scan [string range $gt 4 6] %d sec set secs [DateToSecs $yr $mon $day $hr $mn $sec] return [list [FormatDate $DateFormat $yr $mon $day $hr $mn $sec] $secs] } ##### GPSMan interface ## not in use: proc GPSChangeProtocol {prot} { # change current protocol # $prot in {magellan} # must change GPSProtocolExt if successful global GPSProtocol GPSProtocolExt GPSState TXT NoGarmin SRLFILE Eof \ RealTimeLogOn if { "$GPSProtocol" == "$prot" } { return } if { ! $NoGarmin } { # change cannot be to garmin Log "GCP> changing to protocol $prot" set NoGarmin 1 } if { "$GPSState" == "online" } { set Eof 1 set GPSState offline close $SRLFILE DisableGPS } if { $RealTimeLogOn } { GPSRealTimeLogOnOff } set GPSProtocol $prot ; set GPSProtocolExt $TXT($prot) return } proc tdebug {msg} { global MasterClock Log "$msg ([expr [clock clicks] - $MasterClock] clicks)" set MasterClock [clock clicks] } gpsman-6.4.4.2/gmsrc/langid.tcl0000644000175000017500000011411112224351120014330 0ustar migmig# # This file is part of: # # gpsman --- GPS Manager: a manager for GPS receiver data # # Copyright (c) 1998-2013 Miguel Filgueiras migfilg@t-online.de # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. # # File : langid.tcl # Last change: 6 October 2013 # # Indonesian language file by Tri Agus Prayitno (acuss _AT_ bk.or.id) # last input from him inserted: 14 September 2008 # # file langengl.tcl is consulted first; no need for duplicating entries here # only 3 chars long names; check also ALLMONTH in file i18n-utf8.tcl set MONTHNAMES "Jan Feb Mar Apr Mei Jun Jul Agt Sep Okt Nop Des" set DLUNIT(KM,dist) km set DLUNIT(KM,subdist) m set DLUNIT(KM,speed) "km/jam" set DLUNIT(KM,area) "km2" set DLUNIT(NAUTMILE,dist) "mil laut" set DLUNIT(NAUTMILE,subdist) kaki set DLUNIT(NAUTMILE,speed) knot set DLUNIT(NAUTMILE,area) "mil laut persegi" set DLUNIT(STATMILE,dist) "mil darat" set DLUNIT(STATMILE,subdist) kaki set DLUNIT(STATMILE,speed) "mil/jam" set DLUNIT(STATMILE,area) "wilayah" set DLUNIT(M,dist) $DLUNIT(KM,subdist) set DLUNIT(FT,dist) $DLUNIT(STATMILE,subdist) set DTUNIT $DLUNIT($DISTUNIT,dist) set SPUNIT $DLUNIT($DISTUNIT,speed) set ARUNIT $DLUNIT($DISTUNIT,area) set ALUNIT $DLUNIT($ALTUNIT,dist) set MESS(RTcomp) "#\tWP\t\t$DTUNIT\tdeg\t$ALUNIT" set MESS(TRcomp) "#\t\t\t\t$ALUNIT\t$DTUNIT\t$DTUNIT\th:m:s\t$SPUNIT\tdeg" set MESS(WPNearest) "WP\t\t$DTUNIT\tdeg" array set MESS { badscale "Nilai salah untuk sekala peta" oktoexit "Klik Ok untuk keluar (data yang belum disimpan akan hilang)" okclrmap "Klik Ok untuk membersihkan layar" namelgth "Nama tidak boleh lebih dari %d karakter" cmmtlgth "Komentar tidak boleh lebih dari %d karakter" namevoid "Nama harus diisi" baddate "Tanggal salah; baris" badhdg "Heading salah %s: harus %s atau +/-" badcoord "Rentang/format koordinat salah: \"%s\", harusnya %s" outofrng "Jumlah di luar jangkauan" UTMZN "Harus huruf A..H, J..N, atau P..Z" badstrg "Karakter salah" strgvoid "String tidak boleh kosong" nan "\"%s\" bukan angka" written "Ditulis oleh" undefWP "Rute %s WP yang belum didefinisikan; gagal disimpan/ekspor" bigRT "Rute %s > jumlah maks; gagal diekspor" unkndatum "Datum tak dikenal" badcommdWP "Perintah salah saat mengambil WP; baris" notabsWP "Definisi WP salah; tidak ada tab, baris" undefinedWP "Merujuk ke WP tak dikenal: %s" nofieldsWP "WP salah, ada kolom yang kurang; baris" excfieldsWP "WP salah, terlalu banyak kolom; baris" badWPsRT "RT dengan daftar waypoint salah; baris" toomuchWPs "Peringatan: ada lebih dari %d WP dalam RT" badcommdTP "Perintah salah saat membuka TPs; baris" badTP "Titik salah dalam TR; baris" badTPsTR "TR dengan daftar titik trek salah; baris" noheader "File tidak diawali dengan header" loaderr "Kesalahan saat membuka dari file; baris" unkncommd "Perintah tak dikenal saat membuka dari file; baris" noformat "File tidak dimulai dengan Format baris" badformat "Format salah, baris" badRT "Definisi RT salah; baris" badRTargs "Argumen RT salah; baris" badTR "Definisi TR salah; baris" fileact "%s file %s?" filexists "File sudah ada!" GPSok "Koneksi ok" toomany "Terlalu banyak %ss (> %d)" cantfgt "Tidak bisa melepaskan %s: milik item yang terpetakan" cantfgted "Tidak bisa melepaskan %s: sedang diedit" cantmapRTunkn "Rute gagal dipetakan; tidak ada info untuk WP" cantmapRTed "Rute tidak dipetakan; WP sedang diedit" cantrun "Gagal menjalankan" inprogr "Operasi ini sudah dieksekusi" cantread "Gagal membaca file bantuan" cantwrtopt "Gagal menulis file konfigurasi" voidRT "Rute tidak berisi waypoint" activeRT "Rute 0 adalah rute aktif; lanjutkan?" voidTR "Trek tidak berisi titik" idinuse "Pengidentifikasi sudah digunakan" cantunmap "Tidak bisa membongkar peta %s: milik item yang terpetakan" askrevert "Kembalikan ke data awal?" askforget "Lepaskan %s ini?" notimpl "Belum diimplementasikan" forgetall "Lepaskan semua item dalam daftar %s?" counted "Ada %d %ss terdefinisi" notlisted "Item tidak terdaftar" wrgval "Nilai salah untuk" voidGR "Grup tidak memiliki elemen" initselfGR "Grup berisi grup itu sendiri melalui" GRelout "Perintah untuk elemen berada di luar definisi GR; baris" badGRels "Grup dengan daftar elemen tidak benar; baris" badcommdGRel "Perintah tidak benar saat memanggil elemen GR; baris" notypeforGRel "Elemen tanpa jenis; baris" badGRel "Definisi elemen tidak benar; baris" check "Memeriksa koneksi" toomanyerr "Terlalu banyak kesalahan; membatalkan..." getWP "Mengambil WPoint" getRT "Mengambil Rute" getTR "Mengambil Trek" putWP "Meletakkan WPoint" putRT "Meletakkan Rute" putTR "Meletakkan Trek" fillbuffWP "Memanggil penyangga WP" fillbuffRT "Memanggil penyangga RT" noACKNAK "Menerima paket saat mengharapkan ACK/NAK; periksa koneksi GPS" badplatform "Tidak ada I/O dengan port serial pada platform ini" badserial "Tidak bisa membuka alat %s" nodata "Tidak ada %ss pada pesawat" badimage "File gambar tidak benar" mapadjust "Masukkan WP pada peta; dan klik Ok jika sudah selesai" duplicate "%s sudah terpilih" clrcurrmap "Kosongkan peta sekarang?" mbkbaddatum "Datum tidak ada/dikenal" mbkbadscale "Sekala tidak boleh negatif" mbkbadat "Argumen salah" edityourrisk "Edit dengan resiko sendiri!" okclrbkmap "Klik Ok untuk membersihkan latar belakang peta" okclrbkim "Klik Ok untuk membersihkan gambar pada" badSYMBOLcode "Kode simbol tidak benar" badDISPOPTcode "Kode opsi tampilan tidak benar" goingdown "Konfigurasi tersimpan; tutup dan jalankan kembali program ini" putwhat "Jenis item apa yang mau diletakkan?" readwhat "Jenis item apa yang mau dibaca?" noWPinx "Terlalu banyak WP untuk diterima" noICinx "Terlalu banyak IC untuk diterima" getIC "Mengambil ikon" serial1 "awalan header salah" serial2 "Pengembalian perintah salah" checksum1 "Header Checksum salah" checksum2 "Data Checksum error" receiver "Tidak tersambung ke alat!" importonly1 "Hanya dapat mengimpor 1 jenis data" exportonly1 "Hanya dapat mengekspor 1 jenis data" outdatedprefs "File konfigurasi sudah basi; mohon periksa sekarang" mustchoose1type "Paling tidak 1 jenis item harus dipilih" nosuchitems "Tidak ada item yang terkait dengan deskripsi" resultsin "Hasil pencarian pada Grup" badWP "WP belum dimasukkan atau didefinisikan" badangle "Sudut harus > 0 dan < 360 derajat" georefhow "Metode Geo-referensi" cantsolve "Tidak dapat menyelesaikan persamaan" transfcantscale "Tidak ada sekala dengan transformasi ini" oldfilefmt "Format file lama; mohon simpan sebagai format baru!" unknProj "Proyeksi tak dikenal" unknTransf "Transformasi tak dikenal" badProjargs "Argumen salah untuk proyeksi" badTransfargs "Argumen salah untuk transformasi" badfield "Atribut=pasangan nilai tidak benar" badattr "Nama attribut salah" missattrs "Atribut yang kurang" mbkbadproj "Proyeksi salah" mbkbadtransf "Transformasi salah" notUTMproj "Info tersimpan untuk UTM; lanjutkan dengan memproyeksikan ke" projchg "Pastikan nilai pada parameter proyeksi" badparam "Nilai salah untuk %s" connectedto "Terhubung ke %s" recnotsuppd "Model pesawat GPS tidak didukung" gotprots "Menerima definisi protokol" badprots "Definisi protokol tidak benar" defprots "Menggunakan tabel protokol" nohidden "Abaikan data tersembunyi?" badRS "Ada tahap rute diluar definisi RT; baris" badWPsRSs "Ada tahap RT sebelum WP awal atau setelah WP akhir; baris" windowdestr "Jendela sudah ditutup!" badhidden "Format tidak benar untuk nilai tersembunyi" replname "Gantikan \"%s\" dengan nama yang memiliki paling tidak %d dari karakter berikut: %s" badalt "Nilai salah untuk ketinggian" baddistunit "Satuan jarak salah untuk sekala peta pada file konfigurasi" badgridzone "Zona grid salah" outofgrid "Posisi berada di luar rentang grid" timeoffnotint "Zona waktu harus dengan bilangan asli atau berakhiran .5" cantchkprot "Tidak bisa memeriksa dalam protokol ini" mustconn1st "Silakan periksa dulu koneksi ke pesawat GPS" rltmnotsupp "Log real-time tidak didukung oleh protokol pada pesawat GPS ini" createdir "Silakan buat direktori %s dan ulangi program" oktomkdir "Klik Ok untuk membuat direktori %s?" projnameabbr "Buat nama dan nama singkat untuk proyeksi baru" abbrevinuse "Nama singkat ini sudah ada" nameinuse "Nama ini sudah ada" projinuse "Proyeksi sedang digunakan; perubahan akan diabaikan" gridneedsdatum "Definisi grid tidak benar untuk %s; belum ada datum" badgriddatum "Datum untuk grid %s harus %s" cantchggriddatum "Grid ini harus dengan datum %s" gridinuse "Grid, digunakan oleh %s, tidak bisa dihapus; lanjutkan?" gridinusenochg "Grid ini digunakan oleh %s; perubahan diabaikan" cantwrtprgr "Gagal membuat file proyeksi" cantwrtdtel "Gagal membuat file datum" movingWP "Letakkan %s dengan klik kiri\nUntuk membatalkan klik kanan" missingdata "Data tidak cukup!" needs1wp "Rute harus berisi minimal 1 titik" emptypos "Posisi dengan kolom kosong" cantwrtsstate "Gagal menyimpan file: %s" cantrdsstate "Tidak bisa membaca file: %s" corruptsstate "File memiliki kesalahan: %s" editrisk "Edit dengan resiko sendiri!" savestate "Simpan keadaan sekarang?" delsstate "Hapus file yang sudah tersimpan?" badmapinfo "File parameter peta tidak benar" badMHloc "Pelokasi Maidenhead salah" areais "Luas (tidak memotong sendiri) poligon adalah %.3f%s" areatoosmall "Wilayah terlalu kecil (<%s km2)" projarea "Menghitung wilayah terproyeksi" selfintsct "WP berulang: RT tidak bisa memotong RT itu sendiri!" badinvmdist "Prakiraan salah saat membalik jarak meridian" badinvproj "Prakiraan salah saat membalik proyeksi %s" negdlatlong "Rentang Lintang/bujur tidak boleh negatif!" allundef "Tidak ada definisi untuk WP dalam GR" badfloats "Konversi titik-mengambang tidak berjalan dengan semestinya; anda yakin ingin terhubung?" noprintcmd "Tidak ada perintah pencetakan; masukkan pada konfigurasi" cantexecasroot "GPSMan tidak bisa dijalankan oleh root" badargtofunc "Argumen tidak benar untuk fungsi %s" redefproj "Proyeksi %s buatan sendiri akan menghapus proyeksi yang sudah ada yang bernama singkat sama; silakan ganti definisi anda!" badattr "Nama kolom %s (tidak harus diisi) salah: %s" badattrval "Nilai kolom %s (tidak harus diisi) salah: %s" couldntcd "Gagal berpindah ke direktori %s" shpext "Ekstensi salah %s; Gunakan .shp, .shx, .dbf?" shpcntopen "Tidak bisa membuat/membuka file Shapefile" shpcntcrtfs "Gagal membuat kolom .dbf file Shapefile" shpcntwrtfs "Gagal menulis kolom .dbf file Shapefile" shpoutmem "Memori habis!" shpemptyfile "File kosong" shpwrongfile "Jenis file salah" shplessdim "Dimensi pada file kurang dari yang dibutuhkan; lanjutkan?" shpbadWPinRT "WP ke-%d dengan nilai koordinat salah diabaikan pada RT %s" badGTMvers "Versi file GTrackMaker tidak bisa dijalankan" badGTMfile "Awalan yang salah pada file GTrackMaker" badGTMcounts "Nilai negatif pada file GTrackMaker" badGTMlat "Nilai lintang di luar jangkauan file GTrackMaker" badGTMlong "Nilai bujur di luar jangkaian file GTrackMaker" badGTMdatum "Datum salah pada file GTrackMaker" unobscmap "Kemunginan kesalahan terjadi karena ada jendela/ikon pada peta; ulangi setelah jeda?" cantwrtimg "Gagal membuat file gambar dengan format %s" TRsimplres "TR hasil penyederhanaan dibuat dengan nama %s" cantsaveRTid "%d RT tidak disimpan: pengidentifikasi bukan angka" cantsaveTRid "%d TR tidak disimpan: pengidentifikasi bukan angka" badtrvconf "Konfigurasi rusak; ulangi dengan yang kosong" drvsimoff "Simulasi kendara: belum dimulai!" needWP "Simulasi kendara: silakan buka atau buat beberapa WP dulu" chgrecprot "Harap ganti protokol penerima" clrtrvlog "Kosongkan catatan perjalanan?" frgetGRcs "Abaikan grup ini dan semua isi di dalamnya ?!" nmeainuse "Log real-time sudah tercatat atau ada file NMEA lain yang sedang dibuka" badfile "Ada kesalahan dalam membaca file" RTnoWPname "Fitur WP dalam RT menurut nama saja sudah tidak ada" distlarge "Jarak terlalu besar!" timeconsmg "Operasi ini sangat lama: lanjutkan?" needNpoints "Anda harus memasukkan minimal %s titik!" twotimeoffsets "Beda zona waktu dalam file" notimeoffset "Tanpa beda zona waktu dalam file; asumsi 0" baddateas "Tanggal tidak benar: %s" unknownenc "Enkoding karakter tak dikenal %s" chgbaudto "Mencoba mengubah baud rate ke %s; mohon tunggu..." baudchgfailed "Tidak bisa mengubah baud rate" busytrylater "Ada perinta lain yang sedang berjalan, silakan coba lagi nanti" obssplit "Hasil pemisahan %s bernama \"%s\"" } set TXT(RTcompflds) "# WP {$DTUNIT} drj {$ALUNIT} tahap label" set TXT(TRcompflds) \ "TP {} {} {} {$ALUNIT} {$DTUNIT} {$DTUNIT} h:m:s {$SPUNIT} deg" set TXT(starttoend) "Mulai: untuk mengakhiri %s $DTUNIT;" set TXT(startmax) "maks %s $DTUNIT;" set TXT(WPnearflds) "WP {$DTUNIT} drj" set TXT(within) "Dalam (${DTUNIT}s)" set TXT(between) "Antara (${DTUNIT}s)" array set TXT { GMtit "GPS Manager - versi" exit Keluar map Peta load Buka loadfrm "Buka dari" save Simpan saveels "Simpan elemen" saveto "Simpan sebagai" clear Kosongkan clearall "Kosongkan Semua" newWP "WP Baru" newRT "RT Baru" newTR "TR Baru" newGR "GR Baru" import Impor importfrm "Impor dari" export Ekspor exportels "Ekspor elemen" exportto "Ekspor ke" count Hitung trueN "Utara Sebenarnya" automagn "Auto Magnetis" usrdef "Definsikan sendiri" nameWP WPoint nameRT Rute nameTR Trek nameGR Grup namePlot Plot nameMap Peta nameRTComp "Penghitungan Rute" nameTRComp "Penghitungan Trek" GPSrec "Pesawat GPS" turnoff "Matikan" get Ambil put Letakkan all Semua select Pilih selection "Yang aktif" options Pilihan DMS DMS DMM DMM DDD DDD GRA Tingkat UTM/UPS UTM/UPS MH MH message Pesan cancel Batalkan file File ovwrt Gantikan app Gabung online tersambung offline terputus check periksa create Buat revert Kembalikan colour warna grey "abu-abu" mono mono portr tegak landsc mendatar legend Legenda incscale "Dengan sekala" more Lanjut waypoint Waypoint name Nama created "Sudah dibuat" cmmt Komentar withWP "Dengan WP ini:" displ "Tampilkan di peta" startRT "Start RT" route Rute number Jumlah insb "Sisipkan sebelum" insa "Sisipkan setelah" del Hapus repl "Gantikan dengan" comp Hitung RTcomp "Penghitungan Rute" savecomp "Simpan Penghitungan" totdst "Total jarak" tottime "Total waktu" track Trek chophd "Potong kepala" choptl "Potong ekor" incb "Sertakan sebelum" date Tanggal newdate "Buat tanggal untuk titik selanjutnya" endprTR "Akhir dari trek terdahulu" begnxt "Awal untuk lanjutan" date1st "Tanggal untuk titik pertama lanjutan" TRcomp "Penghitungan Trek" avgsp "Kec. rata-rata" maxsp "Kec. maksimal" minsp "Kec. minimal" lat Lintang long Bujur ze ZT zn ZU eastng Easting nrthng Northing zone Zona change Ganti forget Lepaskan others Lainnya opt_Interf "Antarmuka" optLANG Bahasa optISOLATIN1 "Buat karakter" optDELETE "DEL menghapus karakter terakhir" optMWINDOWSCONF "Jendela utama" optGPSREC "GPS Model" opt_GPSRecConf "Parameter pesawat" optACCEPTALLCHARS "Terima semua karakter" optNAMELENGTH "Panjang nama maksimal" optINTERVAL "Interval pengambilan data" optCOMMENTLENGTH "Panjang maks komentar" optMAXWPOINTS "Jumlah maks WPoint" optMAXROUTES "Jumlah maks Rute" optMAXWPINROUTE "Jumlah maks WP dalam Rute" optMAXTPOINTS "Jumlah maks titik trek" optCREATIONDATE "Data mempunyai tanggal pembuatan" optNOLOWERCASE "Data tanpa huruf kecil" optDEFAULTSYMBOL "Simbol default WP" optDEFAULTDISPOPT "Opsi tampilan default WP" opt_Data "Data" optEQNAMEDATA "Data dengan nama sama" optKEEPHIDDEN "Biarkan data tersembunyi" optDatum Datum optTimeOffset "Ofset waktu" optACCFORMULAE "Rumus tepat" optASKPROJPARAMS "Konfirmasi parameter proyeksi" optBalloonHelp "Panduan" optTRNUMBERINTVL "Tampilkan nomor TP pada peta setiap" opt_Formats "Satuan dan format" optDISTUNIT "Jarak" KM km NAUTMILE "mil laut" STATMILE "mil darat" optPositionFormat "Format posisi" optDateFormat "Format tanggal" opt_Geom "Geometri jendela" opt_MapGeom "Geometri peta" optMAPWIDTH "Lebar peta" optMAPHEIGHT "Tinggi peta" optMAPSCLENGTH "Panjang sekala peta" optMAPSCALE "Sekala peta" optMAXMENUITEMS "Jumlah maks item menu" optLPOSX "Posisi x jendela daftar file" optLPOSY "Posisi y jendela daftar file" optMPOSX "Posisi x jendela peta" optMPOSY "Posisi y jendela peta" optRPOSX "Posisi x jendela pesawat" optRPOSY "Posisi y jendela pesawat" optEPOSX "Posisi x jendela kesalahan" optEPOSY "Posisi y jendela kesalahan" optDPOSX "Posisi x dialog" optDPOSY "Posisi x dialog" optDPOSRTMAP "Ofset dialog RT/peta" optLISTWIDTH "Lebar daftar file" optLISTHEIGHT "Tinggi daftar file" optCOLOUR Warna optCOLOUR,fg Depan optCOLOUR,bg Belakang optCOLOUR,messbg "Latar belakang kesalahan" optCOLOUR,confbg "Latar belakang konfirmasi" optCOLOUR,selbg "Latar belakang aktif" optCOLOUR,dialbg "Latar belakang input" optCOLOUR,offline "Pesawat tidak tersambung" optCOLOUR,online "Pesawat tersambung" optCOLOUR,check "Tombol cek terpilih" optCOLOUR,ballbg "Latar belakang panduan" optCOLOUR,ballfg "Warna depan panduan" optMAPCOLOUR "Warna peta" optMAPCOLOUR,mapsel "Item peta aktif" optMAPCOLOUR,WP "Waypoint pada peta" optMAPCOLOUR,RT "Rute pada peta" optMAPCOLOUR,mkRT "Rute terdefinisi pada peta" optMAPCOLOUR,TR "Trek pada peta" optMAPCOLOUR,TP "Titik trek pada peta" optMAPCOLOUR,mapleg "Legenda peta" optMAPCOLOUR,anim "Animasi pada peta" optMAPCOLOUR,emptygrid "Gambar tidak ada" optMAPCOLOUR,fullgrid "Gambar yang ada" optMAPFONTSIZE "Ukuran huruf pada peta" optDEFMAPPROJ "Proyeksi peta" optDEFMAPPFRMT "Koordinat peta" opt_Files "Alat dan file" optDEFSPORT "Alat" optSAVESTATE "Simpan keadaan saat keluar" optDELSTATE "Hapus file setelah mengembalikan keadaan" optPERMS "Hak akses file" optPRINTCMD "Perintah pencetakan" optPAPERSIZE "Ukuran kertas" red Merah green Hijau blue Biru owner Pemilik permgroup Grup others Lainnya fread Baca fwrite Tulis fexec Eksekusi YYYYMMDD YYYYMMDD MMDDYYYY MMDDYYYY DDMMMYYYY DDMMMYYYY YYYY-MM-DD YYYY-MM-DD mainwd "Jendela utama" distazim "Jarak dan arah" nearestWPs "WP terdekat" fromto "Dari %s ke %s" degrees derajat nameWPDistBear "jarak dan arah" nameWPNearest "WP terdekat" inrect "Dalam kotak" forthisWP "untuk WP ini" formappedWPs "untuk WP yang dipetakan" group Grup element Elemen insert Sisipkan joinGR "Gabungkan Grup" TRtoRT "Konversi dari TR ke RT" TRRTnpoints "Tidak ada point yang bisa disimpan" TRTRdispl "Tampilkan TR sekarang" WP WP RT RT TR TR GR GR commrec "Komunikasi dengan pesawat GPS" abort Batalkan ACKs ACK NAKs NAK packets paket unnamed "(tak diketahui)" fromTR "Dari TR: %s" mapload "Gambar ber-georeferens" loadmback Buka savemback "Simpan info geo-ref" chgmback Ganti clearmback Kosongkan backgrnd "Latar belakang" nameMapBkInfo "Info Latar belakang" nameMapInfo "Konfirguasi Peta" mpbkchg "Ganti Latar belakang" mpbkgrcs "Posisi Grid" nameImage Gambar symbol Simbol SYCATgeneral "Penggunaan Umum" SYCATland Daratan SYCATwater Perairan SYCATaviation Penerbangan SY1st_aid "P3K" SYWP_buoy_white "Pelampung, putih" SYWP_dot "WP" SYairport "Bandara" SYamusement_park "Taman Hiburan" SYanchor "Jangkar" SYavn_danger "Bahaya" SYavn_faf "1st approach fix" SYavn_lom "Penanda luar lokal" SYavn_map "Titik pendekatan salah" SYavn_ndb "Menara ND" SYavn_tacan "TACAN" SYavn_vor "Jangkauan omni VHF" SYavn_vordme "VOR-DME" SYavn_vortac "VOR/TACAN" SYball "Bola" SYbeach "Pantai" SYbell "Bel" SYboat "Perahu" SYboat_ramp "Lompatan perahu" SYborder "Lintas batas" SYbowling "Boling" SYbridge "Jembatan" SYbuilding "Bangunan" SYbuoy_amber "Pelampung, kuning" SYbuoy_black "Pelampung, hitam" SYbuoy_blue "Pelampung, biru" SYbuoy_green "Pelampung, hijau" SYbuoy_green_red "Pelampung, hijau merah" SYbuoy_green_white "Pelampung, hijau putih" SYbuoy_orange "Pelampung, jingga" SYbuoy_red "Pelampung, merah" SYbuoy_red_green "Pelampung, merah hijau" SYbuoy_red_white "Pelampung, merah putih" SYbuoy_violet "Pelampung, ungu" SYbuoy_white "Pelampung, putih" SYbuoy_white_green "Pelampung, putih hijau" SYbuoy_white_red "Pelampung, putih merah" SYcamping "Lokasi kemah" SYcapitol_city "Kota, metropolitan" SYcar "Mobil" SYcar_rental "Penyewaan mobil" SYcar_repair "Bengkel" SYcasino "Kasino" SYcastle "Istana" SYcemetery "Pekuburan" SYchapel "Kapel" SYchurch "Gereja" SYcircle_x "Tanda X terlingkar" SYcivil "Lokasi sipil" SYcontrolled "Wilayah terawasi" SYcrossing "Persilangan" SYdam "Bendungan" SYdanger "Bahaya" SYdeer "Rusa" SYdiamond_green "Berlian, hijau" SYdiamond_red "Berlian, merah" SYdiver_down_1 "Penyelaman 1" SYdiver_down_2 "Penyelaman 2" SYdollar "Dolar" SYdot "Titik" SYdrinking_water "Air minum" SYduck "Bebek" SYelevation "Ketinggian" SYexit_no_serv "Keluar, tanpa layanan" SYexit "Keluar" SYfactory "Pabrik" SYfastfood "Resto cepat saji" SYfish "Ikan" SYfitness "Fitness" SYflag "Bendera" SYfreeway "Jalan Negara" SYfuel "Pompa Bensin" SYfuel_store "Pom Bensin & toko" SYgeo_name_land "Nama tempat, daratan" SYgeo_name_man "Nama tempat, buatan manusia" SYgeo_name_water "Nama tempat, perairan" SYglider "Glider" SYgolf "Golf" SYheliport "Helipad" SYhorn "Klakson" SYhouse "Rumah" SYice_skating "Ice skating" SYinfo "Info" SYintersection "Persimpangan" SYis_highway "Jalan Tol" SYknife_fork "Makanan" SYladder "Tangga" SYlanding "Pendaratan" SYlarge_city "Kota, besar" SYlarge_exit_ns "Keluar tanpa layanan, besar" SYlarge_ramp_int "Ramp int, large" SYlevee "Tanggul" SYlight "Mercu suar" SYlodging "Penebangan kayu" SYmany_fish "Daerah ikan" SYmany_tracks "Banyak jejak" SYmark_x "Tanda, x" SYmedium_city "Kota, sedang" SYmile_marker "Rambu km" SYmilitary "Daerah Militer" SYmine "Pertambangan" SYMOB "Man over board" SYmonument "Monumen" SYmountains "Pegunungan" SYmovie "Bioskop" SYmug "Mug" SYmuseum "Museum" SYntl_highway "Jalan Negara" SYnull "(transparan)" SYnull_2 "(void)" SYoil_field "Tambang minyak" SYparachute "Parasit" SYpark "Taman" SYparking "Parkir" SYpharmacy "Apotik" SYphone "Telpon umum" SYpicnic "Piknik" SYpizza "Pizza" SYpolice "Kantor polisi" SYpost_office "Kantor pos" SYprivate "Daerah pribadi" SYradio_beacon "Menara radio" SYramp_int "Persimpangan miring" SYrestricted "Daerah terbatas" SYrestrooms "WC" SYRV_park "Tempat parkir karavan" SYscenic "Permai" SYschool "Sekolah" SYseaplane "Pendaratan pesawat terbang air" SYshopping_cart "Perbelanjaan" SYshort_tower "Menara, rendah" SYshowers "Tempat mandi" SYskiing "Ski air" SYskull "Tengkorak" SYsmall_city "Kota, kecil" SYsnow_skiing "Ski es" SYsoft_field "Daerah tanah labil" SYsquare_green "Kotak, hijau" SYsquare_red "Kotak, merah" SYst_highway "Jalan Propinsi" SYstadium "Stadion" SYstore "Toko" SYstreet_int "Persimpangan jalan" SYsummit "Puncak" SYswimming "Renang" SYtake_off "Tinggal landas" SYtall_tower "Menara, tinggi" SYtheater Teater SYtoll Tol SYtow_truck "Truk gandeng" SYtraceback "Trace-back" SYtracks Jejak SYtrail_head "Jalan setapak" SYtree "Pohon" SYtruck_stop "Pemberhentian truk" SYtunnel "Terowongan" SYultralight "Ultra ringan" SYus_highway "US highway" SYweight_station "Jemb. timbang" SYwreck "Puing perahu" SYzoo "Kebun binatang" psvisible "Hanya bagian yang terlihat" DISPsymbol "Simbol saja" DISPs_name "Simbol & nama" DISPs_comment "Simbol & komentar" DISPname "Nama saja" DISPcomment "Komentar saja" dispopt Tampilan mapitems "Tampilkan item pada peta" nameIC Ikon prod Produk WPCapac "Kapasitas Waypoint" ICCapac "Kapasitas Ikon" RTCapac "Kapasitas Rute" TRCapac "Kapasitas Trek" protcl "Protokol" ICGraph "Gambar ikon" WPperRT "Waypoint per Rute" notinGR "tidak dalam (sub-)grup" onlyinGR "hanya dalam (sub-)grup" loadgrels "Buka elemen" importgrels "Impor elemen" about "Tentang GPSMan..." contrib "Kontributor" errorsto "Laporkan kesalahan program ke:" obsTRToRT "WP dibuat dengan konversi TR ke RT" nameLists "Lihat daftar" nameData "Data" MWCmap "Map" MWClists "Daftar" MWCsingle "Satu jendela" search "Cari" rmrk "NB" closeto "Dekat ke" with "Dengan" srchres "DITEMUKAN" database "Database" where "Dimana" what "Apa" list "daftar" distance "Jarak" fromWP "dari Waypoint" fromPos "dari posisi" azimuth "Arah" any "semua" opening "Awalan" suggested "disarankan" another "Another" srchdd1 "Cari di" srchdd2Data "semua item" srchdd2GR "Grup" from "dari" started "dimulai pada" transf "Transf Koord" TRNSFAffine "Affine" TRNSFAffineConf "Aff Conformal" TRNSFNoRot "Conf No Rot" projection "Proyeksi" lat0 "Lintang bagian tengah" long0 "Bujur bagian tengah" lat1 "Lintang paralel st 1" lat2 "Lintang paralel st 2" latF "Lintang awal semu" longF "Bujur awal semu" k0 "Faktor sekala" NTFzone zona PRJUTM "UTM/UPS" PRJTM "Transverse Mercator" PRJCMP "Portuguese Mil Map" PRJBNG "British National Grid" PRJBWI "British West Indies" PRJITM "Irish Transv Mercator" PRJGKK "German Grid" PRJLCC1 "Lambert Conic Conf 1" PRJLCC2 "Lambert Conic Conf 2" PRJKKJP "Basic Finnish Grid" PRJKKJY "Uniform Finnish Grid" PRJSEG "Swedish Grid" PRJMerc1 "Mercator 1" PRJMerc2 "Mercator 2" PRJCS "Cassini-Soldner" PRJAPOLY "American Polyconic" PRJStereogr Stereografik PRJTWG "Taiwan Grid" PRJSOM "Swiss Oblique Mercator" PRJLV03 "Swiss LV03 Grid" PRJIcG "Iceland Grid" PRJRDG "The Netherlands Grid" PRJBMN "Grid BMN Austria" PRJCTR "Carta Tecnica Reg (I)" PRJLamb93 "Lambert 93" PRJLambNTFe "NTF IIet" PRJLambNTF "NTF" NTFzone zona dontaskagain "Jangan tanya lagi" rename "Buat nama baru" oname "Nama asli" never "Tidak" ask "Tanyakan" always "Selalu" stage "Tahap" label "Label" alt "Ketinggian" optALTUNIT "Ketinggian" locate "Lokasikan" animation Animasi fast Cepat slow Lambat start Mulai pause Jeda speed Kecepatan centred "Tetap di tengah" state Keadaan animinit "di awal/akhir" animon "aktif.." animpause "jeda.." animabort "membatalkan" realtimelog "Log trek real-time" garmin Garmin nmea "NMEA 0183" stext "File teks" simul "Simulator" lowrance Lowrance getlog "Ambil Log" stop Henti dolog Catat show Tampilkan hide Sembunyikan posfixerror error posfix_ ? posfix2D 2D posfix3D 3D posfix2D-diff "2D d" posfix3D-diff "3D d" posfixGPS GPS posfixDGPS DGPS posfixAuto ok posfixsimul simul restart "Ulang Program" mkTR "Buat TR" PVTflds "# t ltg bjr tgi fix EPE EPH EPV vel_x vel_y vel_z TRK" namePVTData "Log data" mkavgWP "Buat WP ratarata" move Pindahkan define Definisikan open Buka defs "Definisi" baseproj "Proyeksi dasar" abbrev "Nama singkat" grid Grid use Gunakan unit Satuan feasting "Timur semu" fnorthing "Utara semua" bounds Ikatan max Maks min Min easting Easting northing Northing fixeddatum "datum tetap" elevation Ketinggian usewps "Gunakan WPs" chgpfrmt "Ganti format posisi" changegroupsymbol "Ganti simbol" here "Di sini" atprevwp "Pada WP sebelumnya" prevwp "WP sebelumnya" firstwp "WP pertama" chglstrs "Edit tahap sebelumnya" chgnxtrs "Edit tahap selanjutnya" contnend "Tambahkan di akhir" closemenu "Tutup menu" ellpsd Elipsoid datum Datum userdefs "Definisikan sendiri" edmap "Edit pada peta" actual aktual rtimelogintv "Log interval" inca "Sertakan setelah" invert "Balikkan" recwindow "Jendela penerimaan" volume "Volume" latS "L Selatan" latN "L Utara" longW "B Barat" longE "B Timur" no Tidak computations Penghitungan comparea "Hitung luas" cluster Kelompok centre Tengah mkclusters "Buat kelompok" quadr "Segi empat" dlat "Rentang garis lintang" dlong "Rentang garis bujur" collcntr "Mengumpulkan tengah..." compclstr "Menghitung kelompok..." crtgclstrgrs "Membuat grup..." chgdatum "Ganti datum..." print Cetak prevctr "Sebelumnya" printopt "Pilihan pencetakan" chgmfsize "Ganti ukuran huruf pada peta" numberid "Nomor/Id" hiddendata "Data tersembunyi" YYYY/MM/DD YYYY/MM/DD cwpsdef "WP kontrol yang akan diisi" nextTP "TP selanjutnya" generate Buat optSERIALBAUD "Baud Rate" optDEFTRTWIDTH "Lebar garis RT" optDEFTTRWIDTH "Lebar garis TR" width Lebar TRtoTR "Penyederhanaan TR" TRlinedispl "Lihat hasil sekarang" obsTRsimpl "Hasil TR dari penyederhanaan" simplTRto "Sederhanakan menjadi" exstglog "Catatan yang ada" contnsly "Terus menerus" animate "buat animasi" animabbrev "anim." noanabbr "tanpa anim." zelev "skala Z" xyelev "skala XY" notext "tanpa teks" view "Tampilan" sideview "Tampak samping" persptv "Perspektif" SYgeocache "Geocache" SYgeocache_fnd "Ditemukan Geocache" optMAPCOLOUR,trvtrk "Panah TRK" optMAPCOLOUR,trvtrn "Panah TRN" optMAPCOLOUR,trvcts "Panah CTS" optMAPCOLOUR,trvcts2 "Panah CTS ke-2" optMAPCOLOUR,trvvel_z "Panah turun/naik" optMAPCOLOUR,trvwrnimportant "Peringatan penting (nav)" optMAPCOLOUR,trvwrnnormal "Peringatan (nav)" optMAPCOLOUR,trvwrninfo "Informasi (nav)" travel Perjalanan notravel "Hentikan Perjalanan" optTRAVELFONTSIZE "Ukuran huruf pada Perjalanan" travdisplay "Konfigurasi tampilan" travchgdisplay "Ganti ke tampilan %s" travdsetup "Konfigurasi tampilan Perjalanan" navMOB "MOB: Man Over Board!" startnav "Navigasi" navWP "Pergi ke WP" goback "Kembali" follow "Ikuti %s" exactly "sama persis" fromnrst "dari yang terdekat" inrvrs "kebalikan" forgetgoal "Lupakan tujuan" suspend "Tunda" resume "Lanjutkan" TRVfix "Fix" TRVhour "Waktu" TRVspeed "Kecepatan" TRVpos "Pos" TRValt "Alt" TRVtrk "TRK" TRVnxtWP "Ke" TRVprvWP "Dari" TRVete "ETE" TRVeta "ETA" TRVvmg "VMG" TRVxtk "XTK" TRVcts "CTS" TRVtrn "TRN" TRVvel_z "Kecepatan V" TRVtrkcts "TRK, CTS" TRVdist "Jarak" TRVc_trkcts "Panah TRK/CTS" TRVc_trn "Panah TRN" TRVc_vel_z "Panah turun/naik" add "Tambahkan" addlabelled "Tambahkan dengan label" remove "Hapus" mindist "Jarak kedatangan" chginggoal "Mengubah tujuan selanjutnya" chggoalhlp "Kapan mengubah tujuan\ndari tujuan saat ini ke tujuan berikutnya\nsaat mengikuti/menelusuri RT/TR" soon segera late nanti warnings "Peringatan" dowarn "Peringatan" warnconf "Konfigurasi peringatan" priority Prioritas high penting medium biasa low "kurang penting" warnprox "Jarak ke WP <" warnanchor "Jarak ke WP >" warnspeed "Kecepatan >" warntrn "TRN (abs)>" warnvspeed "Kecepatan vertikal" warnxtk "XTK (abs)>" fntsize "Ukuran huruf" trvhlpbox "Gunakan klik-kanan untuk mengubah urutan elemen di bawah ini" trvhlpbxs "Gunakan klik-kanan untuk mengubah daftar elemen" trvwarrv "Tiba pada %s!" trvwleave "Berangkat dari %s!" trvwspeed "Kecepatan > %s!" trvwtrn "TRN > %s!" trvwvspeed "Kec. vertikal bukan pada [%s,%s]!" trvwxtk "XTK > %s!" trvwnolog "Pencatatan Real-time dimatikan!" trvwnopos "Posisi sebelumnya tidak ada" trvwuwps "RT memiliki WP tidak jelas" trvwchg "Sekarang berangkat ke %s" TP TP drivesim "simulasi kendara" startfrom "Mulai dari..." outofctrl "Di luar kontrol!" right Kanan left Kiri straight Lurus rthlpdsim "Tombol panah: mengubah arah, mengatur kecepatan\nSpace bar: lurus" chggoal "Ganti ke tujuan berikutnya" Ghidden_class Kelas Ghidden_subclass Sub-kelas Ghidden_lnk_ident "ID Tahapan" Ghidden_colour Warna Ghidden_attrs Atribut Ghidden_depth Kedalaman Ghidden_state Propinsi Ghidden_country Negara Ghidden_facility Fasilitas Ghidden_city Kota Ghidden_addr Alamat Ghidden_int_road "Simpang jalan" Ghidden_dtyp "Tampilkan opt+jenis" Ghidden_ete "ETE" Ghidden_display "Tampilkan?" Ghidden_yes Ya Ghidden_no Tidak Ghidden_user "User" Ghidden_user_symbol "User (simbol saja)" Ghidden_non_user "Non-user" Ghidden_avn_airport "Bandara" Ghidden_avn_inters "Simpang Avn" Ghidden_avn_NDB "NDB" Ghidden_avn_VOR "VOR" Ghidden_avn_airp_rway "Wilayah landas pacu" Ghidden_avn_airp_int "Simpangan bandara" Ghidden_avn_airp_NDB "NDB bandara" Ghidden_map_pt "Titik" Ghidden_map_area "Wilayah" Ghidden_map_int "Persimpangan" Ghidden_map_addr "Alamat" Ghidden_map_line "Garis" Ghidden_locked Terkunci Ghidden_default "Default" Ghidden_black Hitam Ghidden_white Putih Ghidden_red Merah Ghidden_dark_red "Merah tua" Ghidden_green Hijau Ghidden_dark_green "Hijau tua" Ghidden_blue Biru Ghidden_dark_blue "Biru tua" Ghidden_yellow Kuning Ghidden_dark_yellow "Kuning tua" Ghidden_magenta Ungu Ghidden_dark_magenta "Ungu gelap" Ghidden_cyan "Biru cerah" Ghidden_dark_cyan "Biru laut" Ghidden_light_gray "Abu-abu muda" Ghidden_dark_gray "Abu-abu gelap" Ghidden_line Garis Ghidden_link Tahap Ghidden_net Jaringan Ghidden_direct Langsung Ghidden_snap Snap forgetGRcs "Abaikan GR&Els" renres "SUDAH DIGANTI NAMA" undo "Gak jadi" UTMzone zona tfwfile "File TFW" ok Ok newWPatdb "WP baru pada..." opinprogr "Operasi dalam proses" working "Bekerja" aborted "Gugurkan!" errwarn "Kesalahan/peringatan!" SYbiker "Peng. motor" SYbox_blue "Kotak, biru" SYbox_green "Kotak, hijau" SYbox_red "Kotak, merah" SYflag_pin_blue "Pin bendera, biru" SYflag_pin_green "Pin bendera, hijau" SYflag_pin_red "Pin bendera, merah" SYhouse_2 "Rumah 2" SYpin_blue "Pin, biru" SYpin_green "Pin, hijau" SYpin_red "Pin, merah" ozimapfile "File Ozi Map" info "Informasi" BGAfeature "Fitur BGA" BGAfindblty "Ketercarian BGA" BGAairact "Aktivitas Udara BGA" optUSESLOWOPWINDOW "Jendela untuk kontrol operasi lambat" optDEFTRECPROTOCOL "Protokol default" optLNSREACT "Reaksi LN thd mouse" syhlpbx "Gunakan klik-kanan untuk\nmengubah daftar elemen" lstsqsfile "File Least Squares" totdstng "Jarak total, tanpa gap" tottimeng "Waktu total, tanpa gap" SYcross "Tanda plus" SYcross_3p "Tanda plus 3p" mapfitWPs "Tampilkan WP yang masuk peta" showfitinfo "Tampilkan informasi yang masuk peta" rmsxydev "rms(deviasi x,y)" resstderr "std error residual" chgdev "Ganti alat" maxalt "Ketinggian maksimal" minalt "Ketinggian minimal" alt_cumula "Ketinggian pendakian kumulatif" alt_cumuld "Ketinggin penurunan kumulatif" optSHOWFILEITEMS "Secara default tampilkan pada item peta yang dibaca" vertgridlines "Garis Grid Vert" convert "Konversi" split "Pisahkan" bysel "menurut titik terpilih" byseg "menurut segmen" openits "Buka %s" } # the following definitions must be coherent with $TXT array set INVTXT { DMS DMS DMM DMM DDD DDD Tingkat GRA UTM/UPS UTM/UPS MH MH WP WP RT RT TR TR GR GR } # changes by Miguel Filgueiras to RM contribution set TXT(srChainage) $TXT(totdst) set TXT(srShowRest) $TXT(gpSRests) set TXT(gpSym) $TXT(symbol) set TXT(srRest) $TXT(gpRest) gpsman-6.4.4.2/gmsrc/symbols.tcl0000644000175000017500000010513112224351120014564 0ustar migmig# # This file is part of: # # gpsman --- GPS Manager: a manager for GPS receiver data # # Copyright (c) 1998-2013 Miguel Filgueiras migfilg@t-online.de # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. # # File: symbols.tcl # Last change: 6 October 2013 # ## GPSMan symbols and display options # names for symbols used by GPSMan (mostly taken from Garmin # GPS Interface Specification version 1, revisions 2, A and B; and from # the set used by Lowrance receivers, provided by Brian Baulch) # user defined symbols: # - shown as $DEFAULTSYMBOL or WP_dot # - represented as user:REPR where REPR is the brand-dependent # representation # - are not shown in symbol menus # icons will have either 15x15 or 30x30 pixels depending on the user # option $ICONSIZE # # icon images are distributed as 15x15 pixels GIFs, 30x30 ones being # obtained by Tk image zooming # # a small number of icons is defined also as bitmaps below, in both # sizes, to avoid errors if the GIFs are missing # these values are used in forming the GIF files names and are then # set depending on $ICONSIZE set ICONWIDTH 15 set ICONHEIGHT 15 # GPSMan symbol names and their categories (not mutually exclusive) # user:REPR is used for user-defined ones set SYMBOLS { 1st_aid MOB RV_park WP_buoy_white WP_dot airport amusement_park anchor anchor_prohib avn_danger avn_faf avn_lom avn_map avn_ndb avn_tacan avn_vor avn_vordme avn_vortac bait_tackle ball beach beacon bell biker boat boat_ramp border bot_cond bowling box_blue box_green box_red bridge building buoy_amber buoy_black buoy_blue buoy_green buoy_green_red buoy_green_white buoy_orange buoy_red buoy_red_green buoy_red_white buoy_violet buoy_white buoy_white_green buoy_white_red camping capitol_city car car_rental car_repair casino castle cemetery chapel church circle_blue circle_green circle_red circle_x civil cntct_afro cntct_alien cntct_ball_cap cntct_big_ears cntct_biker cntct_bug cntct_cat cntct_dog cntct_dreads cntct_female1 cntct_female2 cntct_female3 cntct_goatee cntct_kung_fu cntct_pig cntct_pirate cntct_ranger cntct_smiley cntct_spike cntct_sumo coast_guard controlled cross cross_3p crossing dam danger deer diamond_blue diamond_green diamond_red diver_down_1 diver_down_2 dock dollar dot drinking_water dropoff duck elevation exit exit_no_serv factory fastfood fhs_facility fish fitness flag flag_pin_blue flag_pin_green flag_pin_red freeway fuel fuel_store geo_name_land geo_name_man geo_name_water geocache geocache_fnd glider golf heliport horn house house_2 hydrant ice_skating info intersection is_highway knife_fork ladder landing large_city large_exit_ns large_ramp_int letter_a_blue letter_a_green letter_a_red letter_b_blue letter_b_green letter_b_red letter_c_blue letter_c_green letter_c_red letter_d_blue letter_d_green letter_d_red levee light lodging many_fish many_tracks marina mark_x medium_city mile_marker military mine monument mountains movie mug museum ntl_highway null null_2 number_0_blue number_0_green number_0_red number_1_blue number_1_green number_1_red number_2_blue number_2_green number_2_red number_3_blue number_3_green number_3_red number_4_blue number_4_green number_4_red number_5_blue number_5_green number_5_red number_6_blue number_6_green number_6_red number_7_blue number_7_green number_7_red number_8_blue number_8_green number_8_red number_9_blue number_9_green number_9_red oil_field open_24hr oval_blue oval_green oval_red parachute park parking pharmacy phone picnic pin_blue pin_green pin_red pizza police post_office private radio_beacon ramp_int rect_blue rect_green rect_red reef restricted restrooms scenic school seaplane shopping_cart short_tower showers skiing skull small_city snow_skiing soft_field square_blue square_green square_red st_highway stadium store street_int stump summit swimming take_off tall_tower theater tide_pred_stn toll tow_truck traceback tracks trail_head tree triangle_blue triangle_green triangle_red truck_stop tunnel ultralight us_highway weedbed weight_station wreck zoo } set UNKNOWNSYMBOLS "" # high-level description of symbol menus: list of lists with symbol # internal names or elements of the one of the forms ==TEXT or =INDEX, # giving the title for a sub-menu (as literal text or index in TXT), # followed by a sub-list describing the sub-menu # symbol default menu: assumed in proc SymbolCustomMenu to have a # sub-menu for each category and nothing else at top-level and titles # given by =INDEX set SYDEFTMENU {=SYCATgeneral {WP_dot danger skull bell flag flag_pin_blue flag_pin_green flag_pin_red traceback dollar null null_2 ball dot cross cross_3p mark_x circle_x diamond_blue diamond_green diamond_red square_blue square_green square_red box_blue box_green box_red pin_blue pin_green pin_red circle_red circle_green circle_blue oval_red oval_green oval_blue rect_red rect_green rect_blue triangle_blue triangle_green triangle_red letter_a_red letter_b_red letter_c_red letter_d_red letter_a_green letter_c_green letter_b_green letter_d_green letter_a_blue letter_b_blue letter_c_blue letter_d_blue number_0_red number_1_red number_2_red number_3_red number_4_red number_5_red number_6_red number_7_red number_8_red number_9_red number_0_green number_1_green number_2_green number_3_green number_4_green number_5_green number_6_green number_7_green number_8_green number_9_green number_0_blue number_1_blue number_2_blue number_3_blue number_4_blue number_5_blue number_6_blue number_7_blue number_8_blue number_9_blue cntct_smiley cntct_ball_cap cntct_big_ears cntct_spike cntct_goatee cntct_afro cntct_dreads cntct_female1 cntct_female2 cntct_female3 cntct_ranger cntct_kung_fu cntct_sumo cntct_pirate cntct_biker cntct_alien cntct_bug cntct_cat cntct_dog cntct_pig} =SYCATland {1st_aid info small_city medium_city large_city capitol_city car car_rental car_repair tow_truck biker restrooms pharmacy phone post_office police hydrant tunnel bridge dam levee mountains elevation summit ladder trail_head tracks many_tracks tree deer duck fish many_fish parking house house_2 building lodging park castle monument church chapel cemetery museum zoo theater casino scenic airport factory mine oil_field knife_fork fastfood mug pizza movie school shopping_cart store stadium amusement_park beach swimming showers skiing golf bowling fitness snow_skiing ice_skating picnic camping drinking_water geocache geocache_fnd RV_park fuel fuel_store horn exit exit_no_serv large_exit_ns mile_marker border toll freeway ntl_highway is_highway st_highway us_highway street_int ramp_int large_ramp_int crossing truck_stop weight_station parachute glider ultralight tall_tower short_tower take_off landing geo_name_land geo_name_man geo_name_water civil military} =SYCATwater {anchor anchor_prohib beacon reef stump weedbed dropoff dock marina coast_guard tide_pred_stn boat boat_ramp fish many_fish fuel light MOB beach swimming wreck dam mile_marker radio_beacon WP_buoy_white buoy_amber buoy_black buoy_blue buoy_green buoy_green_red buoy_green_white buoy_orange buoy_red buoy_red_green buoy_red_white buoy_violet buoy_white buoy_white_green buoy_white_red diver_down_1 diver_down_2 open_24hr fhs_facility bot_cond bait_tackle} =SYCATaviation {airport heliport private seaplane soft_field landing take_off radio_beacon avn_danger avn_faf avn_lom avn_map avn_ndb avn_tacan avn_vor avn_vordme avn_vortac controlled restricted intersection parachute glider ultralight tall_tower short_tower} } # GPSMan display options set DISPOPTS {symbol s_name s_comment name comment} # images that must be defined because the symbols are used by GPSMan # must have an internal definitions as 15x15 and 30x30 bitmaps # there is a frame image as 17x17 and 34x34 bitmaps # this must be changed if initial values of $ICONWIDTH or $ICONHEIGHT change # both WP_dot and interr are assumed to be in this list set DEFINEIMGS {WP_dot diamond_green diamond_red MOB interr} array set INTERNALIMG { frame,dims 17x17 frame,fg red frame { #define fr_width 17 #define fr_height 17 static unsigned char fr_bits[] = { 0xff, 0xff, 0x01, 0xff, 0xff, 0x01, 0x03, 0x80, 0x01, 0x03, 0x80, 0x01, 0x03, 0x80, 0x01, 0x03, 0x80, 0x01, 0x03, 0x80, 0x01, 0x03, 0x80, 0x01, 0x03, 0x80, 0x01, 0x03, 0x80, 0x01, 0x03, 0x80, 0x01, 0x03, 0x80, 0x01, 0x03, 0x80, 0x01, 0x03, 0x80, 0x01, 0x03, 0x80, 0x01, 0xff, 0xff, 0x01, 0xff, 0xff, 0x01}; } frame,2,dims 34x34 frame,2 { #define fr_width 34 #define fr_height 34 static unsigned char fr_bits[] = { 0xff, 0xff, 0xff, 0xff, 0x03, 0xff, 0xff, 0xff, 0xff, 0x03, 0xff, 0xff, 0xff, 0xff, 0x03, 0xff, 0xff, 0xff, 0xff, 0x03, 0x0f, 0x00, 0x00, 0xc0, 0x03, 0x0f, 0x00, 0x00, 0xc0, 0x03, 0x0f, 0x00, 0x00, 0xc0, 0x03, 0x0f, 0x00, 0x00, 0xc0, 0x03, 0x0f, 0x00, 0x00, 0xc0, 0x03, 0x0f, 0x00, 0x00, 0xc0, 0x03, 0x0f, 0x00, 0x00, 0xc0, 0x03, 0x0f, 0x00, 0x00, 0xc0, 0x03, 0x0f, 0x00, 0x00, 0xc0, 0x03, 0x0f, 0x00, 0x00, 0xc0, 0x03, 0x0f, 0x00, 0x00, 0xc0, 0x03, 0x0f, 0x00, 0x00, 0xc0, 0x03, 0x0f, 0x00, 0x00, 0xc0, 0x03, 0x0f, 0x00, 0x00, 0xc0, 0x03, 0x0f, 0x00, 0x00, 0xc0, 0x03, 0x0f, 0x00, 0x00, 0xc0, 0x03, 0x0f, 0x00, 0x00, 0xc0, 0x03, 0x0f, 0x00, 0x00, 0xc0, 0x03, 0x0f, 0x00, 0x00, 0xc0, 0x03, 0x0f, 0x00, 0x00, 0xc0, 0x03, 0x0f, 0x00, 0x00, 0xc0, 0x03, 0x0f, 0x00, 0x00, 0xc0, 0x03, 0x0f, 0x00, 0x00, 0xc0, 0x03, 0x0f, 0x00, 0x00, 0xc0, 0x03, 0x0f, 0x00, 0x00, 0xc0, 0x03, 0x0f, 0x00, 0x00, 0xc0, 0x03, 0xff, 0xff, 0xff, 0xff, 0x03, 0xff, 0xff, 0xff, 0xff, 0x03, 0xff, 0xff, 0xff, 0xff, 0x03, 0xff, 0xff, 0xff, 0xff, 0x03 }; } SYMBOL,dims 15x15 SYMBOL,2,dims 30x30 WP_dot,fg red WP_dot { #define dot_width 15 #define dot_height 15 static unsigned char dot_bits[] = { 0xc0, 0x01, 0xf0, 0x07, 0xfc, 0x1f, 0xfc, 0x1f, 0xfe, 0x3f, 0xfe, 0x3f, 0x7f, 0x7f, 0x3f, 0x7e, 0x7f, 0x7f, 0xfe, 0x3f, 0xfe, 0x3f, 0xfc, 0x1f, 0xfc, 0x1f, 0xf0, 0x07, 0xc0, 0x01}; } WP_dot,2 { #define dot_width 30 #define dot_height 30 static unsigned char dot_bits[] = { 0x00, 0xf0, 0x03, 0x00, 0x00, 0xf0, 0x03, 0x00, 0x00, 0xff, 0x3f, 0x00, 0x00, 0xff, 0x3f, 0x00, 0xf0, 0xff, 0xff, 0x03, 0xf0, 0xff, 0xff, 0x03, 0xf0, 0xff, 0xff, 0x03, 0xf0, 0xff, 0xff, 0x03, 0xfc, 0xff, 0xff, 0x0f, 0xfc, 0xff, 0xff, 0x0f, 0xfc, 0xff, 0xff, 0x0f, 0xfc, 0xff, 0xff, 0x0f, 0xff, 0x3f, 0xff, 0x3f, 0xff, 0x3f, 0xff, 0x3f, 0xff, 0x0f, 0xfc, 0x3f, 0xff, 0x0f, 0xfc, 0x3f, 0xff, 0x3f, 0xff, 0x3f, 0xff, 0x3f, 0xff, 0x3f, 0xfc, 0xff, 0xff, 0x0f, 0xfc, 0xff, 0xff, 0x0f, 0xfc, 0xff, 0xff, 0x0f, 0xfc, 0xff, 0xff, 0x0f, 0xf0, 0xff, 0xff, 0x03, 0xf0, 0xff, 0xff, 0x03, 0xf0, 0xff, 0xff, 0x03, 0xf0, 0xff, 0xff, 0x03, 0x00, 0xff, 0x3f, 0x00, 0x00, 0xff, 0x3f, 0x00, 0x00, 0xf0, 0x03, 0x00, 0x00, 0xf0, 0x03, 0x00 }; } diamond_green,fg green diamond_green { #define diamond_green_width 15 #define diamond_green_height 15 static unsigned char diamond_green_bits[] = { 0x80, 0x00, 0xc0, 0x01, 0xe0, 0x03, 0xf0, 0x07, 0xf8, 0x0f, 0xfc, 0x1f, 0xfe, 0x3f, 0xff, 0x7f, 0xfe, 0x3f, 0xfc, 0x1f, 0xf8, 0x0f, 0xf0, 0x07, 0xe0, 0x03, 0xc0, 0x01, 0x80, 0x00}; } diamond_green,2 { #define diamond_green_width 30 #define diamond_green_height 30 static unsigned char diamond_green_bits[] = { 0x00, 0xc0, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0xf0, 0x03, 0x00, 0x00, 0xf0, 0x03, 0x00, 0x00, 0xfc, 0x0f, 0x00, 0x00, 0xfc, 0x0f, 0x00, 0x00, 0xff, 0x3f, 0x00, 0x00, 0xff, 0x3f, 0x00, 0xc0, 0xff, 0xff, 0x00, 0xc0, 0xff, 0xff, 0x00, 0xf0, 0xff, 0xff, 0x03, 0xf0, 0xff, 0xff, 0x03, 0xfc, 0xff, 0xff, 0x0f, 0xfc, 0xff, 0xff, 0x0f, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xff, 0x3f, 0xfc, 0xff, 0xff, 0x0f, 0xfc, 0xff, 0xff, 0x0f, 0xf0, 0xff, 0xff, 0x03, 0xf0, 0xff, 0xff, 0x03, 0xc0, 0xff, 0xff, 0x00, 0xc0, 0xff, 0xff, 0x00, 0x00, 0xff, 0x3f, 0x00, 0x00, 0xff, 0x3f, 0x00, 0x00, 0xfc, 0x0f, 0x00, 0x00, 0xfc, 0x0f, 0x00, 0x00, 0xf0, 0x03, 0x00, 0x00, 0xf0, 0x03, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00 }; } diamond_red,fg red diamond_red { #define diamond_red_width 15 #define diamond_red_height 15 static unsigned char diamond_red_bits[] = { 0x80, 0x00, 0xc0, 0x01, 0xe0, 0x03, 0xf0, 0x07, 0xf8, 0x0f, 0xfc, 0x1f, 0xfe, 0x3f, 0xff, 0x7f, 0xfe, 0x3f, 0xfc, 0x1f, 0xf8, 0x0f, 0xf0, 0x07, 0xe0, 0x03, 0xc0, 0x01, 0x80, 0x00}; } diamond_red,2 { #define diamond_red_width 30 #define diamond_red_height 30 static unsigned char diamond_red_bits[] = { 0x00, 0xc0, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0xf0, 0x03, 0x00, 0x00, 0xf0, 0x03, 0x00, 0x00, 0xfc, 0x0f, 0x00, 0x00, 0xfc, 0x0f, 0x00, 0x00, 0xff, 0x3f, 0x00, 0x00, 0xff, 0x3f, 0x00, 0xc0, 0xff, 0xff, 0x00, 0xc0, 0xff, 0xff, 0x00, 0xf0, 0xff, 0xff, 0x03, 0xf0, 0xff, 0xff, 0x03, 0xfc, 0xff, 0xff, 0x0f, 0xfc, 0xff, 0xff, 0x0f, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xff, 0x3f, 0xfc, 0xff, 0xff, 0x0f, 0xfc, 0xff, 0xff, 0x0f, 0xf0, 0xff, 0xff, 0x03, 0xf0, 0xff, 0xff, 0x03, 0xc0, 0xff, 0xff, 0x00, 0xc0, 0xff, 0xff, 0x00, 0x00, 0xff, 0x3f, 0x00, 0x00, 0xff, 0x3f, 0x00, 0x00, 0xfc, 0x0f, 0x00, 0x00, 0xfc, 0x0f, 0x00, 0x00, 0xf0, 0x03, 0x00, 0x00, 0xf0, 0x03, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00 }; } MOB,fg red MOB { #define MOB_width 15 #define MOB_height 15 static unsigned char MOB_bits[] = { 0xff, 0x7f, 0xff, 0x7f, 0xfd, 0x7f, 0xf9, 0x7f, 0xf1, 0x7f, 0xe1, 0x7f, 0xc1, 0x7f, 0x81, 0x7f, 0x01, 0x7f, 0x01, 0x7e, 0x01, 0x7c, 0x01, 0x78, 0x01, 0x70, 0x01, 0x60, 0xff, 0x7f}; } MOB,2 { #define MOB_width 30 #define MOB_height 30 static unsigned char MOB_bits[] = { 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xff, 0x3f, 0xf3, 0xff, 0xff, 0x3f, 0xf3, 0xff, 0xff, 0x3f, 0xc3, 0xff, 0xff, 0x3f, 0xc3, 0xff, 0xff, 0x3f, 0x03, 0xff, 0xff, 0x3f, 0x03, 0xff, 0xff, 0x3f, 0x03, 0xfc, 0xff, 0x3f, 0x03, 0xfc, 0xff, 0x3f, 0x03, 0xf0, 0xff, 0x3f, 0x03, 0xf0, 0xff, 0x3f, 0x03, 0xc0, 0xff, 0x3f, 0x03, 0xc0, 0xff, 0x3f, 0x03, 0x00, 0xff, 0x3f, 0x03, 0x00, 0xff, 0x3f, 0x03, 0x00, 0xfc, 0x3f, 0x03, 0x00, 0xfc, 0x3f, 0x03, 0x00, 0xf0, 0x3f, 0x03, 0x00, 0xf0, 0x3f, 0x03, 0x00, 0xc0, 0x3f, 0x03, 0x00, 0xc0, 0x3f, 0x03, 0x00, 0x00, 0x3f, 0x03, 0x00, 0x00, 0x3f, 0x03, 0x00, 0x00, 0x3c, 0x03, 0x00, 0x00, 0x3c, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xff, 0x3f }; } interr,fg blue interr { #define interr_width 15 #define interr_height 15 static unsigned char interr_bits[] = { 0xe0, 0x03, 0xf0, 0x07, 0xf8, 0x0f, 0x7c, 0x1e, 0x3c, 0x3c, 0x3c, 0x3c, 0x00, 0x3c, 0x00, 0x1e, 0x80, 0x0f, 0xc0, 0x03, 0xe0, 0x03, 0x00, 0x00, 0xc0, 0x01, 0xe0, 0x03, 0xc0, 0x01}; } interr,2 { #define interr_width 30 #define interr_height 30 static unsigned char interr_bits[] = { 0x00, 0xfc, 0x0f, 0x00, 0x00, 0xfc, 0x0f, 0x00, 0x00, 0xff, 0x3f, 0x00, 0x00, 0xff, 0x3f, 0x00, 0xc0, 0xff, 0xff, 0x00, 0xc0, 0xff, 0xff, 0x00, 0xf0, 0x3f, 0xfc, 0x03, 0xf0, 0x3f, 0xfc, 0x03, 0xf0, 0x0f, 0xf0, 0x0f, 0xf0, 0x0f, 0xf0, 0x0f, 0xf0, 0x0f, 0xf0, 0x0f, 0xf0, 0x0f, 0xf0, 0x0f, 0x00, 0x00, 0xf0, 0x0f, 0x00, 0x00, 0xf0, 0x0f, 0x00, 0x00, 0xfc, 0x03, 0x00, 0x00, 0xfc, 0x03, 0x00, 0xc0, 0xff, 0x00, 0x00, 0xc0, 0xff, 0x00, 0x00, 0xf0, 0x0f, 0x00, 0x00, 0xf0, 0x0f, 0x00, 0x00, 0xfc, 0x0f, 0x00, 0x00, 0xfc, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x03, 0x00, 0x00, 0xf0, 0x03, 0x00, 0x00, 0xfc, 0x0f, 0x00, 0x00, 0xfc, 0x0f, 0x00, 0x00, 0xf0, 0x03, 0x00, 0x00, 0xf0, 0x03, 0x00 }; } } # general procs proc InitImages {} { # initialize images including those for logos, symbols and the frame # image; set up symbol menus low-level description from high-level ones global SRCDIR SYMBOLS SYMBOLIMAGE FRAMEIMAGE DEFINEIMGS INTERNALIMG \ ICONSIZE ICONWIDTH ICONHEIGHT Logo SmallLogo if { $ICONSIZE == "30x30" } { set ICONWIDTH [set ICONHEIGHT 30] set is ",2" } else { set is "" } # logos foreach v "Logo SmallLogo" f "gpsman-logo.gif gpsman-logo-small.gif" { if { [catch {set $v [image create photo \ -file [file join $SRCDIR gmicons $f]]}] } { set $v "" } elseif { $is != "" } { DoubleImageSize "\#0" $v } } # frame and symbols set f gif set fdims $INTERNALIMG(frame,dims) set udims $INTERNALIMG(frame$is,dims) if { [catch {set FRAMEIMAGE [image create photo \ -file [file join $SRCDIR gmicons redframe${fdims}.$f]]}] } { set FRAMEIMAGE [image create bitmap -data $INTERNALIMG(frame$is) \ -foreground $INTERNALIMG(frame,fg)] } elseif { $is != "" } { DoubleImageSize 1 FRAMEIMAGE } set sdims $INTERNALIMG(SYMBOL,dims) # assuming that $DEFINEIMGS contains both WP_dot and interr foreach sy $DEFINEIMGS { if { [catch {set im$sy [image create photo \ -file [file join $SRCDIR gmicons \ ${sy}${sdims}.$f]]}] } { set im$sy [image create bitmap -data $INTERNALIMG($sy$is) \ -foreground $INTERNALIMG($sy,fg)] } elseif { $is != "" } { DoubleImageSize 1 im$sy } set SYMBOLIMAGE($sy) [set im$sy] } set SYMBOLIMAGE(interr) $iminterr foreach sy $SYMBOLS { if { [lsearch -exact $DEFINEIMGS $sy] == -1 } { if { [catch {set im [image create photo \ -file [file join $SRCDIR gmicons \ ${sy}${sdims}.$f]]}] } { set im $imWP_dot } elseif { $is != "" } { DoubleImageSize 1 im } set SYMBOLIMAGE($sy) $im } } InitSymbolMenuDescr return } proc DoubleImageSize {level iname} { # doubles the size of the photo image given in the variable $iname # and destroys the original one upvar $level $iname img set new [image create photo -width 0 -height 0] $new copy $img -zoom 2 image delete $img set img $new return } proc InitSymbolMenuDescr {} { # init low-level description of symbol menus from high-level ones # which are list of lists with symbol internal names or elements # of the one of the forms ==TEXT or =INDEX, giving the title for a # sub-menu (as literal text or index in TXT), followed by a sub-list # describing the sub-menu # the low-level description has a similar structure but each # symbol internal name is followed by its text label and # =INDEX elements are replaced by ==TEXT with TEXT the final # text to be used as label; this description also reflects the # partition of long menus according $MAXMENUITEMS global SYDEFTMENU SYUSRMENU SYMENU set high $SYDEFTMENU if { $SYUSRMENU != "" } { set high [linsert $high 0 =syusrmenu $SYUSRMENU] } set SYMENU [PartitionSymbolMenu $high] return } proc PartitionSymbolMenu {hdescr} { # create low-level description of symbol menus # this implements recursion on sub-menus global UNKNOWNSYMBOLS TXT MAXMENUITEMS set low "" ; set n 0 ; set sub 0 foreach e $hdescr { if { $sub } { lappend low [PartitionSymbolMenu $e] set sub 0 continue } if { $n > $MAXMENUITEMS } { # continue in a sub-menu lappend low [list ==$TXT(more) ...] \ [PartitionSymbolMenu [lreplace $hdescr 0 $n]] break } if { [regexp {^=(.+)$} $e x ti] } { set sub 1 if { ! [regexp {^=(.+)$} $ti x ti] } { set ti $TXT($ti) } lappend low ==$ti } else { set sub 0 if { [lsearch -exact $UNKNOWNSYMBOLS $e] != -1 } { set t "~ $TXT(SY$e)" } else { set t $TXT(SY$e) } lappend low $e $t } incr n } return $low } proc InitBitmaps {} { # initialize bitmaps global SRCDIR BITMAP BITMAPS set dir [file join [pwd] $SRCDIR gmicons] foreach b $BITMAPS { if { [file readable [set f [file join $dir $b.bmp]]] } { set BITMAP($b) @$f } else { set BITMAP($b) error } } return } proc FillSymbolsMenu {menu commd} { # fill a symbols menu using the low-level description built by # proc InitSymbolMenuDescr # $menu is the parent menu to fill in # $commd is the callback to associate to each selection # whose arguments will be the symbol name and $menu (even on sub-menus) global SYMENU FillSymbolsMenuRec $SYMENU $menu $menu $commd return } proc FillSymbolsMenuRec {ldescr topmenu menu commd} { # recursively fill a symbols menu using the low-level description $ldescr global SYMBOLIMAGE set mc 0 foreach "e ei" $ldescr { if { [regexp {^==(.+)$} $e x txt] } { # sub-menu title set submenu $menu.m$mc ; incr mc $menu add cascade -label $txt -menu $submenu menu $submenu FillSymbolsMenuRec $ei $topmenu $submenu $commd } else { $menu add command -image $SYMBOLIMAGE($e) -accelerator $ei \ -command "$commd $e $menu" } } return } ## user-defined menu proc SymbolCustomMenu {} { # dialog for allowing the definition of the user symbol menu global SYDEFTMENU SYUSRMENU TXT MESS DPOSX DPOSY COLOUR MAPFTSIZES \ SyCMenu LISTHEIGHT SYMBOLIMAGE ICONSIZE # used explicitly elsewhere set w .syumenu if { [winfo exists $w] } { bell ; Raise $w ; return } array set SyCMenu { cat "" submenus 0 mtit,0 "" mparent,0 "" tmenu "" cmenu "" } GMToplevel $w syusrmenu +$DPOSX+$DPOSY {} \ [list WM_DELETE_WINDOW "destroy $w"] {} label $w.tit -text $TXT(syusrmenu) frame $w.fr -relief flat -borderwidth 5 label $w.fr.tit -text $TXT(cfgsymenu) # categories and symbols # $SYDEFTMENU assumed to have a sub-menu for each category and nothing # else, with each sub-menu title given by =INDEX set frcs $w.fr.frcs frame $frcs frame $frcs.frrbs frame $frcs.frbx set n 0 if { $ICONSIZE == "15x15" } { set width 150 ; set height 21 } else { set width 280 ; set height 35 } foreach "title subm" $SYDEFTMENU { regsub {^=} $title "" ti if { $n == 0 } { set cat $ti } set box $frcs.frbx.bx$ti ImageListbox create $box 10 $width $height extended $frcs.frbx.scr$ti scrollbar $frcs.frbx.scr$ti -command "$box yview" foreach e $subm { if { [regexp {^=} $e] } { BUG sub-menu in SYDEFTMENU } ImageListbox insert $box end $SYMBOLIMAGE($e) $TXT(SY$e) $e } radiobutton $frcs.frrbs.b$n -text $TXT($ti) -variable SyCMenu(cat) \ -value $ti -command "SyCMenuAct chgcat $ti" -anchor w grid $frcs.frrbs.b$n -sticky ew incr n } grid $frcs.frrbs -row 1 -column 0 -sticky ne grid $frcs.frbx -row 0 -column 0 SyCMenuAct chgcat $cat # inserting frame $w.fr.fradd foreach b "ab aa" ti "insb insa" { button $w.fr.fradd.b$b -text "--$TXT($ti)-->" -command "SyCMenuAct $ti" grid $w.fr.fradd.b$b -sticky ew } # menu project frame $w.fr.frmn label $w.fr.frmn.cmenu -textvariable SyCMenu(tmenu) -width 15 \ -relief sunken -justify left set frmbx $w.fr.frmn.frbx frame $frmbx SyCMenuFill $frmbx $SYUSRMENU # menu project buttons set frmop $w.fr.frmn.frmop frame $frmop foreach op "insmnb insmna opensbmn clssbmn del" { button $frmop.b$op -text $TXT($op) \ -command "SyCMenuAct $op ; $frmop.b$op configure -state normal" grid $frmop.b$op -sticky nesw } grid [BalloonButton $frmop.bhlp syhlpbx] grid $w.fr.frmn.cmenu -row 0 -column 0 -sticky w grid $frmbx -row 1 -column 0 grid $frmop -row 1 -column 1 SyCMenuAct chgmenu 0 # ok, cancel buttons frame $w.fr.frbs button $w.fr.frbs.ok -text $TXT(ok) -command "SyCMenuAct ok" button $w.fr.frbs.cnc -text $TXT(cancel) -command "SyCMenuAct cancel" grid $w.fr.frbs.ok grid $w.fr.frbs.cnc -row 0 -column 1 grid $w.fr.tit -row 0 -column 0 -columnspan 3 grid $frcs -row 2 -column 0 -sticky n -pady 5 grid $w.fr.fradd -row 2 -column 1 -sticky n -pady 5 -padx 3 grid $w.fr.frmn -row 2 -column 2 -sticky n -pady 5 -padx 3 grid $w.fr.frbs -row 3 -column 0 -columnspan 3 -pady 5 grid $w.fr update idletasks return } proc SyCMenuFill {frm hdescr} { # create and fill image listboxes for symbol menu high-level description # $frm will be taken as parent window of listboxes and scrollbars # using a scheme similar of that used for displaying the # available symbols # the following elements of global array SyCMenu are used/set: # submenus - counter of sub-menus, used in naming widgets # mtit,$sm - title (literal text) of sub-menu $sm # mparent,$sm - parent of sub-menu $sm # this is a recursive procedure global SyCMenu SYMBOLIMAGE TXT set n $SyCMenu(submenus) ; incr SyCMenu(submenus) set box $frm.bx$n ImageListbox create $box 10 150 21 extended $frm.scr$n set SyCMenu($box,move) "" foreach ev " " p "start end" { bind $box $ev "SyCMenuMove $p $box %x %y" } bind $box "SyCMenuMove enter-down $box %X %Y; break" foreach ev " " p "go enter leave" { bind $box $ev "SyCMenuMove $p $box %X %Y" } scrollbar $frm.scr$n -command "$box yview" set sub 0 foreach e $hdescr { if { $sub } { SyCMenuFill $frm $e set sub 0 continue } if { [regexp {^=(.+)$} $e x ti] } { set sub 1 if { ! [regexp {^=(.+)$} $ti x ti] } { set ti $TXT($ti) } ImageListbox insert $box end "" ">>> $ti" @@@=$SyCMenu(submenus) set SyCMenu(mtit,$SyCMenu(submenus)) $ti set SyCMenu(mparent,$SyCMenu(submenus)) $n } else { set sub 0 ImageListbox insert $box end $SYMBOLIMAGE($e) $TXT(SY$e) $e } } return } proc SyCBuildDescr {tags} { # build high-level description of symbol menu from tags in image # listboxes global SyCMenu set w .syumenu set frmbx $w.fr.frmn.frbx set hd "" foreach t $tags { if { [regsub {^@@@=} $t "" n] } { # sub-menu set ts [ImageListbox gettags $frmbx.bx$n 0 end] lappend hd "==$SyCMenu(mtit,$n)" [SyCBuildDescr $ts] } else { lappend hd $t } } return $hd } proc SyCMenuAct {act args} { # deal with user action when setting up user symbol menu # $act in {chgcat, chgmenu, insa, insb, insmnb, insmna, opensbmn, # clssbmn, del, ok, cancel} # described in switch below # $args depends on $act: void except for # chgcat text index for symbol category name # chgmenu number of sub-menu (0 is top menu) global SyCMenu SyCMenuAux SYUSRMENU SYMBOLIMAGE TXT MESS set w .syumenu set frbx $w.fr.frcs.frbx set sybox $frbx.bx$SyCMenu(cat) set frmbx $w.fr.frmn.frbx set mnbox $frmbx.bx$SyCMenu(cmenu) switch -glob $act { chgcat { # change to listbox for symbol category $args set SyCMenu(cat) $args foreach s [grid slaves $frbx] { grid forget $s } grid $frbx.bx$args -row 0 -column 0 grid $frbx.scr$args -row -0 -column 1 -sticky ns } chgmenu { # display another sub-menu set SyCMenu(cmenu) $args set SyCMenu(tmenu) $SyCMenu(mtit,$args) foreach s [grid slaves $frmbx] { grid forget $s } grid $frmbx.bx$args -row 0 -column 0 grid $frmbx.scr$args -row -0 -column 1 -sticky ns } ins? { # insert selected symbols before/after current selection # in menu listbox or if there is no selection at the # beggining/end; bell if there are no symbols selected if { [set selsys [ImageListbox getseltags $sybox]] == "" } { bell ; return } set inspt [ImageListbox cursel $mnbox] if { $act == "insa" } { if { $inspt == "" } { set inspt end } else { set inspt [lindex $inspt end] incr inspt } } elseif { $inspt == "" } { set inspt 0 } else { set inspt [lindex $inspt 0] } foreach e $selsys { ImageListbox insert $mnbox $inspt $SYMBOLIMAGE($e) \ $TXT(SY$e) $e if { $inspt != "end" } { incr inspt } } } insmn? { # insert a sub-menu before/after current selection # in menu listbox or if there is no selection at the # beggining/end if { ! [GMChooseParams $TXT(cfgsymenu) SyCMenuAux \ [list "=$TXT(name)"]] } { return } set inspt [ImageListbox cursel $mnbox] if { $act == "insa" } { if { $inspt == "" } { set inspt end } else { set inspt [lindex $inspt end] incr inspt } } elseif { $inspt == "" } { set inspt 0 } else { set inspt [lindex $inspt 0] } set n $SyCMenu(submenus) ImageListbox insert $mnbox $inspt "" ">>> $SyCMenuAux" @@@=$n set SyCMenu(mtit,$n) $SyCMenuAux set SyCMenu(mparent,$n) $SyCMenu(cmenu) SyCMenuFill $frmbx "" SyCMenuAct chgmenu $n } opensbmn { # display sub-menu whose entry is the current single selection in # menu listbox if { [set tag [ImageListbox getseltags $mnbox]] == "" || \ [lindex $tag 1] != "" || ! [regsub {^@@@=} $tag "" n] } { bell ; return } SyCMenuAct chgmenu $n } clssbmn { # close sub-menu and go to parent sub-menu if { [set p $SyCMenu(mparent,$SyCMenu(cmenu))] == "" } { bell ; return } SyCMenuAct chgmenu $p } del { # delete selected entries ImageListbox seldel $mnbox } ok - cancel { # exit if { $act == "ok" } { if { [set tags [ImageListbox gettags $frmbx.bx0 0 end]] \ == "" } { if { ! [GMConfirm $MESS(emptymenu)] } { return } set SYUSRMENU "" } else { set SYUSRMENU [SyCBuildDescr $tags] } SaveSymbolCustomMenu InitSymbolMenuDescr } ImageListbox destroyall $w destroy $w } } return } proc SyCMenuMove {how box x y} { # move element in image listbox $box when changing symbol custom menu # $how in {start, go, end, enter-down, enter, leave} # $x,$y are either the coordinates inside the listbox (for $how==start # and $how==end) or the global coordinates global SyCMenu COLOUR SYMBOLIMAGE TXT set tb .sycmove$SyCMenu(cmenu) switch $how { start { set ix [ImageListbox index $box $y] set txt [lindex [ImageListbox get $box $ix] 0] if { $SyCMenu($box,move) == "" } { set SyCMenu($box,move) in } NewBalloon $tb $txt \ +[expr $x+[winfo rootx $box]+9]+[expr $y+[winfo rooty $box]+9] set SyCMenu($box,move,tag) [ImageListbox gettags $box $ix] set SyCMenu($box,move,txt) $txt set SyCMenu($box,move,ix) $ix } enter-down { if { $SyCMenu($box,move) == "out" } { if { [winfo exists $tb] } { set SyCMenu($box,move) in wm geometry $tb +[expr $x+9]+[expr $y+9] } else { set SyCMenu($box,move) "" } } } enter { if { $SyCMenu($box,move) != "" } { destroy $tb ; set SyCMenu($box,move) "" } } go { if { $SyCMenu($box,move) == "in" && [winfo exists $tb] } { wm geometry $tb +[expr $x+9]+[expr $y+9] } } end { if { $SyCMenu($box,move) == "in" && [winfo exists $tb] } { destroy $tb ; set SyCMenu($box,move) "" set fix [ImageListbox index $box $y] set ix $SyCMenu($box,move,ix) if { $fix != $ix } { if { [regexp {^@@@=} \ [set tag $SyCMenu($box,move,tag)]] } { set img "" } else { set img $SYMBOLIMAGE($tag) } ImageListbox delete $box $ix ImageListbox insert $box $fix $img \ $SyCMenu($box,move,txt) $tag } } } leave { if { $SyCMenu($box,move) == "in" } { set SyCMenu($box,move) out } } } return } proc SaveSymbolCustomMenu {} { # save user-defined symbol menu global UFile MESS SYUSRMENU if { [catch {set f [open $UFile(symenu) w]}] } { GMMessage $MESS(cantwrtsymenu) return } puts $f "" puts $f "# $MESS(written) GPSMan [NowTZ]" puts $f "# $MESS(editrisk)" puts $f "" puts $f "set SYUSRMENU \{$SYUSRMENU\}" puts $f "" close $f return } proc LoadSymbolCustomMenu {} { # load user-defined symbol menu global UFile SYUSRMENU # assumed to be in system encoding source $UFile(symenu) return } ## utilities proc SymbolImageName {symbol} { # returns list with image and external name of $symbol # needed when $symbol may be user-defined # THIS PROC IS NOT BEING USED when symbols are assumed to be # standard ones (e.g., in search.tcl) global SYMBOLIMAGE TXT if { [regexp {^user:} $symbol] } { set symbol WP_dot set t usrdef } else { set t SY$symbol } return [list $SYMBOLIMAGE($symbol) $TXT($t)] } proc BadSymbol {name} { # check if $name is a valid GPSMan symbol name global SYMBOLS if { [regexp {^user:} $name] } { return 0 } return [expr [lsearch -exact $SYMBOLS $name] == -1] } proc BadDispOpt {name} { # check if $name is a valid GPSMan display option name global DISPOPTS return [expr [lsearch -exact $DISPOPTS $name] == -1] } proc NameForCodeOf {id code} { # get name for $code of $id # $id in {SYMBOL DISPOPT} global DEFAULT$id UNKNOWN${id}S MESS if { [set ns [FindArrayIndices ${id}CODE $code -1]] == -1 } { GMMessage "$MESS(bad${id}code): $code" return [set DEFAULT$id] } foreach n $ns { if { [lsearch -exact [set UNKNOWN${id}S] $n] == -1 } { return $n } } GMMessage "$MESS(bad${id}code): $code" return [set DEFAULT$id] } gpsman-6.4.4.2/gmsrc/garmin.tcl0000644000175000017500000031056112224351120014356 0ustar migmig# # This file is part of: # # gpsman --- GPS Manager: a manager for GPS receiver data # # Copyright (c) 1998-2013 Miguel Filgueiras migfilg@t-online.de # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. # # File: garmin.tcl # Last change: 6 October 2013 # # Includes contributions by # - David Gardner (djgardner_AT_users.sourceforge.net) marked # "DJG contribution" # # implemented using #- "Garmin GPS Interface Specification", May 6 1998, 001-00063-00 Rev. 1 # kindly provided by Garmin Corporation # updated to follow the descriptions available from www.garmin.com: # "Garmin GPS Interface Specification", April 13 1999, 001-00063-00 Rev. 2 # "Garmin GPS Interface Specification", December 6 1999, 001-00063-00 Rev. 3 # "Garmin GPS Interface Specification", April 24 2004, 001-00063-00 Rev. A # "Garmin GPS Interface Specification", September 16 2004, 001-000063-00 # Rev. B # "Garmin GPS Interface Specification", May 19 2006, 001-000063-00 Rev. C # #- GPS 15H & 15L TECHNICAL SPECIFICATIONS, 190-00266-01, Rev. D, February 2006 # # Garmin USB protocol is implemented assuming that the USB port is driven by # the garmin_gps Linux kernel driver by Hermann Kneissel and part of the # official 2.6 Linux kernel releases # logging the communication: see serial.tcl # get rid of identical packets that follow one another in the same input # operation. This is to solve a problem with Garmin 12Map. set TestRepeated 0 #### no configurable values below this line! ### state of the communication set Request idle set Jobs "" # serial set SInState idle set SInPacketState start set SOutBusy 0 set SRecACKs 0 set SRecNAKs 0 set PkInState idle set PkLastData "" set FirstACKNAK 1 # general set NoInProc 1 set GetPVT 0 set STextPVT 0 ##### opening USB port proc OpenUSBFailed {} { # open USB port to use the Garmin USB protocol, and log file if needs be # initialise USB driver # return 1 on failure global SERIALPORT USBFILE GUSB USBPackets USBMissing USBBuff Eof MESS \ USBHdrNeeded USBRecs if { ! [file exists $SERIALPORT] || \ ! [file readable $SERIALPORT] || \ [catch {set USBFILE [open $SERIALPORT r+]}] || \ [regexp {^-} $USBFILE] } { GMMessage [format $MESS(badserial) $SERIALPORT] return 1 } fconfigure $USBFILE -blocking 0 -translation binary # initialise USB driver # change to USB mode puts -nonewline $USBFILE \ [DataToStr "long long long long" \ [list $GUSB(LAYERID,PRIVATE) $GUSB(PRIV,PID,SET,MODE) \ 4 $GUSB(MODE,NATIVE)]] flush $USBFILE # driver can be set to debug mode with the packet # $GUSB(LAYERID,PRIVATE) $GUSB(PRIV,PID,SET,DEBUG) 4 0xffff # send start session request to receiver puts -nonewline $USBFILE \ [DataToStr "long long long" \ [list $GUSB(LAYERID,TRANSPORT) \ $GUSB(PID,TRANSPORT,START,SESSION,REQ) 0]] flush $USBFILE # read and discard anything there is to be read # should have waited for a session started packet at the transport level after 10 read $USBFILE # initialise input and open log file set Eof 0 set USBPackets "" ; set USBMissing 0 ; set USBHdrNeeded 12 ; set USBBuff "" set USBRecs 0 fileevent $USBFILE readable ReadUSB OpenSerialLog return 0 } ##### closing the serial or USB connection proc CloseConnection {} { # close the connection after a turn off command or a change from # the serial or USB Garmin protocols # receiver types and info are restored to the original lists # as a different receiver may be connected next global GPSState Eof GPSProtocol USBFILE GUSB SRLFILE NoGarmin \ RECTYPES RECINFO ORIGRECTYPES ORIGRECINFO Log "CC> closing down..." set GPSState offline set Eof 1 ResetSerial if { $GPSProtocol == "garmin_usb" } { # change USB driver to serial mode Log "CC> changing to serial mode..." puts -nonewline $USBFILE \ [DataToStr "long long long long" \ [list $GUSB(LAYERID,PRIVATE) $GUSB(PRIV,PID,SET,MODE) \ 4 $GUSB(MODE,GARMIN,SERIAL)]] flush $USBFILE catch {close $USBFILE} } else { catch {close $SRLFILE} } DisableGPS set NoGarmin 1 set RECTYPES $ORIGRECTYPES ; set RECINFO $ORIGRECINFO Log "CC> closed\n" return } proc ReopenSerialPortFailed {baud} { # close and open the serial port # receiver types and info are kept assuming no change of receiver global Eof InBuff Polling SRLFILE SERIALPORT tcl_platform set Eof 1 ResetSerial catch {close $SRLFILE} if { ! [file exists $SERIALPORT] || \ ! [file readable $SERIALPORT] || \ [catch {set SRLFILE [open $SERIALPORT r+]}] || \ [regexp {^-} $SRLFILE] } { return 1 } switch $tcl_platform(platform) { unix { set Polling 0 ; set InBuff "" fconfigure $SRLFILE -blocking 0 -mode $baud,n,8,1 \ -translation binary fileevent $SRLFILE readable ReadChar } windows { # Tcl/Tk 8.0p2 does not support I/O from/to serial ports set Polling 1 ; set InBuff "" fconfigure $SRLFILE -blocking 0 -mode $baud,n,8,1 \ -translation binary # after 0 ReadPollChar after 0 ReadChar } } set Eof 0 return 0 } ##### low-level read procedures # USB protocol proc ReadUSB {} { # read bytes and form a complete Garmin USB packet # complete packets are kept in the list $USBPackets and # proc UseUSBInput called to process them when needed global USBFILE Eof USBPackets NoInProc GUSB USBMissing USBHdrNeeded \ USBBuff USBPId USBRecs RPID if { $Eof } { return } if { $USBMissing == 0 } { while 1 { # read (rest of) USB packet header if { [catch {set buff [read $USBFILE $USBHdrNeeded]}] || \ [set n [string length $buff]] == 0 } { # no more data to be read return } if { $n != $USBHdrNeeded } { Log "RU> only $n bytes not $USBHdrNeeded for header" set USBHdrNeeded [expr $USBHdrNeeded-$n] return } set USBHdrNeeded 12 foreach "layerid USBPId USBMissing" \ [UnPackData [split $buff ""] "long long long"] { break } Log "RU> layerid=$layerid, pid=$USBPId, length=$n" if { $layerid == $GUSB(LAYERID,TRANSPORT) } { Log "RU> transport layer packet discarded" if { $USBMissing != 0 } { if { $USBMissing > 0 } { read $USBFILE $USBMissing } set USBMissing 0 } continue } if { $layerid != $GUSB(LAYERID,APPL) || \ [catch {set USBPId $RPID($USBPId)}] } { Log "RU> bad layer id or pid; discarding all data to be read" read $USBFILE set USBMissing 0 return } set USBBuff "" break } } # read USB data set pdata [read $USBFILE $USBMissing] append USBBuff $pdata if { [set nn [string length $pdata]] != $USBMissing } { Log "RU> packet data, only $nn bytes not $USBMissing" set USBMissing [expr $USBMissing-$nn] return } Log "RU> complete packet got: length $nn" lappend USBPackets [list $USBPId $USBBuff] set USBMissing 0 if { $USBRecs } { if { $USBPId == "XfrCmpl" } { set USBRecs 0 if { $NoInProc } { after 0 UseUSBInput } } } elseif { $USBPId == "Records" } { set USBRecs 1 } elseif { $NoInProc } { after 0 UseUSBInput } if { [set Eof [eof $USBFILE]] } { Log "RU> at eof" set GPSState offline catch {close $USBFILE} } return } # line-oriented protocols proc ProcLineChar {char} { # process char received when expecting a line of input # call $ProcProcLine to process line (as string) when getting a line-feed # discard carriage-returns global ProcProcLine LInBuffer SInPacketState LineXOR if { [binary scan $char "c" dec] != 1 } { Log "PLC> scan failed: char=$char" return } set dec [expr ($dec+256)%256] if { $dec == 10 } { if { [string length $LInBuffer] != 0 } { $ProcProcLine $LInBuffer $LineXOR set LInBuffer "" set LineXOR 0 } } elseif { $dec != 13 } { append LInBuffer $char set LineXOR [expr $LineXOR ^ $dec] } return } ##### link layer # USB protocol proc UseUSBInput {} { # use packets read from USB channel in list $USBPackets # loop until either a Records packet was detected by proc ReadUSB # or no more packets were queued global USBPackets NoInProc USBRecs set NoInProc 0 while 1 { set queue $USBPackets ; set USBPackets "" foreach pak $queue { foreach "pid pdata" $pak {} set pdata [split $pdata ""] LogBytes "UUI> got packet pid=$pid; contents:" $pdata ProcInPacket $pid $pdata update } if { $USBRecs || $USBPackets == "" } { break } } set NoInProc 1 return } proc SendUSBPacket {pid types vals} { # send a Garmin USB packet # $pid is the packet identifier name # $types is list of types aligned with # $vals a list of values # assume that the packet is actually sent and call proc SentPacket # unless the size exceeds 64K-1 global USBFILE GUSB PID Eof if { $Eof } { Log "SUP> at eof: not sending packet $pid" return } if { [catch {set pdata [DataToStr $types $vals]}] } { Log "SUP> BUG, bad data: pid=$pid\n\ttypes=$types\nvals=$vals" return } if { [set size [string length $pdata]] > 65535 } { Log "SUP> too much data ($size>65535)" return } set pak [DataToStr "long long long" \ [list $GUSB(LAYERID,APPL) $PID($pid) $size]] append pak $pdata LogBytes "SUP> sending packet $pid with:" [split $pak ""] puts -nonewline $USBFILE $pak flush $USBFILE # to avoid a too deep recursion do not use a direct call after 0 "SentPacket $pid" return } # serial protocol proc SendSPacket {pid types vals} { # initialize a send packet action to serial channel # wait for termination of a previous similar operation # $pid is the packet identifier name # $types is list of types aligned with # $vals a list of values # uses the following global variable that may be reset elsewhere: # $SOutBusy a flag set if a packet is being sent; it is # cleared by DoSendSPacket (for ACK/NAK packets) # or by ProcACKNAK (after a valid ACK is received) global SInState SOutBusy PID ACK NAK \ SOutPID SOutBData SOutDSum SOutBPID SOutSize Eof if { $Eof } { Log "SSP> at eof: not sending packet $pid" return } if { $SOutBusy } { after 50 "SendSPacket $pid {$types} {$vals}" return } if { [catch {set SOutBPID $PID($pid)}] } { Log "SSP> bad PID: $pid" return } set SOutBData [PackData $types $vals] if { [set SOutSize [llength $SOutBData]] > 255 } { Log "SSP> too much data ($SOutSize>255)" return } Log "SP> sending packet $pid with:" set SOutBusy 1 ; set SOutDSum 0 ; set SOutPID $pid foreach ch $SOutBData { binary scan $ch "c" v incr SOutDSum $v Log "SSP> [expr ($v+256)%256]" } DoSendSPacket return } proc DoSendSPacket {} { # do the actual sending of the packet initiated by SendSPacket; # wait for termination of get operations in progress unless the # packet is an ACK/NAK one # this proc may be called for re-sending the packet if a NAK is # received global SInPacketState SInState SOutBusy DLE DLECHR ETX ACK NAK \ SOutPID SOutBData SOutDSum SOutBPID SOutSize SRLFILE if { $SOutBPID!=$ACK && $SOutBPID!=$NAK && $SInState == "get" } { after 50 DoSendSPacket return } Log "DSSP> sending packet $SOutPID" if { $SOutBPID!=$ACK && $SOutBPID!=$NAK } { set SInPacketState start ; set SInState put } set datasum [expr (-$SOutDSum-$SOutBPID-$SOutSize)&255] if { [catch {puts -nonewline $SRLFILE \ [binary format ccc $DLE $SOutBPID $SOutSize]}] } { Log "DSSP> error writing to $SRLFILE" set SOutBusy 0 if { $SOutBPID!=$ACK && $SOutBPID!=$NAK } { set SInState idle } return } if { $SOutSize == $DLE } { puts -nonewline $SRLFILE "$DLECHR" } foreach b $SOutBData { puts -nonewline $SRLFILE "$b" if { $b == $DLECHR } { puts -nonewline $SRLFILE "$DLECHR" } } if { $datasum == $DLE } { puts -nonewline $SRLFILE "$DLECHR" } puts -nonewline $SRLFILE [binary format "ccc" $datasum $DLE $ETX] flush $SRLFILE Log "DSSP> size=$SOutSize, checksum=$datasum" if { $SOutBPID==$ACK || $SOutBPID==$NAK } { set SOutBusy 0 } return } proc SendACKNAK {what pid} { # send an ACK or NAK packet # $what is either ACK or NAK # $pid is packet id name to not-/acknowledge global PID PDTYPE SendSPacket $what $PDTYPE($what) $PID($pid) return } proc FixACKNAKType {data} { # inspect incoming ACK/NAK packet data to decide on the data type # to be used, as suggested by Klaus Ethgen (Klaus _AT_ Ethgen.de) # Garmin specifications versions < 3 have a 16-bit integer # while version 3 has a byte global FirstACKNAK PDTYPE set FirstACKNAK 0 if { [llength $data] == 1 } { set t byte } else { set t int } set PDTYPE(ACK) $t ; set PDTYPE(NAK) $t return } proc ProcACKNAK {pid data} { # process incoming ACK or NAK packet # $pid is packet id name of the packet (in {ACK, NAK, error}) # $data is its data # after sending a packet, in case of an ACK for a packet id different # from the one sent, or a NAK the packet will be re-sent; if an error # (expecting an ACK/NAK but got a different packet id) the state is # reset; otherwise the packet is assumed to have been received # successfully and SentPacket is called # when the first ACK/NAK packet is received the protocol data type for # these packets is fixed to be either a 16-bit int or a byte global SOutBusy SOutPID SOutBPID SRecACKs SRecNAKs PDTYPE MESS \ PkLastPID FirstACKNAK set PkLastPID -1 switch $pid { ACK { if { $FirstACKNAK } { FixACKNAKType $data } # only one byte is relevant even if there are more set bpid [expr [UnPackData $data $PDTYPE(ACK)]&255] if { $SOutBusy } { incr SRecACKs if { $bpid != $SOutBPID } { Log "PAN> ACK for wrong packet $bpid, expected $SOutPID" DoSendSPacket } else { SentPacket $SOutPID set SOutBusy 0 } } else { Log "PAN> ACK for $bpid when output is idle" } } NAK { if { $FirstACKNAK } { FixACKNAKType $data } # only one byte is relevant even if there are more set bpid [expr [UnPackData $data $PDTYPE(NAK)]&255] if { $SOutBusy } { incr SRecNAKs if { $bpid != $SOutBPID } { Log "PAN> NAK for wrong packet $bpid, expected $SOutPID" } DoSendSPacket } else { Log "PAN> NAK for $bpid when output is idle" } } default { # $SOutBusy must be 1 GMMessage $MESS(noACKNAK) # Log "PAN> $pid when sending $SOutPID; resending" # DoSendSPacket Log "PAN> $pid when sending $SOutPID; resetting" ResetSerial } } return } proc ProcChar {char} { # process character seen in the serial port # the following global variables control what is going on: # $SInState in {idle, get, put} # when idle, discards all input unless $GetPVT is set # the difference between get and put is that the put-state # only expects ACK/NAK packets and always calls ProcACKNAK, # while the get-state calls either ProcInPacket or ProcACKNAK # PVT data packets are always processed by ProcInPacket # $SInPacketState in {block, start, got1stDLE, gotPID} # a packet is considered finished only when a single DLE # followed by a ETX is read in; the packet size is used # only for checking the consistency of the data # $Jobs should be set to "", and will be a list of # background jobs started for $Request # $GetPVT is set if PVT data packets are expected global SInBuffer SInState SInPacketState SInSum SInCount GetPVT \ SeenDLE PacketID PacketData NotACKNAK PID RPID DLE ETX \ Polling PrdDATA PkInState if { [binary scan $char "c" dec] != 1 } { Log "PC> scan failed: char=$char" return } set dec [expr ($dec+256)%256] Log "PC> got $dec; state=$SInState, $SInPacketState" if { $SInState == "idle" && ! $GetPVT } { Log "PC> idle: discarded $dec" ; return } switch $SInPacketState { block { Log "PC> bug: called when blocked!" } start { if { $dec == $DLE } { set SInPacketState got1stDLE Log "PC> got 1st DLE" } else { Log "PC> got $dec instead of DLE" } } got1stDLE { if { [catch {set PacketID $RPID($dec)}] } { # this covers the cases $dec in {$DLE, $ETX} Log "PC> wrong PID code=$dec; restarting" set SInPacketState start } else { set NotACKNAK [expr $dec!=$PID(ACK) && $dec!=$PID(NAK)] Log "PC> packet: $PacketID" set SInPacketState gotPID set SInBuffer "" set SInSum $dec ; set SInCount 0 ; set SeenDLE 0 } } gotPID { if { $SeenDLE } { if { $dec != $DLE } { Log "PC> got last DLE" if { $dec == $ETX } { Log "PC> got ETX" if { [PacketOK] } { set SInPacketState block if { $NotACKNAK } { SendACKNAK ACK $PacketID ProcInPacket $PacketID "$PacketData" } else { ProcACKNAK $PacketID "$PacketData" } } else { if { $NotACKNAK } { SendACKNAK NAK $PacketID } } } else { Log "PC> got $dec instead of ETX" if { $NotACKNAK } { SendACKNAK NAK $PacketID } } set SInPacketState start } else { set SeenDLE 0 lappend SInBuffer $char incr SInSum $dec ; incr SInCount } } elseif { $dec == $DLE } { set SeenDLE 1 } else { lappend SInBuffer $char incr SInSum $dec ; incr SInCount } } } return } proc PacketOK {} { # test consistency of packet just read in (mainly size and checksum) global SInBuffer SInSum SInCount PacketID PacketData set PacketData "" if { $PacketID == "error" } { return 0 } set size [expr $SInCount-2] binary scan [lindex $SInBuffer 0] "c" expsize set expsize [expr ($expsize+256)%256] if { $expsize != $size } { Log "PO> bad length $size instead of $expsize" return 0 } if { [expr $SInSum&255] != 0 } { Log "PO> bad checksum [expr $SInSum&255]" return 0 } set PacketData [lrange $SInBuffer 1 $size] return 1 } ##### application layer: input proc ProcInPacket {pid data} { # process incoming packet # $pid is packet identifier name # $data is list of bytes (as TCL characters) # uses the following global variables that may be set elsewhere: # $PkInState should be set externally either to idle (discarding # packets) or to name of protocol the incoming packet is # is expected to conform to # $GetPVT is set if PVT data packets are expected global PkInState PkInPrevState PkInData PkInRTsData PkInCount CurrPSPID \ PDTYPE SPckts GetPVT PkLastPID PkLastData Jobs \ TestRepeated PrdDATA Request if { $pid == "PVTData" } { # PVT data protocol if { ! $GetPVT } { Log "PP> discarding PVT packet" return } set p $CurrPSPID(PVTData) ProcPVTData $p [UnPackData $data $PDTYPE($p)] return } if { $TestRepeated && \ $pid == $PkLastPID && $data == $PkLastData } { Log "PP> discarding repeated packet for $pid" return } set PkLastPID $pid ; set PkLastData $data incr SPckts switch $PkInState { idle { Log "PP> discarding $pid packet" } N/A { Log "PP> asking for non-available protocol" set PkInState idle } T001 { # changing baud rate (not sure this is the T001 protocol) # step 3: get proposed baud rate if { [GoodPID $pid BaudAcptData] } { # $data is proposed baud with an error of +-5% set baud 0 if { [set pbaud [UnPackData $data long]] >= 18240 } { foreach b "19200 38400 57600 115200 230400" { if { abs($pbaud-$b) <= 0.05*$b } { set baud $b break } } } if { $baud == 0 } { # do noting: keep baud rate at the 9600 default Log "PP> proposed baud not accepted: $pbaud" AbortComm baudchgfailed } else { # accept anything else after 100 if { [ReopenSerialPortFailed $baud] } { AbortComm baudchgfailed } else { set PkInState idle set Request chgbaudcf=1 after 0 "SendData chgbaudcf" } } return } } A000 { # product data protocol if { [GoodPID $pid PrdData] } { # save product data set PrdDATA $data # wait for the Protocol Capability packet set PkInState A001 # the data will be dealt with either when A001 terminates # (see below) or fails to show up (see proc AbortComm) return } } A001 { # protocol capability protocol if { $pid == "PrdExtData" } { # this data is to be discarded; keep # waiting for the protocol capability packet return } if { [GoodPID $pid PArray] } { # the Product Data information must be processed now # kill timeout alarm after cancel [lindex $Jobs 0] set PkInState idle EndInProt A000 [UnPackData $PrdDATA $PDTYPE(PrdData)] EndInProt A001 [UnPackData $data $PDTYPE(PArray)] } } A010 { # device command protocol 1 if { [GoodPID $pid CmdData] } { set PkInState idle EndInProt A010 [UnPackData $data int] } } A100 { # WP transfer protocol ExpectRecords $pid $data WPData } A100EXF { # expecting end of transfer on A100 protocol EndOfTransfer $pid $data WP A100 $PkInData } D100 - D101 - D102 - D103 - D104 - D105 - D106 - D107 - D108 - D109 - D110 - D150 - D151 - D152 - D154 - D155 { # WP data; product specific if { $PkInPrevState == $CurrPSPID(RT) } { if { $pid == "RTHeader" } { lappend PkInRTsData $PkInData \ "[UnPackData $data $PDTYPE($CurrPSPID(RTHeader))]" set PkInData "" if { $PkInCount == 1 } { set PkInState ${PkInPrevState}EXF } else { incr PkInCount -1 } return } set d RTWPData set nolk [string compare $PkInPrevState A201] } else { set d WPData ; set nolk 1 } if { [GoodPID $pid $d] } { lappend PkInData [UnPackData $data $PDTYPE($PkInState)] if { $PkInCount == 1 } { set PkInState ${PkInPrevState}EXF } else { incr PkInCount -1 if { ! $nolk } { set PkInState $CurrPSPID(RTLinkData) } } } } A200 - A201 { # RT transfer protocol (without/with RT link data) ExpectRecords $pid $data RTHeader set PkInRTsData "" } A200EXF { # expecting end of transfer on A200 protocol lappend PkInRTsData $PkInData EndOfTransfer $pid $data RT A200 $PkInRTsData } A201EXF { # expecting end of transfer on A201 protocol lappend PkInRTsData $PkInData EndOfTransfer $pid $data RT A201 $PkInRTsData } D200 - D201 - D202 { # RT header; product specific if { [GoodPID $pid RTHeader] } { lappend PkInRTsData "[UnPackData $data $PDTYPE($PkInState)]" set PkInData "" if { $PkInCount == 1 } { Log "PP> RT header as last element of RT protocol" set PkInState ${PkInPrevState}EXF } else { incr PkInCount -1 set PkInState $CurrPSPID(RTWPData) } } } D210 { # RT link type; product specific if { $pid == "RTHeader" } { lappend PkInRTsData $PkInData \ "[UnPackData $data $PDTYPE($CurrPSPID(RTHeader))]" set PkInData "" if { $PkInCount == 1 } { set PkInState ${PkInPrevState}EXF } else { incr PkInCount -1 set PkInState $CurrPSPID(RTWPData) } return } if { [GoodPID $pid RTLinkData] } { lappend PkInData "[UnPackData $data $PDTYPE($PkInState)]" if { $PkInCount == 1 } { Log "PP> RT link as last element of RT" set PkInState ${PkInPrevState}EXF } else { incr PkInCount -1 set PkInState $CurrPSPID(RTWPData) } } } A300 { # TR transfer protocol ExpectRecords $pid $data TRData } A301 - A302 { # TR transfer protocol ExpectRecords $pid $data TRHeader } A300EXF { # expecting end of transfer on A300 protocol EndOfTransfer $pid $data TR A300 $PkInData } A301EXF - A302EXF { # expecting end of transfer on A301, A302 protocols regsub {EXF$} $PkInState "" prot EndOfTransfer $pid $data TR $prot $PkInData } D300 - D301 - D302 - D303 - D304 { # TR data; product specific if { $pid == "TRHeader" } { set PkInState $CurrPSPID(TRHeader) ProcInPacket $pid $data return } elseif { [GoodPID $pid TRData] } { lappend PkInData \ [list data [UnPackData $data $PDTYPE($PkInState)]] if { $PkInCount == 1 } { set PkInState ${PkInPrevState}EXF } else { incr PkInCount -1 } } } D310 - D311 - D312 { # TR header; product specific if { [GoodPID $pid TRHeader] } { lappend PkInData \ [list header [UnPackData $data $PDTYPE($PkInState)]] if { $PkInCount == 1 } { set PkInState ${PkInPrevState}EXF } else { set PkInState $CurrPSPID(TRData) incr PkInCount -1 } } } A500 { # AL transfer protocol ExpectRecords $pid $data ALData } A500EXF { # expecting end of transfer on A500 protocol EndOfTransfer $pid $data AL A500 $PkInData } D500 - D501 - D550 - D551 { # AL data; product specific if { [GoodPID $pid ALData] } { lappend PkInData "[UnPackData $data $PDTYPE($PkInState)]" if { $PkInCount == 1 } { set PkInState ${PkInPrevState}EXF } else { incr PkInCount -1 } } } D600 { # date and time initialization protocol if { [GoodPID $pid DtTmData] } { set PkInState idle EndInProt D600 [UnPackData $data $PDTYPE($CurrPSPID(DtTmData))] } } D700 { # position initialization protocol if { [GoodPID $pid PosnData] } { set PkInState idle EndInProt D700 [UnPackData $data $PDTYPE($CurrPSPID(PosnData))] } } A906 { # LAP transfer protocol (from receiver) ExpectRecords $pid $data LAPData } A906EXF { # expecting end of transfer on A906 protocol EndOfTransfer $pid $data LAP A906 $PkInData } D906 { # LAP data; product specific if { [GoodPID $pid LAPData] } { lappend PkInData [UnPackData $data $PDTYPE($PkInState)] if { $PkInCount == 1 } { set PkInState ${PkInPrevState}EXF } else { incr PkInCount -1 } } } A011 - A101 - A400 - A600 - A650 - A700 - default { Log "$PkInState not supported" set PkInState idle } } return } proc ExpectRecords {pid data type} { # check if records packet received and set global variables if yes # for protocol $PkInState global PkInData PkInCount PkInState PkInPrevState CurrPSPID if { [GoodPID $pid Records] } { set PkInData "" if { [set PkInCount [UnPackData $data int]] } { set PkInPrevState $PkInState set PkInState $CurrPSPID($type) } else { set PkInState ${PkInState}EXF } } return } proc EndOfTransfer {pid data wh prot recs} { # end of transfer after records for protocol $prot # $recs is data collected from the records global PkInData if { [GoodPID $pid XfrCmpl] } { if { [GoodCMD [UnPackData $data int] Xfr$wh] } { EndInProt $prot $recs set PkInState idle } } return } proc GoodPID {pid wanted} { # check that packet id name is what is wanted if { $pid != $wanted } { BadPacket "PID $pid instead of $wanted" return 0 } return 1 } proc GoodCMD {cmd wanted} { # check that command code is what is wanted global CMD if { $cmd != $CMD($wanted) } { BadPacket "CMD $cmd not good for $wanted" return 0 } return 1 } ### application layer: output proc SendData {type args} { # start transfer to receiver # first packet sent will, in serial mode, hopefully be ACK-ed, what # will fire up (in sequence) ProcChar, ProcACKNAK, SentPacket; in # USB mode SentPacket will be called after the packet is sent # $type in {product, abort, turnOff, get, put, start, stop, chgbaud, # chgbaudcf} # $args void unless # $type==get: in {WP RT TR AL PosnData DtTmData}; not yet # in {Prx} # $type==put and 1st arg in {WP RT TR PosnData DtTmData}; not yet # in {AL Prx} # 2nd arg is list of indices # $type in {start, stop}: in {PVT} # set global GPSOpResult to 1 (error) if put operation fails global PDTYPE PRTHNID PkInState SOutBusy CurrPSPID CMD Command CommArgs \ PkOutState PkOutData PkOutCount PkOutStart PkOutWhat PkTRSegs \ PkOutSaved PkOutInfo RTIdNumber RTWPoints RTStages TRTPoints \ TRSegStarts PrdDATA MESS PTRHNID ProcSendPacket PROTNOOUTPUT \ GPSOpResult # DJG contribution global RTNextNumber AutoNumRts RTSendNumber #-- set Command $type ; set CommArgs $args switch $type { product { set PrdDATA "" $ProcSendPacket PrdReq $PDTYPE(PrdReq) 0 } abort { $ProcSendPacket CmdData int [list $CMD(Abort)] } turnOff { $ProcSendPacket CmdData int $CMD(TurnOff) # do not wait for an answer CloseConnection } chgbaud { # step 1: turn off all requests $ProcSendPacket RqstData int 0 } chgbaudcf { # step 4: send ping for confirmation $ProcSendPacket CmdData int $CMD(AckPing) } start { # $args in {PVT} $ProcSendPacket CmdData int $CMD(Start$args) } stop { # $args in {PVT} $ProcSendPacket CmdData int $CMD(Stop$args) } get { # $args in {WP RT TR AL PosnData DtTmData} # not implemented: {Prx} $ProcSendPacket CmdData int $CMD(Xfr$args) } put { set putwhat [lindex $args 0] set ixs [lindex $args 1] foreach z $PROTNOOUTPUT { if { [lindex $z 0] == $putwhat } { if { [set z [lindex $z 1]] == "" } { Log "SD> put $putwhat not implemented" set GPSOpResult 1 return } foreach zz $z { foreach "zt zid" $zz {} if { ! [catch {set zc $CurrPSPID($zt)}] && \ $zc == $zid } { Log "SD> put: $zt protocol $zid not implemented" set GPSOpResult 1 return } } } } set PkOutWhat $putwhat set p $CurrPSPID($putwhat) switch $putwhat { WP { set PkOutStart XfrWP switch $p { A100 { set PkOutData $ixs set PkOutCount [llength $ixs] set PkOutState $CurrPSPID(WPData) $ProcSendPacket Records int $PkOutCount } default { Log "protocol $p not implemented" return } } } RT { set nolk [string compare $CurrPSPID(RT) A201] set n 0 ; set badrts 0 set data "" # DJG contribution: do autonumbering of RTs if the device # can't cope with names; and try to do it the proper way... # If the user has numbered their routes (silly thing to # do in my book, as my GPS can only cope with so many # of the things...) then we obey that. Otherwise we # assign numbers in a first-come first served way. If # some routes are numbered, then we cope with that too by # preallocating those numbers if { $AutoNumRts } { foreach rt [ array names RTIdNumber ] { set num $RTIdNumber($rt) if { [regexp {^[0-9]+$} $num] } { set $taken($num) 1 # MF change: no need for this here as # it must appear below when no $AutoNumRTs # set $RTSendNumber($rt) $num } } } #-- foreach rt $ixs { # DJG contribution: auto-numbering if { $PRTHNID } { if { ! [regexp {^[0-9]+$} $RTIdNumber($rt)] } { # AutoNumRts is a user option if { ! $AutoNumRts } { incr badrts continue } if { [catch {set RTSendNumber($rt)}] } { while { ! [catch \ {set taken($RTNextNumber)}] } { incr RTNextNumber } set RTSendNumber($rt) $RTNextNumber incr RTNextNumber } } else { # Alternative taken care of above # MF change: ... only if $AutoNumRts set RTSendNumber($rt) $RTIdNumber($rt) } } else { set RTSendNumber($rt) $RTIdNumber($rt) } #-- set k [llength $RTWPoints($rt)] if { ! $nolk } { incr k [expr $k-1] } lappend data $rt $k $nolk incr n [expr $k+1] } if { $badrts > 0 } { GMMessage [format $MESS(cantsaveRTid) $badrts] if { $n == 0 } return } set PkOutStart XfrRT switch $p { A200 - A201 { set PkOutData $data ; set PkOutCount $n set PkOutState $CurrPSPID(RTHeader) $ProcSendPacket Records int $PkOutCount } default { Log "protocol $p not implemented" return } } } TR { set n 0 ; set badtrs 0 set PkTRSegs 0 foreach tr $ixs { if { $PTRHNID && ! [regexp {^[0-9]+$} $TRName($ix)] } { incr badtrs continue } incr n [llength $TRTPoints($tr)] if { $TRSegStarts($tr) != "" } { incr PkTRSegs } } if { $badtrs > 0 } { GMMessage [format $MESS(cantsaveTRid) $badtrs] if { $n == 0 } return } set PkOutStart XfrTR set PkOutData $ixs switch $p { A300 { # TR segments not supported set PkTRSegs 0 set PkOutCount $n set PkOutState TRData } A301 - A302 { # $PkTRSegs is count of TRs having segments set PkOutCount [expr $n+[llength $ixs]] set PkOutState TRHeader } default { Log "protocol $p not implemented" return } } $ProcSendPacket Records int $n } PosnData - DtTmData { Log "PosnData/DtTmData not implemented" return } } } } return } proc SentPacket {pid} { # deal with continuation after a packet has successfully been sent global Command CommArgs PkInState CurrPSPID SInState \ PkOutState PkOutWhat PkOutCount PkOutData PkOutStart PkOutSaved \ CMD RTWPoints RTStages Jobs Request SPckts ProcSendPacket incr SPckts Log "StP> packet for $pid sent" switch $pid { PrdReq { if { $PkInState != "idle" } { lappend Jobs [after 50 "SentPacket $pid"] return } set PkInState A000 set SInState get } CmdData { switch $Command { get { if { $PkInState != "idle" } { lappend Jobs [after 50 "SentPacket $pid"] return } set PkInState $CurrPSPID($CommArgs) set SInState get } abort { if { [string first check $Request] != 0 } { # called this way so that it may cancel pending jobs after 0 AbortComm } } chgbaudcf { regsub chgbaudcf= $Request "" n if { $n == 1 } { set Request chgbaudcf=2 SendData chgbaudcf return } EndChangeGarminBaud } default { # do nothing (?); should it report to layer above? } } } RqstData { switch -glob -- $Request { chgbaud=* { # step 2: send request for changing baud regsub chgbaud= $Request "" baud $ProcSendPacket BaudRqstData long $baud } default { Log "StP> bad request for RqstData: $Request" after 0 AbortComm } } } BaudRqstData { set PkInState T001 set SInState get } Records { if { $PkOutCount == 0 } { $ProcSendPacket XfrCmpl int $CMD($PkOutStart) } else { incr PkOutCount -1 switch $PkOutWhat { WP { foreach "ts vs" [PrepData] {} $ProcSendPacket WPData $ts $vs } RT { foreach "ts vs" [PrepData] {} $ProcSendPacket RTHeader $ts $vs } TR { set PkOutSaved "" set pid $PkOutState set PkOutState $CurrPSPID($pid) foreach "ts vs" [PrepData] {} $ProcSendPacket $pid $ts $vs } } } } WPData { if { $PkOutCount == 0 } { $ProcSendPacket XfrCmpl int $CMD($PkOutStart) } else { incr PkOutCount -1 foreach "ts vs" [PrepData] {} $ProcSendPacket $pid $ts $vs } } RTHeader { set rt [lindex $PkOutData 0] set n [lindex $PkOutData 1] set nolk [lindex $PkOutData 2] set PkOutSaved [list [expr $PkOutCount-$n] $PkOutState \ [lreplace $PkOutData 0 2]] set PkOutState $CurrPSPID(RTWPData) set PkOutData [Apply "$RTWPoints($rt)" IndexNamed WP] if { ! $nolk } { set k 1 if { $RTStages($rt) == "" } { foreach nwp [lrange $PkOutData 1 end] { set PkOutData [linsert $PkOutData $k ""] incr k 2 } } else { foreach st $RTStages($rt) { set PkOutData [linsert $PkOutData $k $st] incr k 2 } } } if { [set PkOutCount $n] } { incr PkOutCount -1 foreach "ts vs" [PrepData] {} $ProcSendPacket RTWPData $ts $vs } else { $ProcSendPacket XfrCmpl int $CMD($PkOutStart) } } RTWPData - RTLinkData { if { $PkOutCount == 0 } { if { [set PkOutCount [lindex $PkOutSaved 0]] } { incr PkOutCount -1 set PkOutState [lindex $PkOutSaved 1] set PkOutData [lindex $PkOutSaved 2] foreach "ts vs" [PrepData] {} $ProcSendPacket RTHeader $ts $vs } else { $ProcSendPacket XfrCmpl int $CMD($PkOutStart) } } else { incr PkOutCount -1 if { $CurrPSPID(RT) != "A201" } { set p RTWPData } elseif { $pid != "RTLinkData" } { set PkOutState $CurrPSPID(RTLinkData) set p RTLinkData } else { set PkOutState $CurrPSPID(RTWPData) set p RTWPData } foreach "ts vs" [PrepData] {} $ProcSendPacket $p $ts $vs } } TRHeader { if { $PkOutCount == 0 } { Log "StP> count 0 after TRHeader" $ProcSendPacket XfrCmpl int $CMD($PkOutStart) } else { incr PkOutCount -1 set PkOutState $CurrPSPID(TRData) foreach "ts vs" [PrepData] {} $ProcSendPacket TRData $ts $vs } } TRData { if { $PkOutCount == 0 } { $ProcSendPacket XfrCmpl int $CMD($PkOutStart) } else { incr PkOutCount -1 if { $PkOutSaved == "" } { switch $CurrPSPID(TR) { A301 - A302 { set pid TRHeader set PkOutState $CurrPSPID(TRHeader) } } } foreach "ts vs" [PrepData] {} $ProcSendPacket $pid $ts $vs } } XfrCmpl { EndOutProt $PkOutStart } } return } proc PrepData {} { # prepare WPs, RTs, or TRs data to be transferred to receiver global PkOutState PkOutData PkOutInfo PkOutSaved PkTRSegs PkSegData \ PkTRTPn PDTYPE WPName WPCommt WPPosn WPDatum WPDate WPSymbol \ WPDispOpt WPAlt WPHidden RTIdNumber RTCommt TRName TRDatum \ TRTPoints TRSegStarts TRColour TRHidden DataIndex #DJG contribution: Autonumber globals global RTSendNumber RTsSent #-- switch $PkOutState { D100 - D101 - D102 - D103 - D104 - D105 - D106 - D107 - D108 - D109 - D110 - D150 - D151 - D152 - D154 - D155 { set ix [lindex $PkOutData 0] set PkOutData [lreplace $PkOutData 0 0] set p $WPPosn($ix) if { $WPDatum($ix) != "WGS 84" } { set p [ToDatum [lindex $p 0] [lindex $p 1] \ $WPDatum($ix) "WGS 84"] } set alt [lindex $WPAlt($ix) 0] return [list $PDTYPE($PkOutState) \ [PrepWPData $PkOutState \ $WPName($ix) $WPCommt($ix) $p \ $WPDate($ix) $WPSymbol($ix) \ $WPDispOpt($ix) $alt $WPHidden($ix)]] } D200 - D201 - D202 { # RT header set ix [lindex $PkOutData 0] # DJG contribution: Use RTSendNumber in place of RTIdNumber return [list $PDTYPE($PkOutState) \ [PrepRTHeaderData $PkOutState \ $RTSendNumber($ix) $RTCommt($ix)]] } D210 { # RT link set st [lindex $PkOutData 0] set PkOutData [lreplace $PkOutData 0 0] return [list $PDTYPE($PkOutState) [PrepRSData $PkOutState $st]] } D300 - D301 - D302 - D303 - D304 { if { $PkOutSaved != "" } { # $PkOutSaved is list of TPs set p [lindex $PkOutSaved 0] set alt [lindex [lindex $p $DataIndex(TPalt)] 0] set depth [lindex $p $DataIndex(TPdepth)] set PkOutSaved [lreplace $PkOutSaved 0 0] set new 0 if { $PkTRSegs && $PkSegData != "" && \ [lindex $PkSegData 0] == $PkTRTPn } { set new 1 if { [set PkSegData [lreplace $PkSegData 0 0]] == "" } { incr PkTRSegs -1 } } } else { # this is needed if no TRHeader is used: start new TR set ix [lindex $PkOutData 0] set PkOutData [lreplace $PkOutData 0 0] set p [lindex $TRTPoints($ix) 0] set PkOutSaved [lreplace $TRTPoints($ix) 0 0] set PkTRTPn 0 if { $PkTRSegs } { # assuming 0 is never in $TRSegStarts($ix) set PkSegData $TRSegStarts($ix) } set alt [lindex $p $DataIndex(TPalt)] set depth [lindex $p $DataIndex(TPdepth)] if { $TRDatum($ix) != "WGS 84" } { set p [ToDatum [lindex $p 0] [lindex $p 1] \ $TRDatum($ix) "WGS 84"] set PkOutSaved [ChangeTPsDatum $PkOutSaved \ $TRDatum($ix) "WGS 84"] } set new 1 } incr PkTRTPn return [list $PDTYPE($PkOutState) \ [PrepTRData $PkOutState $p 0 $new $alt $depth]] } D310 - D311 - D312 { # TRHeader set ix [lindex $PkOutData 0] set PkOutData [lreplace $PkOutData 0 0] set PkOutSaved $TRTPoints($ix) set PkTRTPn 0 if { $PkTRSegs } { set PkSegData $TRSegStarts($ix) } if { $TRDatum($ix) != "WGS 84" } { set PkOutSaved [ChangeTPsDatum $PkOutSaved \ $TRDatum($ix) "WGS 84"] } return [list $PDTYPE($PkOutState) \ [PrepTRHeader $PkOutState $TRName($ix) \ $TRColour($ix) $TRHidden($ix)]] } } } proc PrepWPData {pid name commt posn date symbol dispopt alt hidden} { # $symbol only used in D101-9, D110, D154-5 # $dispopt only in D103-4, D107-9, D155 # $alt only in D108-9, D110 (as float), D150-5 (as integer) global SYMBOLCODE DISPOPTCODE set sc $SYMBOLCODE($symbol) set do $DISPOPTCODE($dispopt) if { $alt == "" } { if { [regexp {^D1((0[89])|10)} $pid] } { # D108-D110 set alt 1.0e25 } else { set alt 0 } } elseif { ! [regexp {^D1((0[89])|10)} $pid] } { # not D108-D110 set alt [expr round($alt)] } switch $pid { D100 { return [list $name $posn 0 $commt] } D101 - D102 { return [list $name $posn 0 $commt 0 $sc] } D103 { return [list $name $posn 0 $commt $sc $do] } D104 { return [list $name $posn 0 $commt 0 $sc $do] } D105 { return [list $posn $sc $name] } D106 { set ps "2 3 4" ; set vs [list $posn $sc $name] } D107 { set ps "0 1 2 3 4 5 6" set vs [list $name $posn 0 $commt $sc $do 0] } D108 { set ps "2 4 6 7 9 12 13" set vs [list $do $sc $posn $alt 0 $name $commt] } D109 { set ps "2 4 6 7 9 13 14" ### merging display option and colour set colour [HiddenFindVal D109 colour $hidden] set dclr [expr ($do<<5)|($colour&0x1f)] set vs [list $dclr $sc $posn $alt 0 $name $commt] } D110 { set ps "2 4 6 7 9 16 17" ### merging display option and colour set colour [HiddenFindVal D110 colour $hidden] set dclr [expr ($do<<5)|($colour&0x1f)] set vs [list $dclr $sc $posn $alt 0 $name $commt] } D150 { set ps "0 3 4 8" ; set vs [list $name $posn $alt $commt] } D151 - D152 { set ps "0 1 2 3 4 8 10" set vs [list $name $posn 0 $commt 0 $alt 0] } D154 { set ps "0 1 2 3 4 8 10 12" set vs [list $name $posn 0 $commt 0 $alt 0 $sc] } D155 { set ps "0 1 2 3 4 8 10 12 13" set vs [list $name $posn 0 $commt 0 $alt 0 $sc $do] } } return [MergeData [HiddenVals $pid $hidden] $ps $vs] } proc PrepRTHeaderData {pid number cmmt} { switch $pid { D200 { return [list $number] } D201 { return [list $number $cmmt] } D202 { return [list $number] } } } proc PrepRSData {pid stage} { global DataIndex set commt [lindex $stage $DataIndex(RScommt)] set label [lindex $stage $DataIndex(RSlabel)] set hidden [lindex $stage $DataIndex(RShidden)] switch $pid { D210 { set ps "2" ; set vs [list $commt] } } return [MergeData [HiddenVals $pid $hidden] $ps $vs] } proc PrepTRHeader {pid name colour hidden} { switch $pid { D310 - D312 { set ps "1 2" ; set vs [list [ToGarminColour $pid $colour] $name] } D311 { set ps 0 ; set vs $name } } return [MergeData [HiddenVals $pid $hidden] $ps $vs] } proc PrepTRData {pid posn date new alt depth} { if { $alt != "" } { set altundef $alt } else { set altundef 1.0e25 } if { $depth != "" } { set depthundef $depth } else { set depthundef 1.0e25 } switch $pid { D300 { return [list $posn $date $new] } D301 { return [list $posn $date $altundef $depthundef $new] } D302 { # temperature is always sent as undefined return [list $posn $date $altundef $depthundef 1.0e25 $new] } D303 { # heart rate is always sent as undefined # no information on new segments return [list $posn $date $altundef 0] } D304 { # heart rate, cadence always sent as undefined and sensor as 0 # no information on new segments return [list $posn $date $altundef 1.025 0 0xff 0] } } } ### data types proc UnPackData {data types} { # convert from list of bytes (as TCL characters) to list of elements # conforming to the types in the list $types # delete leading and trailing spaces of strings and char arrays global PacketDataRest PDTSIZE tcl_platform set vals "" foreach t $types { switch -glob $t { char { set n 1 binary scan [join [lrange $data 0 0] ""] "a1" x } boolean - byte { set n 1 binary scan [join [lrange $data 0 0] ""] "c" x set x [expr ($x+256)%256] } int { set n 2 binary scan [join [lrange $data 0 1] ""] "s" x } word { set n 2 binary scan [join [lrange $data 0 1] ""] "s" x set x [expr ($x+0x10000)%0x10000] } long - longword { # longword cannot be represented in Tcl as unsigned! set n 4 binary scan [join [lrange $data 0 3] ""] "i" x } float { # this only works with machines following the # IEEE standard floating point representation set n 4 if { $tcl_platform(byteOrder) == "littleEndian" } { binary scan [join [lrange $data 0 3] ""] "f" x } else { set id "" foreach k "3 2 1 0" { lappend id [lindex $data $k] } binary scan [join $id ""] "f" x } } double { # this only works with machines following the # IEEE standard floating point representation set n 8 if { $tcl_platform(byteOrder) == "littleEndian" } { binary scan [join [lrange $data 0 7] ""] "d" x } else { set id "" foreach k "7 6 5 4 3 2 1 0" { lappend id [lindex $data $k] } binary scan [join $id ""] "d" x } } string { set x "" ; set n 0 while { 1 } { set c [lindex $data $n] incr n binary scan $c c d if { $d == 0 } { break } append x $c } if { ! [regexp {^ +$} $x] } { set x [string trim $x " "] } } string<* { # null-terminated string of at most *-1 characters # to be truncated if it exceeds the limit regsub string< $t "" n incr n -1 set x "" for { set i 0 } { $i < $n } { incr i } { set c [lindex $data $i] binary scan $c c d if { $d == 0 } { break } append x $c } if { $d != 0 } { # find the actual length while 1 { set c [lindex $data $i] binary scan $c c d if { $d == 0 } { break } incr i } } set n [expr $i+1] } charray=* { regsub charray= $t "" n set x "" for { set i 0 } { $i < $n } { incr i } { set c [lindex $data $i] binary scan $c c d if { $d == 0 } { set c " " } append x $c } if { ! [regexp {^ +$} $x] } { set x [string trim $x " "] } } bytes=* { # result is list of bytes regsub bytes= $t "" n set x "" for { set i 0 } { $i < $n } { incr i } { set c [lindex $data $i] binary scan $c c v lappend x [expr ($v+256)%256] } } starray=* { # return list of lists with structure fields regsub starray= $t "" ets set ts [split $ets ","] set x "" while { $data != "" } { lappend x [UnPackData $data $ts] set data $PacketDataRest } set n 0 } semicircle { # return lat/long in degrees set la [expr [UnPackData $data long]/ \ 11930464.7111111111111] set lo [expr [UnPackData [lrange $data 4 7] long]/ \ 11930464.7111111111111] set x [list $la $lo] set n 8 } radian { # return lat/long in degrees set la [expr [UnPackData $data double]* \ 57.29577951308232087684] set lo [expr [UnPackData [lrange $data 8 15] double]* \ 57.29577951308232087684] set x [list $la $lo] set n 16 } unused=* { regsub unused= $t "" n set x UNUSED } union=* { # can only appear if $data is a singleton and types in the # union are all of different lengths; no checks on this regsub union= $t "" l set size [llength $data] foreach ut [split $l ,] { if { $PDTSIZE($ut) == $size } { return [UnPackData $data $ut] } } Log "no types of size $size in $t; using byte" return [UnPackData $data byte] } ignored { set PacketDataRest "" return $vals } default { Log "unimplemented data type when unpacking: $t" set n 1 ; set x 0 } } lappend vals $x set data [lrange $data $n end] } set PacketDataRest $data return $vals } proc PackData {types vals} { # convert from a list of types and a list of values into a # list of bytes (as TCL characters) return [split [DataToStr $types $vals] ""] } proc DataToStr {types vals} { # convert from list of elements conforming to the types in $types to # a TCL string global tcl_platform if { [llength $types] != [llength $vals] } { Log "DataToStr> bad lengths: types=\{$types\}, vals=\{$vals\}" # BUG DataToStr: bad lengths } set data "" foreach t $types v $vals { switch -glob $t { char { append data [binary format "a" $v] } boolean - byte { append data [binary format "c" $v] } word - int { append data [binary format "s" $v] } longword - long { append data [binary format "i" $v] } float { # this only works with machines following the # IEEE standard floating point representation set s [binary format "f" $v] if { $tcl_platform(byteOrder) != "littleEndian" } { set l [split "$s" ""] set s "" foreach k "3 2 1 0" { append s [lindex $l $k] } } append data $s } double { # this only works with machines following the # IEEE standard floating point representation set s [binary format "d" $v] if { $tcl_platform(byteOrder) != "littleEndian" } { set l [split "$s" ""] set s "" foreach k "7 6 5 4 3 2 1 0" { append s [lindex $l $k] } } append data $s } string { append data [binary format "a*x" $v] } string<* { # null-terminated string of at most *-1 characters # to be truncated if it exceeds the limit regsub string< $t "" n incr n -1 if { [string length $v] > $n } { set v [string range $v 0 $n] } append data [binary format "a*x" $v] } charray=* { regsub charray= $t "" n append data [binary format "A$n" $v] } bytes=* { # $v is list of bytes regsub bytes= $t "" n foreach e $v { append data [binary format "c" $e] if { [incr n -1] == 0 } { break } } # complete with 0s if not enough data while { $n > 0 } { append data [binary format "c" 0] incr n -1 } } starray=* { # $v must be a list of lists with structure fields regsub starray= $t "" ets set ts [split $ets ","] foreach st $v { append data [DataToStr $ts $st] } } semicircle { set sla [expr round([lindex $v 0]*11930464.7111111111111)] set slo [expr round([lindex $v 1]*11930464.7111111111111)] append data [DataToStr "long long" [list $sla $slo]] } radian { set rla [expr [lindex $v 0]/57.29577951308232087684] set rlo [expr [lindex $v 1]/57.29577951308232087684] append data [DataToStr "double double" [list $rla $rlo]] } unused=* { regsub unused= $t "" n append data [binary format "x$n"] } union=* { # use the first type in the comma-separated list of types regsub union= $t "" l set t [string range $l 0 [expr [string first , $l]-1]] append data [DataToStr $t $v] } ignored { # no need for this: # just to ensure a non-empty packet data #append data [binary format "c" 0] } default { Log "DataToStr> unimplemented data type when packing: $t" } } } return $data } proc ToGarminColour {pid colour} { # convert from user colour to Garmin code by finding best-match # in set of colours allowed by $pid # $colour expected to be in hexadecimal global GARMINCOLOURS foreach "cx cy cz" [ColourToDec $colour] {} set cs "" ; set c 0 foreach n $GARMINCOLOURS($pid) { foreach "x y z" [ColourToDec $n] {} if { $x == -1 } { continue } if { $x == $cx && $y == $cy && $z == $cz } { return $c } lappend cs $c $x $y $z incr c } return [ColourMatch $cx $cy $cz $cs] } proc FromGarminColour {pid code} { # convert from Garmin code to GPSMan colour (in hexadecimal) global GARMINCOLOURS RGBNamed if { [set name [lindex $GARMINCOLOURS($pid) $code]] == "" || \ $name == "default" } { set defvar $GARMINCOLOURS($pid,dvar) global $defvar return [set $defvar] } return [eval DecToColour $RGBNamed($name)] } ##### upper level proc EndInProt {pid data} { # deal with end of input protocol # $pid in {A000 A001 A010 A100 A200-201 A300-302 A500 A600 A650 # A700 A906} # (cf. ProcInPacket) but {A010 A500 A600 A650 A700} not supported here # global $Request==get$wh where $wh in {WP RT TR LAP AL PosnData # DtTmData} (cf. SendData) # GPSOpResult is set to 0 on success or 1 on error # ==check=$args where 1st arg should be executed as # connection is ok global Request Jobs MESS TXT MyProdId MyProdDescr MyProdVersion \ PRTCLVERSION GPSOpResult switch $pid { A000 { # Product Data # executed after waiting for Protocol Capability packet Log "EIP> product data=$data" set MyProdId [lindex $data 0] set MyProdVersion [lindex $data 1] ; set descr [lindex $data 2] if { ! [catch {set pvs $PRTCLVERSION($MyProdId)}] } { foreach p $pvs { # compare version and set variant id if needs be if { [expr $MyProdVersion [lindex $p 0]] } { set MyProdId [lindex $p 1] break } } } set MyProdDescr [format $MESS(connectedto) $descr] return } A001 { # Protocol Capability if { [InitGivenProtocols $data] } { set SInState idle EndConnCheck gotprots } else { AbortComm badprots } return } } CloseInProgrWindow ResetSerial switch -glob $Request { get* { regsub get $Request "" wh SetCursor . watch if { [lindex $data 0] != "" } { InData$wh $data EndWPRenaming set GPSOpResult 0 } else { GMMessage [format $MESS(nodata) $TXT($wh)] set GPSOpResult 1 } ResetCursor . } default { Log ">EIP: wrong request ($Request)" } } set Jobs "" return } proc InDataWP {data} { InDataWPRT $data WPData return } proc InDataWPRT {data pid} { # add WPs data from receiver to database not overwriting non-user WPs # with same name and different positions # return list of names of WPs; it may be void if WPs were discarded because # of unacceptable data fields or because the user cancelled renaming global CurrPSPID GetDispl GetSet set wps "" foreach hcd [ConvWPData $data $CurrPSPID($pid)] { foreach "hclass d" $hcd { break } set name [lindex $d 0] if { ! [CheckName Ignore $name] } { if { [set nname [AskForName $name]] == "" } { continue } set d [AddOldNameToObs WP $d $name] set d [lreplace $d 0 0 $nname] set name $nname } if { [set ix [IndexNamed WP $name]] != -1 && $hclass != "user" && \ [SamePosn $ix $d] != 1 } { # do not overwrite non-user WPs with same name but different # positions set ix -1 set d [AddOldNameToObs WP $d $name] set name [NewName WP] set d [lreplace $d 0 0 $name] } if { $GetSet(WP) == "" || [lsearch -exact $GetSet(WP) $ix] != -1 } { set name [StoreWP $ix $name $d $GetDispl] lappend wps $name } } return $wps } proc ConvWPData {data pid} { # convert WPs data got from receiver into list of lists whose heads are # either "user" or the string given by proc HiddenFormatVal for the class # attribute (may be "user"), and whose rests are suitable for use with # proc SetItem # result may be an empty list global PositionFormat CREATIONDATE DATAFOR HiddenClass set r "" set fs $DATAFOR($pid,ns) ; set ps $DATAFOR($pid,ps) if { $CREATIONDATE } { set all [linsert $fs 0 Datum PFrmt Date Hidden] set cnsts [list "WGS 84" "" [Now]] } else { set all [linsert $fs 0 Datum PFrmt Hidden] set cnsts [list "WGS 84" ""] } foreach d $data { set vs $cnsts lappend vs [set hvs [HiddenGet $pid $d]] set ok 1 foreach f $fs p $ps { set v [lindex $d $p] switch $f { Posn { foreach "latd longd" $v { break } if { ( $pid == "D110" && abs($latd) > 0x40000000 ) || \ abs($latd) > 90 || abs($longd) > 180 } { # discard Log "CWPD> WP bad position, $pid: $latd $longd" set ok 0 break } foreach "v pfmt datum" \ [FormatPosition $latd $longd "WGS 84" \ $PositionFormat "" DDD] { break } set vs [lreplace $vs 0 1 $datum $pfmt] } Commt { # replace newlines by spaces regsub -all {[\n]} $v " " v } Symbol { set v [NameForCodeOf SYMBOL $v] } DispOpt { if { $pid == "D109" || $pid == "D110" } { # colour has been dealt with by HiddenGet set v [expr $v>>5] } set v [NameForCodeOf DISPOPT $v] } Alt { switch $pid { D108 - D109 - D110 { if { $v < 1e20 } { set v [format %.1f $v] } else { set v "" } } D150 - D151 - D152 - D154 - D155 { # this depends on what HiddenGet does! set k [lsearch -glob $hvs G*:class=*] if { $k != -1 && \ "G${pid}:class=[HiddenCode int 0]" == \ [lindex $hvs $k] } { set v "" } } } } } lappend vs $v } if { $ok } { lappend r [list $HiddenClass [FormData WP $all $vs]] } } return $r } proc InDataRT {data} { # add RT data from receiver to database # $data is a list with in turn # RT header data as returned by UnPackData # list of WP data or list with in turn WP data and RS data global CurrPSPID GetDispl GetSet MESS if { [set nolk [string compare $CurrPSPID(RT) A201]] } { set fs "IdNumber Commt WPoints" } else { set fs "IdNumber Commt Stages WPoints" } set hpid $CurrPSPID(RTHeader) while { $data != "" } { set r [ConvRTHeaderData [lindex $data 0] $hpid] # replace newlines in comment by spaces if { [regsub -all {[\n]} [lindex $r 1] " " commt] != 0 } { set r [lreplace $r 1 1 $commt] } set id [lindex $r 0] ; set ix [IndexNamed RT $id] if { $GetSet(RT) == "" || [lsearch -exact $GetSet(RT) $ix] != -1 } { set GetSet(WP) "" set wpd [lindex $data 1] if { ! $nolk } { set wps "" ; set sts "" while { $wpd != "" } { lappend wps [lindex $wpd 0] if { [set sd [lindex $wpd 1]] != "" } { lappend sts [ConvRSData $sd $CurrPSPID(RTLinkData)] } set wpd [lreplace $wpd 0 1] } set wpd $wps lappend r $sts } set wps [InDataWPRT $wpd RTWPData] # $wps can be void if the user cancelled replacement of names # or $wps were discarded if { $wps != "" } { lappend r $wps set d [FormData RT $fs $r] StoreRT $ix $id $d $wps $GetDispl } else { GMMessage "$MESS(voidRT): $id" } } set data [lreplace $data 0 1] } return } proc ConvRTHeaderData {data pid} { # convert RT header data got from receiver into list of id number and # comment switch $pid { D200 - D202 { lappend data "" return $data } D201 { return $data } } } proc ConvRSData {data pid} { # convert RT stage data got from receiver into list using FormData switch $pid { D210 { return [FormData RS "commt hidden" \ [list [lindex $data 2] [HiddenGet D210 $data]]] } } } proc InDataTR {data} { # add TRs data from receiver to database # $data is a list of pairs with kind (in {header, data}) and list of # values global CurrPSPID GetDispl SegPrefix # $trs is a list of triples with TR header info, a list of TP info, and # a list of segment starters, where the TR header info is a pair with # field names and values, and each TP info is a list obtained by FormData set trs "" ; set tps "" set pidd $CurrPSPID(TRData) switch $CurrPSPID(TR) { A300 { # no support for segments foreach p $data { set vals [lindex $p 1] if { [lindex $p 0] != "data" } { Log "IDTR> got a non-data pair: [lindex $p 0]" return } if { [set tpp [ConvTPData $vals $pidd]] == "" } { continue } if { [lindex $tpp 0] == 1 && $tps != "" } { lappend trs [list "" $tps ""] set tps "" } lappend tps [lindex $tpp 1] } if { $tps != "" } { lappend trs [list "" $tps ""] } } A301 - A302 { # segments are supported set pidh $CurrPSPID(TRHeader) set phdr "" ; set segsts "" ; set tpn 0 # for dealing with segments marked with invalid packets set SegPrefix 0 foreach p $data { set vals [lindex $p 1] if { [lindex $p 0] != "header" } { if { [set tpp [ConvTPData $vals $pidd]] == "" } { continue } lappend tps [lindex $tpp 1] if { [lindex $tpp 0] && $tpn != 0 } { lappend segsts $tpn } incr tpn } else { if { $tps != "" } { if { $phdr == "" } { Log "IDTR> TPs without header" return } lappend trs [list $phdr $tps $segsts] set tps "" } elseif { $phdr != "" } { Log "IDTR> TR header without TPs; discarding" } if { [set phdr [ConvTRHeaderData $vals $pidh]] == -1 } { return } set tpn 0 ; set segsts "" } } if { $tps != "" && $phdr != "" } { lappend trs [list $phdr $tps $segsts] } } } foreach tr $trs { set phdr [lindex $tr 0] set fs [lindex $phdr 0] ; set vs [lindex $phdr 1] if { [set k [lsearch -exact $fs Name]] == -1 } { lappend fs Name ; lappend vs [set id [NewName TR]] } else { set id [lindex $vs $k] } lappend fs Datum TPoints SegStarts lappend vs "WGS 84" [lindex $tr 1] [lindex $tr 2] StoreTR [IndexNamed TR $id] $id [FormData TR $fs $vs] $GetDispl } return } proc ConvTRHeaderData {data pid} { # convert TR header data # return pair of lists with field names and values switch $pid { D310 - D312 { set fs "Name Colour Hidden" set vs [list [lindex $data 2] \ [FromGarminColour $pid [lindex $data 0]] \ [HiddenGet $pid $data]] } D311 { set fs Name ; set vs [lindex $data 0] } } return [list $fs $vs] } proc ConvTPData {data pid} { # convert TP data # return empty list if invalid packet, otherwise pair with flag indicating # a new TR or segment, and list obtained by FormData global SegPrefix set fs "" ; set vs "" # common fields: position, date set badpos 0 foreach "latd longd" [lindex $data 0] {} if { abs($latd) > 90 || abs($longd) > 180 } { incr badpos } set d [lindex $data 1] switch $pid { D300 { if { $badpos } { Log "CTPD> TP bad position: $latd $longd" return "" } set new [lindex $data 2] } D301 - D302 { if { $badpos } { Log "CTPD> TP bad position: $latd $longd" return "" } if { [set alt [lindex $data 2]] < 1e10 } { lappend fs alt ; lappend vs $alt } if { [set dep [lindex $data 3]] < 1e10 } { lappend fs depth ; lappend vs $dep } if { $pid == "D302" } { # discard temperature set new [lindex $data 5] } else { # D301 set new [lindex $data 4] } } D303 - D304 { # segments are prefixed with 2 packets whose fields are all invalid set prefix $badpos if { [set alt [lindex $data 2]] < 1e10 } { lappend fs alt ; lappend vs $alt set prefix 0 } if { $pid == "D303" } { if { [set heartrate [lindex $data 3]] != 0 } { set prefix 0 } } else { # D304 foreach "dist heartrate cadence sensor" [lreplace $data 0 2] {} if { $heartrate != 0 || abs($dist-1.0e25) > 1 || \ $sensor != 0xff } { set prefix 0 } } if { $prefix } { Log "CTPD> segment prefix discarded" incr SegPrefix return "" } if { $badpos } { Log "CTPD> TP bad position: $latd $longd" set SegPrefix 0 return "" } # discard all information except position, date and altitude if { $SegPrefix > 1 } { set new 1 } else { set new 0 } set SegPrefix 0 } } if { [catch {set np [FormatLatLong $latd $longd DMS]}] } { Log "CTPD> bad position: $latd $longd\ndata=$data" GMMessage "Error getting TPs; please report to migfilg _AT_ t-online.de" return [list 1 {}] } set dl [ConvGarminDate $d] lappend fs latd longd latDMS longDMS date secs set tpdata [FormData TP $fs [concat $vs $np $dl]] return [list $new $tpdata] } proc InDataLAP {data} { # add LAPs data from receiver to database # create GRs with runs # $data is a list of lists of values global CurrPSPID GetSet LAPName LAPTRIx TXT set pidd $CurrPSPID(LAPData) set ixs "" switch $CurrPSPID(LAP) { A906 { foreach d [ConvLAPData $data $pidd] { set name [lindex $d 0] ; set ix [IndexNamed LAP $name] if { $GetSet(LAP) == "" || \ [lsearch -exact $GetSet(LAP) $ix] != -1 } { set ix [StoreLAP $ix $name $d] lappend ixs $ix } } } } # build runs: create a GR for each one set run "" ; set n 0 foreach ix $ixs { lappend run $LAPName($ix) if { [set trix $LAPTRIx($ix)] < 255 } { set n "$TXT(lapsrun) [lindex $run 0]" CreateGRFor "@$n" "" [list [list LAP $run]] set run "" } } if { $run != "" && $trix == 255 } { set n "$TXT(lapsrun) [lindex $run 0]" CreateGRFor "@$n" "" [list [list LAP $run]] } return } proc ConvLAPData {data pid} { # convert LAPs data got from receiver into list of lists suitable for # use with SetItem global PositionFormat DATAFOR set r "" set fs $DATAFOR($pid,ns) ; set ps $DATAFOR($pid,ps) set all [linsert $fs 0 Datum PFrmt Name] set cnsts [list "WGS 84" $PositionFormat ""] foreach d $data { set vs $cnsts set ix 0 foreach f $fs p $ps { set v [lindex $d $p] switch -glob $f { Start { set v [ConvGarminDate $v] set name [lindex $v 0] } Dur { set v [FormatTime [expr $v*0.01] 2] } *Posn { foreach "latd longd" $v { break } if { abs($latd) > 90 || abs($longd) > 180 } { set v "" set $f "" } else { foreach "v pfmt datum" \ [FormatPosition $latd $longd "WGS 84" \ $PositionFormat "" DDD] { break } # BegPosn and EndPosn must have same format and datum set $f [list $pfmt $datum $latd $longd $ix] } } } lappend vs $v } incr ix if { $BegPosn != "" || $EndPosn != "" } { if { $BegPosn != "" && $EndPosn != "" && \ [lrange $BegPosn 0 1] != [lrange $EndPosn 0 1] } { # incompatible position format or datum: use DDD for both foreach k [list $BegPosn $EndPosn] { set i [lindex $k 4] set vs [lreplace $vs $i $i \ [eval FormatLatLong [lrange $k 2 3] DDD]] } set pfmt DDD ; set datum "WGS 84" } set vs [lreplace $vs 0 1 $datum $pfmt] } set vs [lreplace $vs 2 2 $name] lappend r [FormData LAP $all $vs] } return $r } proc InDataAL {data} { # show almanac data to user or, if in command-line mode, store it as # text in global ALDataTxt # $data is a list of lists of values global CurrPSPID DATAFOR TXT CMDLINE ALDataTxt set pid $CurrPSPID(ALData) set title "$TXT(nameAL)\n" ; set sep "" foreach n $DATAFOR($pid,ns) { append title $sep $TXT(alm_$n) set sep ", " } if { $CMDLINE } { set ALDataTxt "$title\n" } else { DisplayInfo $title } foreach lst $data { set line "" ; set sep "" foreach v $lst { append line $sep $v set sep " " } if { $CMDLINE } { append ALDataTxt $line "\n" } else { DisplayInfo $line } } return } proc ConvGarminDate {gd} { # converts Garmin date (seconds since 1989.12.31 00:00:00) into list # with date in current format and seconds since beginning of $YEAR0, # not necessarily a leap year, but < 1990 global YEAR0 TimeOffset if { $gd == 0x7fffffff || $gd == 0xffffffff } { set gd 0 } set dd -1 set yy [expr $YEAR0+$YEAR0%4] while { $yy < 1990 } { if { $yy%100!=0 || $yy%400==0 } { incr dd } incr yy 4 } set secs [expr round((((1990-$YEAR0)*365+$dd)*24+$TimeOffset)*3600+$gd)] return [list [DateFromSecs $secs] $secs] } proc InDataPosnData {data} { GMMessage "InDataPosnData not implemented" return } proc InDataDtTmData {data} { GMMessage "InDataDtTmData not implemented" return } proc ProcPVTData {pid data} { # process position, velocity and time data if { [set data [InDataPVT $data $pid]] != "" } { UseRealTimeData $data } return } proc InDataPVT {data pid} { # get position, velocity and time data from receiver # return "" on error, or list with (any element may be "_" for undefined) # UTC time - as a list with y m d h mn s # position - as a list with latd, longd (for datum WGS 84) # pos fix - as defined in array GarminPVTStatus # pos error - as a list with # estimated position error EPE in meters # estimated horizontal error EPH in meters # estimated vertical error in meters # altitude - signed number in meters # velocity vector - as list with vlat vlong valt, in m/s # true course (track/course over ground) - degrees # number of satellites in view # HDOP - horizontal dilution of precision # speed - scalar in km/h # global DAYSOF GarminPVTStatus switch $pid { D800 { foreach "alt epe eph epv fix tow posn vlong vlat valt mslh \ lsecs wnds" \ $data { break } # some old receivers may use a fix value that is 1 more than this # (Garmin specs 1 rev A); that is not dealt with here!!! if { $fix < 2 } { return "" } foreach "latd longd" $posn {} if { abs($latd) > 90 || abs($longd) > 180 } { return "" } if { $fix%2 == 0 } { set alt "_" ; set valt "_" } else { set alt [expr $alt+$mslh] } if { [set utcs [expr round($tow-$lsecs)]] < 0 } { set nd -1 ; incr utcs 86400 } else { # integer division set nd [expr $utcs/86400] set utcs [expr $utcs%86400] } set s [expr $utcs%60] ; set x [expr $utcs/60] set mn [expr $x%60] ; set h [expr $x/60] incr wnds $nd set y [expr $wnds/365+1990] ; set d [expr $wnds%365] for { set yy 1992 } { $yy < $y } { incr yy 4 } { if { $yy%100 != 0 || $yy%400 == 0 } { incr d -1 } } if { $d < 0 } { incr y -1 ; incr d 365 } set b [expr $y%4 == 0 && ($y%100 != 0 || $y%400 == 0)] for { set m 1 } { $d > $DAYSOF($m) } { incr m } { if { $b && $m == 2 } { if { $d == 29 } { break } incr d -1 } incr d -$DAYSOF($m) } set r [list [list $y $m $d $h $mn $s] $posn \ $GarminPVTStatus($fix) [list $epe $eph $epv] $alt \ [list $vlat $vlong $valt] _ _ _ _] } } return $r } ##### PVT simulator proc SimulPVTOn {} { # simulate PVT by randomly generating fake PVT data lists and calls to # proc UseRealTimeData global SimulPVTData set SimulPVTData [list \ {2002 6 30 14 0 20} {45.02 -8.5} simul {23.2 34.3 56.5} 123.43 \ {-1.3 4.5 1.6} 23.4 _ _ 0] SimulPVT return } proc SimulPVT {} { # generate a fake PVT data list and a call to proc UseRealTimeData # the previous data list is changed in some random, arbitrary way global SimulPVTData RealTimeLogOn if { $SimulPVTData != "" } { if { $RealTimeLogOn } { UseRealTimeData $SimulPVTData } foreach "date pos fix errv alt velv trk" $SimulPVTData { break } foreach "lat long" $pos {} set min [lindex $date 4] if { [set secs [expr [lindex $date end]+1]] > 59 } { incr min ; set secs 0 } set date [lreplace $date 4 5 $min $secs] set dlat [expr 0.001*rand()-0.0005] set dlong [expr 0.002*rand()-0.001] set lat2 [expr $lat+$dlat] if { [expr abs($dlat)] < 1e-20 } { if { [expr abs($dlong)] < 1e-20 } { set trk 0 } elseif { $dlong < 0 } { set trk 270 } else { set trk 90 } } elseif { [expr abs($dlong)] < 1e-20 } { if { $dlat < 0 } { set trk 180 } else { set trk 0 } } else { set trk [expr round(atan(sin($dlong)/ \ (tan($lat2)*cos($lat)-sin($lat)*cos($dlong))) \ *57.29577951308232087684)] if { $trk < 0 } { if { $dlong < 0 } { incr trk 360 } else { incr trk 180 } } elseif { $dlong < 0 } { incr trk 180 } } set vel_z [expr 3*rand()-1.5] # assuming 1 sec interval and 100km/degree in lat or long set vel_x [expr $dlat*1e5] ; set vel_y [expr $dlong*1e5] set SimulPVTData [list $date \ [list $lat2 [expr $long+$dlong]] simul $errv \ [expr $alt+$vel_z] [list $vel_x $vel_y $vel_z] $trk _ _ _] after 1000 SimulPVT } return } proc SimulPVTOff {} { global SimulPVTData set SimulPVTData "" return } ## de/coding of hidden attribute values proc HiddenGet {pid data} { # form list of hidden attributes from $data got from receiver using # protocol $pid # set global HiddenClass either to "user" or to string given by # proc HiddenFormatVal for class attribute (may be "user") # dependencies on what this proc does in proc ConvWPData ! global HIDDENFOR HiddenClass set HiddenClass "user" if { [catch {set HIDDENFOR($pid,ns)}] } { return "" } set fs $HIDDENFOR($pid,ns) ; set ps $HIDDENFOR($pid,ps) if { ! [catch {set $HIDDENFOR($pid,pp)}] } { # preprocess values in $data foreach pp $HIDDENFOR($pid,pp) { set pos [lindex $ps [lsearch -exact $fs [lindex $pp 0]]] set pexpr [lindex $pp 1] set v [lindex $data $pos] set data [lreplace $data $pos $pos [expr $v [set pexpr]]] } } foreach f $fs p $ps { set $f [lindex $data $p] if { $f == "class" } { set HiddenClass [HiddenFormatVal class $pid $class] } } set undef "" foreach c $HIDDENFOR($pid,cs) { eval $c } set h "" foreach f $fs t $HIDDENFOR($pid,ts) { if { [lsearch -exact $undef $f] == -1 } { lappend h G${pid}:${f}=[HiddenCode $t [set $f]] } } return $h } proc HiddenFindVal {pid name hidden} { # find value of a hidden attribute under $name # use default value if needs be global HIDDENFOR MESS set fs $HIDDENFOR($pid,ns) set posHF [lsearch -exact $fs $name] set pos [lindex $HIDDENFOR($pid,ps) $posHF] set type [lindex $HIDDENFOR($pid,ts) $posHF] set v [lindex $HIDDENFOR($pid,vs) $posHF] foreach hh $hidden { if { [string first G${pid}: $hh] == 0 } { set i [string first : $hh] set h [string range $hh [expr $i+1] end] if { [set i [string first = $h]] > 0 } { if { [string range $h 0 [expr $i-1]] == $name } { set hd [HiddenDecode $type \ [string range $h [expr $i+1] end]] if { [lindex $hd 0] } { return [lindex $hd 1] } GMMessage "$MESS(badhidden): $hh" ; break } } else { GMMessage "$MESS(badhidden): $hh" ; break } } else { Log "hidden not for $pid discarded when finding: $hh" } } return $v } proc HiddenVals {pid hidden} { # build list of values for all hidden attributes of $pid from $hidden # use default values if needs be # list is built according to the positions in $HIDDENFOR($pid,ps) # with empty elements if they are not consecutive global HIDDENFOR MESS set fs $HIDDENFOR($pid,ns) foreach f $fs v $HIDDENFOR($pid,vs) t $HIDDENFOR($pid,ts) { set $f $v ; set type($f) $t } foreach hh $hidden { if { [string first G${pid}: $hh] == 0 } { set i [string first : $hh] set h [string range $hh [expr $i+1] end] if { [set i [string first = $h]] > 0 } { set f [string range $h 0 [expr $i-1]] set hd [HiddenDecode $type($f) \ [string range $h [expr $i+1] end]] if { [lindex $hd 0] } { set $f [lindex $hd 1] } else { GMMessage "$MESS(badhidden): $hh" } } else { GMMessage "$MESS(badhidden): $hh" } } else { Log "hidden not for $pid discarded when building: $hh" } } set vs "" ; set k 0 foreach f $fs p $HIDDENFOR($pid,ps) { while { $k != $p } { lappend vs "" ; incr k } lappend vs [set $f] ; incr k } return $vs } proc HiddenData {wh hidden} { # build list of pairs with name of field and its value (in # a suitable form for displaying) for the given hidden information # $hidden cannot be empty # $wh is type of item # assume a single protocol was used to get the information global HIDDENFOR MESS if { $hidden == "" } { return "" } set hh [lindex $hidden 0] if { ! [regexp {^G([A-Za-z0-9]+):} $hh x pid] } { GMMessage "$MESS(badhidden): $hh" return "" } set fs $HIDDENFOR($pid,ns) foreach f $fs v $HIDDENFOR($pid,vs) t $HIDDENFOR($pid,ts) { set type($f) $t } set fvs "" foreach hh $hidden { if { [string first G${pid}: $hh] == 0 } { set i [string first : $hh] set h [string range $hh [expr $i+1] end] if { [set i [string first = $h]] > 0 } { set f [string range $h 0 [expr $i-1]] set hd [HiddenDecode $type($f) \ [string range $h [expr $i+1] end]] if { [lindex $hd 0] } { lappend fvs [HiddenFormatVal $f $pid [lindex $hd 1]] } else { GMMessage "$MESS(badhidden): $hh" } } else { GMMessage "$MESS(badhidden): $hh" } } else { Log "hidden not for $pid when displaying: $hh" } } return $fvs } proc HiddenFormatVal {field pid val} { # format hidden value for given $field and $pid # return pair with field title and formatted value global HIDDENFOR TXT foreach t $HIDDENFOR($pid,fm) { if { [lindex $t 0] == $field } { set xs [lindex $t 2] ; set x "" switch [lindex $t 1] { enum { # enumeration from 0 set x [lindex $xs $val] } enumd { # enumeration from 0, but last element is the default if { $val < 0 || $val >= [llength $xs]-1 } { set x [lindex $xs end] } else { set x [lindex $xs $val] } } envals { # enumeration with values ($xs is list of pairs) foreach p $xs { if { [lindex $p 0] == $val } { set x [lindex $p 1] ; break } } } } if { $x != "" } { set val $TXT(Ghidden_$x) } break } } return [list $TXT(Ghidden_$field) $val] } proc HiddenRecover {wh avs hidden} { # convert old hidden attribute-value pairs to open attribute-value # pairs when reading files in old format # $wh in $TYPES # $avs open attribute=value pairs # $hidden hidden data # return pair with all open atribute-value pairs and remaining hidden # information # see also proc LoadAttrPairs (files.tcl) global OLDHIDDENFOR FATTRPAIRS MESS DataIndex switch $wh { TR { # D310 colour used to be hidden (up to 6.0.1) # this should be generalized if there are other similar cases if { [set ix [lsearch -glob $hidden GD310:colour=*]] != -1 } { set h [lindex $hidden $ix] set hidden [lreplace $hidden $ix $ix] foreach "type fattr conv" $OLDHIDDENFOR(D310:colour) { break } set f 1 foreach fd $FATTRPAIRS(TR) { if { [lindex $fd 0] == $fattr } { set f 0 ; break } } if { $f } { BUG Bad file attr name in OLDHIDDENFOR } set dvar [lindex $fd 2] global $dvar set default [set $dvar] regsub {GD310:colour=} $h "" hc set colour [HiddenDecode $type $hc] if { [lindex $colour 0] == 0 } { GMMessage "$MESS(badhidden): $h" set colour $default } else { set colour [lindex $colour 1] eval $conv } if { [[lindex $fd 3] $colour] } { GMMessage [format $MESS(badattrval) $wh $h] } else { lappend avs [list $DataIndex([lindex $fd 1]) $colour] } } } } return [list $avs $hidden] } proc HiddenCode {type val} { # return codification of $val (with $type) as an ASCII string with all # characters in the range [!-~] (codes 33 to 126) # codification is as follows: # - 4 shift levels: normal (initial), control, upper, upper control # - shift sequences: # "|c" control, "|C" upper control, "|_" normal, "~" upper # - "|" and "~" escaped: "||" and "|~" # - code in 33..126 (except "|", "~"): normal, as self # - code in 0-32: control as code+33 ("!" up to "A") # - code 127: normal, as "|Z" # - code in 161-255: upper, as code-128 # - code in 128-160: upper control, as code-128+33 ("!" up to "A") # - repeated codes can be coded as: # "|R" preceded by shift sequence if any and followed by count as # character with code in (32+1..94), and code proper set chars [PackData $type [list $val]] set r "" set shift 0 while { $chars != "" } { for { set c [lindex $chars 0] ; set n 1 } \ { $chars != "" && $c == [lindex $chars $n] } \ { incr n } { continue } binary scan $c "c" x set x [expr ($x+256)%256] set sh "" switch [HiddenCharCat $x] { copy { if { $shift } { set sh "|_" ; set shift 0 } set code $c } escape { if { $shift } { set sh "|_" ; set shift 0 } set code "|$c" } control { if { $shift != 1 } { set sh "|c" ; set shift 1 } set code "" append code [binary format "c" [expr $x+33]] } rubout { if { $shift } { set sh "|_" ; set shift 0 } set code "|Z" } upper { if { $shift != 2 } { set sh "~" ; set shift 2 } incr x -128 set c "" ; append c [binary format "c" $x] switch [HiddenCharCat $x] { copy { set code $c } escape { set code "|$c" } rubout { set code "|Z" } } } upper_control { if { $shift != 3 } { set sh "|C" ; set shift 3 } set code "" append code [binary format "c" [expr $x+33-128]] } } if { $n<95 && [string length $code]*($n-1) > 3 } { set k "" ; append k [binary format "c" [expr $n+32]] set code "|R${k}$code" } else { set fc $code for { set i 1 } { $i < $n } { incr i } { set code "${fc}$code" } } set r "${r}${sh}$code" set chars [lrange $chars $n end] } return $r } proc HiddenCharCat {b} { # find category of char with ASCII code $b if { $b>32 && $b<127 } { if { $b==124 || $b==126 } { return escape } return copy } if { $b < 33 } { return control } if { $b == 127 } { return rubout } if { $b < 161 } { return upper_control } return upper } proc HiddenDecode {type coded} { # decode $coded to get value of $type # return 0 on error, otherwise list with 1 and value set d "" set shift 0 ; set x 1 array set dshift { 1 -33 2 128 3 95 } set lc [split $coded ""] while { $lc != "" } { set info 1 switch -- [set c [lindex $lc 0]] { "|" { set lc [lreplace $lc 0 0] if { $lc == "" } { Log "HD> nothing after |" return 0 } set info 0 switch -- [set c [lindex $lc 0]] { "|" - "~" { set info 1 if { $shift == 2 } { binary scan $c "c" v set c "" append c [binary format "c" [expr $v+128]] } } "c" { set shift 1 } "C" { set shift 3 } "_" { set shift 0 } "Z" { set info 1 if { $shift == 2 } { set v 255 } else { set v 128 } set c "" append c [binary format "c" $v] } "R" { set lc [lreplace $lc 0 0] if { $lc == "" } { Log "HD> nothing after |R" return 0 } binary scan [lindex $lc 0] "c" x if { [set x [expr ($x+256)%256-32]] > 94 } { Log "HD> |R with count $x>94" } } default { Log "HD> | followed by $c" return 0 } } } "~" { set info 0 ; set shift 2 } default { if { $shift } { binary scan $c "c" v set c "" append c [binary format "c" [expr $v+$dshift($shift)]] } } } if { $info } { while { $x != 1 } { incr x -1 ; lappend d $c } lappend d $c } set lc [lreplace $lc 0 0] } if { $x != 1 } { Log "HD> repeat $x not followed by data" return 0 } elseif { ! $info } { Log "HD> no data after command" return 0 } # UnPackData returns a list that will have a single element here return [list 1 [lindex [UnPackData "$d" $type] 0]] } ## initializing protocol definitions proc InitGivenProtocols {data} { # initialize global description of product specific protocols as # obtained from the receiver # $data is list with list of lists each with a tag and a number for # a protocol each protocol is followed by those it requires if any # if there is no information on this receiver in the table of protocols, # there is no file $USERDIR/$MyProdId.prt and $NotLogging, create that # file and ask the user to send it to migfilg _AT_ t-online.de # return 0 on error global CurrPSPID PROTTAG PROTCAT PROTREQ PSPROTOCOLS MyProdId MyProdDescr \ MyProdVersion NotLogging USERDIR PRTCLDEF MESS VERSION PDTYPE set npf [file join $USERDIR $MyProdId.prt] if { $NotLogging && [catch {set PRTCLDEF($MyProdId)}] && \ ! [file exists $npf] && ! [catch {set pfile [open $npf w]}] } { set outpfile 1 puts $pfile "$MESS(written) GPSManager $VERSION [NowTZ]" puts $pfile "" puts $pfile "Please send this file to migfilg _AT_ t-online.de!" puts $pfile "It contains the list of protocols of your receiver" puts $pfile " which is not part of the table of protocols in GPSMan." puts $pfile "" puts $pfile "Keep this file to avoid GPSMan messages about this!" puts $pfile "" puts $pfile $MyProdDescr puts $pfile "Product id: $MyProdId, version: $MyProdVersion" set pfmess "Please read file $npf and send it to migfilg _AT_ t-online.de!" } else { set outpfile 0 } foreach p $PSPROTOCOLS { set CurrPSPID($p) N/A } set data [lindex $data 0] set odata $data set undef 0 ; set error 0 while { $data != "" } { set st [lindex $data 0] set t [lindex $st 0] ; set n [format %03d [lindex $st 1]] set p ${t}$n set data [lreplace $data 0 0] if { [catch {set tag $PROTTAG($t)}] } { if { $outpfile } { puts $pfile "Unknown tag: $t\n>>$st<<" } Log "IGP> unknown tag: $t\n>>$st<<" incr error continue } switch $tag { nospec - Physical { set undef 0 if { $outpfile } { puts $pfile "$tag: $p" } Log "IGP> $tag: $p" } Link { set undef 0 set CurrPSPID(Link) L$n if { $outpfile } { puts $pfile "Link: $p" } Log "IGP> Link: $p" } Transmission { if { $n == 1 } { set undef 0 set CurrPSPID(Baud) T$n if { $outpfile } { puts $pfile "Baud: $p" } Log "IGP> Baud: $p" } else { set undef 1 if { $outpfile } { puts $pfile "Unknown protocol: $p\n>>$st<<" } Log "IGP> unknown protocol: $p\n>>$st<<" } } Application { if { [catch {set ct $PROTCAT($p)}] } { set undef 1 if { $outpfile } { puts $pfile "Unknown protocol: $p\n>>$st<<" } Log "IGP> unknown protocol: $p\n>>$st<<" } else { set undef 0 if { $ct == "nospec" } { set info " (no spec)" } else { if { $ct == "FleetManagement" && \ $CurrPSPID($ct) != "N/A" } { append CurrPSPID($ct) "+" $p } else { set CurrPSPID($ct) $p } set info "" } if { $outpfile } { puts $pfile "Application: $p$info" } Log "IGP> Application: $p$info" set notav 0 foreach dp $PROTREQ($p) { set st [lindex $data 0] set t [lindex $st 0] set n [format %03d [lindex $st 1]] if { [catch {set tag $PROTTAG($t)}] } { if { $outpfile } { puts $pfile "Unknown tag: $t\n>>$st<<" } Log "IGP> unknown tag: $t\n>>$st<<" incr error set data [lreplace $data 0 0] continue } if { [string first "?" $dp] == 0 } { if { $tag != "Data" } { # non-mandatory protocol missing break } set dp [string replace $dp 0 0] } set data [lreplace $data 0 0] if { $tag != "Data" } { if { $outpfile } { puts $pfile \ "Error: missing data protocol for $p: $odata" } Log "IGP> missing data protocol for $p: $odata" incr error continue } set dprot "$t$n" if { [catch {set dtdp $PDTYPE($dprot)}] } { if { $outpfile } { puts $pfile \ "Error: unknown data protocol $dprot: $odata" } Log "IGP> unknown data protocol $dprot: $odata" incr notav } elseif { $dtdp == "nospec" } { if { $outpfile } { puts $pfile \ "Data: $dprot (nospec)" } Log "IGP> Data: $dprot (nospec)" incr notav } else { if { $dp == "FMData" && \ ! [catch {set CurrPSPID($dp)}] } { append CurrPSPID($dp) "+" $dprot } else { set CurrPSPID($dp) $dprot } if { $outpfile } { puts $pfile "Data: $dprot" } Log "IGP> Data: $dprot" } } if { $notav } { set CurrPSPID($ct) N/A if { $outpfile } { puts $pfile "... $p N/A" } Log "IGP> ... $p N/A" } } } Data { if { $undef } { set mess "discarding data protocol $st: $odata" } else { set mess "spurious data protocol $st: $odata" } if { $outpfile } { puts $pfile "Error: $mess" } Log "IGP> $mess" } } } if { $error } { if { $outpfile } { puts $pfile "Aborting due to previous error(s)" close $pfile GMMessage $pfmess } Log "IGP> aborting due to previous error(s)" return 0 } if { $CurrPSPID(Link) == "N/A" || $CurrPSPID(DevCmd) == "N/A" } { if { $outpfile } { puts $pfile "Error: no Link or DevCmd protocol(s): $odata" close $pfile GMMessage $pfmess } Log "IGP> no Link or DevCmd protocol(s): $odata" return 0 } if { $outpfile } { puts $pfile "Done" close $pfile GMMessage $pfmess } Log "IGP> done" RecAdjustToProtocols return 1 } proc InitProtocols {prodid} { # initialize global description of product specific protocols in use # from the default table # $prodid is the product identifier global PRTCLDEF PSPROTOCOLS PSPID PSDIFF CurrPSPID PROTREQ PDTYPE switch -glob $PRTCLDEF($prodid) { array { foreach p $PSPROTOCOLS { if { ! [catch {set pid $PSPID($prodid,$p)}] } { set CurrPSPID($p) $pid foreach dp $PROTREQ($pid) { set dprot $PSPID($prodid,$dp) if { [catch {set dtdp $PDTYPE($dprot)}] || \ $dtdp == "nospec" } { Log "IP> unknown/nospec protocol $dprot for $p" set CurrPSPID($p) N/A break } set CurrPSPID($dp) $dprot } } else { set CurrPSPID($p) N/A } } } see=* { regsub see= $PRTCLDEF($prodid) "" prod InitProtocols $prod } diff { InitProtocols [lindex $PSDIFF($prodid) 0] foreach d [lreplace $PSDIFF($prodid) 0 0] { set CurrPSPID([lindex $d 0]) [lindex $d 1] } } } RecAdjustToProtocols return } proc RecAdjustToProtocols {} { # set up protocol descriptions and adjust receiver parameters according to # its protocols global PSPDEF PID RPID PSCMDDEF CMD CurrPSPID RECTYPES RECINFO PRTNUMID \ PRTHNID PTRNUMID PTRHNID GPSProtocol RecCanChgBaud # set up protocol descriptions foreach d $PSPDEF($CurrPSPID(Link)) { set p [lindex $d 0] ; set v [lindex $d 1] set PID($p) $v ; set RPID($v) $p } foreach d $PSCMDDEF($CurrPSPID(DevCmd)) { set CMD([lindex $d 0]) [lindex $d 1] } # can the receiver change its baud rate? if { $GPSProtocol == "garmin" && ! [catch {set p $CurrPSPID(Baud)}] && \ $p != "N/A" } { set RecCanChgBaud 1 } else { set RecCanChgBaud 0 } # is there a protocol for AL data? if { [catch {set p $CurrPSPID(ALData)}] || $p == "N/A" } { set RECINFO [Delete $RECINFO AL] } # $RECTYPES does not contain LAP if $SUPORTLAPS is not set foreach t $RECTYPES { # there are models without RTs, TRs or LAPs # $CurrPSPID(LAP) may not be defined if { $t != "GR" && \ ( [catch {set p $CurrPSPID($t)}] || $p == "N/A" ) } { set RECTYPES [Delete $RECTYPES $t] } else { switch $t { RT { if { ! [catch {set p $CurrPSPID(RTHeader)}] && \ [lsearch -exact $PRTNUMID $p] != -1 } { # RT needs numeric id set PRTHNID 1 } else { set PRTHNID 0 } } TR { if { ! [catch {set p $CurrPSPID(TRHeader)}] && \ [lsearch -exact $PTRNUMID $p] != -1 } { # TR needs numeric id set PTRHNID 1 } else { set PTRHNID 0 } } } } } return } proc NoProtCapability {} { # receiver does not support the Protocol Capability Protocol # so the default definitions should be used global MyProdId PRTCLDEF Log "NPC> no Protocol Capability protocol" if { [catch {set PRTCLDEF($MyProdId)}] } { AbortComm recnotsuppd return } InitProtocols $MyProdId EndConnCheck defprots return } ##### Simple Text Output protocol proc ProcSimpleTextLine {line lxor} { # process a line of Garmin's Simple Text Output Format # and call the higher level procs # $lxor is the XOR of all chars in $line (not used here) if { [set data [DecodeSimpleText $line]] == 0 } { Log "PSTL> bad line: $line" return } Log "PSTL> got line: $line" UseRealTimeData $data return } proc DecodeSimpleText {line} { # decode a line (as string) of Garmin's Simple Text Output Format # return 0 on error, otherwise list with # UTC time - as a list with y m d h mn s # position - as a list with latd, longd (for datum WGS 84) # pos fix - as defined in array SimpleTextPStatus # pos error - as a list with # "_" for undefined estimated position error EPE in meters # estimated horizontal error EPH in meters # "_" for undefined estimated vertical error in meters # altitude - signed number in meters # velocity vector - as list with vlat vlong valt, in m/s # bearing (track over ground, course made good, track made good) - degrees # any value may be "_" for non-available data # assume EPH and altitude to be given as integers global SimpleTextBegs SimpleTextEnds SimpleTextPStatus if { [string index $line 0] != "@" } { return 0 } foreach f "y m d h mn s hlat dlat mlat hlong dlong mlong pst eph as alt \ hvlong vlong hvlat vlat hvalt valt" \ type "int int int int int int NS int int/1000 EW int int/1000 \ dDgGS int +- int EW int/10 NS int/10 UD int/100" \ ix $SimpleTextBegs ixn $SimpleTextEnds { set v [string range $line $ix $ixn] if { [string first "_" $v] != -1 } { set v "_" } else { switch -glob $type { int/* { if { ! [regexp {[0-9]+} $v] } { return 0 } regsub {int/} $type "" div scan $v %0d v set v [expr 1.0*$v/$div] } int { if { ! [regexp {[0-9]+} $v] } { return 0 } scan $v %0d v } default { if { [string first $v $type] == -1 } { return 0 } } } set $f $v } } if { $y != "_" } { if { $y < 89 } { incr y 2000 } else { incr y 1900 } } if { [set pst $SimpleTextPStatus($pst)] == "_" } { set latd "_" ; set longd "_" } else { foreach dim "lat long" neg "S W" { if { [set v [set h$dim]] == "_" || [set xd [set d$dim]] == "" || \ [set xm [set m$dim]] == "_" } { set ${dim}d "_" } else { if { $v == $neg } { set sign -1 } else { set sign 1 } set ${dim}d [expr $sign*($xd+$xm/60.0)] } } } if { $alt != "_" } { if { $as == "_" } { set alt "_" } elseif { $as == "-" } { set alt [expr -$alt] } } foreach dim "lat long alt" neg "S W D" { if { [set v [set v$dim]] != "_" } { if { [set hv [set hv$dim]] == "_" } { set v$dim "_" } elseif { $hv == $neg } { set v$dim [expr -$v] } else { set v$dim $v } } } return [list [list $y $m $d $h $mn $s] \ [list $latd $longd] $pst [list _ $eph _] $alt \ [list $vlat $vlong $valt] _] } ##### GPSMan interface proc StartGPS {} { global NoGarmin ResetAutoNumberRT set NoGarmin 1 return } proc ResetAutoNumberRT {} { # reset counter for renumbering RTs sent to receiver # based on DJG contribution global RTNextNumber RTSendNumber set RTNextNumber 1 catch {unset RTSendNumber} return } proc GPSChangeProtocol {prot} { # change current protocol # $prot in {garmin, garmin_usb, nmea, stext, simul} # must change GPSProtocolExt if successful global GPSProtocol GPSProtocolExt GPSState NoGarmin RealTimeLogOn TXT \ GPSProtocolButton if { $GPSProtocol == $prot } { return } if { ! $NoGarmin } { # change cannot be to garmin Log "GCP> changing to protocol $prot" set NoGarmin 1 } if { $GPSState == "online" } { CloseConnection } if { $RealTimeLogOn } { GPSRealTimeLogOnOff } set GPSProtocol $prot ; set GPSProtocolExt $TXT($prot) set GPSProtocolButton $prot return } proc AbortComm {args} { # abort communication in progress # $args either void or a message id to be shown # global $Request==get$wh where $wh in {WP RT TR LAP PosnData # DtTmData} (cf. SendData) # GPSOpResult is set to 1 (error) # ==check=$cargs where 2nd arg should be executed as # connection is apparently down; # GPSOpResult is set to 1 (error) # ==chgbaud=$baud global Request Jobs MESS GPSOpResult PrdDATA PDTYPE CloseInProgrWindow foreach j $Jobs { catch { after cancel $j } } ResetSerial if { $args != "" } { GMMessage $MESS($args) } set Jobs "" switch -glob -- $Request { get* { set Request abort SendData abort # after which SentPacket will call AbortComm again set GPSOpResult 1 } check=* { if { $PrdDATA == "" } { # assume connection is down regsub check= $Request "" as eval [lindex $as 1] set GPSOpResult 1 } else { # A001 protocol failed: deal with Product Data from A000 EndInProt A000 [UnPackData $PrdDATA $PDTYPE(PrdData)] # this will call either AbortComm or EndConnCheck set PrdDATA "" NoProtCapability } } chgbaud*=* { set Request idle set GPSOpResult 1 } abort { set Request idle } } return } proc GPSChangeBaud {baud} { # called by user to try to change receiver baud rate # $baud in $RECBAUDS, set in recdefs.tcl # only called when connected and $RecCanChgBaud is true # see proc RecAdjustToProtocols # if port cannot be reopened restores interface global GetPVT MESS if { $GetPVT } { GMMessage $MESS(nmeainuse) return } ChangeGarminBaud $baud return } proc ChangeGarminBaud {baud} { # starts change of receiver baud rate # $baud in $RECBAUDS, set in recdefs.tcl # only called when connected and $RecCanChgBaud is true # see proc RecAdjustToProtocols # based on the Garmin 15H & 15L Specs, assuming this is the T001 protocol global MESS Request Jobs if { [FailsInProgrWindow [format $MESS(chgbaudto) $baud]] } { GMMessage $MESS(busytrylater) return } Log "FBC> Trying new baud rate $baud" # global Request will change according to what step is going on set Request chgbaud=$baud set Jobs [list [after 10000 "AbortComm baudchgfailed"] \ [after 0 "SendData chgbaud"]] return } proc EndChangeGarminBaud {} { # change of receiver baud rate was successful global GPSOpResult ResetSerial Log "ECGB> baud rate successfully changed" CloseInProgrWindow set GPSOpResult 0 return } ### real time log control proc GarminStartPVT {} { # start real time logging with PVT protocol # return 0 on failure global NoGarmin MESS CurrPSPID GetPVT if { $NoGarmin } { GMMessage $MESS(mustconn1st) return 0 } if { [catch {set CurrPSPID(PVTData)}] || $CurrPSPID(PVTData) == "N/A" } { GMMessage $MESS(rltmnotsupp) return 0 } if { ! $GetPVT } { SendData start PVT set GetPVT 1 } return 1 } proc GarminStopPVT {} { global GetPVT if { $GetPVT } { SendData stop PVT set GetPVT 0 } return } proc StartLineProtocol {procline baud} { # open connection for line-by-line protocol # $procline is name of proc to call to process a line # $baud rate # return 0 on failure global ProcProcChar ProcProcLine SInBuffer LineXOR Jobs GPSState set ProcProcChar ProcLineChar set ProcProcLine $procline ResetSerial set SInBuffer "" ; set LineXOR 0 set Jobs "" if { [OpenSerialFailed $baud] } { return 0 } set GPSState online return 1 } proc StopLineProtocol {} { global SRLFILE Eof GPSState # make sure the read char proc called by fileevent stops set Eof 1 if { $GPSState == "online" } { catch {close $SRLFILE} } DisableGPS return } proc StartSimpleText {} { # start real time logging with Simple Text output protocol # return 0 on failure global STextPVT if { ! $STextPVT } { set STextPVT [StartLineProtocol ProcSimpleTextLine 9600] return $STextPVT } return 1 } proc StopSimpleText {} { global STextPVT StopLineProtocol set STextPVT 0 return } gpsman-6.4.4.2/gmsrc/langnl.tcl0000644000175000017500000014267212224351120014362 0ustar migmig# # This file is part of: # # gpsman --- GPS Manager: a manager for GPS receiver data # # Copyright (c) 1998-2013 Miguel Filgueiras migfilg@t-online.de # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. # # File: langnl.tcl # Last change: 6 October 2013 # Dutch language file by Rob Buitenhuis (geo_AT_btnhs.nl) # last input from him inserted: 10 October 2011 # # # file langengl.tcl is consulted first; no need for duplicating entries here # only 3 chars long names; check also ALLMONTH in file i18n-utf8.tcl set MONTHNAMES "jan feb mrt apr mei jun jul aug sep okt nov dec" set DLUNIT(KM,dist) km set DLUNIT(KM,subdist) m set DLUNIT(KM,speed) km/u set DLUNIT(KM,area) km2 set DLUNIT(NAUTMILE,dist) sm set DLUNIT(NAUTMILE,subdist) ft set DLUNIT(NAUTMILE,speed) knt set DLUNIT(NAUTMILE,area) sm2 set DLUNIT(STATMILE,dist) "us ml" set DLUNIT(STATMILE,subdist) ft set DLUNIT(STATMILE,speed) mph set DLUNIT(STATMILE,area) usml2 set DLUNIT(M,dist) $DLUNIT(KM,subdist) set DLUNIT(FT,dist) $DLUNIT(STATMILE,subdist) set DTUNIT $DLUNIT($DISTUNIT,dist) set SPUNIT $DLUNIT($DISTUNIT,speed) set ALUNIT $DLUNIT($ALTUNIT,dist) set MESS(RTcomp) "#\tWP\t\t$DTUNIT\tgrd\t$ALUNIT" set MESS(TRcomp) "#\t\t\t\t$ALUNIT\t$DTUNIT\t$DTUNIT\th:m:s\t$SPUNIT\tgrd" set MESS(WPNearest) "WP\t\t$DTUNIT\tgrd" ## comments to Mess # namevoid # "Naam mag niet worden weggelaten" # activeRT # "Route 0 is al aktief; doorgaan?" # noACKNAK # "Ontving packet terwijl ACK/NAK verwacht werd; controleer GPS aansluiting" # badplatform # "Geen I/O via de seriele poort op dit platform" # notUTMproj # "Opgeslagen info betreft UTM; doorgaan met projectie gezet naar" array set MESS { badscale "Waarde niet geldig bij deze kaartschaal" oktoexit "Ok om te stoppen (niet opgeslagen gegevens gaan verloren)" okclrmap "Ok om de kaart te wissen" namelgth "De naam mag de %d tekens niet overschrijden" cmmtlgth "Het commentaar mag de %d tekens niet overschrijden" namevoid "Het naamveld mag niet leeg zijn" baddate "Niet geldige datum; regel" badhdg "Niet geldige richting %s: moet of %s of +/- zijn" badcoord "Niet geldige coordinaten of foutieve weergave: \"%s\" moet %s zijn" outofrng "Getal buiten grenzen van toegestaan bereik" UTMZN "Moet een letter uit A..H, J..N, of P..Z zijn" badstrg "Fout(e) karakter(s)" strgvoid "String mag niet leeg zijn" nan "\"%s\" is geen getal" written "Geschreven door" undefWP "Route %s heeft ongedefinieerde WP's; niet opgeslagen/ge-exporteerd" bigRT "Route %s > max. aantal; niet ge-exporteerd" unkndatum "Onbekende datum" badcommdWP "Niet geldig commando bij het laden van WP's; regel" notabsWP "Niet geldige WP definitie; geen tabs, regel" undefinedWP "Verwijzing naar onbekend WP: %s" nofieldsWP "Niet geldig WP, niet genoeg velden; regel" excfieldsWP "Niet geldig WP, teveel velden; regel" badWPsRT "RT met niet geldige waypoint-lijst; regel" toomuchWPs "Waarschuwing: meer dan %d WP's in de RT" badcommdTP "Niet geldig commando bij het laden van de TP's; regel" badTP "Niet geldige punt in TR; regel" badTPsTR "TR met niet geldige punten-lijst; regel" noheader "Bestand begint niet met header" loaderr "Fout bij het laden van het bestand; regel" unkncommd "Onbekend commando bij het laden van bestand; regel" noformat "Bestand begint niet met format-regel" badformat "Niet geldige format-regel" badRT "Niet geldige RT definitie; regel" badRTargs "Niet geldige RT argumenten; regel" badTR "Niet geldige TR definitie; regel" fileact "%s %s bestand?" filexists "Bestand bestaat!" GPSok "Verbinding ok" toomany "Teveel %s's (> %d)" cantfgt "Kan %s niet verwijderen: hoort bij item op de kaart" cantfgted "Kan %s niet verwijderen: is in bewerking" cantmapRTunkn "Route niet weergegeven; geen info bij WP" cantmapRTed "Route niet weergegeven; WP is in bewerking" cantrun "Niet uitvoerbaar" inprogr "Bewerking wordt al uitgevoerd" cantread "Kan hulpbestand niet lezen" cantwrtopt "Kan bestand met instellingen niet wegschrijven" voidRT "Route bevat geen waypoints" activeRT "Route 0 is aktief; doorgaan?" voidTR "Track bevat geen punten" idinuse "Variabele-naam bestaat al" cantunmap "Kan %s niet wissen: hoort bij weergegeven item" askrevert "Oorspronkelijke gegevens herstellen?" askforget "%s verwijderen?" notimpl "Net ge-implementeerd" forgetall "Alle punten in lijst %s verwijderen?" counted "Er zijn %d %s's gedefinieerd" notlisted "Punt niet in lijst" wrgval "Foutieve waarde voor" voidGR "Groep heeft geen elementen" initselfGR "Groep bevat zichzelf door" GRelout "Commando bij element buiten de GR definitie; regel" badGRels "Groep met niet geldige elementen-lijst; regel" badcommdGRel "Ongeldig commando bij het laden van de GR elementen; regel" notypeforGRel "Element zonder type; regel" badGRel "Niet geldige element-definitie; regel" check "Testen van de verbindung" toomanyerr "Teveel fouten, wordt afgebroken..." getWP "Opvragen van de waypoints" getRT "Opvragen van de routes" getTR "Opvragen van de tracks" putWP "Versturen van de waypoints" putRT "Versturen van de routes" putTR "Versturen van de tracks" fillbuffWP "Laden van de WP buffer" fillbuffRT "Laden van de RT buffer" noACKNAK "Packet ontvangen, verwachte ACK/NAK; GPS verbindung controleren!" badplatform "Geen I/O via seriele poort op dit platform" badserial "Kan device %s niet openen" nodata "Geen %s's in ontvanger" badimage "Niet geldig beeld-bestand" mapadjust "Plaats a.u.b. WP's op de kaart; Ok om te stoppen" duplicate "%s al gekozen" clrcurrmap "Huidige kaart wissen?" mbkbaddatum "Geen of onbekende datum" mbkbadscale "Schaal mag niet negatief zijn" mbkbadat "Niet geldige argumenten" edityourrisk "Op eigen risico bewerken!" okclrbkmap "Ok om de kaart-achtergrond te wissen" okclrbkim "Ok om het beeld te wissen bij" badSYMBOLcode "Niet geldige symbool-code" badDISPOPTcode "Niet geldige optie-code" goingdown "Instellingen worden opgeslagen; a.u.b. herstarten" putwhat "Welke item-types opslaan?" readwhat "Welke item-types lezen?" noWPinx "Teveel WP's voor deze ontvanger" noICinx "Teveel IC's voor deze ontvanger" getIC "Laden van de icons" serial1 "Onjuiste header preamble" serial2 "Onjuist commando verkregen" checksum1 "Onjuiste header checksum" checksum2 "checksum-fout in de gegevens" receiver "Niet verbonden met device!" importonly1 "Kan slechts 1 type gegevens importeren" exportonly1 "Kan slechts 1 type gegevens exporteren" outdatedprefs "Instellingen-bestand verouderd, controleer het nu a.u.b." mustchoose1type "Tenminste 1 soort item kiezen" nosuchitems "Er is geen item dat voldoet aan de beschrijving" resultsin "Zoek-resultaten in de groep" badWP "WP niet aangegeven of niet gedefinieerd" badangle "Hoek moet tussen 0 en 360 graden liggen" georefhow "Methode van Geo-referencing" cantsolve "Kan vergelijkingen niet oplossen" transfcantscale "Inschalen bij deze transformatie niet mogelijk" oldfilefmt "Oud bestandsformaat; a.u.b. opslaan onder het nieuwe formaat" unknProj "Onbekende kaartprojectie" unknTransf "Onbekende kaarttransformatie" badProjargs "Foutieve argumenten voor de projectie" badTransfargs "Foutieve argumenten voor de transformatie" badfield "Foutief attribuut/waarde paar" badattr "Niet geldige attribuut-naam" missattrs "Ontbrekend(e) attribu(u)t(en)" mbkbadproj "Niet geldige kaartprojectie" mbkbadtransf "Niet geldige kaarttransformatie" notUTMproj "Info voor UTM opgeslagen; doorgaan met de projectie gezet op" projchg "Bevestig a.u.b. de projectie-parameters" badprojprm "Niet geldige waarde voor %s" connectedto "Verbonden met %s" recnotsuppd "Ontvanger-model wordt niet ondersteund" gotprots "Protocol-definities geladen" badprots "Niet geldige protocol-definities" defprots "Maak gebruik van de protocol-tabel" badRS "Etappe van de route ligt buiten de definitie van de RT; regel" badWPsRSs "RT etappe voor het eerste of na het laatste WP; regel" windowdestr "Het window was gesloten!" replname "Vervang \"%s\" door een naam met ten hoogste %d van de volgende karakters" badalt "Niet geldige waarde voor de hoogte" baddistunit "Niet geldige eenheid voor de kaartschaal in het instellingenbestand" badgridzone "Niet geldige grid-zone" outofgrid "Positie buiten de definitie van het bereik van het grid" timeoffnotint "Tijdsverschuiving moet integer zijn of eindigen op .5" cantchkprot "Kan met dit protocol niet gecontroleerd worden" mustconn1st "Eerst de verbinding met de ontvanger controleren" rltmnotsupp "Ware tijd wordt niet ondersteund door het protocol in deze ontvanger" timeoffnotint "Tijdsverschil moet een geheel getal zijn" abbrevinuse "Afkorting bestaat al" nameinuse "Naam bestaat al" badgriddatum "De datum voor het grid %s is %s" badparam "Foutieve waarde voor %s" cantchggriddatum "Voor dit grid is datum %s nodig" cantwrtprgr "Kan het door de gebruiker gedefinieerde projektie-bestand niet schrijven" createdir "A.u.b. eerst de directory %s aanmaken en opnieuw starten" cantwrtdtel "Kan het door de gebruiker gedefinieerde datum-bestand niet schrijven" gridinuse "Het grid, door %s gebruikt, kan niet gewist worden, toch doorgaan?" gridinusenochg "Het grid wordt door %s gebruikt; geen wijzigingen doorgevoerd" gridneedsdatum "Foutieve definitie voor het grid %s; geen datum aangegeven" oktomkdir "Moet de directory %s aangemaakt worden?" projinuse "De projectie is in gebruik; de wijzigingen worden genegeerd" projnameabbr "Geef a.u.b. een naam en een afkorting in voor de nieuwe projectie" missingdata "Te weinig gegevens!" movingWP "Positioneren van %s met linker muisknop\nAfbreken met rechter muisknop" needs1wp "Een route moet tenminste 1 waypoint bevatten" emptypos "positie met leeg veld/lege velden" cantwrtsstate "Kan opgeslagen status-bestand niet schrijven: %s" cantrdsstate "Kan opgeslagen status-bestans niet lezen: %s" corruptsstate "Niet geldig opgeslagen status-bestand: %s" editrisk "Wijzigen op eigen risico!" savestate "Huidige status opslaan?" delsstate "Opgeslagen status-bestanden wissen?" badmapinfo "Niet geldig bestand met kaart-parameters" badMHloc "Foutief Maidenhead grid" areais "Oppervlakte van de (niet zichzelf doorsnijdende) veelhoek is %.3f%s" areatoosmall "Oppervlakte is te klein (<0.001 km2)" projarea "Berekenen van de geprojecteerde oppervlakte" selfintsct "Herhaalde WP's: RT kan zichzelf niet doorsnijden!" badinvmdist "Benaderingsfout bij de inversie van de meridionale afstand" badinvproj "Benaderingsfout bij de inversie van de %s projectie" negdlatlong "Breedte/lengte mogen niet negatief zijn!" allundef "In de groep zijn geen definities voor de WP's inbegrepen" badfloats "Floating-point conversie werkt niet goed, weet u zeker dat u verbinding wilt?" noprintcmd "Geen afdruk commando; plaats er een in de opties" cantexecasroot "GPSMan mag niet worden uitgevoerd als root" badargtofunc "Foutief argument bij %s functie" redefproj "Door gebruiker gedefinieerde %s projectie verwijdert een hiervoor gedefinieerde projectie met dezelfde afkorting; verander de definitie!" badattr "Onbekende optionele veldnaam in %s : %s" badattrval "Foutieve optionele veldwaarde in %s : %s" couldntcd "Niet gelukt om naar directory %s te gaan" shpext "Vereerde extensie %s; wilt u .shp, .shx, .dbf gebruiken?" shpcntopen "Kan geen Shapefile bestanden maken of openen" shpcntcrtfs "Kan geen Shapefile .dbf velden maken" shpcntwrtfs "Kan geen Shapefile .dbf velden beschrijven" shpoutmem "Memory is op!" shpemptyfile "Leeg bestand" shpwrongfile "Bestandstype ongeldig" shplessdim "Dimensies in bestand minder dan vereist; doorgaan?" shpbadWPinRT "%d-th WP met verkeerde coordinaten geweigerd in RT %s" badGTMvers "Versie van GTrackMaker-bestand niet acceptabel" badGTMfile "Verkeerd begin van GTrackMaker-bestand" badGTMcounts "Negatieve telling(en) in GTrackMaker-bestand" badGTMlat "Breedte buiten bereik in GTrackMaker-bestand" badGTMlong "Lengte buiten bereik in GTrackMaker-bestand" badGTMdatum "Verkeerde datum in GTrackMaker-bestand" unobscmap "Fout, waarschijnlijk veroorzaakt door een window/icon over de kaart; opnieuw na een pauze?" cantwrtimg "Fout tijdens schrijven van beeld naar bestand in %s formaat" TRsimplres "TR als resultaat van vereenvoudiging gemaakt met naam %s" cantsaveRTid "%d RT(s) niet opgeslagen: niet numerieke aanduiding" cantsaveTRid "%d TR(s) niet opgeslagen: niet numerieke aanduiding" badtrvconf "Corrupte configuratie; herstart met een lege" drvsimoff "Rij-simulator: nog niet gestart!" needWP "Rij-simulator: laad of definieer aub eerst wat WP's" chgrecprot "Verander aub het ontvanger-protocol" nohidden "Additionele geg. negeren?" badhidden "Add. waarde heeft foutieve opmaak" clrtrvlog "Log wissen?" nmeainuse "Bezig met real-time log of het lezen van een ander NMEA bestand" badfile "Fout gedurende het lezen van bestand" RTnoWPname "WP in RT met alleen een naam wordt niet langer ondersteund" distlarge "Afstand te groot!" timeconsmg "Bewerking kost tijd: doorgaan?" badtimeval "Fout in waarde tijd" badLAP "Fout in ronde; regel" lapncnsdrd "Rondes niet meenemen" undefinedTR "Onbekende TR" emptymenu "Menu leeg; doorgaan?" cantwrtsymenu "Kan menu met symbolen niet wegschrijven" cantwrtmbaks "Kan het achtergrondenbestand niet schrijven" abbrevhasspaces "Afgekorte naam mag geen spaties bevatten" getAL "Verkrijgen almanak" needNpoints "U moet tenminste %s punten opgeven!" twotimeoffsets "Verschillende tijdsverschuiving in file" notimeoffset "Geen tijdsverschuiving in file; veronderstel 0" baddateas "Slechte datum: %s" unknownenc "Onbekende karakter-encoding %s" chgbaudto "Probeer de baud rate te veranderen naar %s; wacht aub..." baudchgfailed "Kon baud rate niet veranderen" busytrylater "Bezig met andere bewerkingen; aub later herhalen" obssplit "Resultaat opsplitsen van %s met naam \"%s\"" loginto "Login %s" samelgth "De twee strings moeten hetzelfde aantal lettertekens bevatten" rschkargs "Oproepen van regsub foutief; check de argumenten" emptyrmeth "Methode van hernoemen mag niet leeg zijn" cantwrtdefs "Kan het bestand met gebruikersdefinities niet schrijven" xcantbey "%s mag niet %s zijn" mustselftfam "Er moet een font family worden geselecteerd" badpluginwhere "Fout plug-in \"waar\" argument; moet eel lijst tripletten zijn" badpluginparam "Foute plug-in parameters: lijst NAME EXPR, NAME begint met _" badpluginparamexec "Tijdens draaien plug-in %s, foutieve parameter: %s" pluginfailed "Plug-in %s faalde met boodschap: %s" cantwrtdir "Kan niet in %s schrijven; wijzig aub de rechten" cantcleandir "Kon directory %s niet leegmaken" defTERMCMD "De optie voor het commando dat een terminal opent moet eerst worden gedefinieerd" gpOutfile "Uitvoer is in bestand \"%s\" in je werk-directory." gpQuitgnuplot "Druk op Enter in xterm window om gnuplot te verlaten." gpModgnuplot "Wijzig het beeld in het Gnuplot-window\ door de muis te slepen (linker en middelste knop).\n\ Na sluiting van het gnuplot-window vind je\ de uitvoer in bestand \"%s\" in je werk-directory." htResult1 "Track=\"%s\"" htResult2 "Totale afstand=%s Totale stijging=%s Totale daling=%s" htResult3 "Gebruikte totale tijd=%s Tijd in rust=%s(%s) Tijd in beweging=%s" htResult4 "%s Cap.vlak=%s Cap.stijg=%s Cap.afd=%s Gesch. wandel tijd=%s" srResult1 "Rust periodes (>5min) van track \"%s\"" badcumuls "Verschil in hoogte %s > totale stijging %s en/of daling %s; drempelwaarde hoogte %s %s optie moet worden aangepast" } set TXT(RTcompflds) "# WP {$DTUNIT} graad {$ALUNIT} et. beschr." set TXT(TRcompflds) \ "TP {} {} {} {$ALUNIT} {$DTUNIT} {$DTUNIT} u:m:s {$SPUNIT} graad" set TXT(starttoend) "Start: tot eind %s $DTUNIT;" set TXT(startmax) "max. %s $DTUNIT;" set TXT(WPnearflds) "WP {$DTUNIT} graad" set TXT(within) "Binnen (${DTUNIT}s)" set TXT(between) "Tussen (${DTUNIT}s)" ## comments to TXT elements # optISOLATIN # "Compose chars" # optDPOSRTMAP # "RT/map dialog offset" # TRRTnpoints # "No. points to keep" # commrec # "Communication with receiver" # Marker (after SYzoo) # azimuth # "Azimuth" "Kompakurs" "Bearing" # opening # "Opening" # started # "starting on" # dontaskagain # "Stop asking" array set TXT { GMtit "GPS Manager - versie" exit Einde map Kaart load Laden loadfrm "Laden uit" save Opslaan saveels "Elementen opslaan" saveto "Opslaan in" clear "Wissen" clearall "Alles wissen" newWP "Nieuw WP" newRT "Nieuwe RT" newTR "Nieuwe TR" newGR "Nieuwe GR" import Importeren importfrm "Importeren uit" export Exporteren exportels "Elementen exporteren" exportto "Exporteren naar" count Tellen trueN "Geografisch Noorden" automagn "Autom. naaldafwijking" usrdef "Gebruikersdef." nameWP WPoint nameRT Route nameTR Track nameGR Groep namePlot Tekening nameMap Kaart nameRTComp "Berekening v.d. Route" nameTRComp "Berekening v.d. Track" GPSrec "GPS ontvanger" turnoff "Uitschakelen" get Opvragen put Versturen all Alles select Kiezen selection Keuze options Instellingen message Bericht cancel Afbreken file Bestand ovwrt Overschrijven app Toevoegen online online offline offline check Controleren create Maken revert Herstellen colour Kleur grey grijs mono monochroom portr portret landsc liggend legend Legenda incscale "Schaal toevoegen" more Meer waypoint Waypoint name Naam created "Gemaakt op" cmmt Commentaar withWP "Met dit WP:" displ "Weergeven op kaart" startRT "Begin RT" route Route number Nummer insb "Invoegen voor" insa "Invoegen na" del Schrappen repl "Vervangen door" invRT "RT omdraaien" comp Berekenen RTcomp "Route berekening" savecomp "Opslaan v.d. berekening" totdst "Totale afstand" tottime "Totale tijd" track Track chophd "Begin weglaten" choptl "Eind weglaten" incb "Invoegen voor" date Datum newdate "Nieuwe datum voor volgend punt" endprTR "Einde vorige track" begnxt "Begin volgende" date1st "Datum voor 1ste punt van volgende" TRcomp "Track-berekening" avgsp "Gemidd. snelheid" maxsp "Max snelheid" minsp "Min snelheid" lat Breedte long Lengte ze ZE zn ZN eastng Rechtswaarde nrthng Hoogwaarde zone Zone change Wijzigen forget Verwijderen others Anderen optLANG Taal optISOLATIN1 "Karakters samenstellen" optDELETE "DEL wist laatste karakter" optMWINDOWSCONF "Hoofd window" optGPSREC "GPS-Model" opt_GPSRecConf "Ontvanger-parameters" optNAMELENGTH "Max. lengte naam" optINTERVAL "Sampling interval" optCOMMENTLENGTH "Max. lengte commentaar" optMAXWPOINTS "Max. # WPoints" optMAXROUTES "Max. # Routes" optMAXWPINROUTE "Max. # WP's per Route" optMAXTPOINTS "Max. # Trackpoints" optCREATIONDATE "Rec. heeft aanmaakdatum" optNOLOWERCASE "Rec. is niet in onderkast" optDEFAULTSYMBOL "Standaard WP symbool" optDEFAULTDISPOPT "Standaard WP weergave-optie" opt_Data "Gegevens" optEQNAMEDATA "Gegevens met dezelfde naam" optKEEPHIDDEN "Additionele geg. vasthouden" optDatum Datum optTimeOffset "Tijdsverschil" optACCFORMULAE "Precieze Formules" optASKPROJPARAMS "Projektie-parameters bevestigen" optBalloonHelp "Hulp in Ballonnen" opt_Formats "Eenheden en weergaven" optDISTUNIT "Afstand" KM km NAUTMILE "Zeemijl" STATMILE "US mijl" optPositionFormat "Positie-weergave" optDateFormat "Datum-weergave" opt_Geom "Window instellingen" optMAPWIDTH "Kaart-breedte" optMAPHEIGHT "Kaart-hoogte" optMAPSCLENGTH "Lengte van de kaartschaal" optMAPSCALE "Schaal" optMAXMENUITEMS "Max. # menu items" optLPOSX "Lijsten-window x-pos" optLPOSY "Lijsten-window y-pos" optMPOSX "Kaart-window x-pos" optMPOSY "Kaart-window y-pos" optRPOSX "Ontvanger-window x-pos" optRPOSY "Ontvanger-window y-pos" optEPOSX "Foutmelding-window x-pos" optEPOSY "Foutmelding-window y-pos" optDPOSX "Dialoog-window x-pos" optDPOSY "Dialoog-window y-pos" optDPOSRTMAP "Afstand RT/Kaart dialoog" optLISTWIDTH "Breedte lijst" optLISTHEIGHT "Hoogte lijst" optCOLOUR Kleuren optCOLOUR,fg Voorgrond optCOLOUR,bg Achtergrond optCOLOUR,messbg "Achtergrond foutmelding" optCOLOUR,confbg "Achtergrond bevestiging" optCOLOUR,selbg "Achtergrond keuze" optCOLOUR,dialbg "Achtergrond invoer" optCOLOUR,offline "Ontvanger offline" optCOLOUR,online "Ontvanger online" optCOLOUR,check "Gekozen knop" optCOLOUR,ballbg "Achtergrondkleur ballon-hulp" optCOLOUR,ballfg "Voorgrondkleur ballon-hulp" optMAPCOLOUR "Kleuren op de kaart" optMAPCOLOUR,mapsel "Gekozen item op de kaart" optMAPCOLOUR,WP "Waypoints op de kaart" optMAPCOLOUR,RT "Routes op de kaart" optMAPCOLOUR,mkRT "Route gedefinieerd op de kaart" optMAPCOLOUR,TR "Tracks op de kaart" optMAPCOLOUR,TP "Track punten op de kaart" optMAPCOLOUR,mapleg "Kaart-legendaas" optMAPCOLOUR,anim "Kaart-animatie" optMAPCOLOUR,emptygrid "Blanco afbeelding" optMAPCOLOUR,fullgrid "Bestaand afbeelding" opt_Files "Device en files" optDEFSPORT "Device" optPERMS "Bestandsrechten" optPAPERSIZE "Papiergrootte" red Rood green Groen blue Blauw owner Eigenaar permgroup Groep others Anderen fread Lezen fwrite Schrijven fexec Uitvoeren mainwd "Hoofd-window" distazim "Afstand en richting" nearestWPs "WP's in nabijheid" fromto "Van %s naar %s" degrees graden nameWPDistBear "afstand en richting" nameWPNearest "WP's in nabijheid" inrect "Binnen rechthoek" forthisWP "voor dit WP" formappedWPs "voor weergeg. WP's" group Groep element Element insert Invoegen joinGR "Groep samenvoegen" TRtoRT "Conversie van TR naar RT" TRRTnpoints "Aantal punten" TRTRdispl "TR nu weergeven" WP WP RT RT TR TR GR GR commrec "Kommunikatie met de ontvanger" abort Afbreken ACKs ACKs NAKs NAKs packets packets unnamed "(onbekend)" fromTR "Van TR: %s" mapload "Afbeelding positioneren" loadmback Laden savemback "Geo-ref. info opslaan" chgmback Wijzigen clearmback "Wissen" backgrnd Achtergrond nameMapBkInfo "Achtergrond-info" nameMapInfo "Kaartinstellingen" mpbkchg "Achtergrond wijzigen" mpbkgrcs "Grid positie" nameImage Afbeelding symbol Symbool SYCATgeneral "Algemeen" SYCATland Land SYCATwater Scheepvaart SYCATaviation Luchtvaart SY1st_aid "Eerste hulp" SYWP_buoy_white "Boei, wit" SYWP_dot "Punt" SYairport "Vliegveld" SYamusement_park "Pretpark" SYanchor "Anker" SYavn_danger "Gevaar (luchtvaart)" SYavn_ndb "ND baken" SYball "Bal" SYbeach "Strand" SYbell "Bel" SYboat "Boot" SYboat_ramp "Boothelling" SYborder "Grenspost" SYbridge "Brug" SYbuilding "Gebouw" SYbuoy_amber "Boei, amber" SYbuoy_black "Boei, zwart" SYbuoy_blue "Boei, blauw" SYbuoy_green "Boei, groen" SYbuoy_green_red "Boei, groen-rood" SYbuoy_green_white "Boei, groen-wit" SYbuoy_orange "Boei, oranje" SYbuoy_red "Boei, rood" SYbuoy_red_green "Boei, rood-groen" SYbuoy_red_white "Boei, rood-wit" SYbuoy_violet "Boei, violet" SYbuoy_white "Boei, wit" SYbuoy_white_green "Boei, wit-groen" SYbuoy_white_red "Boei, wit-rood" SYcamping "Kampeerplaats" SYcapitol_city "Hoofdstad" SYcar "Auto" SYcar_rental "Auto-verhuur" SYcar_repair "Garage" SYcastle "Kasteel, slot" SYcemetery "Kerkhof" SYchapel "Kapel" SYchurch "Kerk" SYcircle_x "Omcirkelde X" SYcivil "Openbare instelling" SYcontrolled "Verboden toegang" SYcrossing "Spoorovergang" SYdam "Dam" SYdanger "Gevaar" SYdeer "Hert" SYdiamond_green "Ruit, groen" SYdiamond_red "Ruit, rood" SYdiver_down_1 "Duiker 1" SYdiver_down_2 "Duiker 2" SYdot "Punt" SYdrinking_water "Drinkwater" SYduck "Eend" SYelevation "Verhoging" SYexit_no_serv "Uitgang, geen bemanning" SYexit "Uitgang" SYfactory "Fabriek" SYfastfood "ZB-restaurant" SYfish "Visplek" SYfitness "Trim-pad" SYflag "Vlag" SYfreeway "Hoofdweg" SYfuel "Benzinestation" SYfuel_store "Wegrestaurant" SYgeo_name_land "Landschap" SYgeo_name_man "Park" SYgeo_name_water "Water" SYglider "Zweefvliegveld" SYgolf "Golfbaan" SYheliport "Heli-haven" SYhorn "Toeter" SYhouse "Huis" SYice_skating "IJsbaan" SYinfo "Info" SYintersection "Kruising" SYis_highway "Snelweg" SYknife_fork "Restauratie" SYladder "Ladder" SYlanding "Landingsbaan" SYlarge_city "Belangrijke stad" SYlarge_exit_ns "Afrit snelweg" SYlarge_ramp_int "Klaverblad" SYlevee "Dijk" SYlight "Vuurtoren" SYlodging "Unterkunft" SYmany_fish "Visgrond" SYmany_tracks "Veel paden" SYmark_x "Markering, X" SYmedium_city "Stad" SYmile_marker "Kilometermarkering" SYmilitary "Kazerne" SYmine "Mijn" SYMOB "Man over boord" SYmonument "Monument" SYmountains "Gebergte" SYmovie "Bioscoop" SYmug "Mok" SYntl_highway "Autoweg" SYnull "(transparent)" SYnull_2 "(leeg)" SYoil_field "Olieveld" SYparachute "Parachute" SYparking "Parkeerplaats" SYpharmacy "Apotheek" SYphone "Telefoon" SYpicnic "Picnicplaats" SYpizza "Pizzeria" SYpolice "Politie" SYpost_office "Postkantoor" SYprivate "Prive-terrein" SYradio_beacon "Radiobaken" SYramp_int "Aansluiting" SYrestricted "Gesloten terrein" SYrestrooms "WC" SYRV_park "Camper-terrein" SYscenic "Uitzicht" SYschool "School" SYseaplane "Watervlieghaven" SYshopping_cart "Inkopen" SYshort_tower "Toren, laag" SYshowers "Douche" SYskiing "Waterski" SYskull "Schedel" SYsmall_city "Kleine plaats" SYsnow_skiing "Ski" SYsoft_field "Grasveld" SYsquare_green "Rechthoek, groen" SYsquare_red "Rechthoek, rood" SYst_highway "Belangrijke weg" SYstadium "Stadion" SYstore "Warenhuis" SYstreet_int "Kruising" SYsummit "Top" SYswimming "Zwembad" SYtake_off "Startplaats" SYtall_tower "Toren, hoog" SYtheater Theater SYtoll Tolhuis SYtow_truck "Sleepwagen" SYtraceback "Terugweg" SYtracks Wandelwegen SYtrail_head "Wandel-parkeerplaats, uitgangspunt" SYtree "Boom" SYtruck_stop "Parkeerplaats naast snelweg" SYtunnel "Tunnel" SYultralight "UL-Landingsterrein" SYus_highway "Doorgaande snelweg" SYweight_station "Weegstation" SYwreck "Wrak" SYzoo "Dierentuin" psvisible "Alleen zichtbaar deel" DISPsymbol "Alleen symbool" DISPs_name "Symbool & naam" DISPs_comment "Symbool & commentaar" DISPname "Alleen naam" DISPcomment "Alleen commentaar" dispopt Weergave mapitems "Geef elementen weer op de kaart" nameIC Ikoon prod Produkt WPCapac "Waypoint-capaciteit" ICCapac "Ikoon-capaciteit" RTCapac "Route-capaciteit" TRCapac "Track-capaciteit" protcl "Protocol" ICGraph "Ikoon-weergave" WPperRT "Waypoints per route" notinGR "niet inbegrepen in (sub-)groep" onlyinGR "alleen inbegrepen in (sub-)groep" loadgrels "Laden v.d. elementen" importgrels "Importeren v.d. elementen" about "Over GPSMan..." contrib "Met bijdragen van" errorsto "Bugreports richten aan:" obsTRToRT "WP's aangemaakt door TR naar RT conversie" nameLists "Lijsten" nameData "Gegevens" MWCmap "Kaart" MWClists "Lijsten" MWCsingle "Enkelvoudig window" search "Zoeken" rmrk "NB" closeto "Benaderd door" with "Met" srchres "GEVONDEN" database "Database" where "Waar" what "Wat" list "Lijst" distance "Afstand" fromWP "van waypoint" fromPos "van positie" azimuth "Kompasrichting" any "elke" opening "Openen" suggested "Voorstel" another "Andere" srchdd1 "Zoeken naar" srchdd2Data "Alle items" srchdd2GR "Groep(en)" from "van" started "beginnend met" transf "Coord. transf." TRNSFAffine "Affin" TRNSFAffineConf "Affin conform" TRNSFNoRot "Conf zonder rot" projection "Projektie" lat0 "centrale breedte" long0 "centrale lengte" k0 "Schaalfactor v.d. centrale meridiaan" PRJUTM "UTM/UPS" PRJTM "Transv. Mercatorproj." PRJCMP "Port. militaire kaart" PRJBNG "Nat. Brits grid" PRJBWI "Brits West Indie" PRJITM "Ierse transv. Mercator-proj." PRJGKK "Gau-Krger-coordinaten" dontaskagain "Niet opnieuw vragen" rename "Gebruik nieuwe naam" oname "Oorspronkelijke naam" never "Nooit" ask "Vragen" always "Altijd" stage "Etappe" label "Beschrijving" alt "Hoogte" optALTUNIT "Hoogte" locate "Lokaliseren" animation Animatie fast Snel slow Traag start Beginnen pause Pauze speed Snelheid centred "gecentreerd" state Status animinit "Bij begin/eind" animon "loopt" animpause "onderbroken" animabort "afgebroken" dolog "Log uitschrijven" getlog "Log opvragen" stop Stoppen hide Verbergen show Weergeven posfixerror fout restart "Herstarten" mkTR "TR maken" posfixsimul simul namePVTData "Log gegevens" realtimelog "Gegevens in ware tijd" simul "Simulator" mkavgWP "WP-gemiddelde berekenen" abbrev "Afkorting" actual "Huidig" baseproj "Basisprojektie" atprevwp "Vorig WP" here "Hier" chglstrs "Vorige status bewerken" chgnxtrs "Volgende status bewerken" contnend "Aansluiten aan het eind" edmap "Op de kaart bewerken" prevwp "Vorig WP" firstwp "Eerste WP" fixeddatum "Gefixeerde datum" grid "Grid" lat1 "eerste breedtecirkel" lat2 "tweede breedtecirkel" latF "Oorsprong van de breedte" longF "OOrsprong van de lengte" chgpfrmt "Positie-weergave wijzigen" changegroupsymbol "Symbool wijzigen" closemenu "Menu sluiten" datum "Datum" bounds Begrenzing easting "Rechtswaarde" northing "Hoogwaarde" feasting "Rechtswaarde oorsprong" fnorthing "Hoogwaarde oorsprong" elevation "Hoogte" ellpsd "Ellipsoide" inca "Invoegen na" invert "omdraaien" move "Verschuiven" define Definieer defs Definities open "Openen" opt_MapGeom "Geometrie v.d. kaart" PRJKKJP "Fins basis grid" PRJKKJY "Uniform Fins grid" PRJSEG "Zweeds grid" recwindow "Ontvanger-window" restart "Opnieuw starten" rtimelogintv "Log-interval" unit "Eenheid" use "gebruik" userdefs "Gebruikersspecifieke definities" usewps "Gebruik WP's" optSAVESTATE "Bij beeindigen status opslaan" optDELSTATE "Na herstellen van de status, bestanden wissen" nameMapInfo "Kaartparameters" volume "Volume" no Nee latS "zuid. breedte" latN "noord. breedte" longW "west. lengte" longE "oost. lengte" PRJAPOLY "Amerik. polyconische" computations Berekeningen comparea "Berekenen oppervlakte" centre Centrum mkclusters "Maak clusters" dlat "Waardenbereik v.d. breedte" dlong "Waardenbereik v.d. lengte" collcntr "Verzamelen van de centra..." compclstr "Berekenen clusters..." crtgclstrgrs "Maken groepen..." PRJStereogr "Stereografische proj." chgdatum "Wijzig datum ..." opt_Interf "Gebruikers-interface" optPRINTCMD "Afdruk commando" print "Druk af" prevctr "Vorig centrum" PRJSOM "Zwitsers Oblique Mercator" PRJLV03 "Zwitsers LV03 Grid" PRJIcG "IJslands Grid" PRJRDG "Nederlands (RD) Grid" printopt "Afdruk opties" numberid "Getal/Aanduiding" hiddendata "Afgeschermde gegevens" YYYY/MM/DD JJJJ/MM/DD nextTP "Volgend TP" generate Maak optSERIALBAUD "Baud Rate" optDEFTRTWIDTH "RT lijn-dikte" optDEFTTRWIDTH "TR lijn-dikte" width Dikte TRtoTR "TR vereenvoudiging" TRlinedispl "Toon nu het resultaat" obsTRsimpl "TR als resultaat van vereenvoudiging" simplTRto "Vereenvoudig tot" exstglog "Bestaande log" contnsly "Continu" animate "animeer" animabbrev "anim." noanabbr "niet anim." zelev "Z-schaal" xyelev "XY-schaal" notext "geen tekst" view "Aanzicht" sideview "Aanzicht van opzij" persptv "Perspectief" SYgeocache "Geocache" SYgeocache_fnd "Geocache gevonden" optMAPCOLOUR,trvtrk "TRK pijl" optMAPCOLOUR,trvtrn "TRN pijlen" optMAPCOLOUR,trvcts "CTS pijl" optMAPCOLOUR,trvcts2 "2e CTS pijl" optMAPCOLOUR,trvvel_z "Op/neer pijl" optMAPCOLOUR,trvwrnimportant "Belangrijke waarschuwing (nav)" optMAPCOLOUR,trvwrnnormal "Waarschuwing (nav)" optMAPCOLOUR,trvwrninfo "Informatie (nav)" travel Verplaats notravel "Stop verplaatsen" travdisplay "Configureer display" travchgdisplay "Ga naar display %s" travdsetup "Configureer verplaatsings-display" navMOB "MOB: Man Over Boord!" startnav "Navigeer" navWP "Ga naar WP" goback "Go terug" follow "Volg %s" exactly "exact" fromnrst "vanaf dichtsbijzijnde" inrvrs "omgekeerd" forgetgoal "vergeet het doel" suspend "Onderbreek" resume "Hervat" TRVfix "Fix" TRVhour "Tijd" TRVspeed "Snelh" TRVpos "Pos" TRValt "hoogte" TRVtrk "TRK" TRVnxtWP "Naar" TRVprvWP "Vanaf" TRVete "ETE" TRVeta "ETA" TRVvmg "VMG" TRVxtk "XTK" TRVcts "CTS" TRVtrn "TRN" TRVvel_z "V snelh" TRVtrkcts "TRK, CTS" TRVdist "Afst" TRVc_trkcts "TRK/CTS pijlen" TRVc_trn "TRN pijlen" TRVc_vel_z "Op/neer pijl" add "Toevoegen" addlabelled "Voeg toe met label" remove "Verwijder" mindist "Afstand tot aankomst" chginggoal "Ga naar volgend doel" chggoalhlp "Gaande van\nhuidig naar volgenddoel\nterwijl RT/TR gevolgd wordt" soon binnenkort late later warnings "Waarschuwingen" dowarn "Geef waarschuwingen" warnconf "Configureer waarschuwingen" priority Prioriteit high hoog medium middel low laag warnprox "Afstand tot WP <" warnanchor "Afstand tot WP >" warnspeed "Snelheid >" warntrn "TRN (abs)>" warnvspeed "Verticale snelheid" warnxtk "XTK (abs)>" trvhlpbox "Gebruik rechter-button om onderstaande elementen te herschikken" trvhlpbxs "Gebuik rechter-button om lijst-elementen te herschikken" trvwarrv "Aankomst bij %s!" trvwleave "Vertrek van %s!" trvwspeed "Snelheid > %s!" trvwtrn "TRN > %s!" trvwvspeed "Vert snelheid niet in [%s,%s]!" trvwxtk "XTK > %s!" trvwnolog "Real-time logging is uit!" trvwnopos "Vorige posities niet beschikbaar" trvwuwps "RT heeft ongedefinieerd(e) WP(s)" trvwchg "Ga nu naar %s" TP TP drivesim "rij-simulator" startfrom "Start vanaf..." outofctrl "Geen controle meer!" right Rechts left Links straight Rechtuit rthlpdsim "Pijltjes-toetsen: sturen, verander snelheid\nSpatiebalk: rechtuit" renres "HERNOEMD" chggoal "Volgend doel instellen" Ghidden_addr Addres Ghidden_attrs Attributen Ghidden_avn_NDB "NDB" Ghidden_avn_VOR "VOR" Ghidden_avn_airp_NDB "Vliegveld NDB" Ghidden_avn_airp_int "Kruispunt vliegveld" Ghidden_avn_airp_rway "Drempel landingsbaan" Ghidden_avn_airport "Vliegveld" Ghidden_avn_inters "Kruispunt luchtwegen" Ghidden_black Zwart Ghidden_blue Blauw Ghidden_cat Kategorie Ghidden_city Stad Ghidden_class Klasse Ghidden_colour Kleur Ghidden_country Land Ghidden_cyan Cyaan Ghidden_dark_blue "Donkerblauw" Ghidden_dark_cyan "Donkercyaan" Ghidden_dark_gray "Donkergrijs" Ghidden_dark_green "Donkergroen" Ghidden_dark_magenta "Donkermagenta" Ghidden_dark_red "Donkerrood" Ghidden_dark_yellow "Donkergeel" Ghidden_default "Verstek" Ghidden_depth Diepte Ghidden_direct Direct Ghidden_display "Display?" Ghidden_dtyp "Display opt+type" Ghidden_ete "ETE" Ghidden_facility Faciliteit Ghidden_green Groen Ghidden_int_road "Kruisende weg" Ghidden_light_gray "Lichtgrijs" Ghidden_line Lijn Ghidden_link Traject Ghidden_lnk_ident "Traject id" Ghidden_locked Vastgezet Ghidden_magenta Magenta Ghidden_map_addr "Kaart addres" Ghidden_map_area "Kaart gebied" Ghidden_map_int "Kaart kruispunt" Ghidden_map_line "Kaart lijn" Ghidden_map_pt "Kaart punt" Ghidden_net Rooster Ghidden_no Nee Ghidden_non_user "Niet-gebruiker" Ghidden_red Rood Ghidden_snap Klik Ghidden_state Staat Ghidden_subclass Subklasse Ghidden_temp Temperatuur Ghidden_time Tijdsmarkering Ghidden_transparent Transparant Ghidden_user "Gebruiker" Ghidden_user_symbol "Gebruiker (alleen symbool)" Ghidden_white Wit Ghidden_yellow Geel Ghidden_yes Ja cwpsdef "Alsnog te def. referentie-WP's" PRJBMN "Oostenrijks BMN Grid" PRJCTR "Carta Tecnica Reg (I)" optDEFMAPPROJ "Kaartprojectie" optDEFMAPPFRMT "Kaartcoordinaten" optMapGuideVersion "MapGuide versie" undo "Ongedaan maken" UTMzone zone tfwfile "TFW-bestand" ok Ok GRA Gon newWPatdb "Nieuw WP bij..." PRJLamb93 "Lambert 93" PRJLambNTFe "NTF IIet" PRJLambNTF "NTF" NTFzone zone opinprogr "Bezig met bewerking" working "Bezig" aborted "Afgebroken!" errwarn "Fout/waarschuwing(en)!" SYbiker "Fietser" SYbox_blue "Kubus, blauw" SYbox_green "Kubus, groen" SYbox_red "Kubus, rood" SYflag_pin_blue "Vlaggetje, blauw" SYflag_pin_green "Vlaggetje, groen" SYflag_pin_red "Vlaggetje, rood" SYhouse_2 "House 2" SYpin_blue "Speld, blauw" SYpin_green "Speld, groen" SYpin_red "Speld, rood" ozimapfile "Ozi Map-bestand" info "Informatie" climbrate "Klimsnelheid" BGAfeature "BGA Feature" BGAfindblty "BGA Findability" BGAairact "BGA Air activity" optUSESLOWOPWINDOW "Controle-venster langdurige bewerkingen" optDEFTRECPROTOCOL "Standaard-protocol" optLNSREACT "LNs op de kaart met muis bewerken" optDEFMAPPFDATUM "Datum kaartcoordinaten" optAutoNumRts "Automatisch nummeren bij export" mkgrp "Groep maken" dispitems "Weergegeven objecten" hiditems "Afgeschermde objecten" SYopen_24hr "24 u p. dag open" SYfhs_facility "FHS faciliteit" SYbot_cond "bodem condities" SYtide_pred_stn "Station v. voorsp. getij/stroom" SYanchor_prohib "Verboden te ankeren" SYbeacon "Baken" SYcoast_guard "Kustwacht" SYreef "Rif" SYweedbed "Zeewier" SYdropoff "Kade" SYdock "Dok" SYmarina "Jachthaven" SYbait_tackle "Visbenodigdheden" SYstump "Stronk" SYcntct_ball_cap "Baseball-pet" SYcntct_big_ears "Groot oor" SYcntct_spike "Spijker" SYcntct_goatee "Puntbaard" SYcntct_dreads "Dreadlocks" SYcntct_female1 "Vrouw 1" SYcntct_female2 "Vrouw 2" SYcntct_female3 "Vrouw 3" SYcntct_ranger "Commando" SYcntct_pirate "Piraat" SYcntct_biker "Fietser" SYcntct_alien "Marsmannetje" SYcntct_bug "Insect" SYcntct_cat "Kat" SYcntct_dog "Hond" SYcntct_pig "Varken" SYhydrant "Brandkraan" SYcircle_blue "Cirkel, blauw" SYcircle_green "Cirkel, groen" SYcircle_red "Cirkel, rood" SYdiamond_blue "Ruit, blauw" SYoval_blue "Ellips, blauw" SYoval_green "Ellips, groen" SYoval_red "Ellips, rood" SYrect_blue "Rechthoek, blauw" SYrect_green "Rechthoek, groen" SYrect_red "Rechthoek, rood" SYsquare_blue "Vierkant, blauw" SYtriangle_blue "Driehoek, blauw" SYtriangle_green "Driehoek, groen" SYtriangle_red "Driehoek, rood" SYletter_a_blue "A, blauw" SYletter_a_green "A, groen" SYletter_a_red "A, rood" SYletter_b_blue "B, blauw" SYletter_b_green "B, groen" SYletter_b_red "B, rood" SYletter_c_blue "C, blauw" SYletter_c_green "C, groen" SYletter_c_red "C, rood" SYletter_d_blue "D, blauw" SYletter_d_green "D, groen" SYletter_d_red "D, rood" SYnumber_0_blue "0, blauw" SYnumber_0_green "0, groen" SYnumber_0_red "0, rood" SYnumber_1_blue "1, blauw" SYnumber_1_green "1, groen" SYnumber_1_red "1, rood" SYnumber_2_blue "2, blauw" SYnumber_2_green "2, groen" SYnumber_2_red "2, rood" SYnumber_3_blue "3, blauw" SYnumber_3_green "3, groen" SYnumber_3_red "3, rood" SYnumber_4_blue "4, blauw" SYnumber_4_green "4, groen" SYnumber_4_red "4, rood" SYnumber_5_blue "5, blauw" SYnumber_5_green "5, groen" SYnumber_5_red "5, rood" SYnumber_6_blue "6, blauw" SYnumber_6_green "6, groen" SYnumber_6_red "6, rood" SYnumber_7_blue "7, blauw" SYnumber_7_green "7, groen" SYnumber_7_red "7, rood" SYnumber_8_blue "8, blauw" SYnumber_8_green "8, groen" SYnumber_8_red "8, rood" SYnumber_9_blue "9, blauw" SYnumber_9_green "9, groen" SYnumber_9_red "9, rood" syhlpbx "Gebuik rechter-button om\nlijst-elementen te herschikken" syusrmenu "Aangepast menu met symbolen" cfgsymenu "Configureer aangepastmenu met symbolen" insmnb "Voeg sub-menu in voor" insmna "Voeg sub-menu in achter" opensbmn "Open sub-menu" clssbmn "Sluit sub-menu" optSUPPORTLAPS "Ondersteuning van rondes" LAP RD nameLAP "Ronde" duration "Duur" calrs "Calorieen" getLAP "Ophalen rondes" lapsrun "Wedstrijd" fromfile "van file" fromdef "van definitie" mbaktoload "Te laden achtergrond" none "geen" opt_Fonts "Fonts" optICONSIZE "Icon-grootte" optTRNUMBERINTVL "Toon TP-info op kaart bij elk" optTRINFO "Te tonen TP-info" nameInfo "Informatie" nameAL "Almanak" alm_svid "sateliet-id" alm_week "week" alm_datatime "geg ref tijd" alm_clockc1 "klok corr coeff s" alm_clockc2 "klok corr coeff s/s" alm_ecc "excentriciteit" alm_sqrta "vwortel a" alm_mnanom "gem onregelmatigheid" alm_argprgee "arg perigeum" alm_rightasc "rechte klimming" alm_rtrightasc "snelh r klimming" alm_inclin "inclinatie" alm_health "geldigheid" lstsqs "Kl. kwadraten" lstsqsfile "Kl. kwadr. bestand" totdstng "Totale afstand, zonder onderbrekingen" tottimeng "Totale tijd, zonder onderbrekingen" SYcross "Kruis" SYcross_3p "Kruis 3p" mapfitWPs "Toon WPs vd fit op kaart" showfitinfo "Toon informatie vd fit" xtcoord "xt" ytcoord "yt" delta "d" residual "rt" rmsxydev "rms(x,y-deviaties)" resstderr "resulterende std fout" chgdev "Verander device" maxalt "Maximum hoogte" minalt "Minimum hoogte" alt_cumula "Cummulatief klimhoogte" alt_cumuld "Cummulatief afdaling" optSHOWFILEITEMS "Toon standaard de ingelezen zaken" vertgridlines "Vert Grid Lijnen" convert "Converteer" split "Splits" bysel "via geselecteerde punten" byseg "via segmenten" openits "Open %s" uname "Naam gebruiker" pword "Wachtwoord" remember "Vasthouden" wptotwitter "WP naar Twitter" wptotwitternb "Stuur WP positie, datum, hoogte, naam and commentaar naar Twitter met tags #GPSMan #waypoint" exportTFW "Exporteer TFW-bestand" nametfwfile "TFW-bestand" PRJEOV EOV chgname "Wijzig naam" clicktoedit "Klik om te wijzigen" renamethod "Methode van hernoemen" operators "Operatoren" keep1st "behoud eerste char" keep1st_hlp "Behoud eerste char\noverige operatoren betreffen de resterende chars" reset "reset" reset_hlp "Herstart met oorspronkelijke naam, vorige wijzigingen worden teruggezet" case "wijzig letterkastchange case" case_hlp "Alle letters naar boven/onder-kast" maxlgth "max lengte" maxlgth_hlp "Huidige chars afgekapt naar opgegeven aantal" inslt "links-invoegen" inslt_hlp "Opgegeven string wordt ingevoegd voor huidig links-char" insrt "rechts-invoegen" insrt_hlp "Opgegeven string wordt aan het eind ingevoegd" replc "vervang" replc_hlp "Elk char in de eerste string wordt vervangen\ndoor de corresponderende in de tweede" delany "wis elk" delany_hlp "Alle chars in de opgegeven string worden uit de naam gewist" rsub "re. substitutie" rsub_hlp "Geef de regular expression and substitution specificatie\nzie het manual voor details" accifnew "accepteer als nieuw" accifnew_hlp "Accepteer resultaat als het een nieuwe naam is" guntilnew "voeg getal toe tot nieuw" guntilnew_hlp "Probeer alle mogelijke waarden van het getal tot een nieuwe naam is gevonden" ndigits "Aantal cijfers" gennames "Genereren van namen..." rentest_hlp "Test huidige methode op opgegeven naam" renmove_hlp "Gebruik rechter muisknop om regels te herschikken" tolower "naar onderkast" toupper "naar bovenkast" applyto "Toepassen op" forall "voor alle" failed "gefaald" selfont "Selecteren font" default "Verstek" size "Grootte" units "Eenheden" points "punts" pixels "pixels" weight "Gewicht" normal "normaal" bold "vet" slant "Schuin" roman "roman" italic "cursief" underline "Onderstreept" overstrike "Overelkaar" optDEFAULTFONT "Verstek-font" optFIXEDFONT "Vast-font" optMAPFONT "Kaart-font" optTRAVELFONT "Reis-display-font" optPLOTFONT "Plot/grafisch-font" plugin "Plug-in" unavailif "Niet beschikbaar als" tclcode "Tcl code" PRJSphMerc "Sferisch Mercator" PRJEPSG:3857 "EPSG:3857" PRJEqCyl "Equidistant cilindrisch" PRJEPSG:32663 "EPSG:32663" gpTRtoGnuplot2d "Zij-aanzicht (Gnuplot)" gpTRtoGnuplot2d_nb "Stuur track-gegevens naar extern programma GNUPLOT en toon hoogte-schets" gpTRtoGnuplot3d "Perspectief (Gnuplot)" gpTRtoGnuplot3d_nb "Stuur track-gegevens naar extern programma GNUPLOT en toon 3D-schets" gpParam2d "Parameters voor Gnuplot 2D-schets" gpParam3d "Parameters voor Gnuplot 3D-schets" gpFilename "Bestandsnaam" gpCanwidth "Breedte beeld" gpCanheight "Hoogte beeld" gpSTotals "Toon totalen" gpLeft "Linkerkant" gpRight "Rechterkant" gpNone "Niets" gpSRests "Toon rusten" gpRest "Rust" gpSymText "Simbool+Tekst" gpSymTime "Simbool+Tijd" gpText "Tekst" gpSHours "Toon uren" gpTimetop "Tijd boven" gpTimebot "Tijd onder" gpSSpeed "Toon snelheid" gpHike "Wandelen" gpBike "Fiets" gpDrive "Auto" gpGlide "Zweven" gpLimitDist "Max. afstand WP tot Track (km)" gpLimitStat "Min. afstand op Track voor zelfde WP (km)" gpDirection "Richting" gpForward "Vooruit" gpBackward "Achteruit" gp2D_hlp "Als er een groepsnaam gelijk aan de track-naam is,\n\ dan worden de waypoints van deze groep getoond\n\ met inachtneming van de gegeven afstanden.\n\ Als er geen passende groepsnaam bestaat,\ kun je kiezen uit een lijst of afbreken." gpGenerated "Gemaakt met gnuplot door GPSMan" gpModify "Wijzig aanzicht met de muis. Stop om plaatje te saven." htCalcHikeTime "Bereken wandeltijd" htCalcHikeTime_nb "Bereken wandeltijd met formule van DAV" htHeader "Geschatte wandeltijd (zonder rusten) voor tracks\ gebruikmakend van de formule van de \"Deutscher Alpenverein\" met verschillende parameters" htFooter1 "Capaciteit verwijst naar een uur." htFooter2 "Aanbevolen rust-tijd is 20 min na twee uur (15%)." srShowRest_nb "Toon rustperiodes > 5 min." srTRTime "Track-tijd" srTotals "Totalen" optALTHRESHOLD "Drempelwaarde hoogte" optDISPLAYCMD "Commando om kaartbeeld te tonen" optTERMCMD "Commando om terminal-window te openen" optMANHTTPADDR "HTTP-adres van het gebruikershandboek" } # the following definitions must be coherent with $TXT array set INVTXT { DMS DMS DMM DMM DDD DDD Gon GRA UTM/UPS UTM/UPS WP WP RT RT TR TR RD LAP GR GR } # changes by Miguel Filgueiras to RM contribution set TXT(srChainage) $TXT(totdst) set TXT(srShowRest) $TXT(gpSRests) set TXT(gpSym) $TXT(symbol) set TXT(srRest) $TXT(gpRest) gpsman-6.4.4.2/gmsrc/lists.tcl0000644000175000017500000002451312224351120014236 0ustar migmig# # This file is part of: # # gpsman --- GPS Manager: a manager for GPS receiver data # # Copyright (c) 1998-2013 Miguel Filgueiras migfilg@t-online.de # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. # # File: lists.tcl # Last change: 6 October 2013 # proc ChangeOnStateList {wh st} { # change state of items list when list becomes empty/non-empty # $wh in $TYPES or LAP # $st in {normal, disabled} global LsW RcW RcMenu GPSState WConf RECTYPES # entries in the type list menu and in the type sub-menu of Data menu switch $wh { WP { set es "1 2 5 6 7" ; set aes "1 2 4 5 6" } GR { set es "1 2 4 5 6 7 8 9" ; set aes "1 2 3 4 5 6 7 8" } LAP { set es "0 2" ; set aes "0 2" } default { set es "1 2 5 6" ; set aes "1 2 4 5" } } if { [set ix [lsearch -exact $RECTYPES $wh]] != -1 } { # reconfigure receiver window/menu if { $wh == "GR" } { set bs "frget.frget2.getGR frput.putGR" $RcMenu.gm entryconfigure $WConf(rec,getmn,GR) -state $st $RcMenu.ptm entryconfigure $WConf(rec,putmn,GR) -state $st } elseif { $wh != "IC" && $wh != "LAP" } { set bs "frput.put$wh" $RcMenu.ptm entryconfigure $WConf(rec,putmn,$wh) -state $st } else { set bs "" } if { $st == "normal" && $GPSState == "online" } { set sg normal } else { set sg disabled } foreach b $bs { $RcW.$b configure -state $sg } } foreach e $es { $LsW.frl$wh.frb.file.m entryconfigure $e -state $st } if { [set p $WConf(additemstate)] != "" } { foreach e $aes { ${p}$wh entryconfigure $e -state $st } } return } proc ClearList {wh} { # forget all items in a list; $wh in $TYPES global ListInds List EdWindow GMEd MESS TXT if { $ListInds($wh) == "" || \ ! [GMConfirm [format $MESS(forgetall) $TXT(name$wh)]] } { return } set ixs $ListInds($wh) if { [winfo exists $EdWindow($wh)] } { GMMessage [format $MESS(cantfgted) $TXT(name$wh)] set ixs [Delete $ixs $GMEd($wh,Index)] } # ForgetSeveral calls procs that update $ListInds($wh) ForgetSeveral $wh $ixs return } proc Count {wh} { # count items in list; $wh in $TYPES global Number MESS TXT GMMessage [format $MESS(counted) $Number($wh) $TXT(name$wh)] return } proc OpenListItem {wh} { # edit or display selected item in a list; $wh in $TYPES global LsW ListInds set s [$LsW.frl$wh.frl.box curselection] if { $s != "" } { OpenItem $wh [lindex $ListInds($wh) $s] } return } proc ToggleDisplayItem {wh sel} { # un-/display on map selected item in a list # $wh in $TYPES or LAP; $sel is selection index in list global ListInds EdWindow GMEd ${wh}Displ Number if { $wh == "LAP" } { return } if { $Number($wh)>0 && $sel != "" } { set index [lindex $ListInds($wh) $sel] set w $EdWindow($wh) if { [winfo exists $w] && $GMEd($wh,Index) == $index } { Raise $w ; bell return } if { [set [set wh]Displ($index)] } { UnMap $wh $index } else { PutMap $wh $index } } return } proc ToggleDisplayNamed {wh name} { # un-/display on map item with given name # $wh in $TYPES or LAP global EdWindow GMEd ${wh}Displ if { $wh == "LAP" } { return } if { [set index [IndexNamed $wh $name]] == -1 } { return } set w $EdWindow($wh) if { [winfo exists $w] && $GMEd($wh,Index) == $index } { Raise $w ; bell } elseif { [set [set wh]Displ($index)] } { UnMap $wh $index } else { PutMap $wh $index } return } proc ListAdd {wh index} { # add new item with given index to non-empty list; $wh in $TYPES or LAP global LsW ListInds Storage CMDLINE LAPStart if { $CMDLINE } { return } set ids [lindex $Storage($wh) 0] global $ids set name [set [set ids]($index)] if { $ListInds($wh) == "" } { set ListInds($wh) $index $LsW.frl$wh.frl.box insert end $name ChangeOnStateList $wh normal } elseif { $wh != "LAP" } { set a 0 ; set b [expr [$LsW.frl$wh.frl.box size]-1] while 1 { set i [expr int(floor(($a+$b)/2))] if { [string compare $name [$LsW.frl$wh.frl.box get $i]] < 0 } { set b $i } else { set a $i } if { $b == $a } { if { [string compare $name \ [$LsW.frl$wh.frl.box get $a]] > 0 } { incr a } $LsW.frl$wh.frl.box insert $a $name set ListInds($wh) [linsert $ListInds($wh) $a $index] break } if { $b == $a+1 } { if { [string compare $name \ [$LsW.frl$wh.frl.box get $a]] > 0 } { incr a if { [string compare $name \ [$LsW.frl$wh.frl.box get $a]] > 0 } { incr a } } $LsW.frl$wh.frl.box insert $a $name set ListInds($wh) [linsert $ListInds($wh) $a $index] break } } } else { # LAP: order by start date set secs [lindex $LAPStart($index) 1] set a 0 ; set nf 1 foreach ix $ListInds(LAP) { if { [lindex $LAPStart($ix) 1] <= $secs } { set nf 0 ; break } incr a } if { $nf } { set a end } $LsW.frl$wh.frl.box insert $a $name set ListInds($wh) [linsert $ListInds($wh) $a $index] } return } proc ListDelete {wh index} { # delete item with given index from list; $wh in $TYPES or LAP global LsW ListInds set n [lsearch -exact $ListInds($wh) $index ] $LsW.frl$wh.frl.box delete $n set ListInds($wh) [lreplace $ListInds($wh) $n $n] if { [$LsW.frl$wh.frl.box size] == 0 } { ChangeOnStateList $wh disabled } return } proc ListDeleteSeveral {wh ixs} { # delete items with given indices from list; $wh in $TYPES or LAP # $ixs has the same order of $ListInds($wh) although with some # elements missing global LsW ListInds if { $ixs == "" } { return } set exs $ListInds($wh) ; set ks "" set bx $LsW.frl$wh.frl.box ; set ib 0 while { $ixs != "" } { set c 0 foreach ex $exs ix $ixs { if { $ex == $ix } { $bx delete $ib ; incr c } else { lappend ks $ex ; incr ib break } } set exs [lrange $exs [expr $c+1] end] set ixs [lrange $ixs $c end] } set ListInds($wh) [concat $ks $exs] if { $ib == 0 } { ChangeOnStateList $wh disabled } return } proc ListDeleteAll {wh} { # delete all items from list; $wh in $TYPES or LAP global LsW ListInds $LsW.frl$wh.frl.box delete 0 end set ListInds($wh) "" ChangeOnStateList $wh disabled return } proc ChooseItems {wh args} { # create modal dialog for selecting from list of items # $wh in $TYPES or LAP # $args is empty or a list whose head is in {single, many, many_0} # for a single element, at least one element, and zero or more # elements, and whose tail is a pair that is passed on to # GMChooseFrom and describes parameters # return indices of items selected or "" if cancelled global LISTWIDTH Storage ListInds TXT set ids [lindex $Storage($wh) 0] global $ids set ns "" foreach i $ListInds($wh) { lappend ns [set [set ids]($i)] } if { $args != "" } { return [GMChooseFrom [lindex $args 0] \ [list $TXT(select) $TXT(name$wh)] \ $LISTWIDTH $ns $ListInds($wh) \ [lindex $args 1] [lindex $args 2]] } return [GMChooseFrom many [list $TXT(select) $TXT(name$wh)] \ $LISTWIDTH $ns $ListInds($wh)] } proc ChItemsCall {wh mode comm args} { # select from list of items and call command # $wh in $TYPES or LAP # $mode in {single, many, many_0} as in proc ChooseItems # $comm is command name to call as # $comm ARG0 ... ARGn NAMES if { [set ixs [ChooseItems $wh $mode]] == "" } { return } set names [Apply $ixs NameOf $wh] eval $comm $args $names return } proc InputToGR {whs notwhs preproc proc postproc fmt} { # input data according to contents of group(s) # items of types in $whs (except those in $notwhs) will be read in # $preproc will be called immediately before input is really required # and should return 0 unless operation is to be cancelled; # arguments: GR and $fmt; proc Ignore can be used if nothing is to # be done # $proc is the input procedure, whose arguments will be: # type of item to input, list of indices and $fmt if not "receiver" # $postproc will be called after the last call to $proc; single # argument: GR; proc Ignore can be used if nothing is to be done # $fmt is a either a file format (as used in the FILEFORMAT array) # or "receiver" global MESS TXT GCHow ListInds Storage FILEFORMAT set gts "" ; set ts "" foreach t $whs { if { [lsearch -exact $notwhs $t] == -1 } { lappend gts $t ; lappend ts $TXT(name$t) } } set vals [list $TXT(notinGR) $TXT(onlyinGR)] if { $fmt != "receiver" && $FILEFORMAT($fmt,filetype) == "data" } { set mode many } else { set mode single } while 1 { set whs [GMChooseFrom many $MESS(readwhat) 6 $ts $gts \ GCHow [list $vals]] set compl [string compare $GCHow $TXT(onlyinGR)] if { [set i [lsearch -exact $whs GR]] != -1 } { set whs [lreplace $whs $i $i] set rec 1 } else { set rec 0 } if { $mode == "single" && [llength $whs] > 1 } { GMMessage $MESS(importonly1) } else { break } } if { $whs == "" || [set ixs [ChooseItems GR]] == "" } { return } if { [$preproc GR $fmt] } { return } if { $mode != "single" } { set ll "" foreach wh $whs { if { [set l [GRsElements $ixs $rec $wh]] != "" } { if { $compl } { set ids [lindex $Storage($wh) 0] global $ids set l [linsert [Complement [array names $ids] $l] 0 -1] } lappend ll $l } } if { $ll != "" } { $proc $whs $ll $fmt } } else { # single if { [set l [GRsElements $ixs $rec $whs]] != "" } { if { $compl } { set ids [lindex $Storage($whs) 0] global $ids set l [linsert [Complement [array names $ids] $l] 0 -1] } if { $fmt != "receiver" } { $proc $whs [list $l] $fmt } else { $proc $whs $l } } } $postproc GR return } gpsman-6.4.4.2/gmsrc/trtort.tcl0000644000175000017500000004005112224351120014431 0ustar migmig# # This file is part of: # # gpsman --- GPS Manager: a manager for GPS receiver data # # Copyright (c) 1998-2013 Miguel Filgueiras migfilg@t-online.de # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. # # File: trtort.tcl # Last change: 6 October 2013 # # Includes contributions by Brian Baulch (baulchb _AT_ onthenet.com.au) # marked "BSB contribution" # ## map tags used, with $w a window path, $n a natural number: # lines in converted RT/TR: exp=$w expconv=$w line # turnpoints in converted RT/TR: exp=$w expconv=$w sq2 lab=$n.$n # TR elements: exp=$w expTR=$w (in addition to normal tags) ### ## the array TRCv is used for keeping conversion information # indices have the form $id,$el with $id an identifier for the operation # (normally a window path) and $el one of: npoints, npsold, linedispl, # TRdispl, line, TPs, sgsts, datum, notps, mouseonscale ### ## the term "line segment" used below has nothing to do with TR segments # which are only used here when displaying the TR; their start indices # are kept in $TRCv($w,sgsts) ### proc GMTRtoLine {wh window} { # create dialog to control conversion from track to RT, TR or LN # $wh in {RT, TR, LN} # $window is the track edit/show window global DPOSX DPOSY COLOUR GMEd TRTPoints TRSegStarts TRDatum TRDispl TXT \ MESS Map EdWindow MAPSCLENGTH TRCv set w ${window}.trtort if { [winfo exists $w] } { Raise $w ; bell ; return } if { $window == $EdWindow(TR) } { if { [set TRCv($w,TPs) $GMEd(TR,TPs)] == "" } { GMMessage $MESS(voidTR) return } set TRCv($w,sgsts) $GMEd(TR,SgSts) set mapped [lindex $GMEd(TR,Data) end] set TRCv($w,datum) $GMEd(TR,Datum) } else { set ixt [IndexNamed TR [$window.fr.fr1.id get]] set TRCv($w,TPs) $TRTPoints($ixt) ; set TRCv($w,datum) $TRDatum($ixt) set TRCv($w,sgsts) $TRSegStarts($ixt) set mapped $TRDispl($ixt) } set trname [string trim [$window.fr.fr1.id get]] if { $trname == "" } { set trname $TXT(unnamed) } set ntps [set TRCv($w,notps) [llength $TRCv($w,TPs)]] set TRCv($w,npoints) 2 ; set TRCv($w,npsold) 1 set TRCv($w,line) [TRCvSimpl $w $TRCv($w,npoints)] set TRCv($w,linedispl) 0 ; set TRCv($w,TRdispl) $mapped set TRCv($w,mouseonscale) 0 GMToplevel $w TRto$wh +[expr $DPOSX+100]+[expr $DPOSY+100] {} \ [list WM_DELETE_WINDOW "TRCvCancel $w"] {} frame $w.fr -borderwidth 5 -bg $COLOUR(dialbg) label $w.fr.from -text [format $TXT(fromTR) $trname] frame $w.fr.sep -height 6 -bg $COLOUR(dialbg) label $w.fr.npts -text $TXT(TRRTnpoints) scale $w.fr.npscl -orient horizontal -from 2 -to $ntps -width 5 \ -length $MAPSCLENGTH -resolution 1 -showvalue 1 \ -variable TRCv($w,npoints) $w.fr.npscl set 2 bind $w.fr.npscl "TRCvNumberChange $w" bind $w.fr.npscl "set TRCv($w,mouseonscale) 1" bind $w.fr.npscl "set TRCv($w,mouseonscale) 0" frame $w.fr.act checkbutton $w.fr.act.drt -text $TXT(TRlinedispl) -onvalue 1 -offvalue 0 \ -variable TRCv($w,linedispl) -command "TRCvDisplLine $w" \ -selectcolor $COLOUR(check) checkbutton $w.fr.act.dtr -text $TXT(TRTRdispl) -onvalue 1 -offvalue 0 \ -variable TRCv($w,TRdispl) -command "TRCvDisplTR $w" \ -selectcolor $COLOUR(check) # if TR is mapped do not allow it to be unmapped if { $mapped } { $w.fr.act.dtr configure -state disabled } frame $w.fr.bts button $w.fr.bts.ok -text $TXT(ok) -command "TRCvCommit$wh $w" button $w.fr.bts.cnc -text $TXT(cancel) -command "TRCvCancel $w" pack $w.fr.from $w.fr.sep $w.fr.npts $w.fr.npscl -side top pack $w.fr.act.drt $w.fr.act.dtr -side left -padx 3 pack $w.fr.bts.ok $w.fr.bts.cnc -side left -padx 3 pack $w.fr.act $w.fr.bts -side top -pady 5 pack $w.fr return } proc TRCvNumberChange {w} { global TRCv TXT if { $TRCv($w,mouseonscale) \ || $TRCv($w,npoints) == $TRCv($w,npsold) } { return } set sid [SlowOpWindow $TXT(comp)] set TRCv($w,npsold) $TRCv($w,npoints) if { [set l [TRCvSimpl $w $TRCv($w,npoints)]] != 0 } { set TRCv($w,line) $l TRCvDisplLine $w } else { set TRCv($w,npoints) $TRCv($w,npsold) } SlowOpFinish $sid "" return } proc TRCvCommitRT {w} { # define WPs from points in conversion result and create RT # open RT edit window or create RT if RT edit window already exists global TRCv EdWindow PositionFormat CREATIONDATE GRName DEFAULTSYMBOL \ DEFAULTDISPOPT TXT MESS MYGPS set sid [SlowOpWindow $TXT(create)] set datum $TRCv($w,datum) # BSB contribution: empty date if Lowrance receiver if { $CREATIONDATE && $MYGPS != "Lowrance" } { set date [Now] } else { set date "" } set wps "" ; set n 0 foreach p $TRCv($w,line) { if { [SlowOpAborted] } { SlowOpFinish $sid "" return } set id [format "ZT%04d" $n] while { [IndexNamed WP $id] != -1 } { incr n ; set id [format "ZT%04d" $n] } incr n foreach "posn pfmt pfdatum" \ [FormatPosition [lindex $p 0] [lindex $p 1] $datum \ $PositionFormat "" DDD] { break } set data [FormData WP "Name PFrmt Posn Datum Date Alt" \ [list $id $pfmt $posn $pfdatum $date [lindex $p 6]]] set ix [CreateItem WP $data] lappend wps $id } SlowOpFinish $sid "" CreateGRFor =TR-RT $TXT(obsTRToRT) [list [list WP $wps]] TRCvCancel $w if { [winfo exists $EdWindow(RT)] } { set name [NewName RT] set data [FormData RT "IdNumber WPoints Displ" [list $name $wps 0]] CreateItem RT $data GMMessage [format $MESS(convres) $TXT(RT) $name] } else { GMRoute -1 {create revert cancel} \ [FormData RT "WPoints Displ" [list $wps 0]] } return } proc TRCvCommitTR {w} { # create TR from simplification result # if TR edit window does not exist open it, otherwise add TR to # data-base # "positions" are assumed here to have lat/long in degrees followed # by lat/long in DMS as in TPs global TRCv EdWindow TXT MESS set obs $TXT(obsTRsimpl) if { [winfo exists $EdWindow(TR)] } { set name [NewName TR] set data [FormData TR "Name Obs Datum TPoints" \ [list $name $obs $TRCv($w,datum) $TRCv($w,line)]] CreateItem TR $data GMMessage [format $MESS(convres) $TXT(TR) $name] } else { GMTrack -1 {create revert cancel} [FormData TR "Obs Datum TPoints" \ [list $obs $TRCv($w,datum) $TRCv($w,line)]] } TRCvCancel $w return } proc TRCvCommitLN {w} { # create LN from simplification result # if LN edit window does not exist open it, otherwise add LN to # data-base # "positions" are assumed here to be representations of TPs with # lat/long in degrees, lat/long in DMS and altitude at index 6 # segments are kept only if the number of points was not changed global TRCv EdWindow TXT MESS set lps "" foreach tp $TRCv($w,line) { lappend lps [list [lrange $tp 0 3] [lindex $tp 6]] } if { $TRCv($w,notps) == $TRCv($w,npoints) } { set sgsts $TRCv($w,sgsts) } else { set sgsts "" } if { [winfo exists $EdWindow(LN)] } { set name [NewName LN] set data [FormData LN "Name Datum PFrmt LPoints SegStarts" \ [list $name $TRCv($w,datum) DMS $lps $sgsts]] CreateItem LN $data GMMessage [format $MESS(convres) $TXT(LN) $name] } else { GMLine -1 {create revert cancel} \ [FormData LN "Datum PFrmt LPoints SegStarts" \ [list $TRCv($w,datum) DMS $lps $sgsts]] } TRCvCancel $w return } proc TRCvCancel {w} { # finish off conversion from TR on window $w global TRCv Map if { $TRCv($w,linedispl) || $TRCv($w,TRdispl) } { $Map delete exp=$w SetMapBounds } destroy $w TRCvCleanMemory $w return } proc TRCvCleanMemory {w} { # free memory used by conversion $w global TRCv foreach e "npoints npsold linedispl TRdispl line TPs sgsts datum notps \ mouseonscale" { catch {unset TRCv($w,$e)} } return } proc TRCvDisplLine {w} { global Map TRCv TXT $Map delete expconv=$w if { $TRCv($w,linedispl) } { set sid [SlowOpWindow $TXT(displ)] set tgspt [list exp=$w expconv=$w sq2] set tgsln [list exp=$w expconv=$w line] set ps $TRCv($w,line) ; set datum $TRCv($w,datum) set p1 [lindex $ps 0] set pp1 [MapFromPosn [lindex $p1 0] [lindex $p1 1] $datum] set x [lindex $pp1 0] ; set y [lindex $pp1 1] $Map create oval [expr $x-1] [expr $y-1] \ [expr $x+1] [expr $y+1] -fill black -outline black \ -tags [concat lab=$w.0 $tgspt] set i 1 foreach p2 [lrange $ps 1 end] { if { [SlowOpAborted] } { $Map delete expconv=$w set TRCv($w,linedispl) 0 break } set pp2 [MapFromPosn [lindex $p2 0] [lindex $p2 1] $datum] set x2 [lindex $pp2 0] ; set y2 [lindex $pp2 1] $Map create oval [expr $x2-1] [expr $y2-1] \ [expr $x2+1] [expr $y2+1] -fill black -outline black \ -tags [concat lab=$w.$i $tgspt] $Map create line $x $y $x2 $y2 -arrow last -smooth 0 \ -fill black -width 2 -tags $tgsln set x $x2 ; set y $y2 incr i } SlowOpFinish $sid "" } SetMapBounds return } proc TRCvDisplTR {w} { # map/unmap TR during this conversion # TR was not mapped when the conversion started global Map TRCv GMEd if { $TRCv($w,TRdispl) } { SetCursor $w watch PutMapTREls $GMEd(TR,Index) $TRCv($w,TPs) $TRCv($w,sgsts) \ $TRCv($w,datum) [list exp=$w expTR=$w] ResetCursor $w } else { $Map delete expTR=$w } SetMapBounds return } ### TR conversion for internal use proc TRCvTR {tps n datum id} { # convert list of TPs or LPs to list of at most $n>=2 positions under # given datum # "position" means list starting with lat long in degrees # but see also procs TRCvCommitTR and TRCvCommitLN # $id is identifier of operation global TRCv if { [set notps [llength $tps]] <= $n } { return $tps } SetCursor . watch set TRCv($id,TPs) $tps ; set TRCv($id,notps) $notps set TRCv($id,datum) $datum set ps [TRCvSimpl $id $n] TRCvCleanMemory $id ResetCursor . return $ps } ### line simplification algorithm proc TRCvSimpl {w n} { # using information indexed by $w, convert list of "positions" in # given datum to list of $n>=2 "positions" # "position" means list starting with lat long in degrees # the following data is used: # $TRCv($w,TPs) is list of positions # $TRCv($w,notps) is number of positions # $TRCv($w,datum) is datum # procs SetDatumData and ComputeDistBearFD are called (indirectly) # return 0 if operation was aborted global TRCv set ps $TRCv($w,TPs) if { $n == $TRCv($w,notps) } { return $ps } if { $n<3 || [llength $ps]<3 } { return [list [lindex $ps 0] [lindex $ps end]] } SetDatumData $TRCv($w,datum) if { [set ss [TRCvSimplSegms [SplitPositions $ps] [expr $n-1]]] == 0 } { return 0 } set r [list [lindex [lindex [lindex $ss 0] 2] 0]] foreach s $ss { lappend r [lindex [lindex $s 2] end] } return $r } proc TRCvSimplSegms {ss n} { # breaks a line segment into $n>=2 segments # a segment is a list of: # maximum distance from a point to line between 1st and last points # index of a point at that distance # "positions" of points # return 0 if operation was aborted while { $n > 2 } { if { [SlowOpAborted] } { return 0 } set mx 0 ; set im 0 ; set i 0 foreach s $ss { if { [set d [lindex $s 0]] > $mx } { set mx $d ; set im $i } incr i } if { $mx == 0 } { return $ss } set s [lindex $ss $im] set is [lindex $s 1] ; set ps [lindex $s 2] set ss [concat [lrange $ss 0 [expr $im-1]] \ [SplitPositionsAt $is $ps] \ [lrange $ss [expr $im+1] end]] incr n -1 } return $ss } proc SplitPositions {ps} { # split "positions" into two segments at maximum distance to line between # end points set dfp [FurthestPoint $ps] set im [lindex $dfp 1] return [SplitPositionsAt $im $ps] } proc SplitPositionsAt {im ps} { # split "positions" into two segments at given index $im set ps1 [lrange $ps 0 $im] ; set ps2 [lrange $ps $im end] return [list [linsert [FurthestPoint $ps1] end $ps1] \ [linsert [FurthestPoint $ps2] end $ps2]] } proc FurthestPoint {ps} { # find a point that is furthest from the line between 1st and last points # return list with maximum distance and index of point if { [set l [llength $ps]] < 3 } { return [list 0 0] } set mx 0 ; set i 1 set pt0 [lindex $ps 0] ; set ptn [lindex $ps end] foreach pt [lrange $ps 1 [expr $l-2]] { set d [DistToLineFD $pt $pt0 $ptn] if { $d >= $mx } { set im $i ; set mx $d } incr i } if { $mx == 0 } { set im [expr $l/2] } return [list $mx $im] } proc DistToLineFD {p p1 p2} { # find distance from point $p to line between $p1 and $p2 # $p, $p1 and $p2 are "positions" set db [ComputeDistBearFD $p1 $p] set a [expr [lindex [ComputeDistBearFD $p1 $p2] 1]-[lindex $db 1]] return [expr abs(sin($a*0.01745329251994329576)*[lindex $db 0])] } ###### average WP from TR proc GMTRtoWP {window} { # make average WP of all TPs in $window global GMEd TRTPoints TRDatum EdWindow MESS CREATIONDATE PositionFormat if { [winfo exists $EdWindow(WP)] } { Raise $EdWindow(WP) ; bell ; return } if { $window == $EdWindow(TR) } { if { [set tps $GMEd(TR,TPs)] == "" } { GMMessage $MESS(voidTR) return } set datum $GMEd(TR,Datum) } else { set ixt [IndexNamed TR [$window.fr.fr1.id get]] set tps $TRTPoints($ixt) ; set datum $TRDatum($ixt) } set sla 0 ; set slo 0 ; set sal 0 ; set noalt 1 ; set n 0 foreach tp $tps { set sla [expr $sla+[lindex $tp 0]] ; set slo [expr $slo+[lindex $tp 1]] if { [regexp {[0-9\.]+} [set a [lindex $tp 6]]] } { set sal [expr $sal+$a] set noalt 0 } incr n } if { $noalt } { set sal "" } else { set sal [format %.1f [expr 1.0*$sal/$n]] } foreach "p pfmt pfdatum" \ [FormatPosition [expr 1.0*$sla/$n] [expr 1.0*$slo/$n] $datum \ $PositionFormat "" DDD] { break } set opts {create revert cancel} if { $CREATIONDATE } { GMWPoint -1 $opts [FormData WP "PFrmt Posn Datum Alt Date" \ [list $pfmt $p $pfdatum $sal [Now]]] } else { GMWPoint -1 $opts [FormData WP "PFrmt Posn Datum Alt Commt" \ [list $pfmt $p $pfdatum $sal [DateCommt [Now]]]] } return } proc GMGRtoWP {window} { # make average WP of all WPs in GR shown in $window global MESS EdWindow WPPosn WPDatum WPAlt CREATIONDATE PositionFormat if { [winfo exists $EdWindow(WP)] } { Raise $EdWindow(WP) ; bell ; return } switch [set ixs [GMGRCollectWPs $window]] { void { GMMessage $MESS(voidGR) ; return } error { return } } if { $ixs == "" } { bell ; return } set sla 0 ; set slo 0 ; set sal 0 ; set noalt 1 ; set n 0 set datum "" foreach ix $ixs { set p $WPPosn($ix) if { $datum == "" } { set datum $WPDatum($ix) } elseif { $WPDatum($ix) != $datum } { set p [ToDatum [lindex $p 0] [lindex $p 1] $WPDatum($ix) $datum] } set sla [expr $sla+[lindex $p 0]] ; set slo [expr $slo+[lindex $p 1]] if { [regexp {[0-9\.]+} [set a $WPAlt($ix)]] } { set sal [expr $sal+$a] set noalt 0 } incr n } if { $noalt } { set sal "" } else { set sal [format %.1f [expr 1.0*$sal/$n]] } foreach "p pfmt pfdatum" \ [FormatPosition [expr 1.0*$sla/$n] [expr 1.0*$slo/$n] $datum \ $PositionFormat "" DDD] { break } set opts {create revert cancel} if { $CREATIONDATE } { GMWPoint -1 $opts [FormData WP "PFrmt Posn Datum Alt Date" \ [list $pfmt $p $pfdatum $sal [Now]]] } else { GMWPoint -1 $opts [FormData WP "PFrmt Posn Datum Alt Commt" \ [list $pfmt $p $pfdatum $sal [DateCommt [Now]]]] } return } gpsman-6.4.4.2/gmsrc/navigate.tcl0000644000175000017500000014476412224351120014711 0ustar migmig# # This file is part of: # # gpsman --- GPS Manager: a manager for GPS receiver data # # Copyright (c) 1998-2013 Miguel Filgueiras migfilg@t-online.de # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. # # File: navigate.tcl # Last change: 6 October 2013 # ##### travel/navigation display proc ToTravel {} { # change the map window for travelling and set up the travel frame if # needed # the frame $WConf(travel,fr) will replace frame $WConf(travel,alt) # assumed to be the only widget in their parent and managed by grid global WConf Travelling Travel MESS if { $Travelling } { return } grid remove $WConf(travel,alt) set fr $WConf(travel,fr) if { ! [winfo exists $fr.fctrl] } { TravelInit $fr } grid $fr if { $Travel(posns) != "" && [GMConfirm $MESS(clrtrvlog)] } { set Travel(posns) "" } set Travelling 1 return } proc TravelInit {fr} { # set up the travel frame $fr global Travel RcMenu TXT COLOUR MAPCOLOUR MAPDISTS MAPDISTVALS foreach e $Travel(els) { set Travel(info,$e) "" } set Travel(info,vel_z) "" set Travel(nav,datum,a) [lindex [EllipsdData $Travel(nav,datum)] 0] TravelInitFonts create # widget names are used in other procedures frame $fr.fctrl set mn $fr.fctrl.ctrl.mn menubutton $fr.fctrl.ctrl -text $TXT(change) -menu $mn menu $mn $mn add command -label $TXT(GPSrec) \ -command { $RcMenu post [expr [winfo rootx $MpW]+30] [expr [winfo rooty $MpW]+30] } $mn add separator $mn add command -label $TXT(navMOB) -foreground $COLOUR(check) \ -command { TravelNav MOB } $mn add command -label "$TXT(create) $TXT(WP)" \ -command { TravelMarkPoint } $mn add cascade -label $TXT(startnav) -menu $mn.ms menu $mn.ms $mn.ms add command -label $TXT(navWP) -command { TravelNav WP } foreach wh "RT TR LN" { $mn.ms add command -label [format $TXT(follow) $TXT($wh)] \ -command "TravelNav $wh" } $mn.ms add command -label $TXT(goback) -command { TravelNav GoBack } $mn add command -label $TXT(chggoal) \ -command { TravelNavCmd chggoal } -state disabled set Travel(travel,mnchggoal) [$mn index last] $mn add command -label $TXT(suspend) \ -command { TravelNavCmd suspend } -state disabled set Travel(travel,mnsuspend) [$mn index last] $mn add command -label $TXT(resume) \ -command { TravelNavCmd resume } -state disabled set Travel(travel,mnresume) [$mn index last] $mn add command -label $TXT(forgetgoal) \ -command { TravelNavCmd abort } -state disabled set Travel(travel,mnabort) [$mn index last] $mn add separator $mn add cascade -label $TXT(mindist) -menu $mn.mdist set ix [$mn index last] menu $mn.mdist set pmd $Travel(mindist) ; set nf 1 foreach e $MAPDISTS d $MAPDISTVALS { $mn.mdist add command -label $e \ -command "set Travel(mindist) $d ; \ $mn entryconfigure $ix -label {$TXT(mindist) = $e}" if { $d == $pmd } { set nf 0 $mn.mdist invoke last } } if { $nf } { # bad value of minimum distance; set to last in menu set Travel(mindist) $d $mn entryconfigure $ix -label "$TXT(mindist) $e" } # prevent bad value for boolean off-road if { $Travel(offroad) != 0 } { set Travel(offroad) 1 } # NOT YET IN USE! # $mn add checkbutton -label $TXT(offroad) -variable Travel(offroad) \ -selectcolor $COLOUR(check) $mn add command -label $TXT(chginggoal) -command TravelChgGoal $mn add cascade -label $TXT(warnings) -menu $mn.mwn menu $mn.mwn set warn $Travel(warn) $mn.mwn add checkbutton -label $TXT(dowarn) -onvalue 1 -offvalue 0 \ -variable Travel(warn) -selectcolor $COLOUR(check) $mn.mwn add command -label $TXT(warnconf) -command TravelWarnConfigure $mn add cascade -label $TXT(travdisplay) -menu $mn.dsp menu $mn.dsp foreach dsp $Travel(displays) { $mn.dsp add command -label $dsp -command "TravelSetUp $dsp" } $mn add separator $mn add command -label $TXT(notravel) -command NoTravel foreach dsp $Travel(displays) { radiobutton $fr.fctrl.b$dsp -value $dsp -anchor w \ -selectcolor $COLOUR(check) -variable Travel(travel,cdsp,b) \ -command "TravelChangeDisplay $dsp $fr.fri" BalloonBindings $fr.fctrl.b$dsp \ [list "=[format $TXT(travchgdisplay) $dsp]"] grid $fr.fctrl.b$dsp -row 1 -column [expr $dsp-1] } set Travel(travel,cdsp,b) $Travel(travel,cdsp) frame $fr.fri set Travel(travel,dsppfr) $fr.fri foreach dsp $Travel(displays) { frame $fr.fri.f$dsp foreach i $Travel(els) s $Travel(elsizes) { label $fr.fri.f$dsp.$i -width $s -font $Travel(font) \ -textvariable Travel(info,$i) -relief sunken label $fr.fri.f$dsp.t_$i -font $Travel(font) -text $TXT(TRV$i) } # TRN arrows # set cbgw 121 ; set cbgh 55 set cbgw 121 ; set cbgh 37 set cbg $fr.fri.f$dsp.c_trn canvas $cbg -width $cbgw -height $cbgh -relief flat -bg $COLOUR(dialbg) set cw2 [expr $cbgw/2] ; set ch2 [expr $cbgh/2] set aw [expr int($cw2*0.7)] ; set aw2 [expr $aw/2] set ah4 [expr ($cbgh-2)/4] set ps "1 $ch2 $aw2 1 $aw2 [expr 1+$ah4] $aw [expr 1+$ah4] \ $aw [expr $cbgh-1-$ah4] $aw2 [expr $cbgh-1-$ah4] \ $aw2 [expr $cbgh-1] 1 $ch2" eval $cbg create polygon $ps -fill $COLOUR(dialbg) -width 1 \ -outline black -tags left set psr "" foreach "x y" $ps { lappend psr [expr $cbgw-$x] $y } eval $cbg create polygon $psr -fill $COLOUR(dialbg) -width 1 \ -outline black -tags right label $cbg.lab -textvariable Travel(info,trn) -font $Travel(fontb) $cbg create window $cw2 $ch2 -anchor c -window $cbg.lab # up-down arrow set cvz $fr.fri.f$dsp.c_vel_z canvas $cvz -width $cbgw -height $cbgh -relief flat -bg $COLOUR(dialbg) set b [expr $cbgh-2] set psn "[expr $ch2+2] 2 \ [expr $cbgh+2] [expr 2+$aw2] \ [expr $cbgh+2-$ah4] [expr 2+$aw2] \ [expr $cbgh+2-$ah4] $b [expr 2+$ah4] $b \ [expr 2+$ah4] [expr 2+$aw2] 2 [expr 2+$aw2] \ [expr $ch2+2] 2" eval $cvz create polygon $psn -fill $COLOUR(dialbg) -width 1 \ -outline black -tags vel_z label $cvz.lab -textvariable Travel(info,vel_z) -font $Travel(fontb2) $cvz create window [expr 0.75*$cbgw] $ch2 -anchor c -window $cvz.lab set Travel(wdgts,vel_z) [expr 2+$b] set Travel(wdgts,vel_z,up) 1 # TRK, CTS and secondary CTS arrows set ccp $fr.fri.f$dsp.c_trkcts set ccpw [set ccph [expr 2*$cbgh]] canvas $ccp -width $ccpw -height $ccph -relief flat -bg $COLOUR(dialbg) if { $ccpw >= $ccph } { set sl $ccph } else { set sl $ccpw } set sl [expr int($sl*0.8)] set x0 [expr ($ccpw-$sl)/2] ; set xe [expr $x0+$sl] set y0 [expr ($ccph-$sl)/2] ; set ye [expr $y0+$sl] $ccp create oval $x0 $y0 $xe $ye -fill $COLOUR(dialbg) -width 1 \ -outline $MAPCOLOUR(trvtrk) set xm [expr $ccpw/2] set ah [expr int(($sl-4)*0.4)] ; set ah2 [expr $ah/2] set ah4 [expr $ah2/2] set yh [expr $y0+3+$ah] set cps [list $xm [expr $y0+3] [expr $xm+$ah2] $yh \ [expr $xm+$ah4] $yh [expr $xm+$ah4] [expr $ye-3] \ [expr $xm-$ah4] [expr $ye-3] \ [expr $xm-$ah4] $yh [expr $xm-$ah2] $yh $xm [expr $y0+3]] foreach ts [list {cts ctss} {cts2 ctss} trk] { set it [eval $ccp create polygon $cps -width 1] # to avoid problems with spaces in names of colours $ccp itemconfig $it -fill $COLOUR(dialbg) -tags $ts } $ccp raise trk set ym [expr $ccph/2] set cs "" foreach "x y" $cps { lappend cs [expr $x-$xm] [expr $y-$ym] } set Travel(wdgts,trk) [set Travel(wdgts,cts) \ [set Travel(wdgts,cts2) [list trkcts $cs $xm $ym]]] # draw N,E,S,W letters set xx0 [expr $xm-2] ; set xxe [expr $xm+2] ; set yye [expr $y0-6] set csn [list $xx0 $y0 $xx0 $yye $xxe $y0 $xxe $yye] eval $ccp create line $csn -width 1 -fill red -tags north set xx1 [expr $xe+1] ; set xx2 [expr $xe+6] set yy1 [expr $ym-3] ; set yy2 [expr $ym+3] set cse [list $xx2 $yy1 $xx1 $yy1 $xx1 $ym [expr $xx1+4] $ym \ $xx1 $ym $xx1 $yy2 $xx2 $yy2] eval $ccp create line $cse -width 1 -fill blue -tags east set yy3 [expr $ye+3] ; set yy4 [expr $ye+6] set css [list $xxe $ye $xx0 $ye $xx0 $yy3 $xxe $yy3 \ $xxe $yy4 $xx0 $yy4] eval $ccp create line $css -width 1 -fill blue -tags south set xx3 [expr $x0-6] ; set xx4 [expr $x0-1] set csw [list $xx3 $yy1 $xx3 $yy2 [expr $x0-3] [expr $yy2-3] \ $xx4 $yy2 $xx4 $yy1] eval $ccp create line $csw -width 1 -fill blue -tags west set ts [list trkcts $xm $ym] foreach e "north east south west" l "csn cse css csw" { set cs "" foreach "x y" [set $l] { lappend cs [expr $x-$xm] [expr $y-$ym] } lappend ts $e $cs } set Travel(wdgts,nesw) $ts TravelDraw $fr $dsp } grid $fr.fctrl.ctrl -row 0 -column 0 -columnspan 2 grid $fr.fctrl -row 0 -column 0 grid $fr.fri.f$Travel(travel,cdsp) grid $fr.fri -row 0 -column 1 return } proc TravelChangeDisplay {dsp pfr} { # change to display $dsp # $pfr is parent frame of displays global Travel WConf grid remove $pfr.f$Travel(travel,cdsp) grid $pfr.f$dsp set Travel(travel,cdsp) $dsp return } proc TravelDraw {fr dsp} { # draw widgets for displaying travel information # $fr is the main travel frame # $dsp gives the secondary frame # the list $Travel(conf,$dsp) gives the elements and canvases to be # displayed; element names can be preceded by lab+ asking for a title # label global Travel set r 0 ; set c 0 foreach e $Travel(conf,$dsp) { if { $e == "c_trkcts" } { # this needs 2 rows if { $r != 0 } { set r 0 ; incr c 2 } grid $fr.fri.f$dsp.$e -row 0 -rowspan 2 -column $c -sticky nesw set r 0 ; incr c } elseif { [string first "c_" $e] == 0 } { # other arrow graphics grid $fr.fri.f$dsp.$e -row $r -column $c -columnspan 2 -sticky ew set c [expr $c+2*$r] ; set r [expr 1-$r] } elseif { [regsub {^lab\+} $e "" ne] } { # with title label grid $fr.fri.f$dsp.t_$ne -row $r -column $c -sticky e grid $fr.fri.f$dsp.$ne -row $r -column [expr $c+1] -sticky w set c [expr $c+2*$r] ; set r [expr 1-$r] } else { grid $fr.fri.f$dsp.$e -row $r -column $c -columnspan 2 set c [expr $c+2*$r] ; set r [expr 1-$r] } } return } proc TravelChgGoal {} { # dialog for setting the parameter on when to change from # current to next goal when following a RT or TR global Travel TXT DPOSX DPOSY set w .trvchggoal if { [winfo exists $w] } { Raise $w ; return } GMToplevel $w chginggoal +$DPOSX+$DPOSY {} \ [list WM_DELETE_WINDOW "destroy $w"] {} frame $w.ft label $w.ft.tit -text $TXT(chginggoal) BalloonButton $w.ft.bhlp chggoalhlp grid $w.ft.tit grid $w.ft.bhlp -row 0 -column 1 -sticky sw frame $w.fr -relief flat -borderwidth 5 label $w.fr.t1 -text $TXT(soon) scale $w.fr.s -orient horizontal -from 0 -to $Travel(chggmaxix) \ -showvalue 0 -width 12 -length 100 -variable Travel(chggix) label $w.fr.t2 -text $TXT(late) grid $w.fr.t1 -row 0 -column 0 grid $w.fr.s -row 0 -column 1 grid $w.fr.t2 -row 0 -column 2 button $w.ok -text $TXT(ok) -command "destroy $w" pack $w.ft $w.fr $w.ok -pady 5 update idletasks return } proc TravelChgGParam {n no op} { # called by trace when $Travel(chggix) has been changed global Travel set ix $Travel(chggix) set Travel(chggparam) [lindex $Travel(chggvals) $ix] set Travel(chggwparam) [lindex $Travel(chggwvals) $ix] return } proc NoTravel {} { # change the map window when stopping travelling # the frame $WConf(travel,alt) will replace frame $WConf(travel,fr) # assumed to be the only widget in their parent and managed by grid global WConf Travelling set Travelling 0 grid remove $WConf(travel,fr) grid $WConf(travel,alt) return } proc TravelRealTimeOff {} { # real-time logging stopped global Travel TXT TravelDoWarn $TXT(trvwnolog) important TravelDisplayChange notraveldata if { $Travel(nav) == "on" } { TravelNavCmd suspend set Travel(nav) nolog set Travel(nav,ok) 0 } return } proc TravelRealTimeOn {} { # real-time logging (re-)started global Travel if { $Travel(nav) == "nolog" } { TravelNavCmd resume } return } ##### configuring the travel displays proc TravelSetUp {dsp} { # set up/change the contents of the travel display $dsp global Travel WConf TXT MESS DPOSX DPOSY COLOUR # used explicitly elsewhere set w .travsetup if { [winfo exists $w] } { bell ; Raise $w ; return } set Travel(font,new) [set Travel(font,txt) ""] GMToplevel $w travdsetup +$DPOSX+$DPOSY {} \ [list WM_DELETE_WINDOW "destroy $w"] \ [list "TravelSUAction ok $dsp"] label $w.tit -text "$TXT(travdsetup) $dsp" frame $w.fr -relief flat -borderwidth 5 # values and titles frame $w.fr.frl foreach l "hide show" col "0 3" { label $w.fr.frl.$l -text $TXT($l) BalloonBindings $w.fr.frl.$l trvhlpbox grid $w.fr.frl.$l -row 0 -column $col -sticky nesw } foreach b "a b" col "0 3" e "nuels cfels" { listbox $w.fr.frl.bx$b -height 12 -width 15 -relief groove \ -yscrollcommand "$w.fr.frl.bscr$b set" -selectmode extended scrollbar $w.fr.frl.bscr$b -command "$w.fr.frl.bx$b yview" set Travel(move,bx$b) "" grid $w.fr.frl.bx$b -row 1 -column $col -sticky nesw grid $w.fr.frl.bscr$b -row 1 -column [expr $col+1] -sticky nesw foreach ev " " p "start end" { bind $w.fr.frl.bx$b $ev "TravelSUMove $p bx$b $e %x %y" } bind $w.fr.frl.bx$b \ "TravelSUMove enter-down bx$b $e %X %Y; break" foreach ev " " p "go enter leave" { bind $w.fr.frl.bx$b $ev "TravelSUMove $p bx$b $e %X %Y" } } set Travel(dsup,cfels) "" set Travel(dsup,nuels) [concat $Travel(cvss) $Travel(els)] foreach e $Travel(conf,$dsp) { lappend Travel(dsup,cfels) $e if { [regsub {^lab\+} $e "" e] } { set t "$TXT(TRV$e), $TXT(label)" } else { set t $TXT(TRV$e) } $w.fr.frl.bxb insert end $t if { [set ix [lsearch -exact $Travel(dsup,nuels) $e]] != -1 } { set Travel(dsup,nuels) [lreplace $Travel(dsup,nuels) $ix $ix] } else { destroy $w set Travel(conf,$dsp) "" GMMessage $MESS(badtrvconf) return [TravelSetUp $dsp] } } foreach e $Travel(dsup,nuels) { $w.fr.frl.bxa insert end $TXT(TRV$e) } frame $w.fr.frl.frb foreach b "a at r" ti "add addlabelled remove" al "- - <" ar "> > -" { button $w.fr.frl.frb.b$b -text "${al}--$TXT($ti)--$ar" \ -command "TravelSUAction $ti $dsp" grid $w.fr.frl.frb.b$b } grid [BalloonButton $w.fr.frl.frb.bhlp trvhlpbxs] grid $w.fr.frl.frb -row 1 -column 2 -sticky n # options: font frame $w.fr.fro -borderwidth 1 -bg $COLOUR(messbg) button $w.fr.fro.ftsel -text $TXT(optTRAVELFONT) -relief raised \ -command "TravelSUAction font $dsp \[GMSelectFont\]" label $w.fr.fro.ft -textvariable Travel(font,txt) -width 40 grid $w.fr.fro.ftsel $w.fr.fro.ft # ok, cancel buttons frame $w.fr.frbs button $w.fr.frbs.ok -text $TXT(ok) \ -command "destroy $w ; TravelSUAction ok $dsp" button $w.fr.frbs.cnc -text $TXT(cancel) -command "destroy $w" grid $w.fr.frbs.ok grid $w.fr.frbs.cnc -row 0 -column 1 grid $w.fr.frl grid $w.fr.fro -pady 5 grid $w.fr.frbs -pady 7 grid $w.tit grid $w.fr # change to display $dsp $WConf(travel,fr).fctrl.b$dsp invoke $WConf(travel,fr).fctrl.b$dsp select update idletasks return } proc TravelSUMove {how box lref x y} { # move element in listbox $box under travel display set up dialog # $how in {start, go, end, enter-down, enter, leave} # $lref is used to access the list $Travel(dsup,$lref) containing the # internal representations of the listbox elements # $x,$y are either the coordinates inside the listbox (for $how==start # and $how==end) or the global coordinates global Travel COLOUR set pb .travsetup.fr.frl.$box set tb .travmv$box switch $how { start { set ix [$pb index @$x,$y] if { [set el [$pb get $ix]] == "" } { return } if { $Travel(move,$box) != "" } { destroy $tb } else { set Travel(move,$box) in } NewBalloon $tb $el \ +[expr $x+[winfo rootx $pb]+9]+[expr $y+[winfo rooty $pb]+9] set Travel(move,$box,el) $el set Travel(move,$box,ix) $ix } enter-down { if { $Travel(move,$box) == "out" } { if { [winfo exists $tb] } { set Travel(move,$box) in wm geometry $tb +[expr $x+9]+[expr $y+9] } else { set Travel(move,$box) "" } } } enter { if { $Travel(move,$box) != "" } { destroy $tb ; set Travel(move,$box) "" } } go { if { $Travel(move,$box) == "in" && [winfo exists $tb] } { wm geometry $tb +[expr $x+9]+[expr $y+9] } } end { if { $Travel(move,$box) == "in" && [winfo exists $tb] } { destroy $tb ; set Travel(move,$box) "" set fix [$pb index @$x,$y] set ix $Travel(move,$box,ix) set e [lindex $Travel(dsup,$lref) $ix] if { $fix != $ix } { $pb delete $ix $pb insert $fix $Travel(move,$box,el) set Travel(dsup,$lref) \ [lreplace $Travel(dsup,$lref) $ix $ix] set Travel(dsup,$lref) \ [linsert $Travel(dsup,$lref) $fix $e] } } } leave { if { $Travel(move,$box) == "in" } { set Travel(move,$box) "out" } } } return } proc TravelSUAction {act dsp args} { # deal with user action when setting up the travel display number $dsp # $act in {ok, add, addlabelled, remove, font} # $args contains result of proc GMSelectFont if $act==font global Travel WConf TXT TRAVELFONT TkDefaultFont set w .travsetup set bxfrom $w.fr.frl.bxa ; set bxto $w.fr.frl.bxb set fr $WConf(travel,fr) switch $act { add { if { [set s [$bxfrom curselection]] == "" } { if { [$bxfrom size] != 1 } { bell ; return } else { set s 0 } } set s [lsort -integer -decreasing $s] set iix [$bxto size] foreach ix $s { set ne [lindex $Travel(dsup,nuels) $ix] set Travel(dsup,nuels) [lreplace $Travel(dsup,nuels) $ix $ix] $bxfrom delete $ix $ix $bxto insert $iix $TXT(TRV$ne) set Travel(dsup,cfels) [linsert $Travel(dsup,cfels) $iix $ne] } } addlabelled { if { [set s [$bxfrom curselection]] == "" } { if { [$bxfrom size] != 1 } { bell ; return } else { set s 0 } } if { [llength $s] == 1 } { set e [lindex $Travel(dsup,nuels) $s] if { [string first "c_" $e] == 0 } { bell ; return } } else { set s [lsort -integer -decreasing $s] } set iix [$bxto size] foreach ix $s { set ne [lindex $Travel(dsup,nuels) $ix] set Travel(dsup,nuels) [lreplace $Travel(dsup,nuels) $ix $ix] $bxfrom delete $ix $ix if { [string first "c_" $ne] == 0 } { set t $TXT(TRV$ne) } else { set t "$TXT(TRV$ne), $TXT(label)" set ne lab+$ne } $bxto insert $iix $t set Travel(dsup,cfels) [linsert $Travel(dsup,cfels) $iix $ne] } } remove { if { [set s [$bxto curselection]] == "" } { if { [$bxto size] != 1 } { bell ; return } else { set s 0 } } set s [lsort -integer -decreasing $s] set iix [$bxfrom size] foreach ix $s { set ne [lindex $Travel(dsup,cfels) $ix] regsub {^lab\+} $ne "" ne set Travel(dsup,cfels) [lreplace $Travel(dsup,cfels) $ix $ix] $bxto delete $ix $ix $bxfrom insert $iix $TXT(TRV$ne) set Travel(dsup,nuels) [linsert $Travel(dsup,nuels) $iix $ne] } } font { if { [set f [lindex $args 0]] != "" } { if { [set ft $f] == "default" } { set ft $TXT(default) if { [set f $TRAVELFONT] == "default" } { set f $TkDefaultFont } } set Travel(font,txt) $ft set Travel(font,new) $f } } ok { if { $Travel(font,new) != "" } { set Travel(font) $Travel(font,new) TravelInitFonts recreate foreach e $Travel(els) { $fr.fri.f$dsp.$e configure -font $Travel(font) $fr.fri.f$dsp.t_$e configure -font $Travel(font) } } if { $Travel(dsup,cfels) != $Travel(conf,$dsp) } { set Travel(conf,$dsp) $Travel(dsup,cfels) foreach s [grid slaves $fr.fri.f$dsp] { grid forget $s } TravelDraw $fr $dsp } } } return } proc TravelInitFonts {how} { # create/recreate auxiliary fonts for travel display # $how=="recreate" means that the $Travel(font) changed and # the auxiliary fonts must be remade # two variants of the travel frame font are at stake and # have fixed names: travelfontb, travelfontb2 # recreating a font automatically updates widgets using it # as the name is the same global Travel if { $how == "recreate" } { font delete travelfontb travelfontb2 } elseif { ! [catch {set $Travel(fontb)}] } { return } set avps [font actual $Travel(font)] foreach {a v} $avps { set [string replace $a 0 0] $v } if { $size > 0 } { set d2 2 } else { set d2 -2 } if { $weight == "bold" } { # change the slant to make it different if { $slant == "italic" } { set opts "-slant roman" } else { set opts "-slant italic" } } else { set opts "-weight bold" } set fb [eval font create travelfontb $avps] eval font configure $fb $opts set Travel(fontb) $fb append opts " -size " [expr $size+$d2] set fb2 [eval font create travelfontb2 $avps] eval font configure $fb2 $opts set Travel(fontb2) $fb2 return } ##### warnings proc TravelWarnConfigure {} { # configure warnings # warnings considered here as belonging to $Travel(warnings): # prox, anchor, speed, trn, vspeed, xtk # all values in $Travel(warn,...) saved to Travel(wcfg,...) global Travel COLOUR DPOSX DPOSY TXT NAMEWIDTH DTUNIT SPUNIT set w .travwrnconf if { [winfo exists $w] } { bell ; Raise $w ; return } foreach p [array names Travel warn,*] { regsub {^warn,} $p "" s set Travel(wcfg,$s) $Travel($p) } GMToplevel $w warnconf +$DPOSX+$DPOSY {} \ [list WM_DELETE_WINDOW "destroy $w"] \ { {TravelWCAction ok}} label $w.tit -text $TXT(warnconf) frame $w.fr -relief flat -borderwidth 5 frame $w.fr.fc -relief flat -borderwidth 1 -bg $COLOUR(messbg) set fr $w.fr.fc label $fr.prior -text $TXT(priority) foreach x "prox anchor speed trn vspeed xtk" { checkbutton $fr.chk$x -text $TXT(warn$x) -variable Travel(wcfg,$x) \ -anchor w -selectcolor $COLOUR(check) frame $fr.frl$x set c -1 foreach l "high medium low" { radiobutton $fr.frl$x.l$l -text $TXT($l) -value $l -anchor w \ -variable Travel(wcfg,$x,level) -selectcolor $COLOUR(check) grid $fr.frl$x.l$l -row 0 -column [incr c] -sticky w } } set nl $NAMEWIDTH foreach x "prox anchor" { button $fr.ch$x -text $TXT(select) -command "TravelWCAction selwp $x" label $fr.wp$x -textvariable Travel(wcfg,$x,wpn) -width $nl entry $fr.dt$x -textvariable Travel(wcfg,$x,dst) -width 4 \ -justify right label $fr.du$x -text $DTUNIT } foreach x "speed trn xtk" \ u [list $SPUNIT $TXT(degrees) $DTUNIT] { entry $fr.max$x -textvariable Travel(wcfg,$x,max) -width 4 \ -justify right label $fr.un$x -text $u } frame $fr.fs entry $fr.fs.minvspeed -textvariable Travel(wcfg,vspeed,min) -width 4 \ -justify right label $fr.fs.sepvspeed -text "---" entry $fr.fs.maxvspeed -textvariable Travel(wcfg,vspeed,max) -width 4 \ -justify right label $fr.fs.unvspeed -text m/s grid $fr.prior -row 0 -column 5 -sticky ew set r 0 foreach x "prox anchor speed vspeed trn xtk" { grid $fr.chk$x -row [incr r] -column 0 -sticky ew grid $fr.frl$x -row $r -column 5 -sticky ew set row_$x $r } foreach x "prox anchor" { set r [set row_$x] grid $fr.dt$x -row $r -column 1 -sticky ew grid $fr.du$x -row $r -column 2 -sticky w grid $fr.ch$x -row $r -column 3 -padx 5 grid $fr.wp$x -row $r -column 4 } foreach x "speed trn xtk" { set r [set row_$x] grid $fr.max$x -row $r -column 1 -sticky ew grid $fr.un$x -row $r -column 2 -sticky w } grid $fr.fs.minvspeed -row 0 -column 0 -sticky ew grid $fr.fs.sepvspeed -row 0 -column 1 -sticky ew grid $fr.fs.maxvspeed -row 0 -column 2 -sticky w grid $fr.fs.unvspeed -row 0 -column 3 -sticky w grid $fr.fs -row $row_vspeed -column 1 -columnspan 3 -sticky w frame $w.fr.frbs button $w.fr.frbs.ok -text $TXT(ok) \ -command "$w.fr.frbs.ok configure -state normal ; \ TravelWCAction ok $w" button $w.fr.frbs.cnc -text $TXT(cancel) -command "destroy $w" grid $w.fr.frbs.ok grid $w.fr.frbs.cnc -row 0 -column 1 grid $w.fr.fc grid $w.fr.frbs -pady 7 grid $w.tit ; grid $w.fr return } proc TravelWCAction {act args} { # react to action when configuring warnings # $args: # if $act==ok (end of configuration): window to destroy on success # if $act=selwp: name of warning in {prox, anchor} # warnings considered here as belonging to $Travel(warnings): # prox, anchor, speed, trn, vspeed, xtk global Travel WPName WPPosn WPDatum TXT MESS switch $act { selwp { if { [set ix [ChooseItems WP single]] == "" } { return } set Travel(wcfg,$args,wpn) $WPName($ix) set Travel(wcfg-int,$args,wpix) $ix } ok { # check values for all active warnings set ws "" foreach e $Travel(warnings) { if { $Travel(wcfg,$e) } { lappend ws $e switch $e { prox - anchor { if { $Travel(wcfg,$e,wpn) == "" } { GMMessage $MESS(badWP) return } if { [BadParam $TXT(warn$e) float>0 \ $Travel(wcfg,$e,dst)] } { return } } trn { if { [BadParam $TXT(warn$e) long=0,180 \ $Travel(wcfg,$e,max)] } { return } } vspeed { if { [BadParam $TXT(warn$e) float \ $Travel(wcfg,$e,min)] || \ [BadParam $TXT(warn$e) \ float>$Travel(wcfg,$e,min) \ $Travel(wcfg,$e,max)] } { return } } speed - xtk { if { [BadParam $TXT(warn$e) float>0 \ $Travel(wcfg,$e,max)] } { return } } } } } foreach e $ws { foreach p [array names Travel wcfg,$e*] { regsub {^wcfg,} $p "" s set Travel(warn,$s) $Travel($p) } if { $e == "prox" || $e == "anchor" } { set ix $Travel(wcfg-int,$e,wpix) set p $WPPosn($ix) if { $WPDatum($ix) != $Travel(nav,datum) } { set p [ToDatum [lindex $p 0] [lindex $p 1] \ $WPDatum($ix) $Travel(nav,datum)] } set Travel(warn,$e,pos) $p } } destroy $args } } return } proc TravelWarn {mess level} { # issue warning message if $Travel(warn) global Travel if { $Travel(warn) } { TravelDoWarn $mess $level } return } proc TravelDoWarn {mess level} { # display warning message on left-upper corner of map # $level in {important, high, medium, normal, low, info} is the priority # level used in cancelling existing warnings and in selecting the # colour global Travel Map MAPCOLOUR set n [lsearch -exact {important high medium normal low info} $level] if { [winfo exists .travelwarn] } { if { $n > $Travel(warnprior) } { return } after cancel $Travel(warncancel) destroy .travelwarn } set Travel(warnprior) $n GMToplevel .travelwarn "" +[winfo rootx $Map]+[winfo rooty $Map] {} {} {} wm resizable .travelwarn 0 0 wm overrideredirect .travelwarn 1 message .travelwarn.m -aspect 800 -text $mess \ -font $Travel(font) -fg $MAPCOLOUR(trvwrn$level) pack .travelwarn.m set Travel(warncancel) [after 4000 { destroy .travelwarn }] return } ##### navigation proc TravelNav {where} { # start navigation # $where in {MOB, WP, RT, TR, LN, GoBack} global Travel WConf RealTimeLogOn TXT if { ! $RealTimeLogOn } { TravelDoWarn $TXT(trvwnolog) important return } if { $Travel(nav) != "" } { TravelDisplayChange clear set Travel(nav) "" } TravelDisplayChange restore if { $where == "MOB" } { if { $Travel(prevtime) == -1 } { TravelDoWarn $TXT(trvwnopos) important return } TravelNavToMOB } else { if { $where == "WP" } { set ix [ChooseItems WP single] } elseif { $where == "GoBack" } { if { $Travel(posns) == "" } { TravelDoWarn $TXT(trvwnopos) important set ix "" } else { set ix ok } } else { # RT, TR, LN set ix [ChooseItems $where single \ "Travel(nav,pmode) Travel(nav,pnear) Travel(nav,prvrs)" \ [list "@$TXT(exactly)" "@$TXT(fromnrst)" "@$TXT(inrvrs)"]] } if { $ix == "" || ! [TravelNavTo$where $ix] } { TravelDisplayChange clear return } } set mn $WConf(travel,fr).fctrl.ctrl.mn foreach z "abort suspend" { $mn entryconfigure $Travel(travel,mn$z) -state normal } set Travel(nav) on ; set Travel(nav,dtype) $where set Travel(nav,ok) 1 ; set Travel(nav,towarn) $Travel(warn) return } proc TravelNavToWP {ix} { # start navigation to WP with given index # return 1 (cannot fail) global Travel WPPosn WPDatum WPName set p $WPPosn($ix) if { $WPDatum($ix) != $Travel(nav,datum) } { set p [ToDatum [lindex $p 0] [lindex $p 1] \ $WPDatum($ix) $Travel(nav,datum)] } set Travel(nav,nxtgoal) $p set Travel(nav,afternxt) "" set Travel(nav,save) nxtWP set Travel(nav,mode) exact set Travel(nav,state) starting set Travel(info,nxtWP) $WPName($ix) return 1 } proc TravelNavToMOB {} { # start navigation to previous position (MOB) global Travel RealTimeLogAnim # create MOB WP set p [FormatLatLong [lindex $Travel(prevposn) 0] \ [lindex $Travel(prevposn) 1] DDD] set n [NewName WP MOB] set d [FormData WP "Name Commt Posn PFrmt Datum Symbol Obs" \ [list $n MOB $p DDD $Travel(nav,datum) MOB "MOB\n[NowTZ]"]] # display on map if animating StoreWP -1 $n $d $RealTimeLogAnim # go there TravelNavToWP [IndexNamed WP $n] return } proc TravelMarkPoint {} { # create waypoint at current log position global Travel RealTimeLogAnim TXT CREATIONDATE if { [set secs $Travel(prevtime)] == -1 } { TravelDoWarn $TXT(trvwnopos) info return } set p [FormatLatLong [lindex $Travel(prevposn) 0] \ [lindex $Travel(prevposn) 1] DDD] set opts [list create revert cancel] set dt [DateFromSecs $secs] if { $CREATIONDATE } { GMWPoint -1 $opts \ [FormData WP "PFrmt Posn Datum Date Displ" \ [list DDD $p $Travel(nav,datum) $dt $RealTimeLogAnim]] } else { GMWPoint -1 $opts \ [FormData WP "Commt PFrmt Posn Datum Displ" \ [list [DateCommt $dt] DDD $p $Travel(nav,datum) \ $RealTimeLogAnim]] } return } proc TravelNavToRT {ix} { # start navigation to RT with given index # return 0 on failure global Travel RTWPoints WPPosn WPDatum TXT set ps "" foreach nwp [set wpns $RTWPoints($ix)] { if { [set wpix [IndexNamed WP $nwp]] == -1 } { TravelDoWarn $TXT(trvwuwps) normal return 0 } set p $WPPosn($wpix) if { $WPDatum($wpix) != $Travel(nav,datum) } { set p [ToDatum [lindex $p 0] [lindex $p 1] \ $WPDatum($wpix) $Travel(nav,datum)] } lappend ps $p lappend wpixs $wpix } if { $Travel(nav,pmode) } { set Travel(nav,mode) exact } else { set Travel(nav,mode) approx set Travel(nav,nxtleg) "" } foreach "ps wpns" [TravelNavParams $ps $wpns] {} set Travel(nav,wpns) $wpns TravelNavLine $ps [lindex $wpns 0] return 1 } proc TravelNavToTR {ix} { # start navigation to TR with given index # return 0 on failure global Travel TRTPoints TRDatum TXT if { $Travel(nav,pmode) } { set Travel(nav,mode) exact } else { set Travel(nav,mode) approx set Travel(nav,nxtleg) "" } set ps $TRTPoints($ix) ; set trdatum $TRDatum($ix) set datum $Travel(nav,datum) set Travel(nav,conv) "" if { $Travel(nav,mode) == "approx" && [llength $ps] > 150 } { # convert to list of at most 150 points and follow it set ps [TRCvTR $ps 150 $trdatum travel] set Travel(nav,conv) "*" } if { $TRDatum($ix) != $datum } { set ps [ChangeTPsDatum $ps $trdatum $datum] } set ps [lindex [TravelNavParams $ps ""] 0] TravelNavLine $ps "$TXT(TP) $Travel(nav,conv)0" return 1 } proc TravelNavToLN {ix} { # start navigation to LN with given index # return 0 on failure global Travel LNLPoints LNDatum TXT if { $Travel(nav,pmode) } { set Travel(nav,mode) exact } else { set Travel(nav,mode) approx set Travel(nav,nxtleg) "" } set ps "" foreach lp $LNLPoints($ix) { lappend ps [lindex $lp 0] } set lndatum $LNDatum($ix) ; set datum $Travel(nav,datum) set Travel(nav,conv) "" if { $Travel(nav,mode) == "approx" && [llength $ps] > 150 } { # convert to list of at most 150 points and follow it set ps [TRCvTR $ps 150 $lndatum travel] set Travel(nav,conv) "*" } if { $lndatum != $datum } { set ps [ChangeLPsDatum $ps $lndatum $datum DDD] } set ps [lindex [TravelNavParams $ps ""] 0] TravelNavLine $ps "$TXT(LP) $Travel(nav,conv)0" return 1 } proc TravelNavToGoBack {args} { # go back using current list of positions # follow it exactly, from last position to first ($Travel(posns) is # in that order) global Travel TXT set Travel(nav,mode) exact set Travel(nav,conv) "*" TravelNavLine $Travel(posns) "$TXT(TP) $Travel(nav,conv)0" return 1 } proc TravelNavLine {ps np} { # initialize variables to follow a line (RT, TR, LN or log) # $ps is list of positions # $np is name of next point global Travel WConf set Travel(nav,ps) $ps set Travel(nav,nxtgoal) [lindex $ps 0] set Travel(nav,afternxt) [lindex $ps 1] set Travel(nav,save) "prvWP nxtWP" set Travel(nav,state) starting set Travel(nav,ix) 0 if { [set Travel(nav,maxix) [expr [llength $ps]-1]] > 0 } { set mn $WConf(travel,fr).fctrl.ctrl.mn $mn entryconfigure $Travel(travel,mnchggoal) -state normal } set Travel(info,prvWP) "" set Travel(info,nxtWP) $np # used for TR, LN and GoBack set Travel(ptname) [lindex $np 0] return } proc TravelNavParams {ps ns} { # using list of positions and corresponding names (may be void) # return pair with new lists taking into account the selected # parameters: # $Travel(nav,pnear) if to start from nearest point # $Travel(nav,prvrs) if to follow in reverse order global Travel TXT set rev $Travel(nav,prvrs) if { $Travel(nav,pnear) } { if { $Travel(prevtime) != -1 } { set datum $Travel(nav,datum) set currpos $Travel(prevposn) set dmin 1e77 ; set ix 0 foreach p $ps { if { [set nd [ComputeDist $currpos $p $datum]] < $dmin } { set ixm $ix ; set dmin $nd } incr ix } if { $rev } { set rps [lrange $ps 0 $ixm] ; set rns [lrange $ns 0 $ixm] set ps "" ; set ns "" foreach p $rps n $rns { set ps [linsert $ps 0 $p] ; set ns [linsert $ns 0 $n] } } else { set ps [lrange $ps $ixm end] ; set ns [lrange $ns $ixm end] } set Travel(nav,conv) "*" return [list $ps $ns] } TravelDoWarn $TXT(trvwnopos) important } if { $rev } { set rps $ps ; set rns $ns set ps "" ; set ns "" foreach p $rps n $rns { set ps [linsert $ps 0 $p] ; set ns [linsert $ns 0 $n] } set Travel(nav,conv) "*" } return [list $ps $ns] } proc TravelNavCmd {cmd} { # process user/internal command when navigating # $cmd in {chggoal, abort, suspend, resume} global Travel WConf set mn $WConf(travel,fr).fctrl.ctrl.mn switch $cmd { abort { set Travel(nav) "" foreach z "chggoal abort suspend resume" { $mn entryconfigure $Travel(travel,mn$z) -state disabled } TravelDisplayChange clear } suspend { set Travel(nav) susp ; set vs "" foreach e $Travel(nav,save) { lappend vs $Travel(info,$e) } set Travel(nav,saved) $vs set Travel(nav,chggstate) \ [$mn entrycget $Travel(travel,mnchggoal) -state] $mn entryconfigure $Travel(travel,mnchggoal) -state disabled $mn entryconfigure $Travel(travel,mnsuspend) -state disabled $mn entryconfigure $Travel(travel,mnresume) -state normal TravelDisplayChange suspend } resume { $mn entryconfigure $Travel(travel,mnchggoal) \ -state $Travel(nav,chggstate) $mn entryconfigure $Travel(travel,mnsuspend) -state normal $mn entryconfigure $Travel(travel,mnresume) -state disabled TravelDisplayChange restore foreach e $Travel(nav,save) v $Travel(nav,saved) { set Travel(info,$e) $v } set Travel(nav) on } chggoal { if { [TravelChangeGoal] || $Travel(nav,afternxt) == "" } { $mn entryconfigure $Travel(travel,mnchggoal) -state disabled } } } return } ##### displaying information proc TravelDisplayChange {act} { # change information on current travel/navigation in displays # $act in {notraveldata, clear, suspend, restore} # assume $Travel(_,els) is list of relevant $e used in accessing # Travel(info,$e), and $Travel(_,cvels) is list of pairs with # canvas and tag $t of relevant item in canvas (coloured # $MAPCOLOUR(trv$t) when in normal state) global Travel WConf COLOUR MAPCOLOUR set nels $Travel(nav,els) ; set cvels $Travel(nav,cvels) set fri $WConf(travel,fr).fri switch $act { notraveldata { foreach e $Travel(trav,els) { set Travel(info,$e) "" } set Travel(info,vel_z) "" foreach p $Travel(trav,cvels) { foreach "cv tag" $p {} foreach dsp $Travel(displays) { $fri.f$dsp.$cv itemconfigure $tag -fill $COLOUR(dialbg) $fri.f$dsp.$cv lower $tag } } } clear { foreach e $nels { set Travel(info,$e) "" } foreach p $cvels { foreach "cv tag" $p {} foreach dsp $Travel(displays) { $fri.f$dsp.$cv itemconfigure $tag -fill $COLOUR(dialbg) $fri.f$dsp.$cv lower $tag } } } suspend { foreach e $nels { foreach dsp $Travel(displays) { $fri.f$dsp.$e configure -bg red } } foreach p $cvels { foreach "cv tag" $p {} foreach dsp $Travel(displays) { $fri.f$dsp.$cv itemconfigure $tag -fill red } } } restore { foreach e $nels { set Travel(info,$e) "" foreach dsp $Travel(displays) { $fri.f$dsp.$e configure -bg $COLOUR(bg) } } foreach p $cvels { foreach "cv tag" $p {} foreach dsp $Travel(displays) { $fri.f$dsp.$cv itemconfigure $tag -fill $MAPCOLOUR(trv$tag) } } } } return } proc TravelBadDate {} { # a message with invalid date was received global WConf Travel foreach dsp $Travel(displays) { $WConf(travel,fr).fri.f$dsp.hour configure -bg orange } return } proc TravelData {hms posn lat long fix alt velx vely vel_z trk speed} { # compute and display new data # $hms is list with hour, minutes and seconds # $posn is current position # $lat, $long in formatted DMS corresponding to $posn # $fix in {error, _, 2D, 3D, 2D-diff, 3D-diff, GPS, DGPS, Auto, # simul} # the following arguments may be "_" for undefined, and stand for # altitude (m), velocity components (m/s), true course (degrees), # and speed (km/h) global WConf Travel RealTimeLogLast COLOUR MAPCOLOUR TXT DSCALE set fr $WConf(travel,fr) # fix if { $fix == "error" } { if { $Travel(nav) == "on" && $Travel(nav,ok) } { TravelNavCmd suspend set Travel(nav,ok) 0 } foreach dsp $Travel(displays) { $fr.fri.f$dsp.fix configure -bg red } return } if { $fix == "_" || $fix == "simul" } { set c orange } else { set c lightgreen } foreach dsp $Travel(displays) { $fr.fri.f$dsp.fix configure -bg $c } # time set hour [eval format %d:%02d:%02d $hms] foreach dsp $Travel(displays) { $fr.fri.f$dsp.hour configure -bg $COLOUR(bg) } # formatted position set pos "$lat $long" # altitude if { [string first "2D" $fix] == 0 } { set alt "" ; set vel_z "_" } elseif { $alt != "_" } { set alt [expr round($alt)] } else { set alt "" } # vertical speed if { $vel_z == "_" } { set vel_z "" foreach dsp $Travel(displays) { $fr.fri.f$dsp.c_vel_z itemconfigure vel_z -fill $COLOUR(dialbg) } } else { if { $vel_z < 0 } { if { $Travel(wdgts,vel_z,up) } { TravelObjectUpDown vel_z set Travel(wdgts,vel_z,up) 0 } } elseif { $vel_z > 0 && ! $Travel(wdgts,vel_z,up) } { TravelObjectUpDown vel_z set Travel(wdgts,vel_z,up) 1 } # used below as number! set vel_z [format "%4d" [expr round($vel_z)]] } # speed, true course and horizontal velocity vector set dtime [expr $RealTimeLogLast-$Travel(prevtime)] if { $velx == "_" || $vely == "_" } { if { $speed != "_" && $trk != "_" } { set a [expr $trk*0.01745329251994329576] # m/s set velx [expr $speed*sin($a)/3.6] set vely [expr $speed*cos($a)/3.6] } elseif { $dtime < $Travel(nav,maxdtime) } { # assume $Travel(prevtime) != -1 because $RealTimeLogLast # is much larger than $Travel(nav,maxdtime) # m/s set latp [lindex $Travel(prevposn) 0] set longp [lindex $Travel(prevposn) 1] set latc [lindex $posn 0] ; set longc [lindex $posn 1] set cosmlat [expr cos(($latp+$latc)*0.00872664625997164788)] set velx [expr 111120.0*($longc-$longp)*$cosmlat/$dtime] set vely [expr 111120.0*($latc-$latp)/$dtime] } else { set velx "_" ; set vely "_" } } if { $velx != "_" } { set novel 0 ; set notrk 0 if { $trk == "_" && [set trk [VectorBearing $velx $vely]] == "_" } { set notrk 1 } # speed in km/h if { $speed == "_" } { set speed [expr sqrt($velx*$velx+$vely*$vely)*3.6] } } else { set novel 1 if { $trk == "_" } { set notrk 1 } else { set notrk 0 } } if { $notrk } { set trk "" foreach c "trkcts trkcts trn trn" e "trk ctss left right" { foreach dsp $Travel(displays) { $fr.fri.f$dsp.c_$c itemconfigure $e -fill $COLOUR(dialbg) } } } else { TravelTurnObjects nesw $trk foreach dsp $Travel(displays) { $fr.fri.f$dsp.c_trkcts itemconfigure trk -fill $MAPCOLOUR(trvtrk) } set trk [expr round($trk)] } # external representations of values set fix $TXT(posfix$fix) if { $speed != "_" } { set ispeed $speed # speed in user units /h set speed [expr round($speed*$DSCALE)] } else { set speed "" } foreach e "fix hour speed vel_z pos alt trk" { set Travel(info,$e) [set $e] } # needed for warnings and not set if navigation is off set trn "" ; set xtk "" set datum $Travel(nav,datum) # navigation if { $Travel(nav) == "on" } { if { ! $Travel(nav,ok) } { TravelNavCmd resume set Travel(nav,ok) 1 } # compute: ete eta vmg xtk cts trn dist set es "ete eta xtk dist vmg cts trn" set rho $Travel(nav,datum,a) while 1 { # loop through subsequent points (if any) when arrived set showcts2 0 set nxtgoal $Travel(nav,nxtgoal) set db [ComputeDistBear $posn $nxtgoal $datum] set dtkp [lindex $db 1] if { $Travel(nav,state) == "starting" } { set Travel(nav,state) on set Travel(nav,dtk) $dtkp set Travel(nav,posn0) $posn if { [set afternxt $Travel(nav,afternxt)] != "" } { set Travel(nav,dtkfn) \ [ComputeBear $nxtgoal $afternxt $datum] } } # distance in km set idist [lindex $db 0] # and in user units set dist [expr $idist*$DSCALE] foreach "d b" [ComputeDistBear $Travel(nav,posn0) $posn $datum] {} # in user units set xtk [expr 1e-3*$rho*$DSCALE*asin(sin(1000.0*$d/$rho)* \ sin(($b-$Travel(nav,dtk))*0.01745329251994329576))] set dtype $Travel(nav,dtype) ; set done 0 if { $dist <= $Travel(mindist) } { # issue arrival warning if { $Travel(nav,towarn) } { TravelWarn \ [format $TXT(trvwarrv) $Travel(info,nxtWP)] normal } if { $dtype == "WP" || $dtype == "MOB" } { set done 1 break } if { [set done [TravelChangeGoal]] } { break } continue } elseif { $Travel(nav,mode) == "approx" && \ [set afternxt $Travel(nav,afternxt)] != ""} { if { $Travel(nav,nxtleg) == "" } { set Travel(nav,nxtleg) \ [ComputeDist $nxtgoal $afternxt $datum] } set d2 [ComputeDist $posn $afternxt $datum] set sd [expr $idist+$Travel(nav,nxtleg)] if { $d2 < $Travel(chggparam)*$sd } { # change goal if { [set done [TravelChangeGoal]] } { break } continue } if { $d2 < $Travel(chggwparam)*$sd } { # show arrow pointing to goal after next set showcts2 1 } } break } if { $done } { foreach e "ete eta xtk dist" { set $e 0 } foreach e "vmg cts trn" { set $e "" } foreach dsp $Travel(displays) { $fr.fri.f$dsp.c_trkcts itemconfigure ctss -fill $COLOUR(dialbg) $fr.fri.f$dsp.c_trn itemconfigure left -fill $COLOUR(dialbg) $fr.fri.f$dsp.c_trn itemconfigure right -fill $COLOUR(dialbg) } set showcts2 0 } elseif { $notrk } { foreach e "ete eta vmg cts trn" { set $e "" } set showcts2 0 } else { # in km/h set vmg [expr $ispeed*cos(abs($dtkp-$trk)*0.01745329251994329576)] if { $vmg < 0.001 } { set ete [set eta "######"] set cts $dtkp } else { # seconds set ete [expr round(3600.0*$idist/$vmg)] # time from receiver; cannot use computer time # and Tcl "clock" procedure foreach "h m s" $hms {} incr s $ete ; incr m [expr $s/60] set s [expr $s%60] ; set h [expr ($h+$m/60)%24] set m [expr $m%60] set eta [format %d:%02d:%02d $h $m $s] set ete [clock format $ete -format %T] # no computation of drift set cts $dtkp } set trn [TravelLeftRight trn [expr $cts-$trk]] TravelTurnArrow cts $trn set vmg [expr round($vmg*$DSCALE)] } foreach e "dist xtk" { set $e [expr round([set $e])] } if { $showcts2 } { TravelTurnArrow cts2 \ [expr [ComputeBear $posn $afternxt $datum]-$trk] } else { foreach dsp $Travel(displays) { $fr.fri.f$dsp.c_trkcts itemconfigure cts2 -fill $COLOUR(dialbg) $fr.fri.f$dsp.c_trkcts lower cts2 trk } } foreach e $es { set Travel(info,$e) [set $e] } } # warnings (see initialization of Travel(warn:...) for list of # variables assumed to be defined here foreach e $Travel(warnings) { if { $Travel(warn,$e) && [expr $Travel(warn:$e,cond)] } { eval TravelWarn $Travel(warn:$e,cont) $Travel(warn,$e,level) } } # saving current position and time-stamp set Travel(prevposn) $posn ; set Travel(prevtime) $RealTimeLogLast set Travel(posns) [linsert $Travel(posns) 0 $posn] update idletasks return } proc TravelChangeGoal {} { # change leg when following RT, TR or LN # return 1 if there are no more points global Travel TXT if { [set tix $Travel(nav,ix)] >= $Travel(nav,maxix) } { return 1 } if { $Travel(nav,dtype) == "RT" } { set Travel(info,prvWP) [lindex $Travel(nav,wpns) $tix] set Travel(info,nxtWP) [lindex $Travel(nav,wpns) [incr tix]] } else { # TR, LN or GoBack set Travel(info,prvWP) "$Travel(ptname) $Travel(nav,conv)$tix" set Travel(info,nxtWP) "$Travel(ptname) $Travel(nav,conv)[incr tix]" } # issue change warning if { $Travel(nav,towarn) } { TravelWarn [format $TXT(trvwchg) $Travel(info,nxtWP)] info } set Travel(nav,nxtgoal) $Travel(nav,afternxt) set Travel(nav,afternxt) [lindex $Travel(nav,ps) [expr $tix+1]] set Travel(nav,nxtleg) "" set Travel(nav,state) starting set Travel(nav,ix) $tix return 0 } ##### graphical proc TravelTurnArrow {el trk} { # turn arrow to point to $trk degrees and colour it # $el is used in indexing $Travel(wdgts,$el) and $MAPCOLOUR(trv$el); # the former is a list with canvas id, list of coordinates from origin # (x_m, y_m) of arrow pointing to 0, and x_m and y_m (coordinates # of rotation centre) # of x and y) global Travel MAPCOLOUR set rad [expr (360-$trk)*0.01745329251994329576] set cos [expr cos($rad)] ; set sin [expr sin($rad)] foreach "cid cs0 xm ym" $Travel(wdgts,$el) {} set cs "" foreach "x y" $cs0 { lappend cs [expr round($xm+$x*$cos+$y*$sin)] \ [expr round($ym-$x*$sin+$y*$cos)] } foreach dsp $Travel(displays) { set cv $Travel(travel,dsppfr).f$dsp.c_$cid eval $cv coords $el $cs $cv itemconfigure $el -fill $MAPCOLOUR(trv$el) $cv raise $el } update idletasks return } proc TravelTurnObjects {el trk} { # turn objects $trk degrees from vertical north # $el is used in indexing $Travel(wdgts,$el) which is a list with canvas # id, x_m and y_m (coordinates of rotation centre), followed by # object tag and list of coordinates from origin (x_m, y_m) of # object at initial position for each object global Travel set dsppfr $Travel(travel,dsppfr) set rad [expr $trk*0.01745329251994329576] set cos [expr cos($rad)] ; set sin [expr sin($rad)] foreach "cid xm ym" $Travel(wdgts,$el) { break } foreach "tag cs0" [lrange $Travel(wdgts,$el) 3 end] { set cs "" foreach "x y" $cs0 { lappend cs [expr round($xm+$x*$cos+$y*$sin)] \ [expr round($ym-$x*$sin+$y*$cos)] } foreach dsp $Travel(displays) { eval $dsppfr.f$dsp.c_$cid coords $tag $cs } } update idletasks return } proc TravelLeftRight {el diff} { # change colours of pair of left-right arrows # $el is used the canvas id and in indexing $MAPCOLOUR(trv$el); # the canvas has two items with tags "left" and "right" # $diff is desired bearing minus current bearing (both in 0..359) # assume $COLOUR(dialbg) to be the "off" colour # return turn in -180..180 global Travel MAPCOLOUR COLOUR set cu $MAPCOLOUR(trv$el) ; set cd $COLOUR(dialbg) set dir right ; set odir left if { $diff == 180 } { set cd $cu } elseif { $diff == 0 } { set cu $cd } else { if { $diff > 180 } { incr diff -360 } elseif { $diff < -180 } { incr diff 360 } if { $diff < 0 } { set dir left ; set odir right } } foreach dsp $Travel(displays) { set cv $Travel(travel,dsppfr).f$dsp.c_$el $cv itemconfigure $dir -fill $cu $cv itemconfigure $odir -fill $cd } return $diff } proc TravelObjectUpDown {el} { # turn canvas object upside down and colour it # $el is used as the canvas id and in indexing $Travel(wdgts,$el) and # $MAPCOLOUR(trv$el) # $Travel(wdgts,$el) is the sum of minimum and maximum y # the object is turned by changing the signs of the y-coordinates and # adding this sum global Travel MAPCOLOUR set cs "" set sum $Travel(wdgts,$el) set x 1 set cv $Travel(travel,dsppfr).f1.c_$el foreach xory [$cv coords $el] { if { $x } { lappend cs $xory } else { lappend cs [expr $sum-$xory] } set x [expr 1-$x] } foreach dsp $Travel(displays) { set cv $Travel(travel,dsppfr).f$dsp.c_$el $cv coords $el $cs $cv itemconfigure $el -fill $MAPCOLOUR(trv$el) } update idletasks return } gpsman-6.4.4.2/gmsrc/langit.tcl0000644000175000017500000014103612224351120014356 0ustar migmig# # This file is part of: # # gpsman --- GPS Manager: a manager for GPS receiver data # # Copyright (c) 1998-2013 Miguel Filgueiras migfilg@t-online.de # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. # # File: langit.tcl # Last change: 6 October 2013 # Italian language file by Alessandro Palmas (alpalmas _AT_ tin.it) # last input from him inserted: 16 October 2011 # # file langengl.tcl is consulted first; no need for duplicating entries here # only 3 chars long names; check also ALLMONTH in file i18n-utf8.tcl set MONTHNAMES "Gen Feb Mar Apr Mag Giu Lug Ago Set Ott Nov Dic" set DLUNIT(KM,dist) km set DLUNIT(KM,subdist) m set DLUNIT(KM,speed) km/h set DLUNIT(KM,area) kmq set DLUNIT(NAUTMILE,dist) mn set DLUNIT(NAUTMILE,subdist) ft set DLUNIT(NAUTMILE,speed) knot set DLUNIT(NAUTMILE,area) mnq set DLUNIT(STATMILE,dist) "st ml" set DLUNIT(STATMILE,subdist) ft set DLUNIT(STATMILE,speed) mph set DLUNIT(M,dist) $DLUNIT(KM,subdist) set DLUNIT(FT,dist) $DLUNIT(STATMILE,subdist) set DTUNIT $DLUNIT($DISTUNIT,dist) set SPUNIT $DLUNIT($DISTUNIT,speed) set ALUNIT $DLUNIT($ALTUNIT,dist) set MESS(RTcomp) "#\tWP\t\t$DTUNIT\tdeg\t$ALUNIT" set MESS(TRcomp) "#\t\t\t\t$ALUNIT\t$DTUNIT\t$DTUNIT\th:m:s\t$SPUNIT\tdeg" set MESS(WPNearest) "WP\t\t$DTUNIT\tdeg" array set MESS { badscale "Valore non corretto per scala mappa" oktoexit "Ok per uscire (i dati non salvati verranno persi)" okclrmap "Ok per cancellare la mappa" namelgth "I nomi non debbono superare i %d caratteri" cmmtlgth "I commenti non debbono superare i %d caratteri" namevoid "Il nome non pu essere lasciato in bianco" baddate "Data non corretta; linea" badhdg "inizio non corretto %s: deve essre %s o +/-" badcoord "Valore o formato delle coordinate non corretto: \"%s\" deve essere %s" outofrng "Il numero eccede i limiti" UTMZN "deve essere una lettera compresa tra A..H, J..N, o P..Z" badstrg "Carattere(i) non corretto(i)" strgvoid "La stringa non pu essere vuota" nan "\"%s\" Non un numero" written "Scritto da" undefWP "La rotta %s ha WP non definiti; non salvata/esportata" bigRT "Rotta %s > num. max; non esportata" unkndatum "Datum sconosciuto" badcommdWP "Comando scorretto caricando i WPs; linea" notabsWP "Definizione WP scorretta; no tabs, linea" undefinedWP "Riferimento a WP ignoto: %s" nofieldsWP "WP scorretto, pochi campi; linea" excfieldsWP "WP scorretto, troppi campi; linea" badWPsRT "RT con lista WP scorretta; linea" toomuchWPs "Attenzione: pi di %d WPs in RT" badcommdTP "Comando scorretto caricando TPs; linea" badTP "Punto scorretto in TR; linea" badTPsTR "TR con lista trackpoints scorretta; linea" noheader "Il file non inizia con header" loaderr "Errore caricando dal file; linea" unkncommd "Comando sconosciuto caricando dal file; linea" noformat "Il file non inizia con Format line" badformat "Format line scorretta" badRT "Definizione RT scorretta; linea" badRTargs "Argomenti RT scorretti; linea" badTR "Definizione TR scorretta; linea" fileact "%s file %s?" filexists "Il file esiste!" GPSok "Connessione ok" toomany "troppi %s (> %d)" cantfgt "Non posso cancellare %s: appartiene ad un oggetto mappato" cantfgted "Non posso cancellare %s: viene editato" cantmapRTunkn "Rotta non mappata; mancano info per WP" cantmapRTed "Rotta non mappata; WP viene editato" cantrun "Cannot run" inprogr "Operazione gi in corso" cantread "non posso leggere il file ausiliario" cantwrtopt "non posso scrivere il file di preferenze" voidRT "La rotta non contiene waypoints" activeRT "La rotta 0 la rotta attiva; continuo?" voidTR "La traccia non contiene punti" idinuse "Identificatore gi in uso" cantunmap "Non Posso eliminare dalla mappa %s: appartiene ad oggetto mappato" askrevert "Ripristino i dati iniziali?" askforget "Cancello questo %s?" notimpl "Non implementato" forgetall "Cancello tutti gli oggetti nella lista %s?" counted "Ci sono %d %s definiti" notlisted "Oggetto non in lista" wrgval "valore scorretto per" voidGR "Il gruppo non contiene componenti" initselfGR "Il gruppo contiene s stesso tramite" GRelout "Comando per componente fuori definizione GR; linea" badGRels "Gruppo con lista componenti scorretta ; linea" badcommdGRel "Comando scorretto caricando componenti GR; linea" notypeforGRel "Componente privo di tipo; linea" badGRel "Definizione componente scorretta; linea" check "Controllo connessione" toomanyerr "Troppi errori; esco..." getWP "Ricevo WPoints" getRT "Ricevo Rotte" getTR "Ricevo Tracce" getLAP "Ricezione giri in corso" getAL "Ricezione almanacco in corso" putWP "Invio WPoints" putRT "Invio Rotte" putTR "Invio Tracce" fillbuffWP "Carico WP buffer" fillbuffRT "Carico RT buffer" noACKNAK "Ricevuto pachetto dati mentre aspettavo ACK/NAK; controllare la connessione con il GPS" badserial "Non riesco ad aprire il dispositivo %s" nodata "Non ci sono %s nel ricevitore" badimage "File immagine scorretto" mapadjust "Posizionare i WP sulla mappa; click su Ok quando si ha finito" duplicate "%s gi selezionato" clrcurrmap "Cancellare la mappa corrente?" mbkbaddatum "Map Datum assente o sconosciuto" mbkbadscale "La scala NON deve essere negativa" mbkbadat "Argomenti scorretti" edityourrisk "Editate a vostro rischio e pericolo!" okclrbkmap "Ok per cancellare la mappa di sfondo" okclrbkim "Ok per cancellare immagine a" goingdown "Preferenze salvate; si prega di riavviare" putwhat "Quali tipi di oggetti inviare?" readwhat "Quali tipi di oggetti leggere?" noWPinx "Troppi WP per il ricevitore" noICinx "Troppi IC per il ricevitore" getIC "Carico le icone" serial1 "Header Preamble scorretto" serial2 "Ricevuto Comando scorretto" checksum1 "Header Checksum scorretto" checksum2 "Data Checksum error" receiver "Non connesso al dispositivo!" importonly1 "Posso importare solo un tipo di dati" exportonly1 "Posso esportare solo un tipo di dati" outdatedprefs "File di preferenze vecchio; controllarlo al pi presto" mustchoose1type "Almeno 1 tipo di oggetti deve essere selezionato" nosuchitems "Nessun oggetto corrisponde alla descrizione" resultsin "Risultati della ricerca tra i gruppi" badWP "WP non dato o indefinito" badangle "L\'angolo deve essere >0 e <360 gradi" georefhow "metodo di Geo-referenziazione" cantsolve "Non posso risolvere le equazioni" oldfilefmt "File con vecchio formato; salvare con il nuovo formato!" notUTMproj "Info per UTM salvate; proceed with projection set to" projchg "Confermare i paratmetri di proiezione" badparam "Valore scorretto per %s" connectedto "Connesso a %s" recnotsuppd "Modello ricevitore non supportato" gotprots "Ricevute definizioni dei protocolli" badprots "Definizioni dei protocolli scorrette" defprots "Uso la tabella dei protocolli" nohidden "Scarto dati nascosti?" windowdestr "La finestra stata distrutta!" badhidden "Formato scorretto per valore nascosto" replname "Sostituire \"%s\" con un nome che abbia al pi %d dei seguenti caratteri: %s" badalt "Valore scorretto per altitudine" baddistunit "Unit non corretta per scala mappa in file di preferenze" badattr "Nome di attributo non corretto" badfield "Coppia attributo=valore non corretta" missattrs "Attributo/i mancante/i" badSYMBOLcode "Codice simbolo non corretto" badDISPOPTcode "Codice modo visualizzazione WP non corretto" badplatform "I/O seriale non supportato su questa piattaforma" badProjargs "Argomento proiezione errato" badTransfargs "Argomenti trasformazione errati" mbkbadproj "Proiezione cartogr. errata" mbkbadtransf "Trasf. cartogr. errata" unknProj "Proiezione cartogr. non supportata" unknTransf "Trasf. cartogr. non supportata" transfcantscale "La trasf. scelta non accetta scalamento" badRS "Tratto di rotta oltre limiti RT; linea" badWPsRSs "Tratto di rotta precedente primo WP o successivo all'ultimo WP; linea" cantchkprot "Controllo connessione impossibile con il protocollo corrente" badgridzone "Zona griglia non valida" outofgrid "Posizione fuori griglia" mustconn1st "Controllare prima la connessione con il ricevitore" rltmnotsupp "Registrazione in Tempo Reale non supportata dal protocollo del ricevitore" timeoffnotint "La differenza oraria deve essere un intero o terminare in .5" createdir "Creare la directory %s e ripartire" oktomkdir "Confermi la creazione della directory %s?" projnameabbr "Si diano un nome esteso ed un nome breve alla nuova proiezione" abbrevinuse "Nome breve gi in uso" nameinuse "Nome gi in uso" projinuse "Proiezione correntemente in uso; i cambiamenti verranno ignorati" gridneedsdatum "Definizione di reticolo per %s errata; datum non fornito" badgriddatum "Il datum per il reticolo %s deve essere %s" cantchggriddatum "Questo reticolo necessita del datum %s" gridinuse "Il reticolo non pu essere cancellata perch usata da %s; continuare?" gridinusenochg "Questo reticolo usato da %s; nessun cambiamento eseguito" cantwrtprgr "Non posso scrivere il file delle proiezioni dell'utente" missingdata "Dati insufficienti" cantwrtdtel "non posso scrivere il file dei datum definiti dall'utente" movingWP "Posizionare %s cliccando con il tasto sinistro\nAbbandonare cliccando con il tasto destro" needs1wp "La Rotta deve avere almeno un WP" emptypos "La posizione presenta uno o pi campi vuoti" cantwrtsstate "Non posso scrivere il file di salvataggio dello stato: %s" cantrdsstate "Non posso leggere il file di salvataggio dello stato: %s" corruptsstate "File di salvataggio dello stato corrotto: %s" editrisk "Modificate a vostro rischio!" savestate "Salvo lo stato corrente?" delsstate "Cancello tutti i file di salvataggio dello stato?" badmapinfo "File di parametri mappa errato" badMHloc "Localizzatore Maidenhead errato" areais "L'area del poligono (non autointersecante) %.3f%s" areatoosmall "Area troppo piccola (<0.001 kmq)" projarea "Calcolo area di proiezione" selfintsct "WP ripetuti: RT non si deve autointersecare" badinvmdist "Errore di approssimazione nell'inversione della distanza dal meridiano" badinvproj "Errore di approssimazione invertendo la proiezione %s" negdlatlong "L'escursione lat/long non deve essere negativa" allundef "I WP non sono definiti nel GR" badfloats "Le conversioni in virgola mobile non funzionano correttamente; siete sicuri di volervi connettere?" noprintcmd "Comando di stampa non selezionato; selezionarne uno nelle opzioni" cantexecasroot "GPSMan non pu essere eseguito da root" badargtofunc "Argomenti non corretti per la funzione %s" redefproj "La proiezione %s definita dall'utente sovrascrive una proiezione predefinita con lo stesso nome breve; Per cortesia cambiate la vostra definizione" badattr "Nome di campo opzionale %s sconosciuto: %s" badattrval "valore del capo opzionale %s errato: %s" couldntcd "tentativo di andare nella directory %s fallito" shpext "Extensione %si non corretta; cwva bene usare .shp, .shx, .dbf?" shpcntopen "Non riesco a creare/aprire file Shapefile" shpcntcrtfs "Non riesco a creare i campi Shapefile .dbf" shpcntwrtfs "Non riesco a scrivere i campi Shapefile .dbf" shpoutmem "Memoria insufficiente!" shpemptyfile "File vuoto" shpwrongfile "Tipo di file non valido" shplessdim "La dimensione nel file inferiore a quanto richiesto; continuo?" shpbadWPinRT "%d WP con coordinate errate ignorato nella RT %s" badGTMvers "Versione file GTrackMaker non accettabile" badGTMfile "Stringa iniziale errata per file GTrackMaker" badGTMcounts "Contatore/i negativi nel file GTrackMaker" badGTMlat "Latitudine fuori intervallo nel file GTrackMaker" badGTMlong "Longitudine fuori intervallo nel file GTrackMaker" badGTMdatum "Datum errato nel file GTrackMaker" unobscmap "Errore, probabilmente perch c' una finestra/icona sulla mappa; ritentare dopo attesa?" cantwrtimg "Errore nella scrittura dell'immagine su file in formato %s" TRsimplres "TR risultanti dalla semplificazione creati sotto il nome %s" cantsaveRTid "%d RT non salvata/e: identificatore non numerico" cantsaveTRid "%d TR non salvata/e: identificatore non numerico" badtrvconf "Configuratione corrotta; ripartire con una vuota" drvsimoff "simulatore di guida: non ancora partito!" needWP "Simulatore di guida: prego voler caricare o definire alcuni WP" chgrecprot "Prego cambiare il protocollo del ricevitore" clrtrvlog "Cancellare il log del viaggio?" frgetGRcs "Cancellare il gruppo e tutti i suoi elementi ?!" nmeainuse "Log in tempo reale o altro file NMEA in acquisizione" badfile "Errore leggendo da file" RTnoWPname "WP in RT indicato dal solo nome non pi supportato" distlarge "Distanza eccessiva!" timeconsmg "Oprazione che richiede tempo: continuare?" badtimeval "Valore tempo non valido" badLAP "LAP non valido; linea" lapncnsdrd "LAP ignorato" undefinedTR "TR sconosciuta" emptymenu "Men vuoto; continuo?" cantwrtsymenu "Non posso scrivere il file del men dei simboli" abbrevhasspaces "I nomi corti non debbono contenere spazi" needNpoints "Fornire almeno %s punti" twotimeoffsets "Differenti offset tempo nel file" notimeoffset "Nessun offset tempo nel file; presunto 0" baddateas "Data erronea: %s" unknownenc "Codifica carattere %s sconosciuta" chgbaudto "Provo a cambiare baud rate a %s; attendere prego ..." baudchgfailed "Non riesco a cambiare baud rate" busytrylater "Altra operazione in corso; prego riprovare pi tardi" obssplit "Risultato della suddivisione: %s chiamato \"%s\"" loginto "Login %s" samelgth "Le due stringhe debbono avere lo stesso numero di caratteri" rschkargs "La regsub chiamante ritorna errore; controllare i parametri" emptyrmeth "Il metodo di rinomina non pu esser nullo" cantwrtdefs "Impossibile scrivere il file di definizioni dell'utente" xcantbey "%s non pu essere %s" mustselftfam "Una famiglia di caratteri (font) deve essere scelta" badpluginwhere "Parametro plug-in \"where\" errato; deve essere una lista di triple" badpluginparam "Parametri plug-in errati: lista di NAME EXPR, NAME inizia con _" badpluginparamexec "Durante l'esecuzione del plug-in %s, incontrato parametro errato: %s" pluginfailed "Plug-in %s fallisce con messaggio: %s" cantwrtdir "Impossibile scrivere su %s; controllare i permessi" cantcleandir "Pulizia directory non possibile %s" defTERMCMD "L'opzione per il comando che apre una finestra emulazione terminale deve essere definita prima" gpOutfile "L'output nel file \"%s\" nella vostra directory di lavoro." gpQuitgnuplot "Premere Invio nella finestra xterm per abbandonare gnuplot." gpModgnuplot "Modica vista in finestra gnuplot." htResult1 "Traccia=\"%s\"" htResult2 "Distanza totale=%s Salita totale=%s Discesa totale=%s" htResult3 "Tempo totale impiegato=%s Tempo sosta=%s(%s) Tempo movimento=%s" htResult4 "%s Cap.piano=%s Cap.sal=%s Cap.disc=%s Est. tempo marcia=%s" srResult1 "Periodi di sosta (>5min) della traccia \"%s\"" badcumuls "Differenza in altitudine %s > salita totale %s e/o discesa %s; soglia altitudine opzionale %s %s andrebbe modificata" } set TXT(RTcompflds) "# WP {$DTUNIT} deg {$ALUNIT} stage label" set TXT(TRcompflds) \ "TP {} {} {} {$ALUNIT} {$DTUNIT} {$DTUNIT} h:m:s {$SPUNIT} deg" set TXT(starttoend) "Start: to end %s $DTUNIT;" set TXT(startmax) "max %s $DTUNIT;" set TXT(WPnearflds) "WP {$DTUNIT} deg" set TXT(within) "Within (${DTUNIT}s)" set TXT(between) "Between (${DTUNIT}s)" array set TXT { GMtit "GPS Manager - versione" exit Exit map Mappa load Carica loadfrm "Carica da" save Salva saveels "Salva componenti" saveto "Salva su" clear Cancella clearall "Cancella Tutto" newWP "Nuovo WP" newRT "Nuovo RT" newTR "Nuova TR" newGR "Nuovo GR" import Importa importfrm "Importa da" export Esporta exportels "Esporta componenti" exportto "Esporta su" count Conta trueN "Nord Vero geografico" automagn "Auto Magnetic" usrdef "User Defined" nameWP WPoint nameRT Rotta nameTR Traccia nameGR Gruppo nameMap Mappa nameRTComp "Calcolo rotta" nameTRComp "Calcolo traccia" GPSrec "Ricevitore GPS" turnoff "spegni" get Scarica put Invia all Tutto select Select selection Selezione options Opzioni message Messaggio cancel Annulla file File ovwrt Sovrascrivi app Accoda online online offline offline check prova create Crea revert Ripristina colour colore grey grigio mono mono portr ritratto landsc panorama legend Legenda incscale "Includi scala" more Ancora name Nome created Creato cmmt Commento withWP "Con questo WP:" displ "Mostra su mappa" startRT "Inizio RT" route Rotta number Numero insb "Inserisci prima" insa "Inserisci dopo" del Cancella repl "Sostituisci con" invRT "Inverti RT" comp Calcola RTcomp "Calcola rotta" savecomp "Salva il calcolo" totdst "Distanza totale" tottime "Tempo complessivo" track Traccia chophd "Taglia la testa" choptl "Taglia la coda" incb "Includi Prima" date Data newdate "Nuova data per il prossimo punto" endprTR "Fine della traccia precedente" begnxt "Inizio della successiva" date1st "Date for 1st point of next" TRcomp "Track Computation" avgsp "Velocit media" maxsp "Velocit max" minsp "Velocit min" lat Lat long Long ze ZE zn ZN eastng Easting nrthng Northing zone Zona change Cambia forget Cancella others Altri optLANG Lingua optISOLATIN1 "Lettere accentate" optDELETE "DEL cancella ultimo carattere" optMWINDOWSCONF "Finestra principale" opt_GPSRecConf "Parametri del ricevitore" optGPSREC "Modello GPS" opt_Interf "Interfaccia utente" optNAMELENGTH "Max lungh nomi" optINTERVAL "Intervallo di campionamento" optCOMMENTLENGTH "Max lungh commento" optMAXWPOINTS "Max # WPoints" optMAXROUTES "Max # Rotte" optMAXWPINROUTE "Max # WPs in Rotta" optMAXTPOINTS "Max # Trackpoints" optCREATIONDATE "Ric con data di creazione" optNOLOWERCASE "Ric privo di lettere minuscole" optDEFAULTSYMBOL "Simbolo di default per WP" opt_Data "Dati" optEQNAMEDATA "Dati con lo stesso nome" optKEEPHIDDEN "Memorizza dati nascosti" optDatum Datum optTimeOffset "Offset temporale" optACCFORMULAE "Accurate formulae" optASKPROJPARAMS "Conferma parametri proiezione" optBalloonHelp "Balloon help" opt_Formats "Unit e formati" optDISTUNIT "Distanza" KM km optPositionFormat "Formato posizione" optDateFormat "Formato data" opt_Geom "Geometria finestre" optMAPWIDTH "Largh mappa" optMAPHEIGHT "Altezza mappa" optMAPSCLENGTH "Lungh scala mappa" optMAPSCALE "Scala mappa" optMAXMENUITEMS "Max # menu items" optLPOSX "Finestra liste x-pos" optLPOSY "Finestra liste y-pos" optMPOSX "Finestra mappa x-pos" optMPOSY "Finestra mappa y-pos" optRPOSX "Finestra ric x-pos" optRPOSY "Finestra ric y-pos" optEPOSX "Finestra errore x-pos" optEPOSY "Finestra errore y-pos" optDPOSX "Dialogo x-pos" optDPOSY "Dialogo y-pos" optDPOSRTMAP "Offset RT/mappa dialogo" optLISTWIDTH "Largh liste" optLISTHEIGHT "Alt liste" optCOLOUR Colori optCOLOUR,fg "Primo piano" optCOLOUR,bg Sfondo optCOLOUR,messbg "Errore - sfondo" optCOLOUR,confbg "Conferma - sfondo" optCOLOUR,selbg "Selezione - sfondo" optCOLOUR,dialbg "Input - sfondo" optCOLOUR,offline "Ricevitore offline" optCOLOUR,online "Ricevitore online" optCOLOUR,check "Checkbutton selezionato" optMAPCOLOUR,mapsel "Oggetto mappa selezionato" optMAPCOLOUR,WP "Waypoints su mappa" optMAPCOLOUR,RT "Rotte su mappa" optMAPCOLOUR,mkRT "Rotte definite su mappa" optMAPCOLOUR,TR "Tracce su mappa" optMAPCOLOUR,TP "Punti tracce su mappa" optMAPCOLOUR,mapleg "Legenda mappe" optMAPCOLOUR,anim "Animazione su mappa" optMAPCOLOUR,emptygrid "Immagine vuota" optMAPCOLOUR,fullgrid "Immagine esistente" opt_Files "Dispositivi e file" optDEFSPORT "Device" optPERMS "Permessi file" optPAPERSIZE "Formato carta" red Rosso green Verde blue Blu owner Owner permgroup Group others Others fread Read fwrite Write fexec Exec mainwd "Finestra principale" distazim "Distanza e azimut" nearestWPs "WP pi vicini" fromto "Da %s a %s" degrees gradi nameWPDistBear "dist e azimut" nameWPNearest "WP pi vicini" inrect "Nel rettangolo" forthisWP "per questo WP" formappedWPs "per i WP su mappa" group Gruppo element Componente insert Inserisci joinGR "Unisci Gruppi" TRtoRT "Conversione da TR a RT" TRRTnpoints "N. punti da conservare" TRTRdispl "Mostra TR ora" WP WP RT RT TR TR GR GR commrec "Comunicazione con il ricevitore" abort Abort ACKs ACKs NAKs NAKs packets pacchetti unnamed "(sconosciuto)" fromTR "Da TR: %s" mapload "Geo-referenziare immagine" loadmback Carica savemback "Salva geo-ref info" chgmback Cambia clearmback Cancella backgrnd Sfondo nameMapBkInfo "Info sfondo" mpbkchg "Cambia sfondo" mpbkgrcs "Posizione rif. alla griglia" nameImage Immagine symbol Simbolo SYCATgeneral "Uso generale" SYCATland Terra SYCATwater Acque SYCATaviation Aviazione SY1st_aid "Primo Soccorso" SYWP_buoy_white "Boa, Bianca" SYWP_dot "WP" SYairport "Aeroporto" SYamusement_park "Parco Divertimenti" SYanchor "Ancora" SYavn_danger "Pericolo (avn)" SYball "Palla" SYbeach "Spiaggia" SYbell "Campana" SYboat "Barca" SYboat_ramp "Scalandrone" SYborder "Confine" SYbridge "Ponte" SYbuilding "Edificio" SYbuoy_amber "Boa, giallo ambra" SYbuoy_black "Boa, nera" SYbuoy_blue "Boa, blu" SYbuoy_green "Boa, verde" SYbuoy_green_red "Boa, verde-rossa" SYbuoy_green_white "Boa, verde-bianca" SYbuoy_orange "Boa, arancione" SYbuoy_red "Boa, rossa" SYbuoy_red_green "Boa, rosso-verde" SYbuoy_red_white "Boa, rosso-bianca" SYbuoy_violet "Boa, viola" SYbuoy_white "Boa, bianca" SYbuoy_white_green "Boa, bianco-verde" SYbuoy_white_red "Boa, bianco-rossa" SYcamping "Campeggio" SYcapitol_city "Citt, stella" SYcar "Auto" SYcar_rental "Noleggio auto" SYcar_repair "Auto officina" SYcasino "Casin" SYcastle "Castello" SYcemetery "Cimitero" SYchapel "Cappella" SYchurch "Chiesa" SYcircle_x "X cerchiata" SYcivil "Installazione civile" SYcrossing "Passerella" SYdam "Diga" SYdanger "Pericolo" SYdeer "Selvaggina" SYdiamond_green "Rombo, verde" SYdiamond_red "Rombo, rosso" SYdiver_down_1 "Punto immersione 1" SYdiver_down_2 "Punto immersione 2" SYdollar "Dollaro" SYdot "Punto" SYdrinking_water "Acqua Potabile" SYduck "Anatra" SYelevation "Rilievo" SYexit_no_serv "Uscita, senza servizi" SYexit "Uscita" SYfactory "Fabbrica" SYfish "Pesce" SYfitness "Fitness" SYflag "Bandiera" SYfreeway "Superstrada" SYfuel "Carburante" SYfuel_store "Carburante & negozio" SYgeo_name_land "Nome geografico, terra" SYgeo_name_man "Nome geografico, umano" SYgeo_name_water "Nome geografico, acqua" SYglider "Aliante" SYheliport "Eliporto" SYhorn "Corno" SYhouse "Casa" SYice_skating "Pattinaggio su ghiaccio" SYinfo "Info" SYintersection "Intersezione" SYis_highway "Strada di grande comunicazione" SYknife_fork "Cibo" SYladder "Scala" SYlanding "Atterraggio" SYlarge_city "Citt, grande" SYlarge_exit_ns "Uscita senza serv, grande" SYlarge_ramp_int "Rampa accesso, grande" SYlevee "Argine" SYlight "Faro" SYlodging "Alloggio" SYmany_fish "Banco di Pesci" SYmany_tracks "Molte impronte" SYmedium_city "Citt, media" SYmile_marker "Pietra Miliare" SYmilitary "Installazione militare" SYmine "Miniera" SYMOB "Uomo in mare!" SYmonument "Monumento" SYmountains "Monti" SYmovie "Cinema" SYmug "Bar" SYmuseum "Museo" SYntl_highway "Statale" SYnull "(trasparente)" SYnull_2 "(vuoto)" SYoil_field "Torre di estrazione" SYparachute "Paracadute" SYpark "Parco" SYparking "Parcheggio" SYpharmacy "Farmacia" SYphone "Telefono" SYpicnic "Picnic" SYpolice "Polizia" SYpost_office "Ufficio postale" SYprivate "Campo privato" SYradio_beacon "Radiofaro" SYramp_int "Rampa di accesso" SYrestrooms "WC" SYscenic "Panorama" SYschool "Scuola" SYseaplane "Idroscalo" SYshopping_cart "Centro commerciale" SYshort_tower "Torre, piccola" SYshowers "Docce" SYskiing "Sci d\'acqua" SYskull "Teschio" SYsmall_city "Citt, piccola" SYsnow_skiing "Sci" SYsoft_field "Soft field" SYsquare_green "Quadrato, verde" SYsquare_red "Quadrato, rosso" SYst_highway "Provinciale" SYstadium "Stadio" SYstore "Negozio" SYstreet_int "incrocio" SYsummit "Cima" SYswimming "Nuoto" SYtake_off "Decollo" SYtall_tower "Torre, alta" SYtheater Teatro SYtoll "Dogana, pedaggio" SYtow_truck "Carro attrezzi" SYtracks Impronte SYtrail_head "Inizio sentiero" SYtree "Albero" SYtruck_stop "Autoporto" SYtunnel "Tunnel" SYultralight "Ultraleggero" SYus_highway "Strada internazionale" SYweight_station "Stadera pubblica" SYwreck "Relitto" psvisible "Solo la parte visibile" DISPsymbol "Solo simbolo" DISPs_name "S & nome" DISPs_comment "S & commento" DISPname "Solo nome" DISPcomment "Solo commento" dispopt Mostra mapitems "Mostra oggetti sulla mappa" nameIC Icona prod Prodotto protcl "Protocollo" WPperRT "Waypoints per Route" about "Circa GPSMan..." contrib "Con il contributo di" errorsto "Riportare gli errori a:" obsTRToRT "WPs creati con conversione da TR a RT" nameLists "Liste" nameData "dati" MWCmap "Mappa" MWClists "Liste" MWCsingle "Finestra singola" search "Ricerca" rmrk "NB" closeto "Vicino a" with "Con" srchres "TROVATO" where "Dove" what "Cosa" list "lista" distance "Distanza" fromWP "dal Waypont" fromPos "dalla posizione" azimuth "puntamento-azimut" any "ogni" another "Altro" srchdd1 "Cerco su" srchdd2Data "tutti gli oggetti" srchdd2GR "Gruppo(i)" from "da" started "a partire da" transf "Coord Trasf" TRNSFAffine "Affine" TRNSFAffineConf "Aff Conforme" TRNSFNoRot "Conf No Rot" projection "Proiezione" lat0 "Lat del centro" long0 "Long del centro" k0 "Fattore di Scala a CM" PRJTM "Transversa di Mercatore" rename "Usare nuovo nome" oname "Nome originale" never "Mai" ask "Chiedi" always "Sempre" stage "Stage" label "Etichetta" alt "Altitudine" optALTUNIT "Altitudine" locate "Locate" animation Animazione fast Rapido slow Lento start Inizio pause Pausa speed Velocit centred "centrato" state Stato animinit "inizio/fine" animon "attivata" animpause "pausa" animabort "interrompi" dolog "Registra" getlog "Ricevi log" hide "Nascondi" show "Mostra" posfixerror "Errore" restar "Riparti" mkTR "Elabora TR" namePVTData "Dati registrati" dontaskagain "Stop richieste" simul "simulatore" WPCapac "Massimo numero WP" ICCapac "Massimo numero icone" RTCapac "Massimo numero rotte" TRCapac "Massimo numero tracce" ICGraph "Simboli icone" loadgrels "Carica componenti" importgrels "Importa componenti" notinGR "non presenti nel (sotto)gruppo" onlyinGR "presenti nel (sotto)gruppo" NAUTMILE "miglio marino" STATMILE "miglio terrestre" opening "Apertura" suggested "suggerita" optCOLOUR,ballbg "Fumetto sfondo" optCOLOUR,ballfg "Fumetto primo piano" optMAPCOLOUR "Colori mappa" optDEFAULTDISPOPT "Modo default visual. WP" PRJTM "Trasversa di Mercatore" PRJCMP "Mappa militare Portoghese" PRJBNG "Griglia Nazionale Britannica" PRJBWI "Indie Occidentali Britanniche" PRJITM "Trasversa di Mercatore - Irlandese" PRJGKK "Reticolo Tedesco" mkavgWP "Elabora WP med." move Sposta define Definire open Apri defs "Definizioni" baseproj "Proiezione base" abbrev "Nome breve" grid Reticolo use Usare unit Unit feasting "Falsa origine Est" fnorthing "Falsa origine Nord" bounds Limiti fixeddatum "datum fissato" lat1 "Lat 1 parallelo" lat2 "Lat 2 parallelo" latF "Lat falsa origine" longF "Long falsa origine" PRJKKJP "Reticolo base finlandese" PRJKKJY "Reticolo finlandese uniforme" PRJSEG "Reticolo svedese" elevation Profilo userdefs "Definizioni utente" actual "reale" atprevwp "Al WP precedente" here "Qui" chglstrs "Modifica il tratto precedente" chgnxtrs "Modifica il tratto successivo" contnend "Aggiungi alla fine" edmap "Modifica sulla mappa" prevwp "WP precedente" firstwp "Primo WP" chgpfrmt "Cammbia formato posizione" changegroupsymbol "Cambia simbolo" closemenu "Chiudi men" ellpsd "Ellissoide" inca "Includi dopo" invert "Inverti" opt_MapGeom "Geometria mappa" PRJLCC1 "Conica Conf di Lambert 1" PRJLCC2 "Conica Conf di Lambert 2" recwindow "Finestra del ricevitore" restart "Riparti" rtimelogintv "Intervallo di acquisizione" usewps "Usa i WPs" optSAVESTATE "Salva lo stato prima di uscire" optDELSTATE "Cancella i files dopo aver ripristinato lo stato" nameMapInfo "settaggi mappa" no No PRJAPOLY "Policonica Americana" computations Calcolo comparea "Calcolo area" cluster Dintorni centre Centro mkclusters "Costruisci dintorni" quadr Quadrangolo dlat "Escursione di latitudine" dlong "Escursione di longitudine" collcntr "Ricerco centri..." compclstr "Calcolo dintorni..." crtgclstrgrs "Creo gruppi..." PRJStereogr "Stereografica" PRJTWG "Griglia di Taiwan" chgdatum "Cambia datum" optPRINTCMD "Comando di stampa" print Stampa prevctr "Centro precedente" PRJSOM "Obliqua di Mercatore - Svizzera" PRJLV03 "Griglia svizzera LV03" PRJIcG "Griglia islandese" PRJRDG "Griglia Olandese" printopt "Opzioni di stampa" numberid "Num/Id" hiddendata "Dati protetti" YYYY/MM/DD YYYY/MM/DD cwpsdef "Punti di taratura da definire ora:" nextTP "Prossimo TP" generate Generare optSERIALBAUD "Baud Rate" optDEFTRTWIDTH "Larghezza linee RT" optDEFTTRWIDTH "Larghezza linee TR" width Larghezza TRtoTR "Semplificazione TR" TRlinedispl "Mostra il risultato adesso" obsTRsimpl "TR risultante da semplificazione" simplTRto "Semplifica in" exstglog "Log esistente" contnsly "Continuamente" animate "anima" animabbrev "anim." noanabbr "no anim." zelev "Scala rilievo" xyelev "Ingrandimento piano orizz." notext "no testo" view "Mostra" sideview "Profilo" persptv "Prospettiva" SYgeocache "Geocache" SYgeocache_fnd "Geocache trovata" optMAPCOLOUR,trvtrk "Freccia TRK" optMAPCOLOUR,trvtrn "Frecce TRN" optMAPCOLOUR,trvcts "Freccia CTS" optMAPCOLOUR,trvcts2 "Seconda freccia CTS" optMAPCOLOUR,trvvel_z "Freccia Su/gi" optMAPCOLOUR,trvwrnimportant "Avviso importante (nav)" optMAPCOLOUR,trvwrnnormal "Avviso (nav)" optMAPCOLOUR,trvwrninfo "Informazione (nav)" travel Viaggio notravel "Stop navigazione" travdisplay "Configura schermata" travchgdisplay "Vai alla schermata %s" travdsetup "Configurare schermata viaggio" navMOB "MOB: Uomo In Mare! (Man Over Board)" startnav "Navigare" navWP "Vai a WP" goback "Torna indietro" follow "Segui %s" exactly "esattamente" fromnrst "Dal pi vicino" inrvrs "al contrario" forgetgoal "Dimentica la meta" suspend "Sospendi" resume "Riprendi" TRVfix "Fix" TRVhour "Tempo" TRVspeed "Velocita" TRVpos "Pos" TRValt "Alt" TRVtrk "TRK" TRVnxtWP "A" TRVprvWP "Da" TRVete "ETE" TRVeta "ETA" TRVvmg "VMG" TRVxtk "XTK" TRVcts "CTS" TRVtrn "TRN" TRVvel_z "V speed" TRVtrkcts "TRK, CTS" TRVdist "Dist" TRVc_trkcts "Frecce TRK/CTS" TRVc_trn "Frecce TRN" TRVc_vel_z "Freccia su/gi" add "Aggiungi" addlabelled "Aggingi con nome" remove "Rimuovi" mindist "Distanza minima per arrivo" chginggoal "Cambia e vai alla prossima meta" chggoalhlp "Quando cambiare dalla\nmeta attuale alla prossima\nseguendo una RT/TR" soon presto late tardi warnings "Avvertimenti" dowarn "Emetti avvertimenti" warnconf "Configura avvertimenti" priority Priorit high alta medium media low bassa warnprox "Distanza dal WP <" warnanchor "Distanza dal WP >" warnspeed "Velocit >" warntrn "TRN (abs)>" warnvspeed "Velocit verticale" warnxtk "XTK (abs)>" fntsize "Dimensione caratteri" trvhlpbox "Usare il tasto destro del mouse per\nriordinare gli elementi sottostanti" trvhlpbxs "Usare il tasto destro del mouse per\nriordinare gli elementi della lista" trvwarrv "Stiamo per arrivare a %s!" trvwleave "Stiamo lasciando %s!" trvwspeed "Velocit > %s!" trvwtrn "TRN > %s!" trvwvspeed "Velocit vert. non entro [%s,%s]!" trvwxtk "XTK > %s!" trvwnolog "Real-time logging NON attivo!" trvwnopos "Posizione precedente non disponibile" trvwuwps "RT ha WP non definiti" trvwchg "Ora andiamo verso %s" TP TP drivesim "simulatore di guida" startfrom "Parti da..." outofctrl "Fuori controllo!" right Destra left Sinistra straight Dritto rthlpdsim "Tasti frecce: sterza, accelera, decelera\nBarra spaziatrice: dritto" chggoal "Vai alla prossima meta" Ghidden_class Classe Ghidden_subclass Sottoclasse Ghidden_lnk_ident "Ident. tratto" Ghidden_colour Colore Ghidden_attrs Attributi Ghidden_depth Profondit Ghidden_state Stato Ghidden_country Regione Ghidden_facility "Installazione" Ghidden_city Citt Ghidden_addr Indirizzo Ghidden_int_road "Intersezione stradale" Ghidden_dtyp "Mostra opt+type" Ghidden_ete "ETE" Ghidden_display "Mostrare?" Ghidden_yes S Ghidden_no No Ghidden_user "Utente" Ghidden_user_symbol "Utente (solo simbolo)" Ghidden_non_user "Non utente" Ghidden_avn_airport "Aeroporto" Ghidden_avn_inters "Intersezione Avn" Ghidden_avn_NDB "NDB" Ghidden_avn_VOR VOR Ghidden_avn_airp_rway "Soglia pista rollaggio" Ghidden_avn_airp_int "Intersezione aeroportuale" Ghidden_avn_airp_NDB "Aeroporto NDB" Ghidden_map_pt "Punto mappa" Ghidden_map_area "Area mappa" Ghidden_map_int "Intersezione mappa" Ghidden_map_addr "Indirizzo mappa" Ghidden_map_line "Linea mappa" Ghidden_locked "Protetto" Ghidden_default Default Ghidden_black Nero Ghidden_white Bianco Ghidden_red Rosso Ghidden_dark_red "Rosso scuro" Ghidden_green Verde Ghidden_dark_green "Verde scuro" Ghidden_blue Blu Ghidden_dark_blue "Blu scuro" Ghidden_yellow Giallo Ghidden_dark_yellow "Giallo scuro" Ghidden_magenta Magenta Ghidden_dark_magenta "Magenta scuro" Ghidden_cyan Ciano Ghidden_dark_cyan "Ciano scuro" Ghidden_light_gray "Grigio chiaro" Ghidden_dark_gray "Grigio scuro" Ghidden_line Linea Ghidden_link Tratto Ghidden_net Rete Ghidden_direct Diretto forgetGRcs "Rimuovi GR&Els" renres "RINOMINATO" PRJBMN "Griglia Austriaca BMN" PRJCTR "Carta Tecnica Reg (I)" optDEFMAPPROJ "Proiezione Mappa" optDEFMAPPFRMT "Coordinate mappa" optMapGuideVersion "Versione MapGuide" undo Annulla UTMzone zona tfwfile "file TFW" ok Ok GRA "Gradi centesimali" newWPatdb "Nuovo WP a..." PRJLamb93 "Lambert 93" PRJLambNTFe "NTF IIet" PRJLambNTF "NTF" NTFzone zona opinprogr "Operazione in esecuzione" working "In funzione" aborted "Abortito!" errwarn "Errore/avviso(i)!" SYbiker "Ciclista" SYbox_blue "Scatola blu" SYbox_green "Scatola verde" SYbox_red "Scatola rossa" SYflag_pin_blue "Bandierina blu" SYflag_pin_green "Bandierina verde" SYflag_pin_red "Bandierina rossa" SYhouse_2 "Casa 2" SYpin_blue "Spillo blu" SYpin_green "Spillo verde" SYpin_red "Spillo rosso" ozimapfile "file Ozi Map" info "Informazione" climbrate "Velocit ascensionale" BGAfeature "Funzionalit" BGAfindblty "Identificabile semplicamente" BGAairact "Attivit aerea" optUSESLOWOPWINDOW "Finestra per il controllo di operazioni lente" optDEFTRECPROTOCOL "Protocollo di default" optLNSREACT "LN mappate rispondono al mouse" syhlpbx "Usare il tasto destro del mouse per\nriordinare gli elementi della lista" optDEFMAPPFDATUM "Datum delle coordinate della mappa" mkgrp "Crea Gruppo" dispitems "Oggetti visibili" hiditems "Oggetti nascosti" optAutoNumRts "Numerare automaticamente le RT in uscita" Ghidden_transparent Transparente Ghidden_temp Temperatura Ghidden_time "Time stamp" Ghidden_cat Categoria SYopen_24hr "Aperto 24 ore" SYfhs_facility "Attrezzature FHS" SYbot_cond "Condizioni del fondo" SYtide_pred_stn "Stazione previsione marea/correnti" SYanchor_prohib "Divieto d'ancoraggio" SYbeacon "Segno" SYcoast_guard "Guardia Costiera" SYreef "Secca" SYweedbed "Banco d'alghe" SYdropoff "Ingresso" SYdock "Dock" SYmarina "Porticciolo" SYbait_tackle "Esche ed attrezzatura da pesca" SYstump "Ceppo" SYcntct_smiley "Smiley" SYcntct_ball_cap "Berretto da baseball" SYcntct_big_ears "Grande orecchio" SYcntct_spike "Punta" SYcntct_goatee "Pizzetto" SYcntct_afro "Cespuglio" SYcntct_dreads "Treccine" SYcntct_female1 "Femminile 1" SYcntct_female2 "Femminile 2" SYcntct_female3 "Femminile 3" SYcntct_ranger "Ranger" SYcntct_kung_fu "Kung fu" SYcntct_sumo "Sumo" SYcntct_pirate "Pirata" SYcntct_biker "Ciclista" SYcntct_alien "Alieno" SYcntct_bug "Insetto" SYcntct_cat "Gatto" SYcntct_dog "Cane" SYcntct_pig "Maiale" SYhydrant "Idrante Antincendio" SYcircle_blue "Cerchio blu" SYcircle_green "Cerchio verde" SYcircle_red "Cerchio rosso" SYdiamond_blue "Rombo blu" SYoval_blue "Ovale blu" SYoval_green "Ovale verde" SYoval_red "Ovale rosso" SYrect_blue "Cubo blu" SYrect_green "Cubo verde" SYrect_red "Cubo rosso" SYsquare_blue "Quadrato blu" SYtriangle_blue "Triangolo blu" SYtriangle_green "Triangolo verde" SYtriangle_red "Triangolo rosso" SYletter_a_blue "A blu" SYletter_a_green "A verde" SYletter_a_red "A rosso" SYletter_b_blue "B blu" SYletter_b_green "B verde" SYletter_b_red "B rosso" SYletter_c_blue "C blu" SYletter_c_green "C verde" SYletter_c_red "C rosso" SYletter_d_blue "D blu" SYletter_d_green "D verde" SYletter_d_red "D rosso" SYnumber_0_blue "0 blu" SYnumber_0_green "0 verde" SYnumber_0_red "0 rosso" SYnumber_1_blue "1 blu" SYnumber_1_green "1 verde" SYnumber_1_red "1 rosso" SYnumber_2_blue "2 blu" SYnumber_2_green "2 verde" SYnumber_2_red "2 rosso" SYnumber_3_blue "3 blu" SYnumber_3_green "3 verde" SYnumber_3_red "3 rosso" SYnumber_4_blue "4 blu" SYnumber_4_green "4 verde" SYnumber_4_red "4 rosso" SYnumber_5_blue "5 blu" SYnumber_5_green "5 verde" SYnumber_5_red "5 rosso" SYnumber_6_blue "6 blu" SYnumber_6_green "6 verde" SYnumber_6_red "6 rosso" SYnumber_7_blue "7 blu" SYnumber_7_green "7 verde" SYnumber_7_red "7 rosso" SYnumber_8_blue "8 blu" SYnumber_8_green "8 verde" SYnumber_8_red "8 rosso" SYnumber_9_blue "9 blu" SYnumber_9_green "9 verde" SYnumber_9_red "9 rosso" numberfrom0 "Poni contatore a 1" items "Oggetti" syusrmenu "Men utente simboli" cfgsymenu "Configura men utente simboli" insmnb "Inserisci sub-men prima" insmna "Inserisci sub-men dopo" opensbmn "Apri sub-men" clssbmn "Chiudi sub-men" optSUPPORTLAPS "Supporto giri" LAP GIRO nameLAP "Giro" duration "Tempo" calrs "Calorie" fromfile "da file" fromdef "da definizione" mbaktoload "Sfondo da caricare" none "nessuno" opt_Fonts "Font" optICONSIZE "Dimensioni icone" optTRNUMBERINTVL "Mostra info TP su mappa ad ogni" optTRINFO "Info TP da mostrare" nameInfo "Informazioni" nameAL "Almanacco" alm_svid "id satellite" alm_week "settimana" alm_datatime "tempo rif. dati" alm_clockc1 "coeff corr clock s" alm_clockc2 "coeff corr clock s/s" alm_ecc "eccentricit" alm_mnanom "anomalia media" alm_argprgee "arg. perigeo" alm_rightasc "ascensione retta" alm_rtrightasc "var. asc. retta" alm_inclin "inclinazione" alm_health "salute" lstsqs "Minimi Quadrati" lstsqsfile "file Min Quadrati" totdstng "Distanza totale, senza separazioni" tottimeng "Tempo totale, senza separazioni" SYcross "Mirino" SYcross_3p "Mirino 3p" mapfitWPs "Mostra WP usati per minimi quadrati" showfitinfo "Mostra info sui minimi quadrati" xtcoord "xt" ytcoord "yt" delta "d" residual "rt" rmsxydev "rms(deviazioni x,y)" resstderr "errore std residuo" chgdev "Cambia dispositivo" maxalt "Altitudine massima" minalt "Altitudine minima" alt_cumula "Altezza cumulativa di salita" alt_cumuld "Discesa cumulativa" optSHOWFILEITEMS "Mostra di default sulla mappa gli oggetti leti da file" vertgridlines "Linee Vert Griglia" convert "Converti" split "Dividi" bysel "per punti selezionati" byseg "per segmenti" openits "Apri %s" uname "Nome utente" pword "Password" remember "Ricordare" wptotwitter "Inviare WP a Twitter" wptotwitternb "Inviare posizione WP, datum, altitudine, nome e commento a Twitter con etichetta #GPSMan #waypoint" exportTFW "Esportare file TWF" nametfwfile "File TFW" PRJEOV EOV chgname "Cambiare nome" clicktoedit "Click per editare" renamethod "Metodo per rinomina" operators "Operatori" keep1st "tenere il primo carattere" keep1st_hlp "Tenere il primo carattere\nulteriori operazioni sui rimanenti" reset "reset" reset_hlp "Ripartenza con il nome iniziale ignorando i cambiamenti effettuati" case "cambiare maiuscolo/minuscolo" case_hlp "Tutte le lettere in maiuscolo/minuscolo" maxlgth "lungh max" maxlgth_hlp "Caratteri correnti tagliati al numero dato" inslt "inserire a sinistra" inslt_hlp "Inserire la stringa a sinistra prima del carattere corrente" insrt "inserire a destra" insrt_hlp "Inserire la stringa a sinistra alla fine" replc "sostituire" replc_hlp " i caratteri della prima stringa verranno sostituiti\ndai corrispondenti nella seconda" delany "cancellare" delany_hlp "Tutti i caratteri nella stringa data verranno cancellati dal nome" rsub "re. sostituzione" rsub_hlp "Fornire espressione regolare e specifiche di sostituzione\nsi veda il manuale per dettagli" accifnew "accettare se nuovo" accifnew_hlp "Accettare il risultato se il nome non in uso" guntilnew "aggiungere in coda numero sino a trovare nuovo" guntilnew_hlp "Tentare con tutti i valori possibili del numero sino a che si trovi un nome non in uso" ndigits "Numero di cifre" gennames "Generazione nomi in corso..." rentest_hlp "Testare il metodo corrente su un nome dato" renmove_hlp "Usare il bottone destro per riordinare le linee" tolower "a minuscolo" toupper "a maiuscolo" applyto "Applicare a" forall "per tutti" failed "fallito" selfont "Selezione font" default "Default" size "Dimensione" units "Unit" points "punti" pixels "pixel" weight "peso" normal "normale" bold "grassetto" slant "inclinazione" roman "romano" italic "italico" underline "Sottolineato" overstrike "Cancellato" optDEFAULTFONT "Default font" optFIXEDFONT "Font fixed" optMAPFONT "Font mappa" optTRAVELFONT "Font viaggio" optPLOTFONT "Font plot/graph" plugin "Plug-in" unavailif "Non disponibile se" tclcode "Codice Tcl" PRJSphMerc "Sferica di Mercatore" PRJEPSG:3857 "EPSG:3857" PRJEqCyl "Cilindrica Equidistante " PRJEPSG:32663 "EPSG:32663" gpTRtoGnuplot2d "Vista di lato-view (Gnuplot)" gpTRtoGnuplot2d_nb "Invia i dati della traccia al programma esterno GNUPLOT e produci grafico elevazione" gpTRtoGnuplot3d "Prospettiva (Gnuplot)" gpTRtoGnuplot3d_nb "Invia i dati della traccia al programma esterno GNUPLOT e produci grafico 3-D" gpParam2d "Parametri per grafico Gnuplot 2D" gpParam3d "Parametri per grafico Gnuplot 3D" gpFilename "Nome file" gpCanwidth "Larghezza Canvas" gpCanheight "Altezza Canvas" gpSTotals "Mostra totali" gpLeft "Lato sinistro" gpRight "Lato destro" gpNone "Nessuno" gpSRests "Mostra soste" gpRest "Sosta" gpSymText "Simbolo+Testo" gpSymTime "Simbolo+Tempo" gpText "Testo" gpSHours "Mostra ore" gpTimetop "Tempo in alto" gpTimebot "Tempo in basso" gpSSpeed "Mostra velocit" gpHike "Piedi" gpBike "Bici" gpDrive "Motore" gpGlide "Aliante" gpLimitDist "Max. Distanza WP da Traccia (km)" gpLimitStat "Min. Lunghezza su Traccia per stesso WP (km)" gpDirection "Direzione" gpForward "Avanti" gpBackward "Indietro" gp2D_hlp "Se esiste un nome di gruppo identico al nome della traccia,\n\ i waypoint di tale gruppo verranno mostrati,\n\ in considerazione delle distanze date.\n\ Quando non esiste un nome di gruppo corrispondente,\ si pu sceglierne uno da lista o uscire (cancel)." gpGenerated "Generato da GPSMan con gnuplot" gpModify "Modicare la vista con il mouse . Abbandonare per salvare il disegno." htCalcHikeTime "Calcolare il Tempo di Cammino" htCalcHikeTime_nb "Calcolare il Tempo di Cammino con formula DAV" htHeader "Tempo stimato di cammino (senza soste) per tracce\ usando la formula di \"Deutscher Alpenverein\"\ con parametri differenti" htFooter1 "La Capacit si riferisce ad un ora." htFooter2 "Il tempo di sosta consigliato 20min ogni due ore (15%)." srShowRest_nb "Mostra periodi di sosta > 5min." srTRTime "Tempo traccia" srTotals "Totali" optALTHRESHOLD "Soglia elevazione" optDISPLAYCMD "Comando per mostrare file immagine" optTERMCMD "Comando per aprire finestra terminale" optMANHTTPADDR "Indirizzo HTTP del Manuale Utente" } # the following definitions must be coherent with $TXT array set INVTXT { DMS DMS DMM DMM DDD DDD {Gradi centesimali} GRA UTM/UPS UTM/UPS WP WP RT RT TR TR GIRO LAP GR GR } # changes by Miguel Filgueiras to RM contribution set TXT(srChainage) $TXT(totdst) set TXT(srShowRest) $TXT(gpSRests) set TXT(gpSym) $TXT(symbol) set TXT(srRest) $TXT(gpRest) gpsman-6.4.4.2/gmsrc/serial.tcl0000644000175000017500000003250312224351120014355 0ustar migmig# # This file is part of: # # gpsman --- GPS Manager: a manager for GPS receiver data # # Copyright (c) 1998-2013 Miguel Filgueiras migfilg@t-online.de # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. # # File: serial.tcl # Last change: 6 October 2013 # # Includes contributions by Matt Martin (matt.martin_AT_ieee.org) # marked "MGM contribution" # # utilities for using the I/O port with Garmin and Magellan receivers # USB ports can, in certain conditions, be used as serial ports # the Garmin USB protocol is supported if there is low-level system # support (e.g., a suitable Linux kernel driver) # logging the communication with the serial port (for debugging purposes) set SERIALLOG $USERDIR/logfile set NotLogging 1 #### no configurable values below this line! set LogFile "" set ErrorCount 0 set MAXTRIALS 5 set ProgrWindow 0 ##### low-level serial read procedures ## the following two procs do not work under MS-Windows... proc ReadChar {} { # read chars when using file events or polling # call $ProcProcChar to process it global SRLFILE Eof InBuff NoInProc Polling GPSState if { $Eof } { return } set buff [read $SRLFILE] if { $buff != "" } { append InBuff $buff if { $NoInProc } { after 0 UseReadChars } } if { [set Eof [eof $SRLFILE]] } { Log "RP> at eof" set GPSState offline catch {close $SRLFILE} } elseif { $Polling } { update ; after 2 ReadChar } return } proc UseReadChars {} { # use chars read from serial channel in string $InBuff # call $ProcProcChar for each character read in global ProcProcChar InBuff NoInProc SInPacketState set NoInProc 0 ; set buff $InBuff ; set InBuff "" while { [set n [string length $buff]] } { for { set i 0 } { $i < $n } { incr i } { while { $SInPacketState == "block" } { update ; after 1 } $ProcProcChar [string index $buff $i] } set buff $InBuff ; set InBuff "" } set NoInProc 1 return } ## special procs for use in MS-Windows... # adapted from GPSMan 5.2 # implement fileevent readable with polling # as Tcl/Tk 8.0 and 8.1 do not support it for MS-Windows proc ReadPollChar {} { # poll and read from serial channel global Eof InBuff SRLFILE if { $Eof } { return } set InBuff [read $SRLFILE] if { [set Eof [eof $SRLFILE]] } { Log "RPoll> at EOF" catch {close $SRLFILE} } UsePollChars 0 [string length $InBuff] return } proc UsePollChars {i n} { # use chars read from serial channel by polling routine # $i is index of next char in buffer # $n is length of buffer # call $ProcProcChar for each character read in global InBuff Eof SInPacketState ProcProcChar while { $i != $n } { if { $SInPacketState == "block" } { after 5 "UsePollChars $i $n" return } $ProcProcChar [string index $InBuff $i] incr i } if { ! $Eof } { after 1 ReadPollChar } return } ##### logging proc OpenSerialLog {} { # open (if requested) logfile for the communication with the I/O port # (also used when importing NMEA files) global NotLogging LogFile SERIALLOG DateFormat VERSION VERSIONDATE \ tcl_version tcl_platform if { ! $NotLogging && $LogFile == "" } { set LogFile [open $SERIALLOG w] set d [FormatDay $DateFormat $VERSIONDATE(year) $VERSIONDATE(month) \ $VERSIONDATE(day)] Log "GPSMan $VERSION / $d" Log "Date: [NowTZ]" Log "tcl_version = $tcl_version" foreach f "platform os osVersion machine byteOrder" { if { ! [catch {set v $tcl_platform($f)}] } { Log "$f = $v" } } } return } proc Log {m} { global NotLogging LogFile if { $NotLogging } { return } puts $LogFile $m flush $LogFile return } proc LogBytes {m bytes} { # write list of bytes to the logfile global NotLogging LogFile if { $NotLogging } { return } puts $LogFile $m set n 0 foreach b $bytes { if { [binary scan $b "c" dec] != 1 } { set dec "???" } puts -nonewline $LogFile " [expr ($dec+256)%256]" if { [incr n] > 20 } { puts $LogFile "" set n 0 } } puts $LogFile "" flush $LogFile return } ##### resetting proc ResetSerial {} { global SOutBusy SInState SInPacketState SInBuffer LInBuffer \ PkInState PkLastPID ErrorCount set SOutBusy 0 set SInPacketState start ; set SInState idle set SInBuffer "" ; set LInBuffer "" set PkInState idle ; set PkLastPID -1 set ErrorCount 0 return } ##### error handling proc BadPacket {mess} { # count errors in receiving packets and abort operation if too many global ErrorCount MAXTRIALS MESS Log "BP> $mess" incr ErrorCount if { $ErrorCount == $MAXTRIALS } { GMMessage $MESS(toomanyerr) AbortComm } return } ##### open serial port proc OpenSerialFailed {baud} { # open serial port at given baud rate, and log file if needs be # return 1 on failure global MESS SRLFILE SERIALPORT InBuff Polling Eof tcl_platform if { ! [file exists $SERIALPORT] || \ ! [file readable $SERIALPORT] || \ [catch {set SRLFILE [open $SERIALPORT r+]}] || \ [regexp {^-} $SRLFILE] } { GMMessage [format $MESS(badserial) $SERIALPORT] return 1 } switch $tcl_platform(platform) { unix { set Polling 0 ; set InBuff "" fconfigure $SRLFILE -blocking 0 -mode $baud,n,8,1 \ -translation binary fileevent $SRLFILE readable ReadChar } windows { # Tcl/Tk 8.0p2 does not support I/O from/to serial ports set Polling 1 ; set InBuff "" fconfigure $SRLFILE -blocking 0 -mode $baud,n,8,1 \ -translation binary # after 0 ReadPollChar after 0 ReadChar } default { GMMessage $MESS(badplatform) return 1 } } set Eof 0 OpenSerialLog return 0 } ##### upper level proc EndOutProt {pid} { # deal with end of output protocol # $pid in {XfrWP, XfrRT, XfrTR}; not being used # set GPSOpResult to 0 global Jobs GPSOpResult CloseInProgrWindow set Jobs "" ResetSerial set GPSOpResult 0 return } ##### floating point representation proc BadFloats {} { # check whether conversions of bytes to float are working correctly # in this machine global MESS tcl_platform if { $tcl_platform(byteOrder) == "littleEndian" } { binary scan [join "A B C D" ""] "f" x } else { binary scan [join "D C B A" ""] "f" x } if { abs($x-781.035217285) > 1e-3 } { return [expr ! [GMConfirm $MESS(badfloats)]] } return 0 } ##### control proc GPSConnection {args} { # check connection with receiver if protocol is garmin* or magellan # open serial port if needs be # if connected the 1st argument will be called, else the 2nd one; # continuation is either to SentPacket and EndConnCheck/AbortComm, or to # AbortComm # return 0 on immediate failure, otherwise 1 global Jobs Request MESS NoGarmin GPSProtocol ProcProcChar ProcSendPacket \ SERIALBAUD RecWPCats # includes MGM contribution if { [string first "garmin" $GPSProtocol] != 0 && \ $GPSProtocol != "magellan" } { GMMessage $MESS(cantchkprot) return 0 } if { $NoGarmin } { if { [BadFloats] } { return 0 } if { $GPSProtocol == "garmin_usb" } { if { [OpenUSBFailed] } { eval [lindex $args 1] return 0 } set ProcSendPacket SendUSBPacket } else { # use as serial port if { $GPSProtocol == "garmin" } { # baud rate is to be set to $SERIALBAUD in proc EndConnCheck set baud 9600 } else { set baud $SERIALBAUD } if { [OpenSerialFailed $baud] } { eval [lindex $args 1] return 0 } set ProcProcChar ProcChar set ProcSendPacket SendSPacket } set NoGarmin 0 set RecWPCats "" } if { [FailsInProgrWindow $MESS(check)] } { eval [lindex $args 1] return 0 } set Request "check=$args" set Jobs [list [after 10000 AbortComm] [after 0 "SendData product"]] return 1 } proc EndConnCheck {messid} { # end connection check successfully # set GPSOpResult to 0 if ok global MYGPS Request MESS CurrPSPID GPSOpResult RecCanChgBaud SERIALBAUD ResetSerial Log "ECC> $MESS($messid)" if { $MYGPS == "Garmin" && ! [catch {set pid $CurrPSPID(WPData)}] } { SymbolsDOForProtocol $pid } CloseInProgrWindow regsub check= $Request "" as eval [lindex $as 0] set GPSOpResult 0 if { $MYGPS == "Garmin" && $RecCanChgBaud && $SERIALBAUD != 9600 } { ChangeGarminBaud $SERIALBAUD } return } proc GPSOff {} { global Request set Request turnOff SendData turnOff return } proc GPSBye {} { return } proc InitGPS {} { return } proc StartGPS {} { global NoGarmin set NoGarmin 1 return } proc GetGPS {wh} { # get data of type $wh global GetSet set GetSet($wh) "" DoGetGPS $wh return } proc GetGPSIn {wh ixs args} { # get data of type $wh (in {WP, RT}), but only to replace items with # given indices $ixs (that may contain -1, meaning that new items # can be created) # $args not used but needed for compatibility with proc LoadGRElsIn global GetSet set GetSet($wh) $ixs DoGetGPS $wh return } proc DoGetGPS {wh} { # there must be a call to proc EndWPRenaming where this operation # ends if data was stored (see, e.g., proc EndInProt, garmin.tcl) global Request MESS PkLastPID set PkLastPID -1 if { [FailsInProgrWindow $MESS(get$wh)] } { return } InitWPRenaming set Request get$wh SendData get $wh return } proc PutGPS {wh ixs args} { # $args used for passing other information, for instance, WP categories # if global GPSOpResult is set to 1 (error) by proc SendData close # progress window global Request MESS PkLastPID GPSOpResult set PkLastPID -1 if { [FailsInProgrWindow $MESS(put$wh)] } { return } set Request put$wh set GPSOpResult 0 SendData put $wh $ixs $args if { $GPSOpResult } { CloseInProgrWindow ResetSerial } return } proc AbortComm {args} { # abort communication in progress # if $MYGPS==Garmin this proc is replaced in garmin.tcl # $args either void or a message id to be shown # global $Request==get$wh where $wh in {WP RT TR PosnData DtTMData} # (cf. SendData) # GPSOpResult is set to 1 (error) # ==check=$cargs where 2nd arg should be executed as # connection is apparently down global Request Jobs MESS GPSOpResult CloseInProgrWindow # should it be more cautious concerning these cancelations? foreach j $Jobs { catch { after cancel $j } } ResetSerial if { $args != "" } { GMMessage $MESS($args) } set Jobs "" switch -glob $Request { get* { set Request abort SendData abort # after which SentPacket will call AbortComm again set GPSOpResult 1 } check=* { # assume connection is down regsub check= $Request "" as eval [lindex $as 1] set GPSOpResult 1 } abort { } } return } ##### input/output progress window proc CloseInProgrWindow {} { global CMDLINE ProgrWindow ProgrWGrabs if { $CMDLINE } { set ProgrWindow 0 } else { DestroyRGrabs .inprogr $ProgrWGrabs } return } proc FailsInProgrWindow {mess} { # create dialog for signaling operation in progress # fail if window already exists # single button: Abort; no bindings global COLOUR EPOSX EPOSY TXT SRecACKs SRecNAKs SPckts CMDLINE \ ProgrWindow ProgrWGrabs GPSProtocol if { $CMDLINE } { if { $ProgrWindow } { return 1 } incr ProgrWindow set SRecACKs 0 ; set SRecNAKs 0 ; set SPckts 0 return 0 } if { [winfo exists .inprogr] } { Raise .inprogr ; bell ; return 1 } set ProgrWGrabs [grab current] set SRecACKs 0 ; set SRecNAKs 0 ; set SPckts 0 GMToplevel .inprogr commrec +$EPOSX+$EPOSY {} \ {WM_DELETE_WINDOW AbortComm} {} frame .inprogr.fr -borderwidth 5 -bg $COLOUR(messbg) label .inprogr.fr.title -text "..." -relief sunken label .inprogr.fr.text -text "$mess" button .inprogr.fr.ok -text $TXT(abort) -command AbortComm if { $GPSProtocol != "garmin_usb" } { foreach f "A N P" v "SRecACKs SRecNAKs SPckts" t "ACKs NAKs packets" { set fw .inprogr.fr.frc$f frame $fw label $fw.val -textvariable $v -width 5 label $fw.tit -text $TXT($t) pack $fw.val $fw.tit -side left -padx 0 } pack .inprogr.fr.title .inprogr.fr.text .inprogr.fr.frcA \ .inprogr.fr.frcN .inprogr.fr.frcP .inprogr.fr.ok -side top -pady 5 } else { set fw .inprogr.fr.frcP frame $fw label $fw.val -textvariable SPckts -width 5 label $fw.tit -text $TXT(packets) pack $fw.val $fw.tit -side left -padx 0 pack .inprogr.fr.title .inprogr.fr.text .inprogr.fr.frcP \ .inprogr.fr.ok -side top -pady 5 } pack .inprogr.fr -side top update idletasks grab .inprogr RaiseWindow .inprogr return 0 } gpsman-6.4.4.2/gmsrc/compute.tcl0000644000175000017500000011246412224351120014557 0ustar migmig# # This file is part of: # # gpsman --- GPS Manager: a manager for GPS receiver data # # Copyright (c) 1998-2013 Miguel Filgueiras migfilg@t-online.de # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. # # File: compute.tcl # Last change: 6 October 2013 # # Includes contributions by # - Matt Martin (matt.martin _AT_ ieee.org) marked "MGM contribution" # - Valere Robin (valere.robin _AT_ wanadoo.fr) marked "VR contribution" # ## Some formulae kindly supplied by # Luisa Bastos, Universidade do Porto # Gil Goncalves, Universidade de Coimbra # Computation of area of spherical polygon adapted from sph_poly.c in # "Graphics Gems IV", edited by Paul Heckbert, Academic Press, 1994. # Formula for ellipsoid radius from # "Ellipsoidal Area Computations of Large Terrestrial Objects" # by Hrvoje Lukatela # http://www.geodyssey.com/papers/ggelare.html # Algorithm for finding a point at given distance and bearing from another # taken from the program "forward" available from # ftp://www.ngs.noaa.gov/pub/pcsoft/for_inv.3d/ # It uses the modified Rainsford's Method with Helmert's elliptical terms, # and is effective in any azimuth and at any distance short of antipodal. ## ### positions and coordinates proc Coord {pformt coord negh} { # convert coordinate $coord in format $pformt, with negative heading $negh, # to signed degrees # $pformt in {DMS, DMM, DDD, GRA} set coord [string trim $coord] set sign 1 set h [string index "$coord" 0] if { ! [regexp {[0-9]} $h] } { if { $h == $negh || $h == "-" } { set sign -1 } set coord [string range "$coord" 1 end] } switch $pformt { DMS { scan "$coord" "%d %d %f" d m s return [expr $sign*($d+$m/60.0+$s/3600.0)] } DMM { scan "$coord" "%d %f" d m return [expr $sign*($d+$m/60.0)] } DDD { return [expr $sign*$coord] } GRA { return [expr $sign*0.9*$coord] } } } proc FormatPosition {latd longd datum reqpfmt pfdatum args} { # produce formatted position from $latd and $longd in decimal # degrees for $datum # $reqpfmt is the required position format # $pfdatum is the datum to use with this format # if $pfdatum=="", $datum is used unless $reqpfmt needs a fixed datum # otherwise $pfdatum must be compatible with $reqpfmt; if it is # not a call to BUG will be made # $args is either "" or is an alternative format to be used with $datum # when conversion to $reqpfmt fails (out of grid scope) # result is a list with: position representation, position format # used and datum used # if $args=="" and conversion to $reqpfmt yields an out of grid scope # result ("--" in the zone or x-field), this result is used in # building the position representation # a position representation is a list whose first two elements # are lat and long in degrees, and whose rest is dependent on format # type: # ==latlong: lat and long in external format # ==utm: zones east and north and x y coordinates # ==grid: zone name and x y coordinates # ==nzgrid: x y coordinates # ==mh: Maidenhead-locator (6 characters) global POSTYPE set la $latd ; set lo $longd if { $pfdatum == "" } { set udatum $datum } else { set udatum $pfdatum if { $pfdatum != $datum } { foreach "la lo" [ToDatum $la $lo $datum $pfdatum] { break } } } switch [set ptype $POSTYPE($reqpfmt)] { latlong { set p [FormatLatLong $la $lo $reqpfmt] } utm { set p [linsert [DegreesToUTM $la $lo $udatum] 0 $la $lo] } grid - nzgrid { if { [set gd [GridDatum $reqpfmt $udatum]] != $udatum } { if { $pfdatum != "" } { BUG calling FormatPosition with wrong pfdatum } set udatum $gd foreach "la lo" [ToDatum $latd $longd $datum $gd] { break } } if { $ptype == "grid" } { set p [DegreesTo$reqpfmt $la $lo $udatum] } else { set p [DegreesToNZGrid $reqpfmt $la $lo $udatum] } if { [lindex $p 0] == "--" && $args != "" } { # out of scope return [FormatPosition $latd $longd $datum $args ""] } set p [linsert $p 0 $la $lo] } mh { set p [list $la $lo [DegreesToMHLoc $la $lo]] } } return [list $p $reqpfmt $udatum] } proc FormatLatLong {latd longd pfmt} { # produce formatted position from $latd and $longd in decimal # degrees in latitude/longitude position format # result is the position representation: a list whose first two elements # are lat and long in degrees, followed by lat and long in external format global COUTFMT if { $latd < 0 } { # VR contribution: 0-$latd instead of -$latd; same for $longd set lax [expr 0-$latd] ; set hlat S } else { set lax $latd ; set hlat N } if { $longd < 0 } { set lox [expr 0-$longd] ; set hlng W } else { set lox $longd ; set hlng E } if { $pfmt == "GRA" } { set lax [format $COUTFMT(GRA) [expr $latd/0.9]] set lox [format $COUTFMT(GRA) [expr $longd/0.9]] return [list $latd $longd $lax $lox] } return [list $latd $longd "$hlat[ExtDegrees $pfmt $lax]" \ "$hlng[ExtDegrees $pfmt $lox]"] } proc ExtDegrees {pformt degs} { # from signed degrees $degs to external representation of format $pformt # $pformt in {DMS, DMM, DDD, DMSsimpl} # DMSsimpl is similar to DMS, but for values less than 1 degree the # representation is either MM'SS.S" or SS.S" global COUTFMT switch -glob $pformt { DMS* { if { $degs < 0 } { set degs [expr -$degs] ; set sign -1 } else { set sign 1 } set d [expr int($degs)] set degs [expr ($degs-$d)*60] set d [expr $sign*$d] set m [expr int($degs)] set s [expr ($degs-$m)*60] if { $s > 59.95 } { set s 0 ; incr m } if { $m > 59 } { set m 0 ; incr d } set sf $COUTFMT(sec) if { $d > 0 || $pformt == "DMS" } { return [format "%d %02d $sf" $d $m $s] } if { $m > 0 } { return [format "%02d'$sf" $m $s] } return [format "$sf\"" $s] } DMM { if { $degs < 0 } { set degs [expr -$degs] ; set sign -1 } else { set sign 1 } set d [expr int($degs)] set degs [expr ($degs-$d)*60] set d [expr $sign*$d] if { $degs > 59.995 } { set degs 0 ; incr d } return [format "%d $COUTFMT(min)" $d $degs] } DDD { return [format $COUTFMT(deg) $degs] } } } proc ChangeCoordSign {pos} { if { $pos != "N" } { return W } return S } proc ConvertPos {pfrmt zone x y datum npfrmt} { # create position representation in format $npfrmt from position # $x, $y (as decimal numbers) in format $pfrmt # if $pfrmt in {DDD, GRA} take $x as long and $y as lat # $zone is either a list with ze and zn for UTM/UPS, or the zone # name for other grids (and is meaningless for other formats # values of $x, $y are checked, as well as suitability of $datum # and of validity of new format # return -1 on error global POSTYPE MESS TXT COUTFMT switch [set ptype $POSTYPE($pfrmt)] { latlong { # must be either DDD or GRA if { $pfrmt == "GRA" } { set x [expr $x*0.9] ; set y [expr $y*0.9] } if { $y < 0 } { set la [expr -$y] ; set hlat S } else { set la $y ; set hlat N } if { $x < 0 } { set lo [expr -$x] ; set hlng W } else { set lo $x ; set hlng E } if { ! [CheckCoord GMMessage $pfrmt $la N 90] || \ ! [CheckCoord GMMessage $pfrmt $lo E 180] } { return -1 } if { $npfrmt == "DDD" } { return [list $y $x "${hlat}[format $COUTFMT(deg) $la]" \ "${hlng}[format $COUTFMT(deg) $lo]"] } set la $y ; set lo $x } utm { foreach "ze zn" $zone {} foreach "la lo" [UTMToDegrees $ze $zn $x $y $datum] { break } if { $npfrmt == $pfrmt } { return [list $la $lo $ze $zn $x $y] } } grid - nzgrid { if { [BadDatumFor $pfrmt $datum GMMessage] != 0 } { return -1 } if { [set p [GridToDegrees $pfrmt $zone $x $y $datum]] == 0 } { GMMessage $MESS(outofgrid) return -1 } if { $npfrmt == $pfrmt } { if { $ptype == "grid" } { return [linsert $p end $zone $x $y] } else { return [linsert $p end $x $y] } } } default { BUG calling ConvertPos with wrong format } } # $datum is suitable for $npfrmt set p [lindex [FormatPosition $la $lo $datum $npfrmt $datum] 0] if { [lindex $p 2] == "--" } { GMMessage $MESS(outofgrid) return -1 } return $p } ### distances and geographic bearings # formulae from Spherical Trignometry # the Law of Cosines, used below to compute distances and bearings, is known # to be unsuitable for computations because of excessive round-off errors; # alternative procedures are supplied in file acccomp.tcl and are loaded # if $ACCFORMULAE (accurate formulae option) is set proc ComputeDist {p1 p2 datum} { # distance (km) between positions $p1 and $p2 with same datum # formulae kindly supplied by Luisa Bastos, Universidade do Porto # and Gil Goncalves, Universidade de Coimbra set lad1 [lindex $p1 0] ; set lod1 [lindex $p1 1] set lad2 [lindex $p2 0] ; set lod2 [lindex $p2 1] if { $lad1==$lad2 && $lod1==$lod2 } { return 0 } set la1 [expr $lad1*0.01745329251994329576] set lo1 [expr $lod1*0.01745329251994329576] set la2 [expr $lad2*0.01745329251994329576] set lo2 [expr $lod2*0.01745329251994329576] set x [expr cos($lo1-$lo2)*cos($la1)*cos($la2)+sin($la1)*sin($la2)] if { $x >= 1 } { return 0 } return [expr 1e-3*[lindex [EllipsdData $datum] 0]*acos($x)] } proc ComputeBear {p1 p2 datum} { # bearing from position $p1 to $p2 with same datum # $datum not used here but kept for compatibility with replacement # proc in acccomp.tcl # formulae kindly supplied by Luisa Bastos, Universidade do Porto # and Gil Goncalves, Universidade de Coimbra set lad1 [lindex $p1 0] ; set lod1 [lindex $p1 1] set lad2 [lindex $p2 0] ; set lod2 [lindex $p2 1] if { $lad1==$lad2 && $lod1==$lod2 } { return 0 } set la1 [expr $lad1*0.01745329251994329576] set lo1 [expr $lod1*0.01745329251994329576] set la2 [expr $lad2*0.01745329251994329576] set lo2 [expr $lod2*0.01745329251994329576] set da [expr $la2-$la1] ; set do [expr $lo2-$lo1] if { [expr abs($da)] < 1e-20 } { if { [expr abs($do)] < 1e-20 } { set b 0 } elseif { $do < 0 } { set b 270 } else { set b 90 } } elseif { [expr abs($do)] < 1e-20 } { if { $da < 0 } { set b 180 } else { set b 0 } } else { set b [expr round(atan2(sin($do), \ tan($la2)*cos($la1)-sin($la1)*cos($do)) \ *57.29577951308232087684)] if { $b < 0 } { if { $do < 0 } { incr b 360 } else { incr b 180 } } elseif { $do < 0 } { incr b 180 } } return $b } proc ComputeDistBear {p1 p2 datum} { # distance between and bearing from positions $p1 and $p2 with same datum # formulae kindly supplied by Luisa Bastos, Universidade do Porto # and Gil Goncalves, Universidade de Coimbra set lad1 [lindex $p1 0] ; set lod1 [lindex $p1 1] set lad2 [lindex $p2 0] ; set lod2 [lindex $p2 1] if { $lad1==$lad2 && $lod1==$lod2 } { return "0 0" } set la1 [expr $lad1*0.01745329251994329576] set lo1 [expr $lod1*0.01745329251994329576] set la2 [expr $lad2*0.01745329251994329576] set lo2 [expr $lod2*0.01745329251994329576] set a [lindex [EllipsdData $datum] 0] # distance (km) set x [expr cos($lo1-$lo2)*cos($la1)*cos($la2)+sin($la1)*sin($la2)] if { $x < 1 } { set d [expr 1e-3*$a*acos($x)] } else { set d 0 } # bearing set da [expr $la2-$la1] ; set do [expr $lo2-$lo1] if { [expr abs($da)] < 1e-20 } { if { [expr abs($do)] < 1e-20 } { set b 0 } elseif { $do < 0 } { set b 270 } else { set b 90 } } elseif { [expr abs($do)] < 1e-20 } { if { $da < 0 } { set b 180 } else { set b 0 } } else { set b [expr round(atan2(sin($do), \ tan($la2)*cos($la1)-sin($la1)*cos($do)) \ *57.29577951308232087684)] if { $b < 0 } { if { $do < 0 } { incr b 360 } else { incr b 180 } } elseif { $do < 0 } { incr b 180 } } return [list $d $b] } proc SetDatumData {datum} { # this proc sets datum parameters as global variables for repeated use # in conversions; see procs ComputeDistFD, ComputeDistBearFD global DatumA DatumF FDDatum if { $FDDatum != $datum } { set dt [EllipsdData $datum] set DatumA [lindex $dt 0] ; set DatumF [lindex $dt 1] set FDDatum $datum } return } proc ComputeDistFD {p1 p2} { # compute distance (km) between positions $p1 and $p2 assuming datum # parameters where set by calling SetDatumData global DatumA # formulae kindly supplied by Luisa Bastos, Universidade do Porto # and Gil Goncalves, Universidade de Coimbra set lad1 [lindex $p1 0] ; set lod1 [lindex $p1 1] set lad2 [lindex $p2 0] ; set lod2 [lindex $p2 1] if { $lad1==$lad2 && $lod1==$lod2 } { return 0 } set la1 [expr $lad1*0.01745329251994329576] set lo1 [expr $lod1*0.01745329251994329576] set la2 [expr $lad2*0.01745329251994329576] set lo2 [expr $lod2*0.01745329251994329576] set x [expr cos($lo1-$lo2)*cos($la1)*cos($la2)+sin($la1)*sin($la2)] if { $x >= 1 } { return 0 } return [expr 1e-3*$DatumA*acos($x)] } proc ComputeDistBearFD {p1 p2} { # compute distance (km) between and bearing from positions $p1 and $p2 # assuming datum parameters where set by calling SetDatumData global DatumA # formulae kindly supplied by Luisa Bastos, Universidade do Porto # and Gil Goncalves, Universidade de Coimbra set lad1 [lindex $p1 0] ; set lod1 [lindex $p1 1] set lad2 [lindex $p2 0] ; set lod2 [lindex $p2 1] if { $lad1==$lad2 && $lod1==$lod2 } { return "0 0" } set la1 [expr $lad1*0.01745329251994329576] set lo1 [expr $lod1*0.01745329251994329576] set la2 [expr $lad2*0.01745329251994329576] set lo2 [expr $lod2*0.01745329251994329576] # distance (km) set x [expr cos($lo1-$lo2)*cos($la1)*cos($la2)+sin($la1)*sin($la2)] if { $x < 1 } { set d [expr 1e-3*$DatumA*acos($x)] } else { set d 0 } # bearing set da [expr $la2-$la1] ; set do [expr $lo2-$lo1] if { [expr abs($da)] < 1e-20 } { if { [expr abs($do)] < 1e-20 } { set b 0 } elseif { $do < 0 } { set b 270 } else { set b 90 } } elseif { [expr abs($do)] < 1e-20 } { if { $da < 0 } { set b 180 } else { set b 0 } } else { set b [expr round(atan2(sin($do), \ tan($la2)*cos($la1)-sin($la1)*cos($do)) \ *57.29577951308232087684)] if { $b < 0 } { if { $do < 0 } { incr b 360 } else { incr b 180 } } elseif { $do < 0 } { incr b 180 } } return [list $d $b] } proc CompWPDistBear {wp1 wp2} { # distance (km) between and bearing from WPs with names $wp1, $wp2 global WPPFrmt WPPosn WPDatum set i1 [IndexNamed WP $wp1] set i2 [IndexNamed WP $wp2] if { $i1<0 || $i2<0 } { return "--- ---" } if { $i1 == $i2 } { return "0 0" } return [CompDistBearDatums $WPPosn($i1) $WPDatum($i1) \ $WPPosn($i2) $WPDatum($i2)] } proc CompDistBearDatums {p1 d1 p2 d2} { # distance (km) between and bearing from positions $p1 and $p2 # with datums $d1 and $d2 if { $d1 != $d2 } { set p2 [ToDatum [lindex $p2 0] [lindex $p2 1] $d2 $d1] } return [ComputeDistBear $p1 $p2 $d1] } ## point at given distance and bearing from another point proc CoordsAtDistBear {pos dist bear datum} { # compute coordinates of point at given distance (km) and bearing # (0-360 degrees) from another point # algorithm taken from the program "forward" available from # ftp://www.ngs.noaa.gov/pub/pcsoft/for_inv.3d/ # It uses the modified Rainsford's Method with Helmert's elliptical # terms, and is effective in any azimuth and at any distance short of # antipodal. # $dist is constrained here to be less than pi*semi-major axis global MESS foreach "lat0 long0" $pos { break } foreach "a f" [EllipsdData $datum] { break } if { [set dist [expr $dist*1000]] >= 3.1415926*$a } { GMMessage $MESS(distlarge) return [list $lat $long] } set phi [expr $lat0*0.01745329251994329576] set lam [expr $long0*0.01745329251994329576] set azm [expr $bear*0.01745329251994329576] set r [expr 1-$f] set tu [expr $r*sin($phi)/cos($phi)] set sf [expr sin($azm)] ; set cf [expr cos($azm)] set baz 0 if { [set cf [expr cos($azm)]] != 0 } { set baz [expr atan2($tu,$cf)*2] } set cu [expr 1.0/sqrt($tu*$tu+1)] set su [expr $tu*$cu] set sa [expr $cu*$sf] set c2a [expr -$sa*$sa+1] set x [expr sqrt((1.0/$r/$r-1)*$c2a+1)+1] set x [expr ($x-2.0)/$x] set c [expr 1-$x] set c [expr ($x*$x/4.0+1.0)/$c] set d [expr (0.375*$x*$x-1)*$x] set y [set tu [expr 1.0*$dist/$r/$a/$c]] while 1 { set sy [expr sin($y)] ; set cy [expr cos($y)] set cz [expr cos($baz+$y)] set e [expr $cz*$cz*2-1] set c $y set x [expr $e*$cy] set y [expr ((($sy*$sy*4-3)*($e+$e-1)*$cz*$d/6.0+$x)*$d/4.0-$cz)* \ $sy*$d+$tu] if { abs($y-$c) <= 5e-14 } { break } } set baz [expr $cu*$cy*$cf-$su*$sy] set c [expr $r*sqrt($sa*$sa+$baz*$baz)] set d [expr $su*$cy+$cu*$sy*$cf] set phi2 [expr atan2($d,$c)] set c [expr $cu*$cy-$su*$sy*$cf] set x [expr atan2($sy*$sf,$c)] set c [expr ((-3*$c2a+4)*$f+4)*$c2a*$f/16.0] set d [expr (($e*$cy*$c+$cz)*$sy*$c+$y)*$sa] set lam2 [expr $lam+$x-(1-$c)*$d*$f] # set baz [expr atan2($sa,$baz)+3.14159265358979323846] set lat1 [expr $phi2*57.29577951308232087684] set long1 [expr $lam2*57.29577951308232087684] return [list $lat1 $long1] } ### area proc ProjectedArea {wpixs} { # compute area of polygon whose boundary is the polyline formed by the # WPs in given list # polygon cannot be self-intersecting (no test on this!) # return value in square km global WPPosn WPDatum ASKPROJPARAMS set ix [lindex $wpixs 0] set datum $WPDatum($ix) ; set p $WPPosn($ix) set ps [list [list [set lat [lindex $p 0]] [lindex $p 1] $datum]] foreach ix [lreplace $wpixs 0 0] { set dt $WPDatum($ix) ; set p $WPPosn($ix) if { $dt != $datum } { set p [ToDatum [lindex $p 0] [lindex $p 1] $dt $datum] } lappend ps [list [lindex $p 0] [lindex $p 1] $datum] } if { $lat>=-80 && $lat<=84 } { set proj TM } else { # in fact this will use UPS set proj UTM } set ask $ASKPROJPARAMS set ASKPROJPARAMS 0 set xy [ProjInit $proj AProj $datum $ps] set ASKPROJPARAMS $ask set xmin [set x0 [lindex $xy 0]] ; set ymin [set y0 [lindex $xy 1]] set xs "" ; set ys "" foreach p [lreplace $ps 0 0] { set xy [eval Proj${proj}Point AProj $p] set x [lindex $xy 0] ; set y [lindex $xy 1] lappend xs $x ; lappend ys $y if { $x < $xmin } { set xmin $x } if { $y < $ymin } { set ymin $y } } set sum 0 set x0 [set x [expr $x0-$xmin]] ; set y0 [set y [expr $y0-$ymin]] foreach x1 $xs y1 $ys { set x1 [expr $x1-$xmin] ; set y1 [expr $y1-$ymin] set sum [expr $sum+$x*$y1-$x1*$y] set x $x1 ; set y $y1 } set sum [expr $sum+$x*$y0-$x0*$y] return [expr abs(0.5e-6*$sum)] } proc SphericalArea {wpixs} { # compute area of polygon whose boundary is the polyline formed by the # WPs in given list # computation is based on a spherical approximation # return negative value if there are precision errors # otherwise value in square km global WPPosn WPDatum set ix [lindex $wpixs 0] set datum $WPDatum($ix) ; set p [set p0 $WPPosn($ix)] set phi0 [set phi [expr [lindex $p 0]*0.01745329251994329576]] set lam0 [set lam [expr [lindex $p 1]*0.01745329251994329576]] set c0 [expr cos($phi0)] # computation of mean radius of the ellipsoid at a point # as described in Hrvoje Lukatela, "Ellipsoidal Area Computations of # Large Terrestrial Objects", http://www.geodyssey.com/papers/ggelare.html set dt [EllipsdData $datum] set a [lindex $dt 0] ; set b [expr $a*(1-[lindex $dt 1])] set s [expr sin($phi)] set a2 [expr $a*$a] # radius in km set r [expr 1e-3*$a2*$b/($a2*$c0*$c0+$b*$b*$s*$s)] # computation of area adapted from sph_poly.c in # "Graphics Gems IV", edited by Paul Heckbert, Academic Press, 1994. set srad 0 SetDatumData $datum foreach ixn [lreplace $wpixs 0 0] { set pos $WPPosn($ixn) if { $WPDatum($ixn) != $datum } { set pos [ToDatum [lindex $pos 0] [lindex $pos 1] \ $WPDatum($ixn) $datum] } set phi1 [expr [lindex $pos 0]*0.01745329251994329576] set lam1 [expr [lindex $pos 1]*0.01745329251994329576] set c1 [expr cos($phi1)] if { $lam0 != $lam1 } { set HavA [expr ((1-cos($phi1-$phi0))/2.0)+ \ ((1-cos($lam1-$lam0))/2.0)*$c0*$c1] set A [expr 2*asin(sqrt($HavA))] set B [expr 1.5707963267948966192313-$phi1] set C [expr 1.5707963267948966192313-$phi0] set S [expr 0.5*($A+$B+$C)] set T [expr tan($S/2.0)*tan(($S-$A)/2.0)* \ tan(($S-$B)/2.0)*tan(($S-$C)/2.0)] if { abs($T) < 1e-8 } { return -1 } set E [expr abs(4*atan(sqrt(abs($T))))] if { $lam1 < $lam0 } { set E [expr -$E] } set srad [expr $srad+$E] } set phi0 $phi1 ; set lam0 $lam1 ; set c0 $c1 } set lam1 $lam if { $lam0 != $lam1 } { set phi1 $phi ; set c1 [expr cos($lam1)] set HavA [expr ((1-cos($phi1-$phi0))/2.0)+ \ ((1-cos($lam1-$lam0))/2.0)*$c0*$c1] set A [expr 2*asin(sqrt($HavA))] set B [expr 1.5707963267948966192313-$phi1] set C [expr 1.5707963267948966192313-$phi0] set S [expr 0.5*($A+$B+$C)] set T [expr tan($S/2.0)*tan(($S-$A)/2.0)* \ tan(($S-$B)/2.0)*tan(($S-$C)/2.0)] if { abs($T) < 1e-8 } { return -1 } set E [expr abs(4*atan(sqrt(abs($T))))] if { $lam1 < $lam0 } { set E [expr -$E] } set srad [expr $srad+$E] } return [expr abs($r*$r*$srad)] } ### datums proc ChangeTPsDatum {tps datum1 datum2} { # convert position of TR points on list $tps from $datum1 to $datum2 # change only the first 4 elements (position) of each TP representation # this depends on DataIndex (see setup.tcl, Storage), not used here # for speed if { $datum1 == $datum2 } { return $tps } set l "" foreach tp $tps { set np [lindex [FormatPosition [lindex $tp 0] [lindex $tp 1] \ $datum1 DMS $datum2] 0] lappend l [concat $np [lrange $tp 4 end]] } return $l } proc ChangeLPsDatum {lps odatum datum pformt} { # change datum of LN list of points # change only the first element (position) of each LP representation # this depends on DataIndex (see setup.tcl, Storage), not used here # for speed # return -1 if the current position format requires a fixed datum # different from $datum global MESS POSTYPE if { $odatum == $datum } { return $lps } if { [set gd [BadDatumFor $pformt $datum Ignore]] != 0 } { GMMessage [format $MESS(cantchggriddatum) $gd] return -1 } set l "" foreach lp $lps { foreach "latd longd" [lindex $lp 0] { break } lappend l [lreplace $lp 0 0 \ [lindex [FormatPosition $latd $longd $odatum \ $pformt $datum] 0]] } return $l } ### altitude proc UserAltitude {altlst} { # return altitude in user units from internal representation global AltUnit ALSCALE if { $altlst == "" } { return "" } if { $AltUnit == "M" } { return [lindex $altlst 0] } if { $AltUnit == [lindex $altlst 2] } { return [lindex $altlst 1] } return [expr [lindex $altlst 0]/$ALSCALE] } proc AltitudeList {a} { # check value for altitude and return internal representation as list # return nil on error global AltUnit ALSCALE if { $a == "" } { return "" } if { ! [CheckSignedFloat Ignore $a] } { return nil } if { $AltUnit == "M" } { return $a } return [list [expr $a*$ALSCALE] $a $AltUnit] } ### dates proc Today {dformt} { # build representation of current date under format $dformt set dt [clock format [clock seconds] -format "%Y %m %d %H %M %S"] scan $dt %d%0d%0d%0d%0d%0d y m d h mn s return [FormatDate $dformt $y $m $d $h $mn $s] } proc TodayUTC {dformt} { # VR contribution # build representation of current date under format $dformt set dt [clock format [clock seconds] -format "%Y %m %d %H %M %S"] scan $dt %d%0d%0d%0d%0d%0d y m d h mn s return [eval FormatDate $dformt [LocalTimeAndUTC $y $m $d $h $mn $s Local]] } proc FormatDay {dformt y m d} { # build representation of date (without time of day) under format $dformt # (see proc FormatDate for date with time of day) # $dformt in # {YYYYMMDD, YYYY-MM-DD, MMDDYYYY, DDMMMYYYY, YYYY/MM/DD, ISO8601} # changes in proc FormatDate are likely to affect this proc! set cdate [FormatDate $dformt $y $m $d 0 0 0] if { $dformt == "YYYY/MM/DD" } { return [string range $cdate 0 9] } return [lindex $cdate 0] } proc FormatDate {dformt y m d h mn s} { # build representation of date (including time of day) under format $dformt # (see proc FormatDay for date without time of day) # $dformt either in # {YYYYMMDD, YYYY-MM-DD, MMDDYYYY, DDMMMYYYY, YYYY/MM/DD, ISO8601} # or DDMMYY in which case the date will have no time of day # changes here must be reflected in proc FormatDay and in proc ScanDate # when adding new formats here, array DATEW must be updated in main.tcl global MONTHNAMES # make sure there are no leading 0's foreach v "y m d h mn s" { scan [set $v] %0d $v } set h [format "%02d:%02d:%02d" $h $mn $s] switch $dformt { DDMMYY { # MGM contribution return [format "%02d%02d%02d" $d $m [expr $y % 100]] } ISO8601 { # VR contribution return [format "%4d-%02d-%02dT%sZ" $y $m $d $h] } YYYYMMDD { return [format "%4d.%02d.%02d %s" $y $m $d $h] } YYYY-MM-DD { return [format "%4d-%02d-%02d %s" $y $m $d $h] } MMDDYYYY { return [format "%02d/%02d/%4d %s" $m $d $y $h] } DDMMMYYYY { incr m -1 ; set m [lindex $MONTHNAMES $m] return [format "%02d-%s-%4d %s" $d $m $y $h] } YYYY/MM/DD { return [format "%4d/%02d/%02d-%s" $y $m $d $h] } } } proc FormatTime {secs args} { # build represention of seconds in hours:minutes:seconds format # $secs may be a float or an integer # if $args!="" it gives the number of decimal places for the seconds field # that defaults to 0 with $secs rounded to integer if { $args != "" && $args > 0 } { set fss "%02.${args}f" ; set fss0 "%8.${args}f" } else { set secs [expr round($secs)] set fss "%02d" ; set fss0 "%8d" } set s0 [expr int($secs)] set s [expr $s0%60] ; set x [expr ($s0-$s)/60] set s [expr $s+$secs-$s0] set mn [expr $x%60] ; set h [expr ($x-$mn)/60] if { $h > 0 } { return [format "%2d:%02d:$fss" $h $mn $s] } if { $mn > 0 } { return [format "%5d:$fss" $mn $s] } return [format $fss0 $s] } proc TimeToSecs {time} { # convert represention of seconds in hours:minutes:seconds format # to seconds (hours and minutes fields may be missing) # return integer or float according to seconds field set n [llength [set l [split $time ":"]]] set s [lindex $l end] if { [string first 0 $s] == 0 } { set s [string range $s 1 end] } if { $n == 1 } { return $s } set ll "" foreach f $l { scan $f %0d f lappend ll $f } scan [lindex $l 0] %0d f if { $n == 2 } { return [expr $s+60*$f] } scan [lindex $l 1] %0d g return [expr $s+60*$g+3600*$f] } proc NowTZ {} { # current date under default format with time zone appended global DateFormat return "[Today $DateFormat] ([clock format 0 -format %Z])" } proc Now {} { # current date under default format global DateFormat return [Today $DateFormat] } array set DAYSOF { 1 31 2 28 3 31 4 30 5 31 6 30 7 31 8 31 9 30 10 31 11 30 12 31 } proc ScanDate {date} { # convert date string to a list with year, month (in 1..12), day, # hours, minutes and seconds # if there is time zone information, return local time # return empty list on error # see proc FormatDate for possible date formats # changes in proc FormatDate are likely to affect this proc! set date [string trim $date] if { [regexp {^([0-9][0-9])([0-9][0-9])([0-9][0-9])$} $date \ x d m y] } { # DDMMYY, no time of day # YY taken as 2000+YY if YY<70, and 1900+YY otherwise foreach v "d m y" { scan [set $v] %02d $v } if { $y < 70 } { incr y 2000 } else { incr y 1900 } return [list $y $m $d 0 0 0] } set goodn -1 # includes VR contribution: decimal comma, empty tail if { [regexp {^ *([-0-9]+)T([0-9:]+([.,][0-9]+)?)([^ ]*) *$} \ $date m ymd hms m tail] } { # coping with ISO8601 format as in: # 2000-01-01T12:00:00Z # 2000-01-01T12:00:00.00000Z # 2004-06-07T13:51:27.2515650-07:00 # 2009-09-23T07:02:46.773 # 2009-09-23T07:02:46,773 # must replace decimal comma by period regsub {,} $hms "." hms set n 1 if { [scan $hms %02d:%02d:%0f h mn s] == 3 && \ [scan $ymd %4d-%02d-%02d y m d] == 3 } { if { [set s [expr round($s)]] > 59 } { incr s -60 if { [incr mn] > 59 } { incr mn -60 if { [incr h] > 23 } { incr h -24 foreach "y m d" [NextDay $y $m $d] {} } } } if { [scan $tail %03d:%02d hz mz] == 2 } { set goodn 1 # compute UTC date if { $hz > 0 } { set mz [expr -$mz] } set hz [expr -$hz] if { [incr mn $mz] > 59 } { incr h ; incr mn -60 } elseif { $mn < 0 } { incr h -1 ; incr mn 60 } if { [incr h $hz] > 23 } { incr h -24 foreach "y m d" [NextDay $y $m $d] {} } elseif { $h < 0 } { incr h 24 foreach "y m d" [PreviousDay $y $m $d] {} } # convert to local date foreach "y m d h mn s" \ [LocalTimeAndUTC $y $m $d $h $mn $s UTC] {} } elseif { $tail == "Z" } { set goodn 1 # convert to local date foreach "y m d h mn s" \ [LocalTimeAndUTC $y $m $d $h $mn $s UTC] {} } elseif { $tail == "" } { # local time : should convert to UTC set goodn 1 } } } else { set l [split $date -] ; set n [llength $l] if { $n == 1 } { # no "-"s set l [split $date /] ; set n [llength $l] if { $n == 1 } { # neither "-"s nor "/"s set l [split $date .] ; set n [llength $l] if { $n == 3 } { # YYYY.MM.DD HH:MM:SS set y [lindex $l 0] set m [string trimleft [lindex $l 1] 0] set n [scan [lindex $l 2] "%0d %0d:%0d:%0d" d h mn s] set goodn 4 } } elseif { $n == 3 } { # MM/DD/YYYY HH:MM:SS set m [string trimleft [lindex $l 0] 0] set d [string trimleft [lindex $l 1] 0] set n [scan [lindex $l 2] "%0d %0d:%0d:%0d" y h mn s] set goodn 4 } } elseif { $n == 3 } { set mt [lindex $l 1] if { [set m [Month $mt]] } { # DD-MMM-YYYY HH:MM:SS set d [string trimleft [lindex $l 0] 0] set n [scan [lindex $l 2] "%d %0d:%0d:%0d" y h mn s] set goodn 4 } elseif { [scan $mt %0d m] } { # YYYY-MM-DD HH:MM:SS set y [lindex $l 0] set n [scan [lindex $l 2] "%0d %0d:%0d:%0d" d h mn s] set goodn 4 } } elseif { $n == 2 } { # YYYY/MM/DD-HH:MM:SS set n [scan [lindex $l 0] "%0d/%0d/%0d" y m d] incr n [scan [lindex $l 1] "%0d:%0d:%0d" h mn s] set goodn 6 } } if { $n == $goodn && [CheckDateEls $y $m $d $h $mn $s] } { return [list $y $m $d $h $mn $s] } return "" } proc DateToSecs {y m d h mn s} { # convert date to seconds ellapsed since beginning of $YEAR0, not # necessarily a leap year global YEAR0 return [DateToSecsFrom $y $m $d $h $mn $s $YEAR0] } proc DateToSecsFrom {y m d h mn s year0} { # convert date to seconds ellapsed since beginning of $year0, not # necessarily a leap year global DAYSOF # make sure there are no leading 0's foreach v "y m d h mn s" { scan [set $v] %0d $v } # days in current month and in whole years except February 29ths set days [expr 365*($y-$year0)+$d-1] set yy [expr $year0+$year0%4] while { $yy < $y } { if { $yy%100!=0 || $yy%400==0 } { incr days } incr yy 4 } # add days in whole months of current year if { $m>2 && $y%4==0 && ($y%100!=0 || $y%400==0) } { incr days } incr m -1 while { $m > 0 } { incr days $DAYSOF($m) ; incr m -1 } return [expr $days*86400+$h*3600+$mn*60+$s] } proc DateFromSecs {secs} { # build date from seconds ellapsed since beginning of $YEAR0, not # necessarily a leap year, using default format global DateFormat return [eval FormatDate $DateFormat [DateIntsFromSecs $secs]] } proc DateIntsFromSecs {secs} { # compute date from seconds ellapsed since beginning of $YEAR0, # not necessarily a leap year # return list with year, month, day, hour, minutes, seconds as integers global DAYSOF YEAR0 set s [expr $secs%60] ; set x [expr ($secs-$s)/60] set mn [expr $x%60] ; set x [expr ($x-$mn)/60] set h [expr $x%24] ; set x [expr ($x-$h)/24] set y [expr int($x/365)] ; set yd [expr $y*365] set yy [expr $YEAR0+$YEAR0%4] ; incr y $YEAR0 while { $yy < $y } { if { $yy%100!=0 || $yy%400==0 } { incr yd } incr yy 4 } if { $yd > $x } { incr y -1 if { $y%4==0 && ($y%100!=0 || $y%400==0) } { incr yd -1 } incr yd -365 } incr x [expr 1-$yd] ; set m 1 while { $x > $DAYSOF($m) } { if { $m==2 && $y%4==0 && ($y%100!=0 || $y%400==0) } { if { $x == 29 } { break } incr x -1 } incr x -$DAYSOF($m) ; incr m } return [list $y $m $x $h $mn $s] } proc DateFromSecsFmt {secs fmt} { # build date from seconds ellapsed since beginning of $YEAR0, not # necessarily a leap year, using given format global DAYSOF YEAR0 set s [expr $secs%60] ; set x [expr ($secs-$s)/60] set mn [expr $x%60] ; set x [expr ($x-$mn)/60] set h [expr $x%24] ; set x [expr ($x-$h)/24] set y [expr int($x/365)] ; set yd [expr $y*365] set yy [expr $YEAR0+$YEAR0%4] ; incr y $YEAR0 while { $yy < $y } { if { $yy%100!=0 || $yy%400==0 } { incr yd } incr yy 4 } if { $yd > $x } { incr y -1 if { $y%4==0 && ($y%100!=0 || $y%400==0) } { incr yd -1 } incr yd -365 } incr x [expr 1-$yd] ; set m 1 while { $x > $DAYSOF($m) } { if { $m==2 && $y%4==0 && ($y%100!=0 || $y%400==0) } { if { $x == 29 } { break } incr x -1 } incr x -$DAYSOF($m) ; incr m } return [FormatDate $fmt $y $m $x $h $mn $s] } proc NextDay {y m d} { # return list with year, month and day for the day following the # given date global DAYSOF if { [incr d] > $DAYSOF($m) } { if { $m==2 && $y%4==0 && ($y%100!=0 || $y%400==0) } { if { $d != 29 } { set d 1 ; set m 3 } } else { set d 1 if { [incr m] == 13 } { incr y ; set m 1 } } } return [list $y $m $d] } proc PreviousDay {y m d} { # return list with year, month and day for the day before the # given date global DAYSOF if { [incr d -1] == 0 } { if { [incr m -1] == 0 } { set m 12 ; incr y -1 } if { $m==2 && $y%4==0 && ($y%100!=0 || $y%400==0) } { set d 29 } else { set d $DAYSOF($m) } } return [list $y $m $d] } proc Month {name} { # from month name to 0 (error) or 1..12 global ALLMONTH for {set m 1} { $m<13 } { incr m } { if { [lsearch -exact $ALLMONTH($m) $name] != -1 } { return $m } } return 0 } proc LocalTimeAndUTC {y m d h mn s origin} { # convert from/to UTC to/from local time # $origin =="UTC" converts from UTC # =="local" converts to UTC # return list with same elements as in the args global TimeOffset DAYSOF if { $origin != "UTC" } { incr h $TimeOffset } else { set h [expr $h-$TimeOffset] } if { $h < 0 } { incr h 24 if { [incr d -1] == 0 } { if { [incr m -1] == 0 } { set m 12 ; set d 31 ; incr y -1 } else { if { $m == 2 && $y%4 == 0 && \ ($y%100 != 0 || $y%400 == 0) } { set d 29 } else { set d $DAYSOF($m) } } } } elseif { $h > 23 } { incr h -24 if { [incr d] > $DAYSOF($m) } { if { $m == 2 } { if { $y%4 != 0 || ($y%100 == 0 && $y%400 != 0) } { set m 3 ; set d 1 } } elseif { $m == 12 } { set m 1 ; set d 1 ; incr y } else { incr m ; set d 1 } } } return [list $y $m $d $h $mn $s] } proc CompatibleDates {y0 m0 d0 secs1} { # check whether two dates are compatible # $y0, $m0, $d0 give one date (year, month name and day) and may # be * (to match anything) # $secs1 is the other date in seconds since $YEAR0 # return 1 if compatible if { $m0 != "*" && [set m0 [Month $m0]] == 0 } { BUG calling CompatibleDates with bad month name } foreach "y1 m1 d1 h1 mn1 s1" [DateIntsFromSecs $secs1] {} if { [string match $d0-$m0-$y0 $d1-$m1-$y1] } { return 1 } return 0 } ### varia proc VectorBearing {vx vy} { # compute bearing (angle from y-axis clockwise, in 0..359) of vector # with given components # return "_" if components are too small if { abs($vy)+abs($vx) > 1e-20 } { set b [expr round(atan2($vx,$vy)*57.29577951308232087684)] if { $b < 0 } { incr b 360 } } else { set b "_" } return $b } gpsman-6.4.4.2/gmsrc/files_foreign.tcl0000644000175000017500000046677712224351120015741 0ustar migmig# # This file is part of: # # gpsman --- GPS Manager: a manager for GPS receiver data # # Copyright (c) 1998-2013 Miguel Filgueiras migfilg@t-online.de # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. # # File: files_foreign.tcl # Last change: 6 October 2013 # # See below for guidelines on how to add support for new foreign formats # # Includes contributions by # - Brian Baulch (baulchb _AT_ onthenet.com.au) marked "BSB contribution" # - Matt Martin (matt.martin _AT_ ieee.org) marked "MGM contribution" # - Miguel Filgueiras (to code by others) marked "MF contribution" # - Valere Robin (valere.robin _AT_ wanadoo.fr) marked "VR contribution" # - Alessandro Palmas (alpalmas _AT_ tin.it) marked "AP contribution" # - Paul Scorer (p.scorer _AT_ leedsmet.ac.uk) marked "PS contribution" # # and changes by # - Mariusz Dabrowski (mgd4 _AT_ poczta.onet.pl) marked "MD changes" # # Includes an adaptation of a Perl script by Niki Hammler, http://www.nobaq.net # that converts exported FUGAWI data to DDD GPSman data # #### guidelines on how to add support for new foreign formats # # - choose a name for the new format: start with a capital letter, # keep the name short as it will be used in menus, and check that # it is not already in use # # - each file format must be described in the FILEFORMAT array that is # defined in metadata.tcl; see the comment there that documents the # entries in the array and prepare a description of the new format # # - find out an existing format similar to the new format, in particular # having the same "filetype" and the same "mode" and use its implementation # as a model (the GPSMan format is implemented in files.tcl, and part of # this code is used in the support for GPStrans; it is a good idea to # choose the implementation of other formats as models) # # - for importation a procedure Import_$FMT must be written whose arguments # are # - if the "filemode" is "unique" (only a possible items type): file # channel to read from, and reading mode that is either "normal" # or "inGR" (importing elements in a group; disregard if dealing # with groups is not supported) # - otherwise: the file channel, a list of types to import or # "Data", and the reading mode ("normal" or "inGR") # # - for exportation a procedure Export_$FMT must be written whose arguments # are # - if the "filemode" is "data": the file channel to write to and # a list of pairs with type and indices of the items to export # - otherwise: the file channel, the type and the list of indices # # - care must be taken to avoid clashes with existing global variables; it # is suggested that an array with name FF_$FMT (with $FMT the name # of the new format) is used for storing all global information needed # for its implementation ##### utility proc NextLine {n file} { # read next $n-th (>=1) non empty line # return trimmed line or "" if end of file found global MESS set k 0 while 1 { if { [eof $file] } { GMMessage $MESS(badfile) return "" } gets $file line ; set line [string trim $line] if { $line != "" && [incr k] == $n } { return $line } } # not used return } ##### reading/writing binary files ## binary coding of files: # little- and big-endian integral numbers # int, int_big: 16 bits; long, long_big: 32 bits # fixed-length strings: as sequence of bytes with given length # variable-length strings: length as int (little-endian), then the # sequence of bytes # floats and doubles: IEEE little-endian # booleans as ints # arrays of multiples: e.g., array@3=double,long is an array of pairs # whose length is given by element at index 3 (from 0) on the data list # (index < index of array); element type cannot be array! a list of lists # is used as the internal representation of the array array set BinConv { byte c byte,l 1 int s int,l 2 bool s bool,l 2 int_big S int_big,l 2 long i long,l 4 long_big I long_big,l 4 } proc ReadBinData {file types} { # adapted from proc UnPackData (garmin.tcl) # read binary data and convert to list of elements conforming to the # types in the list $types # accepted types: byte, int, int_big, long, long_big, float, double, # charray=*, varstring, unused=*, bool, array@*=* # bool is the same as int # delete leading and trailing spaces of strings and char arrays # return list of values read in global tcl_platform ReadBinError BinConv set vals "" foreach t $types { switch -glob $t { byte { set n 1 binary scan [read $file $n] "c" x set x [expr ($x+0x100)%0x100] } bool - int - int_big - long - long_big { set n $BinConv($t,l) binary scan [read $file $n] $BinConv($t) x } float { # this only works with machines following the # IEEE standard floating point representation set n 4 set bs [read $file $n] if { $tcl_platform(byteOrder) == "littleEndian" } { binary scan $bs "f" x } else { set id "" foreach k "3 2 1 0" { append id [string index $bs $k] } binary scan $id "f" x } } double { # this only works with machines following the # IEEE standard floating point representation set n 8 set bs [read $file $n] if { $tcl_platform(byteOrder) == "littleEndian" } { binary scan $bs "d" x } else { set id "" foreach k "7 6 5 4 3 2 1 0" { append id [string index $bs $k] } binary scan $id "d" x } } varstring { if { [set lg [ReadBinData $file int]] < 0 } { set ReadBinError 1 return $vals } set x [read $file $lg] set n [expr 2+$lg] set x [string trim $x " "] } charray=* { regsub charray= $t "" n set x [read $file $n] set x [string trim $x " "] } array*@* { if { ! [regexp {array@([0-9]+)=(.+)$} $t m ix lst] || \ [set lg [lindex $vals $ix]] < 0 || \ ! [regexp {^[0-9]+$} $lg] } { set ReadBinError 1 return $vals } set x "" ; set sts [split $lst ","] while { $lg } { incr lg -1 lappend x [ReadBinData $file $sts] if { $ReadBinError } { return [lappend vals $x] } } } unused=* { regsub unused= $t "" n read $file $n set x UNUSED } default { set ReadBinError 1 return $vals } } lappend vals $x } return $vals } proc WriteBinData {file types vals} { # adapted from proc DataToStr (garmin.tcl) # write binary data the result of converting from list of elements # conforming to the types in $types # accepted types: byte, int, int_big, long, long_big, float, double, # charray=*, varstring, unused=*, bool, array@*=* # bool is the same as int # return 0 on error global tcl_platform BinConv foreach t $types v $vals { switch -glob $t { byte - bool - int - int_big - long - long_big { puts -nonewline $file [binary format $BinConv($t) $v] } float { # this only works with machines following the # IEEE standard floating point representation set s [binary format "f" $v] if { $tcl_platform(byteOrder) != "littleEndian" } { set l [split "$s" ""] set s "" foreach k "3 2 1 0" { append s [lindex $l $k] } } puts -nonewline $file $s } double { # this only works with machines following the # IEEE standard floating point representation set s [binary format "d" $v] if { $tcl_platform(byteOrder) != "littleEndian" } { set l [split "$s" ""] set s "" foreach k "7 6 5 4 3 2 1 0" { append s [lindex $l $k] } } puts -nonewline $file $s } varstring { WriteBinData $file int [string length $v] puts -nonewline $file [binary format "a*" $v] } charray=* { regsub charray= $t "" n puts -nonewline $file [binary format "A$n" $v] } array*@* { if { ! [regexp {array@([0-9]+)=(.+)$} $t m ix lst] || \ [set lg [lindex $vals $ix]] < 0 || \ ! [regexp {^[0-9]+$} $lg] } { BUG "error in specification to WriteBinData: $t $lg" return 0 } set sts [split $lst ","] while { $lg } { incr lg -1 if { ! [WriteBinData $file $sts [lindex $v 0]] } { return 0 } set v [lreplace $v 0 0] } } unused=* { regsub unused= $t "" n puts -nonewline $file [binary format "x$n"] } default { BUG "unimplemented data type when converting to binary: $t" return 0 } } } flush $file return 1 } ##### exporting ### geo-referencing files ## Tiff World File format proc ExportTFW {affps} { # export coordinates tranformation parameters to TFW file # $affps is list with a parameter name followed by its value, as # in the map transformation data array for the affine case, # cf. proc AffineParams (maptransf.tcl) global TXT if { [set file [GMOpenFile $TXT(exportto) tfwfile w]] == ".." } { return } array set dt $affps foreach m {a c b d e f} { puts $file $dt($m) } close $file return } ### exporting data proc ExportFile {how fmt what} { # write data to file in foreign format # $fmt such that "out" is in $FILEFORMAT($fmt,mode) except GPSMan # $how==all: all items if $what==Data, otherwise items of type $what # $how==select: items of type $what chosen from list # possible types must be described by $FILEFORMAT($fmt,types) or the # the second element of the pair $FILEFORMAT($fmt,io_types) and # if $FILEFORMAT($fmt,filetype)!="data" there is a single type # return 0 on success, 1 on failure return [ExportFileTo "" $how $fmt $what] } proc ExportFileTo {file how fmt what} { # if $file!="stdout" it will be closed at the end global SFilePFrmt SFileDatum Storage TXT FILEFORMAT switch $how { all { # the order of the list is that imposed by $FILEFORMAT($fmt,types) # or the second element of the pair $FILEFORMAT($fmt,io_types); # this may be important when writing to files in a format that # imposes a specific order in the data if { [catch {set ts $FILEFORMAT($fmt,types)}] } { set ts [lindex $FILEFORMAT($fmt,io_types) 1] } set lp [AllIndicesForType $what $ts] } select { if { [set ixs [ChooseItems $what]] == "" } { return 1 } set lp [list [list $what $ixs]] } } if { $FILEFORMAT($fmt,filetype) != "data" } { set ixs [lindex [lindex $lp 0] 1] set ft type } else { set ft data } if { $fmt == "Shapefile" } { # single type return [ExportShapefileTo $file $what $ixs] } if { $file == "" && \ [set file [GMOpenFile $TXT(exportto) $what w]] == ".." } { return 1 } set sid [SlowOpWindow $TXT(export)] if { $ft == "data" } { Export_$fmt $file $lp } else { Export_$fmt $file $what $ixs } foreach v "PFrmt PFType Datum" { catch {unset SFile$v($file)} } if { $file != "stdout" } { close $file } SlowOpFinish $sid "" return 0 } proc ExportGREls {how fmt args} { # write data on elements of group to file in foreign format # $fmt such that "out" is in $FILEFORMAT($fmt,mode) except GPSMan, and # $FILEFORMAT($fmt,GREls) is defined # $how==all: from all groups, but types are selected # $how==select: groups and types are selected by the user # $args not used but in call-back # possible types must be described by $FILEFORMAT($fmt,types) or # the second element of the pair $FILEFORMAT($fmt,io_types) and # if $FILEFORMAT($fmt,filetype)!="data" there is a single type global GRName SFilePFrmt SFileDatum MESS TXT FILEFORMAT if { [catch {set types $FILEFORMAT($fmt,types)}] } { set types [lindex $FILEFORMAT($fmt,io_types) 1] } lappend types GR switch $how { all { set ixs [array names GRName] } select { if { [set ixs [ChooseItems GR]] == "" } { return } } } set ts "" foreach k $types { lappend ts $TXT(name$k) } if { $FILEFORMAT($fmt,filetype) == "data" } { set ft data } else { set ft type } while 1 { # select types of items to export keeping the order in $types set whs [GMChooseFrom many $MESS(putwhat) 6 $ts $types] if { [set i [lsearch -exact $whs GR]] != -1 } { set whs [lreplace $whs $i $i] set rec 1 } else { set rec 0 } if { [set n [llength $whs]] == 0 } { return } if { $n > 1 && $ft == "type" } { GMMessage $MESS(exportonly1) } else { break } } set lp "" ; set none 1 foreach wh $whs { if { [set eixs [GRsElements $ixs $rec $wh]] != "" } { set none 0 } lappend lp [list $wh $eixs] } if { $none } { return } if { $fmt == "Shapefile" } { # single type ExportShapefileTo "" $whs $eixs return } set f [GMOpenFile $TXT(exportto) GR w] if { $f != ".." } { set sid [SlowOpWindow $TXT(export)] if { $ft == "data" } { Export_$fmt $f $lp } else { Export_$fmt $f $whs $eixs } catch { unset SFilePFrmt($f) ; unset SFileDatum($f) } close $f SlowOpFinish $sid "" } return } ## GPStrans format proc Export_GPStrans {file what ixs} { ExportGPStransHeader $file ExportGPStrans$what $file $ixs 1 return } proc ExportGPStransHeader {file} { # write header to file in GPStrans format, using $pformt for positions global TimeOffset Datum SFilePFrmt SFileDatum set dix [DatumRefId $Datum] if { ! [regexp {^[0-9]+$} $dix] } { # datum not defined in GPStrans set datum "WGS 84" set dix [DatumRefId $datum] } else { set datum $Datum } set h [format {Format: DDD UTC Offset: %6.2f hrs Datum[%3d]: %s} \ $TimeOffset $dix $datum] puts $file $h set SFileDatum($file) $datum # following values assumed below set SFilePFrmt($file) DDD return } proc ExportGPStransWP {file ixs tofile} { # write WPs with indices in list $ixs either to file in GPStrans format, # or to auxiliary file for putting data into receiver global WPName WPCommt WPPosn WPDatum WPDate global CREATIONDATE SFileDatum set d [Today MMDDYYYY] foreach i $ixs { if { [SlowOpAborted] } { return } if { $i != -1 } { if { $CREATIONDATE } { set d $WPDate($i) } set latd [lindex $WPPosn($i) 0] ; set longd [lindex $WPPosn($i) 1] if { $WPDatum($i) != $SFileDatum($file) } { set p [ToDatum $latd $longd $WPDatum($i) $SFileDatum($file)] set latd [lindex $p 0] ; set longd [lindex $p 1] } if { $tofile } { set m [format "W\t%s\t%40s\t%20s\t%03.7f\t%04.7f" \ $WPName($i) $WPCommt($i) $d $latd $longd] } else { set m [format "W\t%s\t%40s\t%20s\t%03.7f\t%04.7f" \ $WPName($i) [JustfLeft 40 $WPCommt($i)] $d $latd $longd] } puts $file $m } } return } proc ExportGPStransRT {file ixs tofile} { # write RTs with indices in list $ixs either to file in GPStrans format, # or to auxiliary file for putting data into receiver global RTIdNumber RTCommt RTWPoints MAXROUTES MESS set badids 0 foreach i $ixs { if { [SlowOpAborted] } { return } if { ! [CheckNumber Ignore $RTIdNumber($i)] } { incr badids } else { set wps [Apply "$RTWPoints($i)" IndexNamed WP] if { [Undefined $wps] } { GMMessage [format $MESS(undefWP) $RTIdNumber($i)] } elseif { !$tofile && $RTIdNumber($i)>$MAXROUTES } { GMMessage [format $MESS(bigRT) $RTIdNumber($i)] } else { puts $file [format "R\t%d\t%40s" $RTIdNumber($i) \ [JustfLeft 40 $RTCommt($i)]] ExportGPStransWP $file $wps $tofile } } } if { $badids > 0 } { GMMessage [format $MESS(cantsaveRTid) $badids] } return } proc ExportGPStransTR {file ixs tofile} { # write TRs with indices in list $ixs either to file in GPStrans format, # or to auxiliary file for putting data into receiver global TRTPoints TRDatum SFileDatum foreach i $ixs { if { [SlowOpAborted] } { return } if { $TRDatum($i) != $SFileDatum($file) } { set tps [ChangeTPsDatum $TRTPoints($i) $TRDatum($i) \ $SFileDatum($file)] } else { set tps $TRTPoints($i) } foreach tp $tps { if { [SlowOpAborted] } { return } puts $file [format "T\t%s\t%lf\t%lf" [lindex $tp 4] \ [lindex $tp 0] [lindex $tp 1]] } puts $file "" } return } proc WriteXMLTag { type value } { regsub -all {&} $value {\&} value regsub -all {>} $value {\>} value regsub -all {<} $value {\<} value regsub -all {"} $value {\"} value # ": a quote to avoid wrong colours in Emacs... regsub -all {\'} $value {\'} value return "<$type>$value\n" } ## GPX format ## Contributed by Valere Robin (valere.robin _AT_ wanadoo.fr) # MF change: using system encoding proc GPX_Encoding {tcl_enc} { # convert a Tcl encoding name to the GPX one # if the prefix is iso[0-9] it is converted to iso-[0-9], otherwise do # nothing regsub {^iso([0-9])} $tcl_enc {iso-\1} tcl_enc return $tcl_enc } #---- set GPX_Header " an author an_email _AT_ somewhere an_url a_url_name" proc Export_GPX {file typesixs} { # MF contribution: code by VR moved out from general export procs ExportGPXHeader $file foreach p $typesixs { ExportGPX[lindex $p 0] $file [lindex $p 1] 1 } ExportGPXTrailer $file return } proc ExportGPXHeader {file} { # write header to file in GPX format, using $pformt for positions global GPX_Header SFilePFrmt SFileDatum puts $file $GPX_Header puts $file "" set SFileDatum($file) "WGS 84" set SFilePFrmt($file) DDD return } proc ExportGPXTrailer {file} { puts $file "" } proc ExportGPXWP {file ixs tofile } { # write WPs with indices in list $ixs either to file in GPX format, # or to auxiliary file for putting data into receiver # type can be "wpt" or "rtept" ExportGPXPT $file $ixs $tofile wpt } proc ExportGPXData {file ixs tofile } { # write WPs with indices in list $ixs either to file in GPX format, # or to auxiliary file for putting data into receiver # type can be "wpt" or "rtept" ExportGPXWP $file $ixs $tofile ExportGPXRT $file $ixs $tofile ExportGPXTR $file $ixs $tofile } proc ExportGPXPT {file ixs tofile type} { # write WPs with indices in list $ixs either to file in GPX format, # or to auxiliary file for putting data into receiver # type can be "wpt" or "rtept" global WPName WPCommt WPPosn WPDatum WPDate WPObs WPSymbol WPAlt global SFileDatum foreach i $ixs { if { [SlowOpAborted] } { return } if { $i != -1 } { set latd [lindex $WPPosn($i) 0] ; set longd [lindex $WPPosn($i) 1] if { $WPDatum($i) != $SFileDatum($file) } { # MF change: calling ToDatum instead of ConvertDatum set p [ToDatum $latd $longd $WPDatum($i) $SFileDatum($file)] set latd [lindex $p 0] ; set longd [lindex $p 1] } puts $file [format "<$type lat=\"%03.7f\" lon=\"%04.7f\">" \ $latd $longd ] # MF contribution: elevation field # altitude in metres if { [set alt [lindex $WPAlt($i) 0]] != "" } { puts $file " $alt" } #--- puts $file [ WriteXMLTag "name" $WPName($i) ] # puts $file [format " %s" $WPName($i) $WPObs($i)] set date $WPDate($i) if { $date != "" } { set datesecs [lindex [CheckConvDate $date ] 1] set dints [ DateIntsFromSecs $datesecs ] set utcdints [ eval LocalTimeAndUTC $dints "local"] set time [eval FormatDate "ISO8601" $utcdints] puts $file " " } if { $WPSymbol($i) != "" } { puts $file [format " %s\n" $WPSymbol($i) ] } if { $WPCommt($i) != "" } { puts $file [ WriteXMLTag "cmt" $WPCommt($i) ] } if { $WPObs($i) != "" } { puts $file [ WriteXMLTag "desc" $WPObs($i) ] } puts $file "\n" } } return } proc ExportGPXRT {file ixs tofile} { # write RTs with indices in list $ixs either to file in GPX format, # or to auxiliary file for putting data into receiver global RTIdNumber RTCommt RTObs RTWPoints MAXROUTES MESS set badids 0 foreach i $ixs { if { [SlowOpAborted] } { return } set wps [Apply "$RTWPoints($i)" IndexNamed WP] if { [Undefined $wps] } { GMMessage [format $MESS(undefWP) $RTIdNumber($i)] } elseif { !$tofile && $RTIdNumber($i)>$MAXROUTES } { GMMessage [format $MESS(bigRT) $RTIdNumber($i)] } else { puts $file "" puts $file [ WriteXMLTag "name" $RTIdNumber($i) ] if { $RTCommt($i) != "" } { puts $file [ WriteXMLTag "desc" $RTCommt($i) ] } if { $RTObs($i) != "" } { puts $file [ WriteXMLTag "cmt" $RTObs($i) ] } ExportGPXPT $file $wps $tofile rtept puts $file "" } } if { $badids > 0 } { GMMessage [format $MESS(cantsaveRTid) $badids] } return } proc ExportGPXTR {file ixs tofile} { # write TRs with indices in list $ixs either to file in GPX format, # or to auxiliary file for putting data into receiver global TRTPoints TRObs TRDatum SFileDatum DataIndex TRName TRSegStarts set idt $DataIndex(TPdate) set ial $DataIndex(TPalt) ; set idp $DataIndex(TPdepth) set ids $DataIndex(TPsecs) foreach i $ixs { puts $file "" puts $file [ WriteXMLTag "name" $TRName($i) ] if { $TRObs($i) != "" } { puts $file [ WriteXMLTag "desc" $TRObs($i) ] } puts $file " \n" if { [SlowOpAborted] } { return } # MF change: using proc ChangeTPsDatum if { $TRDatum($i) != $SFileDatum($file) } { set tps [ChangeTPsDatum $TRTPoints($i) $TRDatum($i) \ $SFileDatum($file)] } else { set tps $TRTPoints($i) } # MF contribution: segment starters set ssts $TRSegStarts($i) set tpn 0 ; set nsst [lindex $ssts 0] #-- foreach tp $tps { if { [SlowOpAborted] } { return } # MF contribution: segment starters if { $nsst == $tpn } { puts $file "\n" set ssts [lreplace $ssts 0 0] set nsst [lindex $ssts 0] } incr tpn #-- set latd [lindex $tp 0] ; set longd [lindex $tp 1] set alt [lindex $tp $ial ] set secs [lindex $tp $ids ] puts $file "" set dints [ DateIntsFromSecs $secs ] set utcdints [ eval LocalTimeAndUTC $dints "local"] set time [eval FormatDate "ISO8601" $utcdints] puts $file " $alt\n \n" } puts $file "" } return } ## KML format ## Contributed by Valere Robin (valere . robin _at_ wanadoo.fr) # MF change: using system encoding set KML_Header " GPSMan Export 1 GPSMan.\]\]> normal #NormalPoint highlight #HighlightedPoint " proc Export_KML {file typesixs} { ExportKMLHeader $file foreach p $typesixs { ExportKML[lindex $p 0] $file [lindex $p 1] 1 } ExportKMLTrailer $file return } proc ExportKMLHeader {file} { # write header to file in KML format global KML_Header SFilePFrmt SFileDatum puts $file $KML_Header puts $file "" set SFileDatum($file) "WGS 84" set SFilePFrmt($file) DDD return } proc ExportKMLTrailer {file} { puts $file "" } proc ExportKMLWP {file ixs tofile } { # write WPs with indices in list $ixs either to file in KML format, puts $file "Waypoints" ExportKMLPT $file $ixs $tofile wpt puts $file "" } proc ExportKMLData {file ixs tofile } { # write WPs with indices in list $ixs either to file in KML format, ExportKMLWP $file $ixs $tofile ExportKMLRT $file $ixs $tofile ExportKMLTR $file $ixs $tofile } proc ExportKMLPT {file ixs tofile type} { # write WPs with indices in list $ixs either to file in KML format, # type can be "wpt" or "rtept" global WPName WPCommt WPPosn WPDatum WPDate WPObs WPSymbol WPAlt global SFileDatum foreach i $ixs { if { [SlowOpAborted] } { return } if { $i != -1 } { set latd [lindex $WPPosn($i) 0] ; set longd [lindex $WPPosn($i) 1] if { $WPDatum($i) != $SFileDatum($file) } { # MF change: calling ToDatum instead of ConvertDatum set p [ToDatum $latd $longd $WPDatum($i) $SFileDatum($file)] set latd [lindex $p 0] ; set longd [lindex $p 1] } if { [set alt [lindex $WPAlt($i) 0]] != "" } { } else { set alt 0 } set ptdesc [format " %03.7f,%04.7f,%04.7f" \ $longd $latd $alt] append ptdesc [ WriteXMLTag "name" $WPName($i) ] set date $WPDate($i) set comment "" if { $date != "" } { set datesecs [lindex [CheckConvDate $date ] 1] set dints [ DateIntsFromSecs $datesecs ] set utcdints [ eval LocalTimeAndUTC $dints "local"] set time [eval FormatDate "ISO8601" $utcdints] #append comment "time:$time
\]\]>" } if { $WPSymbol($i) != "" } { #puts $file [format " %s\n" $WPSymbol($i) ] } if { $WPCommt($i) != "" } { #puts $file [ WriteXMLTag "cmt" $WPCommt($i) ] append comment "$WPCommt($i)" } if { $WPObs($i) != "" } { #puts $file [ WriteXMLTag "desc" $WPObs($i) ] append comment "$WPObs($i)" } append ptdesc "$comment" append ptdesc "#WayPoint" append ptdesc "
" if { $type == "wpt" } { puts $file $ptdesc } elseif { $type == "rtept" } { puts $file "$longd,$latd,$alt" } } } return } proc ExportKMLRT {file ixs tofile} { # write RTs with indices in list $ixs either to file in KML format, global RTIdNumber RTCommt RTObs RTWPoints MAXROUTES MESS set badids 0 puts $file "Routes1" puts $file "0" set RTcoordinates "" foreach i $ixs { if { [SlowOpAborted] } { return } set wps [Apply "$RTWPoints($i)" IndexNamed WP] if { [Undefined $wps] } { GMMessage [format $MESS(undefWP) $RTIdNumber($i)] } elseif { !$tofile && $RTIdNumber($i)>$MAXROUTES } { GMMessage [format $MESS(bigRT) $RTIdNumber($i)] } else { puts $file "" puts $file [ WriteXMLTag "name" $RTIdNumber($i) ] puts $file "0" set comment "" if { $RTCommt($i) != "" } { append comment "$RTCommt($i)" } if { $RTObs($i) != "" } { append comment " - $RTObs($i)" } puts $file [ WriteXMLTag "description" $comment ] puts $file "#YellowLine" puts $file "1" ExportKMLPT $file $wps $tofile rtept puts $file "" } } puts $file "" if { $badids > 0 } { GMMessage [format $MESS(cantsaveRTid) $badids] } return } proc ExportKMLTR {file ixs tofile} { # write TRs with indices in list $ixs either to file in KML format, global TRTPoints TRObs TRDatum SFileDatum DataIndex TRName TRSegStarts set idt $DataIndex(TPdate) set ial $DataIndex(TPalt) ; set idp $DataIndex(TPdepth) set ids $DataIndex(TPsecs) puts $file "Tracks" puts $file "1" puts $file "0" foreach i $ixs { puts $file "" puts $file [ WriteXMLTag "name" $TRName($i) ] if { $TRObs($i) != "" } { puts $file [ WriteXMLTag "description" "$TRObs($i)" ] } puts $file "" puts $file "Segment" puts $file "#RedLine" puts $file " 1\n" if { [SlowOpAborted] } { return } # MF change: using proc ChangeTPsDatum if { $TRDatum($i) != $SFileDatum($file) } { set tps [ChangeTPsDatum $TRTPoints($i) $TRDatum($i) \ $SFileDatum($file)] } else { set tps $TRTPoints($i) } # MF contribution: segment starters set ssts $TRSegStarts($i) set tpn 0 ; set nsst [lindex $ssts 0] #-- foreach tp $tps { if { [SlowOpAborted] } { return } # MF contribution: segment starters if { $nsst == $tpn } { puts $file "" puts $file "" puts $file "" puts $file "Segment" puts $file "#RedLine" puts $file "1\n" set ssts [lreplace $ssts 0 0] set nsst [lindex $ssts 0] } incr tpn #-- set latd [lindex $tp 0] ; set longd [lindex $tp 1] set alt [lindex $tp $ial ] set secs [lindex $tp $ids ] puts $file "$longd,$latd,$alt" #set dints [ DateIntsFromSecs $secs ] #set utcdints [ eval LocalTimeAndUTC $dints "local"] #set time [eval FormatDate "ISO8601" $utcdints] #puts $file " $alt\n \n" } puts $file "" puts $file "" } puts $file "" return } ## Ozi format # Contributed by Alessandro Palmas (alpalmas _AT_ tin.it) # Thanks to: # Alex Mottram - gpsbabel staff - http://gpsbabel.sourceforge.net # Dave Patton - http://www.confluence.org/ proc Export_Ozi {file what ixs} { # MF contribution: code moved out from general export procs ExportOzi$what $file $ixs return } proc DelphiTime {date} { # compute Delphi time (starting 1899-12-30 0:0:0) from GPSMan date # return the empty list on error if { [set l [ScanDate $date]] == "" } { return "" } foreach "Y m D hh mm ss" $l {} set seconds_a [DateToSecsFrom $Y $m $D $hh $mm $ss 1950] set seconds_b [DateToSecsFrom 1950 1 1 0 0 0 1899] set seconds_0 [DateToSecsFrom 1899 12 30 0 0 0 1899] set delphi_1 [expr 1.0 * ($seconds_b - $seconds_0)/86400.0] set delphi_2 [expr 1.0 * $seconds_a/86400.0] set delphi [expr $delphi_1 + $delphi_2] return $delphi } proc ExportOziWP {file ixs} { # derived from proc ExportGPStransWP # write WPs with indices in list $ixs to file in OZI format global WPName WPCommt WPPosn WPDatum WPDate global Datum global CREATIONDATE SFileDatum global ALSCALEFOR MESS TXT global WPAlt set d [Today MM/DD/YYYY] # $file must end in .wpt # we will have some checks here... To Be Done puts $file "OziExplorer Waypoint File Version 1.1" puts $file "WGS 84" puts $file "Reserved 2" ;# reserved for future use puts $file "Reserved 3" ;# GPS Symbol Set, unused # since max wp number is 1000 per file, we must trace this in $n; set n 0 ;# count wp in current $file set nf 0 ;# count for $file name foreach i $ixs { if { [SlowOpAborted] } { return } if { $i != -1 } { if { $CREATIONDATE } { set d $WPDate($i) } set latd [lindex $WPPosn($i) 0] ; set longd [lindex $WPPosn($i) 1] if { $WPDatum($i) != "WGS 84" } { # MF change: calling ToDatum instead of ConvertDatum set p [ToDatum $latd $longd $WPDatum($i) "WGS 84"] set latd [lindex $p 0] ; set longd [lindex $p 1] } set n [expr $n+1] if {$n > 1000} { GMMessage [format $MESS(toomany) $TXT(waypoint) 1000] return } puts -nonewline $file "$n," ;# Field 1: number puts -nonewline $file "$WPName($i)," ;# Field 2: Name (short) puts -nonewline $file "$latd," ;# Field 3: lat DDD puts -nonewline $file "$longd," ;# Field 4: long DDD set delphitime [DelphiTime $d] puts -nonewline $file "$delphitime," ;# Field 5: date, in delphi format puts -nonewline $file "0," ;# Field 6: symbol puts -nonewline $file "1," ;# Field 7: fixed puts -nonewline $file "3," ;# Field 8: map display format puts -nonewline $file "0," ;# Field 9: Foreground color: Black puts -nonewline $file "65535," ;# Field 10: Background color: White set wpcomm40 [string range $WPCommt($i) 0 39] puts -nonewline $file "$wpcomm40," ;# Field 11: Comment (Max 40, no commas) TBD puts -nonewline $file "," ;# Field 12: Direction puts -nonewline $file "0," ;# Field 13: Garmin Display Format puts -nonewline $file "0," ;# Field 14: Proximity Distance( 0 is off) set mt [lindex $WPAlt($i) 0] # if not valid set ft -777 if {$mt == ""} { set ft -777 } else { set ft [expr $mt/$ALSCALEFOR(FT)] } puts -nonewline $file "$ft," ;# Field 15: Altitude, in feet. -777 is non valid puts -nonewline $file "6," ;# Field 16: Font size puts -nonewline $file "0," ;# Field 17: Font style: 0 normal, 1 bold puts -nonewline $file "17" ;# Field 18: Symbol Size, 17 is normal puts $file "" } } return } proc ExportOziTR {file ixs} { # write TRs with indices in list $ixs to file in Ozi format global TRTPoints TRDatum SFileDatum global TRName global ALSCALEFOR global DataIndex # It seems that in ozi 1 file <-> 1 track, anyway let's go... foreach i $ixs { if { [SlowOpAborted] } { return } if { $TRDatum($i) != "WGS 84" } { set tps [ChangeTPsDatum $TRTPoints($i) $TRDatum($i) \ "WGS 84"] } else { set tps $TRTPoints($i) } #Line 1: File type & version puts $file "OziExplorer Track Point File Version 2.1" #Line 2: Datum puts $file "WGS 84" #Line 3: Reminder puts $file "Altitude is in Feet" #Line 4: Reserved line puts $file "Reserved 4" #Line 5: Various fields # in GPSBabel they use: 0,2,255,ComplimentsOfGPSBabel,0,0,2,8421376 puts -nonewline $file "0," ;# Field 1: fixed puts -nonewline $file "2," ;# Field 2: track size puts -nonewline $file "255," ;# Field 3: track color regsub -all -- {(?=[[:punct:]])} $TRName($i) "-" trackname puts -nonewline $file "$trackname," ;# Field 4: track name ( no commas! TBD regexp) puts $file "0,0,2,8421376" ;# Field 5,6,7,8: track type & style #Line 6: Unused, if you want, put here number of track points puts $file "0" foreach tp $tps { if { [SlowOpAborted] } { return } puts -nonewline $file "[lindex $tp 0]," ; # 1- Lat, DDD puts -nonewline $file "[lindex $tp 1]," ; # 2- Lon, DDD puts -nonewline $file "0," ; # 3- 0: no break line, 1: break line set mt [lindex $tp $DataIndex(TPalt)] # if not valid set ft -777 if {$mt == ""} { set ft -777 } else { set ft [expr $mt/$ALSCALEFOR(FT)] } puts -nonewline $file "$ft," ; # 4- altitude set date [lindex $tp 4] set delphitime [DelphiTime $date] puts -nonewline $file "$delphitime," ; # 5- Date Delphi format TBD puts -nonewline $file "," ; # 6- Date MM/DD/YYYY TBD puts -nonewline $file "," ; # 7- Time TBD puts $file "" } } return } # ------------------------------------------------------------ # ## Shapefile format set SHPUndef -1e40 # datum must be kept compatible with position format set SHPDatum "WGS 84" set SHPPFormt DDD set SHPZone "" set SHPDUnit $ALTUNIT set SHPAUnit $ALTUNIT set SHPDim 3 proc ExportShapefileTo {fname what ixs} { # export to Shapefile format items with indices $ixs of type $what # $fname may be empty in which case the user is asked to give a file name # $what in {WP, RT, TR, LN} # all data converted to $SHPDatum (currently set to "WGS 84") # return 1 on error, 0 on success global WPName WPCommt WPDate WPPFrmt WPPosn WPDatum WPAlt RTIdNumber \ RTCommt RTWPoints TRName TRObs TRDatum TRTPoints TRSegStarts \ LNName LNObs LNPFrmt LNDatum LNLPoints LNSegStarts DataIndex MESS \ TXT SHPUndef SHPPFormt SHPDatum SHPDUnit SHPAUnit SHPDim GFPFormt \ GFDUnit GFAUnit NNUMPFORMATS POSTYPE ALSCALEFOR INVTXT GSHPVersion if { $fname == "" } { set ok 0 set GFPFormt $TXT($SHPPFormt) set GFDUnit $TXT($SHPDUnit) ; set GFAUnit $TXT($SHPAUnit) set vs "SHPDim GFPFormt SHPDatum GFDUnit GFAUnit" set pfas [list $NNUMPFORMATS =GFPFormt TXT] set us [list $TXT(M) $TXT(FT)] set ds [list +$TXT(dimens)/[list 3 2] \ !$TXT(optPositionFormat)=FillPFormtMenu/$pfas \ !$TXT(datum)=FillDatumMenu/ \ +$TXT(distunit)/$us +$TXT(altunit)/$us] while { [set fn [GMGetFileName $TXT(exportto) $what w $vs $ds]] \ != ".." } { set basename [file rootname $fn] switch -- [set ext [file extension $fn]] { .shp - .shx - .dbf - "" { set ok 1 } default { if { [GMConfirm [format $MESS(shpext) $ext]] } { set ok 1 } } } if { $ok && ( [file exists $basename.shp] || \ [file exists $basename.shx] || \ [file exists $basename.dbf] ) } { if { [GMSelect $MESS(filexists) \ [list $TXT(ovwrt) $TXT(cancel)] "0 1"] } { set ok 0 } } if { $ok } { set SHPPFormt $INVTXT($GFPFormt) if { [BadDatumFor $SHPPFormt $SHPDatum GMMessage] != 0 } { set ok 0 } else { set SHPDUnit $INVTXT($GFDUnit) set SHPAUnit $INVTXT($GFAUnit) break } } } if { ! $ok } { return 1 } } else { # SHPDim, SHPPFormt, SHPDatum, SHPDUnit and SHPAUnit assumed to be # defined set basename [file rootname $fname] } if { $what == "LN" } { set shpwh TR } else { set shpwh $what } if { [set fsid [GSHPCreateFiles $basename $shpwh $SHPDim]] < 1 } { switch -- $fsid { 0 { set m shpcntopen } -1 - -2 { BUG invalid type or dim } -3 { set m shpcntcrtfs } -4 { set m shpoutmem } } GMMessage $MESS($m) ; GSHPCloseFiles $fsid return 1 } foreach "xix yix" $POSTYPE($SHPPFormt,xyixs) {} if { $POSTYPE($SHPPFormt) == "latlong" } { set scdist 1 } else { set scdist $ALSCALEFOR($SHPDUnit) } set scalt $ALSCALEFOR($SHPAUnit) set slowid [SlowOpWindow $TXT(export)] switch $what { WP { foreach ix $ixs { if { [SlowOpAborted] } { break } set p $WPPosn($ix) if { $WPPFrmt($ix) != $SHPPFormt || \ $WPDatum($ix) != $SHPDatum } { set p [lindex [FormatPosition [lindex $p 0] [lindex $p 1] \ $WPDatum($ix) $SHPPFormt $SHPDatum] 0] } if { [lindex $p 2] == "--" } { GMMessage $MESS(outofgrid) continue } set x [expr $scdist*[lindex $p $xix]] set y [expr $scdist*[lindex $p $yix]] if { $SHPDim == 3 } { if { [set alt [lindex $WPAlt($ix) 0]] == "" } { set alt $SHPUndef } else { set alt [expr $alt*$scalt] } set r [GSHPWriteWP $fsid $x $y $alt $WPName($ix) \ $WPCommt($ix) $WPDate($ix)] } else { set r [GSHPWriteWP $fsid $x $y $WPName($ix) $WPCommt($ix) \ $WPDate($ix)] } switch -- $r { -3 { SlowOpFinish $slowid $MESS(shpoutmem) return 1 } -4 { SlowOpFinish $slowid $MESS(shpcntwrtfs) ; return 1 } } } } RT { foreach ix $ixs { if { [SlowOpAborted] } { break } GSHPCreateRT $SHPDim $RTIdNumber($ix) $RTCommt($ix) set wpixs [Apply "$RTWPoints($ix)" IndexNamed WP] if { [Undefined $wpixs] } { SlowOpFinish $slowid \ [format $MESS(undefWP) $RTIdNumber($ix)] return 1 } else { foreach wpix $wpixs { if { [SlowOpAborted] } { break } set p $WPPosn($wpix) if { $WPPFrmt($wpix) != $SHPPFormt || \ $WPDatum($wpix) != $SHPDatum } { set p [lindex [FormatPosition [lindex $p 0] \ [lindex $p 1] $WPDatum($wpix) \ $SHPPFormt $SHPDatum] 0] } if { [lindex $p 2] == "--" } { GMMessage $MESS(outofgrid) continue } set x [expr $scdist*[lindex $p $xix]] set y [expr $scdist*[lindex $p $yix]] if { $SHPDim == 3 } { if { [set alt [lindex $WPAlt($wpix) 0]] == "" } { set alt $SHPUndef } else { set alt [expr $scalt*$alt] } set r [GSHPAddWPToRT $x $y $alt] } else { set r [GSHPAddWPToRT $x $y] } if { $r == -2 } { SlowOpFinish $slowid $MESS(shpoutmem) return 1 } } switch -- [GSHPWriteRT $fsid 1] { -5 { SlowOpFinish $slowid $MESS(shpoutmem) return 1 } -6 { SlowOpFinish $slowid $MESS(shpcntwrtfs) return 1 } } } } } TR { set ilt $DataIndex(TPlatd) ; set ilg $DataIndex(TPlongd) set ial $DataIndex(TPalt) set wsegs [expr $GSHPVersion >= 1.1] foreach ix $ixs { if { [SlowOpAborted] } { break } if { $wsegs && $TRSegStarts($ix) != "" } { switch -- [GSHPCreateTR $SHPDim $TRName($ix) $TRObs($ix) \ $TRSegStarts($ix)] { -2 { SlowOpFinish $slowid $MESS(shpoutmem) return 1 } -3 { BUG invalid segment starters } } } else { GSHPCreateTR $SHPDim $TRName($ix) $TRObs($ix) } if { $TRDatum($ix) != $SHPDatum } { set tps [ChangeTPsDatum $TRTPoints($ix) \ $TRDatum($ix) $SHPDatum] } else { set tps $TRTPoints($ix) } foreach tp $tps { if { [SlowOpAborted] } { break } if { $SHPPFormt != "DMS" } { set p [lindex \ [FormatPosition [lindex $tp $ilt] [lindex $tp $ilg] \ $SHPDatum $SHPPFormt $SHPDatum] 0] if { [lindex $p 2] == "--" } { GMMessage $MESS(outofgrid) continue } } else { set p $tp } set x [expr $scdist*[lindex $p $xix]] set y [expr $scdist*[lindex $p $yix]] if { $SHPDim == 3 } { if { [set alt [lindex [lindex $tp $ial] 0]] == "" } { set alt $SHPUndef } else { set alt [expr $scalt*$alt] } set r [GSHPAddTPToTR $x $y $alt] } else { set r [GSHPAddTPToTR $x $y] } if { $r == -2 } { SlowOpFinish $slowid $MESS(shpoutmem) return 1 } } switch -- [GSHPWriteTR $fsid 1] { -5 { SlowOpFinish $slowid $MESS(shpoutmem) ; return 1 } -6 { SlowOpFinish $slowid $MESS(shpcntwrtfs) ; return 1 } -7 { BUG segment starter too large } } } } LN { set ipos $DataIndex(LPposn) ; set ial $DataIndex(LPalt) set wsegs [expr $GSHPVersion >= 1.1] foreach ix $ixs { if { [SlowOpAborted] } { break } if { $wsegs && $LNSegStarts($ix) != "" } { switch -- [GSHPCreateTR $SHPDim $LNName($ix) $LNObs($ix) \ $LNSegStarts($ix)] { -2 { SlowOpFinish $slowid $MESS(shpoutmem) ; return 1 } -3 { BUG invalid segment starters } } } else { GSHPCreateTR $SHPDim $LNName($ix) $LNObs($ix) } if { $LNDatum($ix) != $SHPDatum } { if { [set lps [ChangeLPsDatum $LNLPoints($ix) \ $LNDatum($ix) $SHPDatum $SHPPFormt]] == -1 } { SlowOpFinish $slowid "" return 1 } set pformt $SHPPFormt } else { set lps $LNLPoints($ix) ; set pformt $LNPFrmt($ix) } foreach lp $lps { if { [SlowOpAborted] } { break } set p [lindex $lp $ipos] if { $pformt != $SHPPFormt } { set p [lindex \ [FormatPosition [lindex $p 0] [lindex $p 1] \ $SHPDatum $SHPPFormt $SHPDatum] 0] if { [lindex $p 2] == "--" } { GMMessage $MESS(outofgrid) continue } } set x [expr $scdist*[lindex $p $xix]] set y [expr $scdist*[lindex $p $yix]] if { $SHPDim == 3 } { if { [set alt [lindex [lindex $lp $ial] 0]] == "" } { set alt $SHPUndef } else { set alt [expr $scalt*$alt] } set r [GSHPAddTPToTR $x $y $alt] } else { set r [GSHPAddTPToTR $x $y] } if { $r == -2 } { SlowOpFinish $slowid $MESS(shpoutmem) return 1 } } switch -- [GSHPWriteTR $fsid 1] { -5 { SlowOpFinish $slowid $MESS(shpoutmem) ; return 1 } -6 { SlowOpFinish $slowid $MESS(shpcntwrtfs) ; return 1 } -7 { BUG segment starter too large } } } } } GSHPCloseFiles $fsid SlowOpFinish $slowid "" return 0 } ## SimpleText format # based on the Garmin Simple Text Output protocol and the following rules # - position status: g or G, for 2D or 3D, depending on altitude being # defined # - EPH: always ___ # - altitude: _____ if undefined, with position status g # - horizontal speed: computed from previous point if any, or undefined # - vertical speed: computed from previous point if any, or undefined # - the first TP of a TR after a different TR is preceded by two # sentences with all fields as undefined # - the first TP of a TR segment (not the first one) is preceded by # a sentence with all fields undefined proc Export_SimpleText {file type ixs} { # write TRs with indices in list $ixs to file in SimpleText format # $type assumed to be TR global TRTPoints TRDatum TRSegStarts DataIndex if { $type != "TR" } { BUG Export_SimpleText not on TR? } foreach d "latd longd date secs alt" { set ix$d $DataIndex(TP$d) } set segstart "@______________________________________________________\r" set first 1 foreach ix $ixs { if { $TRDatum($ix) != "WGS 84" } { set tps [ChangeTPsDatum $TRTPoints($ix) $TRDatum($ix) "WGS 84"] } else { set tps $TRTPoints($ix) } set sgsts $TRSegStarts($ix) if { $first } { set ssg [lindex $sgsts 0] ; set sgsts [lreplace $sgsts 0 0] set first 0 set platd "" } else { set ssg 0 puts $file $segstart } set tpn 0 foreach tp $tps { if { [SlowOpAborted] } { return } if { $tpn == $ssg } { puts $file $segstart set ssg [lindex $sgsts 0] ; set sgsts [lreplace $sgsts 0 0] set platd "" } incr tpn foreach d "latd longd date secs alt" { set $d [lindex $tp [set ix$d]] } set sent @ # date set vs [DateIntsFromSecs $secs] append sent [format %02d [expr [lindex $vs 0]%100]] foreach v [lreplace $vs 0 0] { append sent [format %02d $v] } # position foreach x [list $latd $longd] hs "{N S} {E W}" wd "2 3" { if { $x < 0 } { set h [lindex $hs 1] ; set x [expr -$x] } else { set h [lindex $hs 0] } set ds [expr int(floor($x))] append sent $h [format "%0${wd}d" $ds] \ [format %05d [expr round(($x-$ds)*60000)]] } # status, EPH and altitude if { [set alt [lindex $alt 0]] == "" } { set status g ; set ealt ______ } else { set status G if { $alt < 0 } { set s - ; set ealt [expr -$alt] } else { set s + ; set ealt $alt } set ealt "$s[format %05d [expr round($ealt)]]" } append sent $status ___ $ealt # velocity if { $platd == "" || $secs-$psecs == 0 } { # no previous TP or with the same time-stamp append sent "_______________\r" } else { set dt [expr $secs-$psecs] set cosmlat [expr cos(($platd+$latd)*0.00872664625997164788)] # dm/s set velx [expr 1111200.0*($longd-$plongd)*$cosmlat/$dt] set vely [expr 1111200.0*($latd-$platd)/$dt] foreach c [list $vely $velx] hs "{E W} {N S}" { if { $c < 0 } { append sent [lindex $hs 1] ; set c [expr -$c] } else { append sent [lindex $hs 0] } append sent [format %04d [expr round($c)]] } # vertical speed if { $alt != "" && $palt != "" } { # cm/s set velh [expr round(($alt-$palt)*100.0/$dt)] if { $velh < 0 } { append sent D ; set velh [expr -$velh] } else { append sent U } append sent [format %04d $velh] \r } else { append sent "_____\r" } } set platd $latd ; set plongd $longd ; set palt $alt set psecs $secs puts $file $sent } } return } ##### importing proc OpenImportFileFails {what fmt} { # open file in foreign format and set initial values for importing data # $what in $TYPES # return 0 unless operation is to be cancelled return [OpenInputFileFails $what $fmt] } proc OpenFileWithExtension {filename what exts} { # open file with base name $filename and extension in $exts and # if they cannot be opened for reading, ask the user # return ".." on error, otherwise the file channel # the actual file path is stored in the global File($what) # $what is in $FileTypes global File TXT set bn [file rootname $filename] foreach ext $exts { if { ! [catch {set f [open $bn.$ext r]}] } { set File($what) [file join [pwd] $bn.$ext] return $f } } if { [set f [GMOpenFile $TXT(loadfrm) $what r]] == ".." } { return ".." } return $f } ### geo-referencing files ## Tiff World File format proc ImportTFW {filename} { # read coordinates tranformation parameters from TFW file # try files with base name $filename and extension .tfw or .TFW and # if they cannot be opened for reading, ask the user # return 0 on failure, or pair with empty list (no known points to be # projected) and list with the values in the first six lines, # see proc MapInitTFWTransf (maptransf.tcl) global File MESS if { [set f [OpenFileWithExtension $filename MapBkInfo "tfw TFW"]] == \ ".." } { return 0 } set filename [file tail $File(MapBkInfo)] set i 0 ; set vals {} while { ! [eof $f] } { gets $f line if { $line != "" } { if { [scan $line %f v] != 1 } { set i 0 break } lappend vals $v incr i } } close $f if { $i != 6 } { GMMessage "$MESS(badmapinfo): $filename" } return [list {} $vals] } ## partial support for OziExplorer .map files # with thanks to Paulo Quaresma (pq _AT_ di.uevora.pt) for the information on # the different forms of line 4 and to Kari Likovuori # (kari.likovuori _AT_ gmail.com) for information leading to not dealing with # projected points array set OziMapFAs { start {prefix {OziExplorer Map Data File} line 5} 5 {datum 0 line 8} 8 {prefix {Magnetic Variation,,,} line 9} 9 {info "" search {Projection Setup,} ps} ps {info "" search {MMPXY,} xy} xy {loop mmpxy search {MMPLL,} ll} ll {loop mmpll end} mmpxy,numxy {^MMPXY,[ ]*([0-9]+)[ ]*,[ ]*([0-9]+),[ ]*([0-9]+)[ ]*$} mmpll,latlong {^MMPLL,[ ]*([0-9]+)[ ]*,([^,]*),[ ]*(.+)[ ]*$} } array set OziDatum { {Ascension Island 1958} {Ascension Island `58} {Astro Beacon 1945} {Astro Beacon "E"} {Astronomic Stn 1952} {Astronomic Stn `52} {Australian Geocentric 1994 (GDA94)} {WGS 84} {Australian Geod 1984} {Australian Geod `84} {Australian Geod 1966} {Australian Geod `66} {European 1950 (Mean France)} {European 1950; NW Europe} {European 1950 (Spain and Portugal)} {European 1950; Portugal+Spain} {Geodetic Datum 1949} {Geodetic Datum `49} {Hartebeeshoek94} {WGS 84} {Indian Bangladesh} {Indian (Bangladesh)} {ISTS 073 Astro 1969} {ISTS 073 Astro `69} {NGO1948} {NGO 1948} {NTF France} {NTF (Nouvelle Triangulation de France)} {Potsdam Rauenberg DHDN} Potsdam {Prov So Amrican 1956} {Prov So Amrican `56} {Prov So Chilean 1963} {Prov So Chilean `63} {Pulkovo 1942 (1)} {Pulkovo 1942} {Pulkovo 1942 (2)} {Pulkovo 1942} Rijksdriehoeksmeting {Rijks Driehoeksmeting} S42 {S-42 (Pulkovo 1942); Hungary} {South American 1969} {South American `69} {Wake-Eniwetok 1960} {Wake-Eniwetok `60} } proc ImportOziMap {filename} { # read pixel and geodetic coordinates of points in an OziExplorer # .map file # try files with base name $filename and extension .map or .MAP and # if they cannot be opened for reading, ask the user # projected points cannot be dealt with because there is no way to # deal with the projection # return 0 on failure, or pair with list of latd,longd,datum and # list of pairs with pixel coordinates (in Tcl sign convention) # aligned with the previous one global OziMapFAs OziDatum File TXT MESS Datum if { [set f [OpenFileWithExtension $filename MapBkInfo "map MAP"]] == \ ".." } { return 0 } set filename [file tail $File(MapBkInfo)] set getline 1 ; set lno 0 ; set err 0 ; set datum "" set state start while { ! [eof $f] } { set trans $OziMapFAs($state) if { $getline } { gets $f line incr lno } # puts "\#$lno; trans=$trans" set getline 1 switch [lindex $trans 0] { prefix { if { [string first [lindex $trans 1] $line] != 0 } { incr err break } } datum { set field [lindex $trans 1] set datum [lindex [split $line ","] $field] if { ! [catch {set d $OziDatum($datum)}] } { set datum $d } elseif { [DatumRefId $datum] == -1 } { incr err break } } info { regsub -all {,} $line "\n\t" line DisplayInfo $line } loop { switch [set sst [lindex $trans 1]] { mmpxy { set patt1 $OziMapFAs(mmpxy,numxy) set patt2 "" } mmpll { set patt1 $OziMapFAs(mmpll,latlong) set patt2 "" } } while 1 { if { ! [regexp $patt1 $line m pn a2 a3] } { set getline 0 break } scan $pn %0d pn set data($pn,$sst) [list $a2 $a3] if { $patt2 != "" } { if { [regexp $patt2 $line m b1 b2 b3 b4 b5 b6] } { set data($pn,$sst,2) \ [list $b1 $b2 $b3 $b4 $b5 $b6] } } if { [eof $f] } { break } gets $f line incr lno } } } switch [lindex $trans 2] { line { set state [lindex $trans 3] while { $lno < $state && ! [eof $f] } { gets $f line incr lno } if { $lno < $state } { incr err break } set getline 0 } search { set prefix [lindex $trans 3] while 1 { if { [string first $prefix $line] == 0 } { break } if { [eof $f] } { incr err break } gets $f line incr lno } if { $err } { break } set state [lindex $trans 4] set getline 0 } end { set state end break } } } close $f if { $err } { GMMessage "$MESS(badmapinfo): $filename, $lno" return 0 } if { $datum == "" || [catch {set es [array names data]}] } { incr err } else { set llds "" ; set pixs "" set es [lsort -dictionary $es] set prev "" ; set ll "" ; set pix "" foreach e $es { regexp {^([0-9]+),([^,]+)(.*)$} $e m pn cat cat2 if { $pn != $prev } { if { $ll != "" && $pix != "" } { lappend ll $datum lappend llds $ll ; lappend pixs $pix } set prev $pn ; set ll "" ; set pix "" } set d $data($e) switch $cat { mmpxy { foreach "x y" $d {} scan $x %0d x ; scan $y %0d y if { $pix == "" } { set pix [list $x $y] } elseif { $pix != [list $x $y] } { set pix "" } } mmpll { foreach "long lat" $d {} if { [scan $lat %f lat] && [scan $long %f long] && \ [CheckLat Ignore $lat DDD] && \ [CheckLong Ignore $long DDD] } { if { $ll == "" } { set ll [list $lat $long] } elseif { $ll != [list $lat $long] } { set ll "" } } } } } if { $ll != "" && $pix != "" } { lappend ll $datum lappend llds $ll ; lappend pixs $pix } if { $llds == "" } { incr err } } if { $err } { GMMessage "$MESS(badmapinfo): $filename" return 0 } set Datum $datum return [list $llds $pixs] } ### file dates proc GetFilesDates {files mdate dhour} { # find the dates of the given $files # $mdate=="pict": for digital pictures: get the date from an # EXIF tag (Tcl exif package, or exif or metacam utilities) # =="exif": files contain EXIF tags as produced by exif or metacam, # the date is taken from a tag # =="fmod": use the file last modification time # $dhour is difference in hours to apply to file dates # files whose date could not be retrieved are discarded with an error # return list of triples of date in seconds from $YEAR0, file, and # date in "%Y:%m:%d %H:%M:%S" format, sorted by seconds global YEAR0 MESS set sfds "" ; set dates "" set dsecs [expr 3600*$dhour] switch $mdate { pict { # check availability of the exif package and the exif utility set exiflib [expr ! [catch {package require exif}]] set exif [expr ! [catch {set x [exec exif]}]] # check whether the metacam utility is available # a catch on metacam will always yield true... if { [catch {exec which which}] } { if { [catch {exec whereis -b whereis}] } { # maybe metacam is available after all... set metacam 1 } else { set metacam [regexp {:.+$} [exec whereis -b metacam]] } } else { set metacam [expr ! [catch {exec which metacam}]] } foreach f $files { set date "" # the exif package gives an error when finding unknown tags if { $exiflib && \ ! [catch {set avs [exif::analyzeFile $f]}] && \ $avs != "" } { catch {unset d} array set d $avs set date $d(DateTime) } if { $date == "" && $exif && [set et [exec exif $f]] != "" } { foreach ln [split $et "\n"] { if { [string first "Date and Time" $ln] == 0 } { set ln [string trimright $ln] # this may fail but is checked below regexp {\|(.+)$} $ln x date break } } } if { $date == "" && $metacam && \ ! [catch {set et [exec metacam $f]}] } { foreach ln [split $et "\n"] { set ln [string trim $ln] if { [string first "Image Creation" $ln] == 0 } { set ln [string trimright $ln] regexp {: (.+)$} $ln x date break } } } set date [string trim $date] if { [lsearch -exact $dates $date] != -1 || \ [scan $date "%d:%0d:%0d %0d:%0d:%0d" y m d h mn s] != 6 || \ ! [CheckDateEls $y $m $d $h $mn $s] } { GMMessage "$MESS(badfile): $f" continue } set secs [DateToSecsFrom $y $m $d $h $mn $s $YEAR0] if { $dhour != 0 } { set secs [expr $secs+$dsecs] # assume use of $YEAR0 set date [DateFromSecs $secs] } lappend sfds [list $secs $f $date] lappend dates $date } } exif { # EXIF files may have been produced by exif or metacam foreach f $files { if { [catch {set fc [open $f r]}] } { GMMessage "$MESS(badfile): $f" continue } set date "" while { ! [eof $fc] } { gets $fc ln if { [string first "Date and Time" $ln] == 0 } { set ln [string trimright $ln] if { [regexp {\|(.+)$} $ln x date] } { break } } else { set ln [string trim $ln] if { [string first "Image Creation" $ln] == 0 } { set ln [string trimright $ln] regexp {: (.+)$} $ln x date break } } } close $fc set date [string trim $date] if { [lsearch -exact $dates $date] != -1 || \ [scan $date "%d:%0d:%0d %0d:%0d:%0d" y m d h mn s] != 6 || \ ! [CheckDateEls $y $m $d $h $mn $s] } { GMMessage "$MESS(badfile): $f" continue } set secs [DateToSecsFrom $y $m $d $h $mn $s $YEAR0] if { $dhour != 0 } { set secs [expr $secs+$dsecs] # assume use of $YEAR0 set date [DateFromSecs $secs] } lappend sfds [list $secs $f $date] lappend dates $date } } fmod { foreach f $files { if { ! [catch {set mt [file mtime $f]}] } { set date [clock format $mt -format "%Y:%m:%d %H:%M:%S"] if { [lsearch -exact $dates $date] == -1 } { scan $date "%d:%0d:%0d %0d:%0d:%0d" y m d h mn s set secs [DateToSecsFrom $y $m $d $h $mn $s $YEAR0] if { $dhour != 0 } { set secs [expr $secs+$dsecs] # assume use of $YEAR0 set date [DateFromSecs $secs] } lappend sfds [list $secs $f $date] lappend dates $date } } else { GMMessage "$MESS(badfile): $f" } } } } return [lsort -index 0 -integer -increasing $sfds] } ### data files proc ImportFile {what fmt} { # open file in foreign format and load data from it # $fmt such that "in" is in $FILEFORMAT($fmt,mode) except GPSMan # $what either may be "Data" if $FILEFORMAT($fmt,filetype) == "data' # or a list of types in $FILEFORMAT($fmt,types) or the first # element of the pair $FILEFORMAT($fmt,io_types) return [ImportFileFrom "" $what $fmt] } proc ImportFileFrom {file what fmt} { # if $file=="" then ask user to select a file # return 1 on error, 0 on success global LChannel FILEFORMAT if { [InitWPRenaming] == 0 } { return 1 } if { $fmt == "Shapefile" } { set r [ImportShapefileFrom $file $what] EndWPRenaming return $r } if { $file == "" && [OpenImportFileFails $what $fmt] } { return 1 } if { $FILEFORMAT($fmt,filetype) == "unique" } { Import_$fmt $LChannel($what) normal } else { Import_$fmt $LChannel($what) $what normal } CloseInputFile $what EndWPRenaming return 0 } proc ImportGREls {what fmt} { # load data from file in foreign format according to contents of GR(s) # $fmt such that "in" is in $FILEFORMAT($fmt,mode) except GPSMan, and # $FILEFORMAT($fmt,GREls) is defined # $what in $TYPES identifies menu, not being used # possible types used here are those in $FILEFORMAT($fmt,types) or the # first element of the pair $FILEFORMAT($fmt,io_types) except # TR (there is no way to identify TRs) global FILEFORMAT if { [catch {set types $FILEFORMAT($fmt,types)}] } { set types [lindex $FILEFORMAT($fmt,io_types) 0] } InputToGR $types TR OpenImportFileFails ImportGRElsIn CloseInputFile $fmt return } proc ImportGRElsIn {types lixs fmt} { # import items of $types to replace items with given indices # with -1 meaning new items should be accepted # $lixs is list of lists of indices (and maybe -1) aligned with $types # $fmt: see proc ImportGREls # most formats have single-type files and $types and $lixs will # have a single element and a single list, respectively global LChannel LFileIxs FILEFORMAT set file $LChannel(GR) foreach wh $types ixs $lixs { set LFileIxs($file,$wh) $ixs } if { $FILEFORMAT($fmt,filetype) == "unique" } { Import_$fmt $file inGR } else { Import_$fmt $file $types inGR } foreach wh $types { catch { unset LFileIxs($file,$wh) } } return } ## GPStrans format proc Import_GPStrans {file what how} { if { [ImportGPStransHeader $file] } { ImportGPStrans$what $file normal } return } proc ImportGPStransHeader {file} { # parse header when reading from file in GPStrans format global LFilePFrmt LFileDatum LFileEOF MESS set m [ReadFile $file] if { $LFileEOF($file) || [string first "Format:" $m]!=0 } { GMMessage "$MESS(noformat): $m" return 0 } set m [string range $m 8 end] set LFilePFrmt($file) [FindPFormat $m] if { $LFilePFrmt($file) != "BAD" } { set m [string range $m 17 end] if { [scan $m "%f" off] == 1 } { # don't know what to do with time offset set LFileDatum($file) [string range $m 24 end] if { [DatumRefId $LFileDatum($file)] == -1 } { GMMessage "$MESS(unkndatum): $LFileDatum($file)" return 0 } return 1 } } GMMessage "$MESS(badformat): $m" return 0 } proc ImportGPStransWP {file how} { # load WPs from file in GPStrans format # $how in {normal, inGR}: keep all data, keep data on WPs with indices # in $LFileIxs($file,WP) LoadWPs $file 1 1 $how return } proc ImportGPStransRT {file how} { # load RTs from file in GPStrans format # $how in {normal, inGR}: keep all data, keep data on RTs with # indices in $LFileIxs($file,RT) global LFileLNo LFileEOF MESS while { 1 } { set m [ReadFile $file] if { $LFileEOF($file) } { return } if { ! [regexp "R\t.*" $m] } { GMMessage "$MESS(badRT) $LFileLNo($file)" return } if { [FindArgs RT [string range $m 2 end] $file] == "BADC" } { GMMessage "$MESS(badRTargs) $LFileLNo($file)" return } if { [BadRTRead $file 1 $how] } { return } } } proc ImportGPStransTR {file how} { # load TRs from file in GPStrans format # $how in {normal, inGR}: keep all data, not used global LFileLNo LFileEOF LFileBuffFull MESS while { 1 } { set m [ReadFile $file] if { $LFileEOF($file) } { return } if { ! [regexp "T\t.*" $m] } { GMMessage "$MESS(badTR) $LFileLNo($file)" return } set LFileBuffFull($file) 1 if { [BadTRRead $file 1 $how] } { return } } } ## Fugawi export format proc Import_Fugawi {file how} { # this is a translation and adaptation of the Perl program "convert" under # copyright by Niki Hammler, http://www.nobaq.net # that converts exported FUGAWI data to DDD GPSman data global LFileEOF LFileVisible LFileLNo LFileIxs MESS set date [Now] set dt "" ; set ixs "" ; set ns "" ; set chgns "" while { [set line [ReadFile $file]] != "" && ! $LFileEOF($file) } { if { [SlowOpAborted] } { return } set vs [split $line ","] if { [set l [llength $vs]] < 5 } { GMMessage "$MESS(nofieldsWP): $LFileLNo($file)" ; return } elseif { $l > 5 } { GMMessage "$MESS(excfieldsWP): $LFileLNo($file)" ; return } set name [lindex $vs 0] if { ! [CheckName Ignore $name] } { if { [set nname [AskForName $name]] == "" } { continue } set chgdname $name set name $nname } else { set chgdname "" } set lat [lindex $vs 2] ; set long [lindex $vs 3] if { ! [CheckLat GMMessage $lat DDD] || \ ! [CheckLong GMMessage $long DDD] } { continue } set latd [Coord DDD $lat S] ; set longd [Coord DDD $long W] set posn [list $latd $longd $lat $long] set comment [MakeComment [lindex $vs 1]] lappend dt [list $name $comment DDD $posn "WGS 84" $date] lappend ixs [IndexNamed WP $name] lappend ns $name lappend chgns $chgdname } if { $ns == "" } { return } switch $how { normal { foreach ix $ixs n $ns d $dt chgdname $chgns { set fd [FormData WP "Name Commt PFrmt Posn Datum Date" $d] if { $chgdname != "" } { set fd [AddOldNameToObs WP $fd $chgdname] } StoreWP $ix $n $fd $LFileVisible($file) } } inGR { set grixs $LFileIxs($file,WP) foreach ix $ixs n $ns d $dt { if { [lsearch -exact $grixs $ix] != -1 } { set fd [FormData WP "Name Commt PFrmt Posn Datum Date" $d] StoreWP $ix $n $fd $LFileVisible($file) } } } } return } ## file with NMEA 0183 log to be read as a track proc Import_NMEA {file args} { # read file with NMEA 0183 log as a TR # this uses procedures defined in files garmin_nmea.tcl and garmin.tcl global NMEARLTM MESS LFileOther LFileVisible if { $NMEARLTM } { GMMessage $MESS(nmeainuse) return } OpenSerialLog Log "IN> Reading NMEA from file" GarminStartNMEA file $file set LFileOther($file) "" ; set errors 0 while { ! [eof $file] } { if { [set line [gets $file]] != "" } { if { [SlowOpAborted] } { break } set buffer "" ; set xor 0 ; set error 0 foreach char [split $line ""] { if { [binary scan $char "c" dec] != 1 } { incr error break } if { [set dec [expr ($dec+0x100)%0x100]] != 13 } { append buffer $char set xor [expr $xor ^ $dec] } } if { ! $error } { set error [ProcNMEALine $buffer $xor] } incr errors $error } } set NMEARLTM 0 if { $errors } { GMMessage $MESS(badfile) } if { [set tps $LFileOther($file)] == "" } { GMMessage $MESS(voidTR) } else { set name [NewName TR] set fd [FormData TR "Name Datum TPoints" [list $name "WGS 84" $tps]] StoreTR -1 $name $fd $LFileVisible($file) } Log "IN> End of NMEA from file" return } proc ImportNMEAData {data file} { # use data from NMEA sentences to form a TP # $data as described in proc UseRealTimeData (realtime.tcl) global LFileOther DateFormat if { [llength $data] < 5 } { return } foreach "date rpos fix err alt" $data { break } if { $rpos == "_" } { return } if { $date == "_" } { set date [ConvGarminDate 0] } else { set date [eval LocalTimeAndUTC $date UTC] set date [list [eval FormatDate $DateFormat $date] \ [eval DateToSecs $date]] } set posn [eval FormatLatLong $rpos DMS] if { $alt == "_" } { set ns "latd longd latDMS longDMS date secs" set alt "" } else { set ns "latd longd latDMS longDMS date secs alt" } lappend LFileOther($file) [FormData TP $ns [concat $posn $date $alt]] return } #### import from file in EasyGPS and GPX formats #### VR contribution #### import from XML files in EasyGPS and GPX export format # XML global variable : context shared by the XML processing procedures proc XML_Init {} { global XML # MF change: clear XML array catch { unset XML } #-- XML_Init_WP wpt foreach i {date lines rte_name trk_name searching_name tmpname tmpdesc} { set XML($i) "" } return } proc XML_Init_WP {tag} { global XML DEFAULTSYMBOL #- MD change: using also geocache foreach i {alt name time cmt long lat time type geocache} { set XML($i) "" } if { $tag != "trkpt" } { set XML(desc) "" } set XML(sym) $DEFAULTSYMBOL return } # XML_ProcessItem_ # Processing one XML item # # ii : index of line being processed # item : string being processed # token : value of XML tag # tag : XML tag type # return : current index of line proc XML_ProcessItem_KML {ii item token tag} { global XML # # Col Luisas # # view point informations # # #msn_ylw-pushpin01 # # 7.069954449489316,44.7186167968765,0 # # set XML(end) "" # MF contribution: using "--" switch -regexp -- $tag { ^Point { XML_Init_WP wpt } \/Point { set XML(name) $XML(tmpname) set XML(desc) $XML(tmpdesc) set XML(end) wpt } \/.* { } coordinates { regexp {([-0-9\.]+),([-0-9\.]+),([-0-9\.]+).*} $token x \ XML(long) XML(lat) $XML(alt)} name { set XML(tmpname) $token} description { set XML(tmpdesc) $token} .*CDATA { regexp {.*\[(.*)\]\]>} $item x XML(desc)} default { } } return $ii } proc XML_ProcessItem_EasyGPS {ii item token tag} { global XML set XML(end) "" # MF contribution: using "--" switch -regexp -- $tag { loc { } ^waypoint { XML_Init_WP wpt } \/waypoint { set XML(end) wpt } \/.* { } coord { regexp {lat="([-0-9\.]+)".*lon="([-0-9\.]+)".*$} $token x \ XML(lat) XML(long) } name { regexp {id="(.*)">} $token x XML(name) } .*CDATA { regexp {.*\[(.*)\]\]>} $item x XML(desc) } link { regsub {.*>} $token "" XML(cmt) } default { } } return $ii } # XML_NormalizeSymbol # Transforming a symbol name into the GPSMan internal name # # token : current name # return : transformed name array set XML_Symbol_Translation { waypoint WP_dot fishing fish trailhead trail_head white_house house white_anchor anchor telephone phone campground camping hunting deer waypoint_dot WP_dot } proc XML_NormalizeSymbol {token} { # normalizing the symbol's name global DEFAULTSYMBOL XML_Symbol_Translation MESS regsub -all { } $token "_" symbol if { [BadSymbol $symbol ] } { set symbol [string tolower $symbol] if { [BadSymbol $symbol ] } { regsub {_area} $symbol "" symbol if { [BadSymbol $symbol ] } { if { [catch {set symbol $XML_Symbol_Translation($symbol)}] } { # MF change: using MESS GMMessage "$MESS(badSYMBOLcode): $symbol" set symbol $DEFAULTSYMBOL } } } } return $symbol } proc XML_ProcessItem_GPX {ii item token tag} { global XML DateFormat MESS set XML(end) "" if { [regexp {.*\/>} $token] } { set XML(end) $tag } # MF contribution: using "--" switch -regexp -- $tag { ^.xml { } gpx - bounds - author - email - url - src - keywords { } wissenbach: - topografix: { } ^wpt$ - ^rtept - ^trkpt { XML_Init_WP $tag # MF change: checking for errors if { ! [regexp {lat="([-0-9\.]+)".*lon="([-0-9\.eE]+)".*$} \ $token x XML(lat) XML(long)] } { GMMessage $MESS(badfile) set XML(end) error return 1000 } } \/wpt$ { set XML(end) wpt } \/rtept$ { set XML(end) rtept } \/trkpt$ { set XML(end) trkpt } ^rte$ { set XML(searching_name) "rte_name" ; XML_Init_WP wpt } \/rte$ { set XML(end) rte } ^trk$ { set XML(searching_name) "trk_name" ; XML_Init_WP wpt } \/trk$ { set XML(end) trk } ^cmt { set XML(cmt) $token } ^sym { set XML(sym) [ XML_NormalizeSymbol $token ] } ^name { # MD change: only deal with names outside geocache if { $XML(geocache) == "" } { if { $token == "" } { # the name is in a CDATA tag set XML(name) [lindex $XML(lines) [expr $ii + 1]] regexp {.*CDATA\[(.*)\]\]\>} $XML(name) x XML(name) incr ii 1 } else { # MF change: deleted changes in the name as it will be # checked/changed in proc XML_process set XML(name) $token } set XML($XML(searching_name)) $XML(name) set XML(searching_name) "" } } ^time { set XML(time) $token if { $XML(time) == "" } { set XML(time) $XML(date) } set datesecs [lindex [CheckConvDate $XML(time) ] 1] # MF contrib if { $datesecs == "" } { # undefined time set datesecs 0 } #----- set dints [ DateIntsFromSecs $datesecs ] set dints1 [ eval LocalTimeAndUTC $dints "UTC" ] set time1 [eval FormatDate $DateFormat $dints1] set XML(time) $time1 } ^desc - ^type { set XML($tag) $token # set XML($tag) [lindex $XML(lines) [expr $ii + 1]] # GMMessage "DESC - TYPE : $item - $token - $tag - $XML($tag)" # regexp {.*CDATA\[(.*)\]\]\>} $XML($tag) x XML($tag) # incr ii 1 } ^ele { set XML(alt) $token} ^trkseg - ^number - CDATA { } \/geocache$ { #- MD change: adding support for geocache set XML(geocache) "" } ^geocache { #- MD change: adding support for geocache set XML(geocache) "in" } \/.* { } default { #GMMessage "Unknown element: $item - $token" } } return $ii } # XML_Process # Processing an XML file proc DecodeXMLChars { s } { regsub -all {>} $s {>} s regsub -all {<} $s {<} s regsub -all {"} $s {"} s regsub -all {'} $s {'} s regsub -all {&} $s {\&} s return $s } proc XML_Process {fileType file what how date} { global MESS LFileVisible LFileIxs global XML # dt : list of WP descriptions set dt {} # wpixs : list of WP indexes set wpixs {} # wpns : list of WP names set wpns {} # ltwps : list of lists of RT waypoints set ltwps {} # rtns : list of RT names set rtns {} # rtdr : list of RT descriptions set rtdt {} # rtixs : list of RT indexes set rtixs {} # lwps : list of RT waypoints names set lwps {} # ldt : list of RT waypoints descriptions set ldt {} # rtld : list of list of RT waypoints descriptions set rtld {} # trns : list of TR names set trns {} # trdesc : list of TR descriptions set trdesc {} # rtld : list of lists of TR points descriptions set ltrks {} # ltrkpts : list of TR points descriptions set ltrkpts {} ## MF contribution # ltrksgsts : list of TR segment starters set ltrksgsts {} # trsgsts : list of segment starters in a TR set trsgsts {} # trcount : counter of points in a TR set trcount 0 ##-- # lchgdnames : list of changed names set lchgdnames {} set llines [llength $XML(lines) ] for {set ii 1} {$ii<[expr $llines - 1]} {incr ii 1} { # MF contribution if { [SlowOpAborted] } { break } #-- set item [lindex $XML(lines) $ii] regsub {( |>).*} $item "" tag regsub {[^ >]*[ >]} $item "" token set cdata "" set raw_cdata [lindex $XML(lines) [expr $ii + 1]] regexp {.*CDATA\[(.*)\]\]\>} $raw_cdata x cdata if { $token == "" && $cdata != "" } { # GMMessage "NULL TOKEN : $item - $tag - $raw_cdata - $cdata - " set token $cdata set ii [ expr $ii + 1 ] } set ii [XML_ProcessItem_$fileType $ii $item $token $tag] # MF contribution: segment starters if { $tag == "trkseg" && $trcount > 0 && \ [lindex $trsgsts end] != $trcount } { lappend trsgsts $trcount } #-- switch $XML(end) { wpt - rtept { set chgdname "" set XML(name) [DecodeXMLChars $XML(name)] if { ! [CheckName Ignore $XML(name)] } { if { [set nname [AskForName $XML(name)]] == "" } { continue } # GMMessage $nname set chgdname $XML(name) set XML(name) $nname } if { ! [CheckLat GMMessage $XML(lat) DDD] || \ ! [CheckLong GMMessage $XML(long) DDD] } { continue } set latd [Coord DDD $XML(lat) S] set longd [Coord DDD $XML(long) W] set posn [list $latd $longd $XML(lat) $XML(long) ] set cmtS [ DecodeXMLChars $XML(cmt) ] set descS [ DecodeXMLChars $XML(desc) ] set d [list $XML(name) "$descS - $XML(type)" $cmtS \ DDD $posn "WGS 84" $XML(time) $XML(sym) $XML(alt)] if { $XML(end) == "wpt" } { lappend wpns $XML(name) lappend dt $d lappend wpixs [IndexNamed WP $XML(name) ] lappend lchgdnames $chgdname XML_Init_WP wpt } elseif { $XML(end) == "rtept" } { lappend lwps $XML(name) lappend ldt $d } } trkpt { # MF change: using FormatLatLong instead of CreatePos set p [FormatLatLong $XML(lat) $XML(long) DMS] # MF change: dealing with undefined time stamp if { $XML(time) == "" || \ [set datesecs [CheckConvDate $XML(time) ]] == "" } { set datesecs [ConvGarminDate 0] } lappend ltrkpts [FormData TP \ "latd longd latDMS longDMS date secs alt" \ [concat $p $datesecs $XML(alt) ]] # MF contribution: segment starters incr trcount #-- } trk { # MF change: using CheckString instead of CheckName set XML(trk_name) [DecodeXMLChars $XML(trk_name)] if { ! [CheckString Ignore $XML(trk_name)] } { set XML(trk_name) [NewName TR] } # MF change: preventing empty tracks to be added if { $ltrkpts != "" } { lappend trns $XML(trk_name) lappend trdesc [DecodeXMLChars $XML(desc)] lappend ltrks $ltrkpts # MF contribution: segment starters lappend ltrksgsts $trsgsts #-- set ltrkpts {} } # MF contribution: segment starters set trsgsts {} set trcount 0 #-- } rte { # MF change: using CheckString instead of CheckName set XML(rte_name) [DecodeXMLChars $XML(rte_name)] if { ! [CheckString Ignore $XML(rte_name)] } { set XML(rte_name) [NewName RT] } set d [list [DecodeXMLChars $XML(desc)] \ [DecodeXMLChars $XML(cmt)]] # MF change: preventing empty routes to be added if { $lwps != "" } { lappend rtns $XML(rte_name) lappend rtdt $d lappend ltwps $lwps lappend rtixs [IndexNamed RT $XML(rte_name) ] lappend rtld $ldt set lwps {} } set ldt {} } default { } } set XML(end) 0 } if { $what == "Data" } { set lwhat {"WP" "TR" "RT"} } else { set lwhat $what } ## MF contribution if { $wpixs == {} && $what == "WP" } { GMMessage $MESS(shpemptyfile) return } if { $ltrks == {} && $what == "TR" } { GMMessage $MESS(shpemptyfile) return } if { $ltwps == {} && $what == "RT" } { GMMessage $MESS(shpemptyfile) return } if { $wpixs == {} && $ltrks == {} && $ltwps == {} && $what == "Data" } { GMMessage $MESS(shpemptyfile) return } foreach what $lwhat { # MF contribution: if { [SlowOpAborted] } { break } if { $how == "inGR" } { set grixs $LFileIxs($file,$what) # GMMessage "Tracing Process_XML : inGR" } switch $what { WP { foreach ix $wpixs n $wpns d $dt chgdname $lchgdnames { # MF contribution: if { [SlowOpAborted] } { break } if { $what != "inGR" || \ [lsearch -exact $grixs $ix] != -1 } { set fd [FormData WP "Name Obs Commt PFrmt Posn Datum \ Date Symbol Alt" $d] if { $chgdname != "" } { set fd [AddOldNameToObs WP $fd $chgdname] } StoreWP $ix $n $fd $LFileVisible($file) } } } RT { set wpsseen {} foreach ix $rtixs id $rtns d $rtdt wps $ltwps ldt $rtld { # MF contribution: if { [SlowOpAborted] } { break } if { $what != "inGR" || \ [lsearch -exact $grixs $ix] != -1 } { # saving the WPs used in the route foreach n $wps d $ldt { # MF contribution: if { [SlowOpAborted] } { break } if { [lsearch $wps $n ] != -1} { if { [ lsearch -exact $wpsseen $n ] == -1 } { set ix [IndexNamed WP $n] set fd [FormData WP \ "Name Obs Commt PFrmt Posn Datum Date Symbol Alt" $d] set nom [StoreWP $ix $n $fd \ $LFileVisible($file) ] lappend wpsseen $n } } } } set l [FormData RT "IdNumber Commt Obs WPoints" \ [list $id [lindex $d 0] [lindex $d 1] $wps]] StoreRT [IndexNamed RT $id] $id $l $wps \ $LFileVisible($file) } } TR { # includes MF contribution: segment starters foreach name $trns tps $ltrks desc $trdesc trsgsts $ltrksgsts { # MF contribution: if { [SlowOpAborted] } { break } #- set fd [FormData TR "Name Obs Datum TPoints SegStarts" \ [list $name $desc "WGS 84" $tps $trsgsts]] # MF change: must call IndexNamed StoreTR [IndexNamed TR $name] $name $fd $LFileVisible($file) } } } } return } proc XML_ImportFile {fileType file what how} { global XML SYSENC File XML_Init set XML(date) [Now] # pre-processing the file # MF change: new way of reading the file for dealing with encoding # - not using proc ReadFile as the file may need to be reopened, # what is done here with no need for changing $file # - it is still safe to use the globals LFile*($file) after this # try to find a XML declaration with an encoding tag foreach "lines encoding" [XMLDeclEncoding $file] {} if { $lines == "" } { return } if { $encoding == "" } { set encoding UTF-8 } if { [set encoding [TclEncodingName $encoding]] == "" } { return } if { $encoding != $SYSENC } { # must reopen file and configure the encoding set all_lines "" set efile [open $File($what) r] fconfigure $efile -encoding $encoding set reop 1 } else { set efile $file set all_lines $lines set reop 0 } # read all while { ! [eof $efile] } { gets $efile line if { [set line [string trim $line " \t"]] != "" } { append all_lines $line } } if { $reop } { close $efile } #----- # one list item for each XML tag set XML(lines) [split $all_lines "<"] # MF contribution: if { [SlowOpAborted] } { return } XML_Process $fileType $file $what $how $XML(date) return } proc Import_GPX {file what how} { XML_ImportFile GPX $file $what $how return } proc Import_KML {file what how} { XML_ImportFile KML $file $what $how return } proc Import_EasyGPS {file how} { XML_ImportFile EasyGPS $file WP $how return } ### end of VR contribution proc XMLDeclEncoding {file} { # try to find the XML declaration and an encoding tag in it # return a pair with the concatenation of non-blank lines read in # and the encoding name (empty if not found) set lines "" ; set state start while 1 { if { [eof $file] } { return [list $lines] } gets $file line if { [set line [string trim $line " \t"]] != "" } { append lines $line while 1 { switch $state { start { if { [regexp {<\?xml} $line] } { set state enc continue } if { [string first "<" $line] != -1 } { return [list $lines] } break } enc { if { [regexp \ {encoding[\t ]*=[\t ]*"([-_a-zA-Z0-9]+)"} \ $line x enc] } { return [list $lines $enc] } if { [regexp {encoding[\t ]*=[\t ]$} $line] } { set state encname break } if { [regexp {\?>} $line] } { return [list $lines] } break } encname { if { [regexp {^"([-_a-zA-Z0-9]+)"} $line x enc] } { return [list $lines $enc] } return [list $lines] } } } } } # not used return } #### Map&Guide export format proc Import_MapGuide {file args} { global GFItemId GFItemCommt GFItemNB GFVersion ImportMapGuide $file $GFItemId $GFItemCommt $GFItemNB $GFVersion return } proc ImportMapGuide {file rtid rtcommt rtrmrk version} { # this is an adaptation of the script "mg2gpsman.tcl" # under copyright by Heiko Thede (Heiko.Thede _AT_ gmx.de) # that converts exported Map&Guide data to GPSman data # each file corresponds to one RT that will be split in more than one # if its length exceeds $MAXWPINROUTE # $rtid is the RT identifier/number given by user; it will be # replaced by an automatically generated one if empty # $rtcommt and $rtrmrk are the comment and remark given by the user # $version is in {03/04, 2002} global MAXWPINROUTE TXT MESS PositionFormat LFileVisible # get rid of leading/trailing blanks foreach v "rtid rtcommt rtrmrk" { set $v [string trim [set $v]] } # generate RT id if none given if { $rtid == "" } { set rtid [NewName RT] ; set rtix -1 } else { set rtix [IndexNamed RT $rtid] } set rts "" ; set wps "" # WPs: prefix for names, position type # the first $rtid is used for all WPs even if the RT is split set prefix "$TXT(RT)$rtid" set nwps 0 # positions of WPs, to avoid creating different WPs in the same place set coords "" ; set coordWPs "" # read lines while { ! [eof $file] } { gets $file line #select only relevant lines if { $line != "" } { if { [SlowOpAborted] } { return } set coordstart [string last "(" $line] set coordend [string last ")" $line] set coord [string range $line $coordstart $coordend] if { [set i [lsearch -exact $coords $coord]] != -1 } { # use WP in this position set wpt [lindex $coordWPs $i] } else { # create new WP and remember its position and name # generate name using $prefix if possible set fields [split $line "\t"] if { $version == 2002 } { if { ! [regexp {\((-?)([0-9]+),(-?)([0-9]+)\)} $coord x \ slong long slat lat] || \ [scan $long %2d%2d%d longd longm longs] != 3 || \ [scan $lat %2d%2d%d latd latm lats] != 3 } { # bad line: ignore WP continue } if { [string length $long] == 7 } { set longs [expr 0.1*$longs] set lats [expr 0.1*$lats] set wprmrk "[lindex $fields 0] [lrange $fields 2 3]" } else { set wprmrk "[lindex $fields 0] [lrange $fields 2 4]" } } elseif { ! [regexp {\((-?)([0-9]+),(-?)([0-9]+)\)} $coord x \ slong long slat lat] || \ ! ( [set x [string length $long]] == 7 && \ [scan $long %2d%2d%3d longd longm longs] == 3 || \ $x == 6 && \ [scan $long %1d%2d%3d longd longm longs] == 3 ) || \ ! ( [set x [string length $lat]] == 7 && \ [scan $lat %2d%2d%3d latd latm lats] == 3 || \ $x == 6 && \ [scan $lat %1d%2d%3d latd latm lats] == 3 ) } { # bad line: ignore WP continue } else { set longs [expr 0.1*$longs] set lats [expr 0.1*$lats] set wprmrk "[lindex $fields 0] [lrange $fields 2 3]" } set lat [expr $latd+($latm+$lats/60.0)/60.0] if { $slat == "-" } { set lat [expr -$lat] } set long [expr $longd+($longm+$longs/60.0)/60.0] if { $slong == "-" } { set long [expr -$long] } foreach "posn pfmt datum" \ [FormatPosition $lat $long "WGS 84" \ $PositionFormat "" DDD] { break } set wpt [NewName WP $prefix] lappend coords $coord ; lappend coordWPs $wpt set data [FormData WP "Name Obs PFrmt Posn Datum" \ [list $wpt $wprmrk $pfmt $posn $datum]] # displaying will be done along with RT if needs be StoreWP -1 $wpt $data 0 } if { $nwps == $MAXWPINROUTE } { # save previous route and start new one lappend rts $rtid $wps # cannot use proc NewName here as previous RTs were not # stored yet set rtid "" set nwps 0 ; set wps "" } lappend wps $wpt incr nwps } } if { $wps == "" && $rts == "" } { GMMessage $MESS(voidRT) return } if { $nwps > 0 } { # save last route lappend rts $rtid $wps } # prepare comment and remark fields if any if { $rtcommt != "" && [CheckComment Ignore $rtcommt] } { set fields Commt set fvals [list $rtcommt] set rmrkix 1 } else { set fields "" ; set fvals "" set rmrkix 0 } if { $rtrmrk != "" } { lappend fields Obs lappend fvals $rtrmrk # prepare for adding new info to remark set norem 0 set rtrmrk "${rtrmrk}\n" } else { set norem 1 } lappend fields IdNumber WPoints # store all routes foreach "rtid wps" $rts { if { [SlowOpAborted] } { return } if { $rtid == "" } { set rtid [NewName RT] ; set rtix -1 } set fd [FormData RT $fields [linsert $fvals end $rtid $wps]] StoreRT $rtix $rtid $fd $wps $LFileVisible($file) # add "Insert after $rtid" to remark for use in next route set rmk "${rtrmrk}$TXT(insa): $rtid" if { $norem } { # add remark field set fields [linsert $fields $rmrkix Obs] set fvals [linsert $fvals $rmrkix $rmk] set norem 0 } else { # replace remark set fvals [lreplace $fvals $rmrkix $rmrkix $rmk] } } return } ## OziExplorer WP file format # from the description in the implementation of exportation of the same # format by Alessandro Palmas proc DateFromDelphiTime {dtime} { # build date from a Delphi time representation (days since 1899-12-30 0:0:0 # as a float) # return empty on error (no message given) global YEAR0 # number of days from 1899-12-30 0:0:0 to 1988-01-01 0:0:0 = 32143 if { [catch {set s88 [expr round(($dtime-32143)*86400)]}] || $s88 < 0 } { return "" } set y $YEAR0 ; set YEAR0 1988 set d [DateFromSecs $s88] set YEAR0 $y return $d } proc Import_Ozi {file what how} { # import data from $file in OziExplorer format # $how in {normal, inGR} # $what == WP # support is only for WP files and only the following fields are kept # Field 2: Name (short) # Field 3: lat DDD # Field 4: long DDD # Field 5: date, in Delphi format # Field 11: Comment # Field 15: Altitude, in feet. -777 is non valid global LFileVisible LFileLNo LFileIxs ALSCALEFOR MESS # header # OziExplorer Waypoint File Version 1.1 # DATUM # Reserved* # anything not starting by number if { ! [regexp {^OziExplorer Waypoint File} [ReadFile $file]] } { GMMessage $MESS(noheader) return } set datum [ReadFile $file] if { ! [catch {set d $OziDatum($datum)}] } { set datum $d } elseif { [DatumRefId $datum] == -1 } { GMMessage "$MESS(unkndatum): $datum" return } while { [set line [ReadFile $file]] != "" } { if { [regexp {^ *[0-9]+,} $line] } { break } } set dt "" ; set ixs "" ; set ns "" ; set chgns "" while 1 { if { [SlowOpAborted] } { return } if { [llength [set line [split $line ","]]] < 15 } { GMMessage "$MESS(nofieldsWP): $LFileLNo($file)" ; return } set name [lindex $line 1] if { ! [CheckName Ignore $name] } { if { [set nname [AskForName $name]] == "" } { continue } set chgdname $name set name $nname } else { set chgdname "" } set lat [lindex $line 2] ; set long [lindex $line 3] if { ! [CheckLat GMMessage $lat DDD] || \ ! [CheckLong GMMessage $long DDD] } { continue } set latd [Coord DDD $lat S] ; set longd [Coord DDD $long W] set posn [list $latd $longd $lat $long] set alt [lindex $line 14] if { $alt == -777 || \ [catch {set alt [expr $alt*$ALSCALEFOR(FT)]}] || \ [set alt [AltitudeList $alt]] == "nil" } { set alt "" } set comment [MakeComment [lindex $line 10]] set date [DateFromDelphiTime [lindex $line 4]] lappend dt [list $name $comment DDD $posn $datum $alt $date] lappend ixs [IndexNamed WP $name] lappend ns $name lappend chgns $chgdname if { [set line [ReadFile $file]] == "" } { break } } if { $ns == "" } { return } switch $how { normal { foreach ix $ixs n $ns d $dt chgdname $chgns { set fd [FormData WP "Name Commt PFrmt Posn Datum Alt Date" $d] if { $chgdname != "" } { set fd [AddOldNameToObs WP $fd $chgdname] } StoreWP $ix $n $fd $LFileVisible($file) } } inGR { set grixs $LFileIxs($file,WP) foreach ix $ixs n $ns d $dt { if { [lsearch -exact $grixs $ix] != -1 } { set fd [FormData WP \ "Name Commt PFrmt Posn Datum Alt Date" $d] StoreWP $ix $n $fd $LFileVisible($file) } } } } return } ## gd2 format proc Import_GD2 {file what how} { # import data from $file in gd2 format # $how in {normal, inGR} # $what in {WP, RT, TR}, but not TR if $how==inGR # gd2.c is a program by Randolph Bentson (bentson _AT_ grieg.seaslug.org) # distributed under GPL global LFileEOF LFileVisible LFileBuffFull LFileLNo LFileIxs MESS set date [Now] set dt "" ; set ixs "" ; set ns "" ; set error 0 switch $what { WP { set ns "" ; set chgns "" } RT { set rtid "" ; set dtwps "" ; set lwps "" ; set lchgwps "" set ldwps "" ; set rtwps start } TR { set tps "" } } while { [set line [ReadFile $file]] != "" && ! $LFileEOF($file) } { if { [SlowOpAborted] } { return } switch $what { WP { if { ! [regexp \ {^WPT ? (......) ([-0-9\.]+) ([-0-9\.]+) ([-0-9/:]+) (.*)$} \ $line x name lat long date commt] || \ [set dwp [ImportGD2WP $name $lat $long $date $commt]] == \ -1 } { set error 1 } else { foreach "name chgdn d ix" $dwp {} lappend dt $d ; lappend ixs $ix ; lappend ns $name lappend chgns $chgdn } } RT { if { $rtwps == "" || \ ! [regexp {^RTE ([0-9]+) (.*)$} line rtid rtcommt] } { set error 1 } else { set rtcommt [MakeComment [string trim $rtcommt]] set what RTWP set rtwps "" ; set dtwps "" ; set rtchgwps "" } } RTWP { if { ! [regexp \ {^ (......) ([-0-9\.]+) ([-0-9\.]+) ([-0-9:/]+) (.*)$} \ $line x name latd longd date commt] } { set what RT ; set LFileBuffFull($file) 1 lappend dt [list $rtid $rtcommt $rtwps] lappend ixs [IndexNamed RT $rtid] lappend ns $rtid lappend lwps $rtwps ; lappend lchgwps $rtchgwps lappend ldwps $dtwps set rtid "" } elseif { [set dwp \ [ImportGD2WP $name $lat $long $date $commt]] == -1 } { set error 1 } else { foreach "name chgdn d ix" $dwp {} lappend dtwps $d ; lappend rtwps $name lappend rtchgwps $chgdn } } TR { if { [regexp \ {^TRK ((S|N)[0-9]+ [0-9\.]+) ((W|E)[0-9]+ [0-9\.]+) ([-0-9:/]+) (0|1)$} \ $line x latdmm x longdmm x date new] } { set lat [Coord DMM $latdmm S] set long [Coord DMM $longdmm W] } elseif { ! [regexp \ {^TRK ([-0-9\.]+) ([-0-9\.]+) ([-0-9:/]+) (0|1)$} \ lat long date new] } { set error 1 } if { ! $error } { if { ! [CheckLat GMMessage $lat DDD] || \ ! [CheckLong GMMessage $long DDD] || \ [set datesecs [CheckConvDate $date]] == "" } { set error 1 } else { if { $new && $tps != "" } { lappend dt $tps set tps "" } set p [FormatLatLong $lat $long DMS] lappend tps [FormData TP \ "latd longd latDMS longDMS date secs" \ [concat $p $datesecs]] } } } } if { $error } { GMMessage "$MESS(loaderr) $LFileLNo($file)" return } } # terminate pending RT or TR if any switch $what { RT { if { $rtid != "" } { if { $rtwps == "" } { GMMessage "$MESS(loaderr) $LFileLNo($file)" return } lappend dt [list $rtid $rtcommt $rtwps] lappend ixs [IndexNamed RT $rtid] lappend ns $rtid lappend lwps $rtwps ; lappend lchgwps $rtchgwps lappend ldwps $dtwps } } TR { if { $tps != "" } { lappend dt $tps } } } switch $how { normal { switch $what { WP { foreach ix $ixs n $ns d $dt chgdname $chgns { if { [SlowOpAborted] } { return } set fd [FormData WP \ "Name Commt PFrmt Posn Datum Date" $d] if { $chgdname != "" } { set fd [AddOldNameToObs WP $fd $chgdname] } StoreWP $ix $n $fd $LFileVisible($file) } } RT { set wpsseen "" ; set wpsseenn "" foreach ix $ixs id $ns d $dt wps $ltwps dwps $ldwps \ chgns $lchgwps { set wpsn "" foreach nwp $wps dwp $dwps chgdname $chgns { if { [SlowOpAborted] } { return } if { [set k [lsearch -exact $wpsseen $nwp]] \ == -1 } { set ix [IndexNamed WP $nwp] set fd [FormData WP \ "Name Commt PFrmt Posn Datum Date" $dwp] if { $chgdname != "" } { set fd [AddOldNameToObs RT $fd $chgdname] } set nnwp [StoreWP $ix $nwp $fd 0] lappend wpsseen $nwp lappend wpsseenn $nnwp lappend wpsn $nnwp } else { lappend wpsn [lindex $wpsseenn $k] } } StoreRT $ix $id $d $wpsn $LFileVisible($file) } } TR { foreach tps $dt { if { [SlowOpAborted] } { return } set name [NewName TR] set fd [FormData TR "Name Datum TPoints" \ [list $name "WGS 84" $tps]] StoreTR -1 $name $fd $LFileVisible($file) } } } } inGR { set grixs $LFileIxs($file,$what) switch $what { WP { foreach ix $ixs n $ns d $dt chgdname $chgns { if { [SlowOpAborted] } { return } if { [lsearch -exact $grixs $ix] != -1 } { set fd [FormData WP \ "Name Commt PFrmt Posn Datum Date" $d] if { $chgdname != "" } { set fd [AddOldNameToObs WP $fd $chgdname] } StoreWP $ix $n $fd $LFileVisible($file) } } } RT { set wpsseen "" ; set wpsseenn "" foreach ix $ixs id $ns d $dt wps $ltwps dwps $ldwps \ chgns $lchgwps { if { [lsearch -exact $grixs $ix] != -1 } { set wpsn "" foreach nwp $wps dwp $dwps chgdname $chgns { if { [SlowOpAborted] } { return } if { [set k [lsearch -exact $wpsseen $nwp] \ == -1 } { set ix [IndexNamed WP $nwp] set fd [FormData WP \ "Name Commt PFrmt Posn Datum Date" \ $dwp] if { $chgdname != "" } { set fd \ [AddOldNameToObs RT $fd $chgdname] } set nnwp [StoreWP $ix $nwp $fd 0] lappend wpsseen $nwp lappend wpsseenn $nnwp lappend wpsn $nnwp } else { lappend wpsn [lindex $wpsseenn $k] } } StoreRT $ix $id $d $wpsn $LFileVisible($file) } } } } } } return } proc ImportGD2WP {name lat long date commt} { # prepare WP data when importing from file in gd2 format # return 0 on error, otherwise list with name, old name (or ""), # list with WP data (see below) and index set name [string trim $name] if { ! [CheckLat GMMessage $lat DDD] || \ ! [CheckLong GMMessage $long DDD] } { return -1 } if { ! [CheckName Ignore $name] } { if { [set nname [AskForName $name]] == "" } { return -1 } set chgdname $name set name $nname } else { set chgdname "" } set posn [FormatLatLong $lat $long DDD] set commt [MakeComment [string trim $commt]] return [list $name $chgdname [list $name $commt DDD $posn "WGS 84" $date] \ [IndexNamed WP $name]] } ## FAI IGC data file format # number 999 for undefined taken to be "WGS 84" array set IGCDatum { 0 0 1 1 2 2 3 3 4 4 5 5 6 6 7 8 8 11 9 12 10 9 11 10 12 7 13 13 14 14 15 15 16 16 17 17 18 19 19 18 20 20 21 22 22 23 23 24 24 25 25 26 26 27 27 28 28 29 29 30 30 31 31 32 32 75 33 33 34 34 35 35 36 36 37 37 38 38 39 39 40 40 41 41 42 42 43 43 44 44 45 45 46 46 47 47 48 48 49 49 50 50 51 51 52 52 53 53 54 54 55 55 56 56 57 60 58 58 59 57 60 59 61 61 62 62 63 63 64 64 65 65 66 66 67 70 68 67 69 68 70 69 71 71 72 72 73 73 74 74 75 76 76 77 77 80 78 81 80 83 81 84 82 85 83 78 85 91 86 79 87 86 88 87 89 88 90 89 91 92 92 93 93 94 94 95 95 96 97 97 98 98 99 99 100 100 101 101 102 21 103 gm145 999 100 } array set IGCTrans { A A B {I J recdata} C {I J recdata} D {I J recdata} E {I J recdata} F {I J recdata} G recdata H {A H} I H J I K {I J recdata} L {I J recdata} } array set IGCRE { B {^B([0-9]{6})([0-9]{7})([NS])([0-9]{8})([EW])([AV])([-0-9]{5})([-0-9]{5})(.*)$} E {^E([0-9]{6})([A-Z0-9]{3})(.*)$} H {^H[FOP]([A-Z0-9]{3})([^:]*)(.*)$} } proc Import_IGC {file args} { # import data from $file in FAI IGC format and return one TR global IGCTrans IGCRE IGCDatum TimeOffset DateFormat LFileEOF \ LFileVisible LFileLNo MESS YEAR0 GFOption File TXT set name [file rootname [file tail $File(TR)]] if { $GFOption == "gps" } { set baroalt 0 set rmrk "" } else { set baroalt 1 set rmrk "$TXT(alt): baro" } set toffsetold $TimeOffset set TimeOffset 0 set ymd [list $YEAR0 1 day 1] set datum "WGS 84" set oldpos "" ; set oldkeep 1 set tps "" ; set sgsts "" ; set ntp 0 set error 0 set state A while { [set line [ReadFile $file]] != "" && ! $LFileEOF($file) } { if { [SlowOpAborted] } { return } set rtype [string index $line 0] if { [catch {set sts $IGCTrans($rtype)}] || \ [lsearch -exact $sts $state] == -1 } { incr error ; break } switch $rtype { A - L { } H { set state H if { ! [regexp $IGCRE(H) $line x stype s1 s2] } { incr error ; break } switch -- $stype { DTE { # date DDMMYY # proc ScanDate could be used here... # YY taken as 2000+YY if YY<70, and 1900+YY otherwise if { $s2 != "" || \ [scan $s1 %02d%02d%02d d m y] != 3 } { incr error ; break } if { $y < 70 } { incr y 2000 } else { incr y 1900 } set ymd [list $y $m $d] set prevtime -1 } TZN { # time zone offset in hours from UTC if { $s2 == "" } { set s $s1 } else { set s [string range $s2 1 end] } if { [scan $s %0d t] != 1 } { incr error ; break } set TimeOffset $t } DTM { # datum if { [scan $s1 %03d n] != 1 || \ [catch {set gmno $IGCDatum($n)}] } { incr error ; break } set datum [DatumWithRefId $gmno] } } } I { set state I } J { set state J } C - D { set state recdata } F { set state recdata } B { set state recdata if { ! [regexp $IGCRE(B) $line x time lat hlat long hlong \ tfix palt alt exts] } { incr error ; break } # time stamp scan $time %02d%02d%02d hh mm ss if { $prevtime > $time } { set ymd [eval NextDay $ymd] } set prevtime $time set date [eval LocalTimeAndUTC $ymd $hh $mm $ss UTC] set date [list [eval FormatDate $DateFormat $date] \ [eval DateToSecs $date]] # position scan $lat %02d%0d latd m set latd [expr $latd+$m/60000.0] if { $hlat == "S" } { set latd [expr -$latd] } scan $long %03d%0d longd m set longd [expr $longd+$m/60000.0] if { $hlong == "W" } { set longd [expr -$longd] } # with bad quality fixes test whether position is # acceptable: not 0 0 as first value, and no # differences in lat and in long greater than 5 degrees set keep 1 if { $tfix == "V" } { if { $oldpos == "" } { if { $latd == 0 && $longd == 0 } { set keep 0 } } elseif { abs([lindex $oldpos 0]-$latd) > 5 || \ abs([lindex $oldpos 1]-$longd) > 5 } { set keep 0 } } if { $keep } { if { $oldkeep == 0 && $ntp != 0 } { lappend sgsts $ntp } set oldpos [list $latd $longd] set posn [FormatLatLong $latd $longd DMS] # altitude if { $baroalt } { set alt $palt ; set tfix "A" } scan $alt %0d alt if { $tfix == "V" || $alt == 0 } { set ns "latd longd latDMS longDMS date secs" set alt "" } else { set ns "latd longd latDMS longDMS date secs alt" } lappend tps [FormData TP $ns [concat $posn $date $alt]] incr ntp } set oldkeep $keep } E { set state recdata if { ! [regexp $IGCRE(E) $line x time stype s] } { incr error ; break } switch -- $stype { CGD { # change datum if { [scan $s %03d n] != 1 || \ [catch {set gmno $IGCDatum($n)}] } { incr error ; break } set datum [DatumWithRefId $gmno] } } } K { set state recdata } G { break } } } set TimeOffset $toffsetold if { $error } { GMMessage "$MESS(loaderr) $LFileLNo($file)" return } if { $tps == "" } { GMMessage $MESS(voidTR) return } if { [IndexNamed TR $name] != -1 } { set rmrk [AddToNB $rmrk "$TXT(file): $name"] set name [NewName TR] } set fd [FormData TR "Name Obs Datum TPoints SegStarts" \ [list $name $rmrk $datum $tps $sgsts]] StoreTR -1 $name $fd $LFileVisible($file) return } ## Kismet .network files with location information # http://www.kismetwireless.net proc Import_Kismet {file how} { # import WPs from Kismet .network files with location information # $how in {normal, inGR}: keep all data, not used # some options can be changed by editing the file config.tcl and # redefining the KISMETOPT array elements # there is a single parameter for controlling the creation of a group # with the imported WPs for each type of network global KISMETOPT GFOption PositionFormat LFileVisible MESS TXT set crgroups $GFOption foreach v "prename namenumber types defsymbol esymbols" { set $v $KISMETOPT($v) } set netno 0 while { ! [eof $file] } { if { [SlowOpAborted] } { return } gets $file line ; set line [string trim $line] if { $line == "" || ! [regexp {^Network} $line] } { continue } # network incr netno set obs "" ; set name "" if { ! [regexp {: "(.+)" B?SSID} $line x name] || \ ! [CheckName Ignore $name] || [IndexNamed WP $name] != -1 } { if { $name != "" } { set obs "ssid = $name" } set k 0 while { $k < 100 } { set name "$prename$namenumber" incr namenumber if { [CheckName Ignore $name] && \ [IndexNamed WP $name] == -1 } { break } incr k } if { $k >= 100 } { set name [NewName WP] } } if { [set line [NextLine 1 $file]] == "" } { return } # type? if { ! [regexp {^Type.*: ([-a-zA-Z0-9]+)$} $line x type] } { # "Bad Type line after $netno Network" GMMessage $MESS(badfile) continue } if { [lsearch -exact $types $type] == -1 } { continue } if { [set line [NextLine 3 $file]] == "" } { return } # channel? if { ! [regexp {^Channel.*:} $line] } { # "No Channel line found after $netno Network" GMMessage $MESS(badfile) continue } set obs [AddToNB $obs $line] if { [set line [NextLine 1 $file]] == "" } { return } # encryption? if { ! [regexp {^Encryption.*: "(.+)"$} $line x encr] } { # "No Encryption line found after $netno Network" GMMessage $MESS(badfile) continue } set symbol $defsymbol foreach p $esymbols { if { [lindex $p 0] == $type } { foreach "epatt s" [lindex $p 1] { if { [string match -nocase $epatt $encr] } { set symbol $s break } } break } } if { [set line [NextLine 10 $file]] == "" } { return } # min loc if { ! [regexp {^Min Loc.*: Lat ([-.0-9]+) Lon ([-.0-9]+) } $line \ x lat1 long1] } { # "No/bad Min Loc line after $netno Network" GMMessage $MESS(badfile) continue } if { [set line [NextLine 1 $file]] == "" } { return } # max loc if { ! [regexp {^Max Loc.*: Lat ([-.0-9]+) Lon ([-.0-9]+) } $line \ x lat2 long2] } { # "No/bad Max Loc line after $netno Network" GMMessage $MESS(badfile) continue } if { [catch {set lat [expr ($lat1+$lat2)*0.5]}] || \ [catch {set long [expr ($long1+$long2)*0.5]}] } { # "Error averaging coordinates after $netno Network" GMMessage $MESS(badfile) continue } foreach "posn pfmt datum" \ [FormatPosition $lat $long "WGS 84" $PositionFormat "" DDD] { break } set data [FormData WP "Name Obs PFrmt Posn Datum Symbol" \ [list $name $obs $pfmt $posn $datum $symbol]] StoreWP -1 $name $data $LFileVisible($file) lappend names $name lappend namesof($type) $name } if { $crgroups } { # create a group with WPs for each type of network foreach t [array names namesof] { set name ${prename}_$t if { [IndexNamed GR $name] != -1 } { set name [NewName GR] } set obs "Kismet type: $t" set els [list [list WP [lsort -dictionary $namesof($t)]]] set data [FormData GR "Name Obs Conts" [list $name $obs $els]] # displaying has already been taken care of StoreGR -1 $name $data 0 } } return } ## BGA format: British Glider Association DOS turnpoints files available at # http://www.spsys.demon.co.uk/turningpoints.htm # # PS contribution: most of the BGA support is # based on code from the dos2gpsman script by # Paul Scorer (p.scorer _AT_ leedsmet.ac.uk), distributed under GPL proc Import_BGA {file how} { # import WPs from file in BGA (DOS) format # $how in {normal, inGR}: keep all data, not used global BGAfeature BGAfindblty BGAairact PositionFormat LFileVisible \ ALSCALEFOR MESS TXT set nwps 0 ; set ascale $ALSCALEFOR(FT) set date [Now] # Process each record while 1 { if { [SlowOpAborted] } { return } # get one record if {[gets $file fullname] > 0 && \ [gets $file trigraph] > 0 && \ [gets $file bganum] > 0 && \ [gets $file findability] > 0 && \ [gets $file exactpoint] > 0 && \ [gets $file description] > 0 && \ [gets $file distance] > 0 && \ [gets $file direction] > 0 && \ [gets $file feature] > 0 && \ [gets $file OSMap] > 0 && \ [gets $file Easting_Northing] > 0 && \ [gets $file Lat_Long] > 0 && \ [gets $file altitude] > 0 && \ [gets $file trigraph1] > 0 && \ [gets $file junk] == 0} { # Blank line - Record Separator if {[string equal $trigraph $trigraph1] } { # Simple consistency check: # Trigraph at last line should match that at second line scan $Lat_Long "%d%lf%s%d%lf%s" \ degLat minLat NS degLong minLong EW # Matches "Findability"? if { $BGAfindblty != "" } { if { [BGACheckFind $BGAfindblty $findability] == 0 } { continue } } # Matches "Feature"? if { $BGAfeature != "" } { if { [BGACheckPlace $BGAfeature $feature] == 0 } { continue } } # Matches "Air Activity"? if { $BGAairact != "" } { if { [BGACheckActivity $BGAairact $findability] == 0 } { continue } } set latd [expr $degLat+$minLat/60.0] if { $NS == "S" || $NS == "s" } { set latd [expr -$latd] } set longd [expr $degLong+$minLong/60.0] if { $EW == "W" || $NS == "w" } { set longd [expr -$longd] } foreach "posn pfmt datum" \ [FormatPosition $latd $longd {WGS 84} \ $PositionFormat "" DDD] { break } set altitude [expr $ascale*$altitude] set obs \ "$fullname\n$exactpoint\n$description\n$feature\n$findability" if { ! [CheckName Ignore $trigraph] } { if { [set nname [AskForName $trigraph]] == "" } { continue } set obs "$obs\n$TXT(oname): $trigraph" set trigraph $nname } set data [FormData WP "Name Obs PFrmt Posn Datum Alt Date" \ [list $trigraph $obs $pfmt $posn \ $datum $altitude $date]] StoreWP [IndexNamed WP $trigraph] $trigraph $data \ $LFileVisible($file) incr nwps } else { GMMessage $MESS(badfile) return } } else { break } } if { $nwps == 0 } { GMMessage $MESS(nosuchitems) } return } proc BGACheckPlace {placeList feature} { # check if current record is associated with $feature foreach place $placeList { if { [string equal -nocase $feature $place] } { return 1 } } return 0 } proc BGACheckFind {findList findability} { # check if "findability" (A B C D or G) matches that given as parameter foreach category $findList { if { [string equal -nocase -length 1 $category $findability] } { return 1 } } return 0 } proc BGACheckActivity {activityList findability} { # check if category of "Air Activity" matches that given as parameter foreach category $activityList { set len [string length $category] incr len if { [string length $findability] == $len } { return 1 } } return 0 } ## SimpleText format # based on the Garmin Simple Text Output protocol and the following rules # - discard lines with position status different from g or G # - a single discarded line (not at the beginning of the file) is # taken as a segment start marker # - two or more discarded lines in sequence (not at the beginning of # the file) are taken as starting a new TR proc Import_SimpleText {file how} { # load TRs from file in SimpleText format # $how in {normal, inGR}: keep all data, not used global LFileLNo LFileEOF LFileVisible MESS DateFormat set tps "" ; set tpn 0 ; set es 0 ; set sgsts "" while { 1 } { set m [ReadFile $file] if { $LFileEOF($file) } { break } if { [string first @ $m] != 0 || \ [string length $m] != 55 } { GMMessage "$MESS(badTR) $LFileLNo($file)" return } set bad 0 foreach fd "x yr mon day hr min sec hlt ltd ltm hlg lgd lgm st x alt" \ wd "1 2 2 2 2 2 2 1 2 5 1 3 5 1 3 6" \ type "x d d d d d d c d d c d d c x pd" { if { $type == "pd" } { if { [set u [string first _ $m]] != -1 && $u < $wd } { set $fd "" ; set type x } else { set type d } } switch $type { d { set type "0${wd}d" if { [scan $m "%$type" $fd] == 0 } { incr bad break } } c { set $fd [string range $m 0 [expr $wd-1]] } } set m [string replace $m 0 [expr $wd-1]] } if { $bad || ( $st != "G" && $st != "g" ) || $ltm < 0 || $lgm < 0 } { incr es continue } # date if { $yr > 86 } { # possible year 3000 bug! incr yr 1900 } else { incr yr 2000 } if { ! [CheckDateEls $yr $mon $day $hr $min $sec] } { GMMessage "$MESS(baddate) $LFileLNo($file)" incr es continue } set l [list $yr $mon $day $hr $min $sec] set dtscs [list [eval FormatDate $DateFormat $l] [eval DateToSecs $l]] # position set lat "$hlt$ltd [expr $ltm/1000.0]" set long "$hlg$lgd [expr $lgm/1000.0]" if { ! [CheckLat GMMessage $lat DMM] || \ ! [CheckLong GMMessage $long DMM] } { incr es continue } set lat [Coord DMM $lat S] set long [Coord DMM $long W] set p [FormatLatLong $lat $long DMS] # altitude if { $st != "G" } { set alt "" } if { $es > 1 } { if { $tps != "" } { set name [NewName TR] set fd [FormData TR "Name Datum TPoints SegStarts" \ [list $name "WGS 84" $tps $sgsts]] StoreTR -1 $name $fd $LFileVisible($file) } set tps "" ; set tpn 0 ; set sgsts "" } elseif { $es && $tps != "" } { # segment starter lappend sgsts $tpn } set es 0 lappend tps [FormData TP "latd longd latDMS longDMS date secs alt" \ [concat $p $dtscs $alt]] incr tpn } if { $tps != "" } { set name [NewName TR] set fd [FormData TR "Name Datum TPoints SegStarts" \ [list $name "WGS 84" $tps $sgsts]] StoreTR -1 $name $fd $LFileVisible($file) } return } ## MapEdit Polish format # tentative support from sample files as no description was found in the Web proc Import_MapEdit {file args} { # import points of interest as waypoints from MapEdit Polish format # coordinates are taken as the average coordinates given for each POI # repeated names are taken to be of different points and are renamed # to each repeated name it is first appended the number of repeats # and then the user is prompted for a replacement or given the option # of the name to be automatically generated global LFileEOF LFileVisible MESS PositionFormat set names {} while 1 { if { [SlowOpAborted] } { break } while { ! $LFileEOF($file) && [ReadFile $file] != {[POI]} } { continue } set lines {} ; set line {} while { ! $LFileEOF($file) && \ [set line [ReadFile $file]] != {[END]} } { lappend lines $line } if { $line == {} } { break } if { $line != {[END]} } { GMMessage $MESS(badfile) break } set n 0 ; set lat 0 ; set long 0 ; set name {} foreach line $lines { if { [regexp {^Label=(.*)$} $line x name] } { continue } if { [regexp {^Data[0-9]+=[(]([-.0-9]+),([-.0-9]+)[)]$} $line \ x la lo] } { set lat [expr $lat+$la] ; set long [expr $long+$lo] incr n } } if { $n == 0 } { GMMessage $MESS(badfile) continue } set lat [expr 1.0*$lat/$n] ; set long [expr 1.0*$long/$n] if { ! [CheckLat GMMessage $lat DDD] || \ ! [CheckLong GMMessage $long DDD] } { break } if { [catch {set nrep $rep($name)}] } { set nrep 0 } if { $nrep != 0 || ! [CheckName Ignore $name] } { set rep($name) [incr nrep] set chgdname $name if { $nrep != 0 } { append name $nrep } if { "[set name [AskForName $name]]" == "" } { continue } } else { set chgdname "" ; set rep($name) 1 } foreach "posn pfmt datum" \ [FormatPosition $lat $long "WGS 84" \ $PositionFormat "" DDD] { break } set data [FormData WP "Name PFrmt Posn Datum" \ [list $name $pfmt $posn $datum]] if { $chgdname != "" } { set data [AddOldNameToObs WP $data $chgdname] } StoreWP [IndexNamed WP $name] $name $data $LFileVisible($file) } return } ## GTrackMaker format # datums having the same definition in GTM and GPSMan (possibly under # different names array set GTMEquivDatum { 1 "Adindan; B Faso" 2 "Adindan; Cameroon" 3 "Adindan; Ethiopia" 4 "Adindan; Mali" 5 "Adindan; Ethiopia+Sudan" 6 "Adindan; Senegal" 7 "Adindan; Sudan" 8 "Afgooye" 9 "Ain el Abd 1970; Bahrain" 10 "Ain el Abd 1970; Saudi Arabia" 11 "American Samoa 1962" 13 "Antigua Island Astro 1943" 14 "Arc 1950; Botswana" 15 "Arc 1950; Burundi" 16 "Arc 1950; Lesotho" 17 "Arc 1950; Malawi" 18 "Arc 1950" 19 "Arc 1950; Swaziland" 20 "Arc 1950; Zaire" 21 "Arc 1950; Zambia" 22 "Arc 1950; Zimbabwe" 23 "Arc 1960; Kenya+Tanzania" 24 "Arc 1960; Kenya" 25 "Arc 1960; Tanzania" 26 "Ascension Island `58" 27 "Astro Beacon \"E\"" 28 "Astro DOS 71/4" 29 "Astro Tern Island (FRIG)" 30 "Astronomic Stn `52" 34 "Bellevue (IGN)" 35 "Bermuda 1957" 36 "Bissau" 37 "Bogota Observatory" 38 "Bukit Rimpah" 39 "Camp Area Astro" 40 "Campo Inchauspe" 41 "Canton Astro 1966" 42 "Cape" 43 "Cape Canaveral" 44 "Carthage" 45 "Chatham 1971" 46 "Chua Astro" 47 "Corrego Alegre" 48 "Dabola" 49 "Deception Island" 50 "Djakarta (Batavia)" 51 "DOS 1968" 52 "Easter Island 1967" 53 "Estonia Coord System 1937" 54 "European 1950; Cyprus" 55 "European 1950; Egypt" 56 "European 1950; England Channel" 57 "European 1950; England Channel" 58 "European 1950; Finland+Norway" 59 "European 1950; Greece" 60 "European 1950; Iran" 61 "European 1950; Italy (Sardinia)" 62 "European 1950; Italy (Sicily)" 63 "European 1950; Malta" 64 "European 1950" 65 "European 1950; NW Europe" 66 "European 1950; Middle East" 67 "European 1950; Portugal+Spain" 68 "European 1950; Tunisia" 69 "European 1979" 70 "Fort Thomas 1955" 71 "Gan 1970" 72 "Geodetic Datum `49" 73 "Graciosa Base SW 1948" 74 "Guam 1963" 75 "Gunung Segara" 76 "GUX 1 Astro" 77 "Herat North" 78 "Hermannskogel" 79 "Hjorsey 1955" 80 "Hong Kong 1963" 81 "Hu-Tzu-Shan" 82 "Indian (Bangladesh)" 83 "Indian (India, Nepal)" 84 "Indian (Pakistan)" 85 "Indian 1954" 86 "Indian 1960; Vietnam (Con Son)" 87 "Indian 1960; Vietnam (N16)" 88 "Indian 1975" 89 "Indonesian 1974" 90 "Ireland 1965" 91 "ISTS 061 Astro 1968" 92 "ISTS 073 Astro `69" 93 "Johnston Island 1961" 94 "Kandawala" 95 "Kerguelen Island" 96 "Kertau 1948" 97 "Kusaie Astro 1951" 98 "NAD83; Canada" 99 "L.C. 5 Astro" 100 "Leigon" 101 "Liberia 1964" 102 "Luzon Philippines" 103 "Luzon Mindanao" 104 "M'Poraloko" 105 "Mahe 1971" 106 "Massawa" 107 "Merchich" 108 "Midway Astro 1961" 109 "Minna; Cameroon" 110 "Minna" 111 "Montserrat Island Astro 1958" 112 "Nahrwn Masirah Ilnd" 113 "Nahrwn Saudi Arbia" 114 "Nahrwn United Arab" 115 "Naparima BWI" 116 "NAD27 Alaska" 117 "NAD27 Alaska; Aleutian East" 118 "NAD27 Alaska; Aleutian West" 119 "NAD27 Bahamas" 120 "NAD27 San Salvador" 121 "NAD27 Canada West" 122 "NAD27 Canada Middle" 123 "NAD27 Canada East" 124 "NAD27 Canada North" 125 "NAD27 Canada Yukon" 126 "NAD27 Canal Zone" 127 "NAD27 Cuba" 128 "NAD27 Greenland" 129 "NAD27 Caribbean" 130 "NAD27 Central" 131 "NAD27 Canada" 132 "NAD27 CONUS" 133 "NAD27 CONUS East" 134 "NAD27 CONUS West" 135 "NAD27 Mexico" 136 "NAD83; Canada" 137 "NAD83; Aleutian Ids" 138 "NAD83; Canada" 139 "NAD83; Canada" 140 "NAD83; Hawaii" 141 "NAD83; Canada" 142 "North Sahara 1959" 143 "Observatorio 1966" 144 "Old Egyptian" 145 "Old Hawaiian; Hawaii" 146 "Old Hawaiian; Kauai" 147 "Old Hawaiian; Maui" 148 "Old Hawaiian" 149 "Old Hawaiian; Oahu" 150 "Oman" 151 "Ord Srvy Grt Britn; England" 152 "Ord Srvy Grt Britn; England+Wales" 153 "Ord Srvy Grt Britn" 154 "Ord Srvy Grt Britn; Scotland+Shetlands" 155 "Ord Srvy Grt Britn; Wales" 156 "Pico De Las Nieves" 157 "Pitcairn Astro 1967" 158 "Point 58" 159 "Pointe Noire 1948" 160 "Porto Santo 1936" 161 "Prov So Amrican 56; Bolivia" 162 "Prov So Amrican 56; Chile North" 163 "Prov So Amrican 56; Chile South" 164 "Prov So Amrican 56; Colombia" 165 "Prov So Amrican 56; Ecuador" 166 "Prov So Amrican 56; Guyana" 167 "Prov So Amrican `56" 168 "Prov So Amrican 56; Peru" 169 "Prov So Amrican 56; Venezuela" 170 "Prov So Chilean `63" 171 "Puerto Rico" 172 "Pulkovo 1942" 173 "Qatar National" 174 "Qornoq" 175 "Reunion" 176 "Rome 1940" 177 "S-42 (Pulkovo 1942); Hungary" 178 "S-42 (Pulkovo 1942); Poland" 179 "S-42 (Pulkovo 1942); Czechoslavakia" 180 "S-42 (Pulkovo 1942); Latvia" 181 "S-42 (Pulkovo 1942); Kazakhstan" 182 "S-42 (Pulkovo 1942); Albania" 183 "S-42 (Pulkovo 1942); Hungary" 184 "S-JTSK" 185 "Santo (DOS)" 186 "Sao Braz" 187 "Sapper Hill 1943" 188 "Schwarzeck" 189 "Selvagem Grande 1938" 190 "Sierra Leone" 191 "South American 69; Argentina" 192 "South American 69; Bolivia" 193 "South American 69; Brazil" 194 "South American 69; Chile" 195 "South American 69; Colombia" 196 "South American 69; Ecuador" 197 "South American 69; Baltra" 198 "South American 69; Guyana" 199 "South American `69" 200 "South American 69; Paraguay" 201 "South American 69; Peru" 202 "South American 69; Trinidad+Tobago" 203 "South American 69; Venezuela" 204 "South Asia" 205 "Tananarive Observatory 1925" 206 "Timbalai 1948" 207 "Tokyo" 208 "Tokyo" 209 "Tokyo; Okinawa" 210 "Tokyo; South Korea" 211 "Tristan Astro 1968" 212 "Viti Levu 1916" 213 "Voirol 1960" 214 "Wake Island Astro 195" 217 "WGS 84" 218 "Yacare" 219 "Zanderij" 220 "Rijks Driehoeksmeting" 221 "NTF (NTF ellipsoid)" 224 "CH-1903" 226 "European 1950; Belgium" 227 "Israeli" 228 "Rome 1940; Luxembourg" 229 "Finland Hayford" 230 "Dionisos" 231 "South American 69; Brazil/IBGE" 232 "Potsdam" 233 "Datum 73" 234 "WGS 72" } # datums having a different definition in GTM; GPSMan definition will be used array set GTMEquivDatum { 12 "Anna 1 Astro 1965" 31 "Australian Geod `66" 32 "Australian Geod `84" 33 "Ayabelle Lighthouse" 215 "Wake-Eniwetok 1960" 216 "WGS 1972" 222 "Potsdam" 223 "RT 90" 225 "Austrian (MGI)" } set GTMVersions 211 array set GTMTypes { header {int charray=10 byte unused=1 byte unused=1 unused=1 byte unused=1 long long long long long long long float float float float long long unused=4 unused=4 bool bool unused=2 unused=2 unused=2 unused=2 unused=2 unused=2 bool unused=2 varstring varstring varstring varstring} datum {unused=2 unused=8 unused=8 unused=8 unused=8 int double double int int int} image {varstring varstring float float float float long float float byte byte} wp {double double charray=10 varstring int byte long int float unused=2} wpstyle {long varstring byte long long float byte bool long byte byte byte byte} tr {double double long byte float} trstyle {varstring byte long float byte int} rt {double double charray=10 varstring varstring int byte byte long int float int} icon {varstring byte long} layer {int varstring long byte byte byte int} } array set GTMDescr { header {version code maplinewidth unused fontsize unused unused iconcolour unused gridcolour bgcolour nwpstyles usercolour nwps ntrs nrts maxlong minlong maxlat minlat nimgs ntrnames unused unused rectcoords truegrid unused unused unused unused unused unused hasmap unused gridfontname unused unused unused} datum {unused unused unused unused unused ndatum a f dx dy dz} image {NOTUSED} wp {lat long name commt symbol style secs txtangle alt unused} wpstyle {NOTUSED} tr {lat long secs new alt} trstyle {NOTUSED} rt {lat long wpname wpcommt rtname wpsymbol wpstyle new secs unused unused unused} icon {NOTUSED} layer {NOTUSED} } array set GTMConstr { header { { if { [lsearch $GTMVersions $version] == -1 } { set m badGTMvers } } { if { $code != "TrackMaker" } { set m badGTMfile } } { if { $nwpstyles < 0 || $nwps < 0 || $ntrs < 0 || $nrts < 0 || $nimgs < 0 || $ntrnames < 0 } { set m badGTMcounts } } { if { $nwps == 0 } { set nwpstyles 0 } } { if { $ntrs == 0 } { set ntrnames 0 } } } datum { { if { [catch {set eqdatum $GTMEquivDatum($ndatum)}] } { set m badGTMdatum } } } wp { { if { $lat < -90 || $lat > 90 } { set m badGTMlat } } { if { $long < -180 || $long > 180 } { set m badGTMlong } } } tr { { if { $lat < -90 || $lat > 90 } { set m badGTMlat } } { if { $long < -180 || $long > 180 } { set m badGTMlong } } } rt { { if { $lat < -90 || $lat > 90 } { set m badGTMlat } } { if { $long < -180 || $long > 180 } { set m badGTMlong } } } } # # file structure: # header, datum, image info, wps, wpstyles, trs, trstyles, rts, layers, # symbols, symbol images, map images # # header has counts of # wpstyles, wps, tps, rtwps, imgs, trnames proc Import_GTrackMaker {file args} { # names in GTMDescr lists are implicitly used here as local variables! global GTMVersions GTMTypes GTMDescr GTMConstr GTMEquivDatum ReadBinError \ PositionFormat DateFormat LFileVisible LFileSlowId YEAR0 MESS fconfigure $file -translation binary set ReadBinError 0 set m "" ; set one 1 set wpl "" ; set trl "" ; set trtps "" ; set rtl "" ; set rtwps "" foreach b "header datum image wp wpstyle tr trstyle rt" \ c "one one nimgs nwps nwpstyles ntrs ntrnames nrts" { for { set i 0 } { $i < [set $c] } { incr i } { if { [SlowOpAborted] } { return } set vals [ReadBinData $file $GTMTypes($b)] if { $ReadBinError } { SlowOpFinish $LFileSlowId($file) $MESS(errorGTMread) return } if { $GTMDescr($b) != "NOTUSED" } { # assign values to vars foreach $GTMDescr($b) $vals {} # check constraints that may assign values to other variables foreach ct $GTMConstr($b) { eval $ct if { $m != "" } { SlowOpFinish $LFileSlowId($file) $MESS($m) return } } # use values in variables corresponding to fields and in # variables assigned during evaluation of constraints switch $b { wp { # unused: symbol, style, txtangle lappend wpl \ [list $lat $long $name $commt $secs $alt] } tr { if { $new } { if { $trtps != "" } { lappend trl $trtps } set trtps "" } lappend trtps [list $lat $long $secs $alt] } rt { # unused: wpsymbol, wpstyle # assume route name only defined when $new if { $new } { if { $rtwps != "" } { lappend rtl [list $oldroute $rtwps] } set rtwps "" set oldroute $rtname } lappend rtwps \ [list $lat $long $wpname $wpcommt $secs] } } } } } if { $trtps != "" } { lappend trl $trtps } if { $rtwps != "" } { lappend rtl [list $oldroute $rtwps] } set oldYEAR0 $YEAR0 ; set YEAR0 1990 foreach wpd $wpl { if { [SlowOpAborted] } { return } foreach "lat long name commt secs alt" $wpd {} # GTM comment saved in remark, along with name if already in use if { [set ix [IndexNamed WP $name]] != -1 } { set commt "$name\n$commt" } foreach "posn pfmt datum" \ [FormatPosition $lat $long $eqdatum $PositionFormat "" DDD] { break } set date [DateFromSecs $secs] set data [FormData WP "Name Obs PFrmt Posn Datum Date Alt" \ [list $name $commt $pfmt $posn $datum $date $alt]] StoreWP $ix $name $data $LFileVisible($file) } foreach trtps $trl { if { $trtps != "" } { set tps "" foreach tpd $trtps { if { [SlowOpAborted] } { return } foreach "lat long secs alt" $tpd {} set dints [DateIntsFromSecs $secs] set date [eval FormatDate $DateFormat $dints] set secs [eval DateToSecsFrom $dints $oldYEAR0] set d [FormatLatLong $lat $long DMS] lappend d $date $secs $alt lappend tps \ [FormData TP "latd longd latDMS longDMS date secs alt" $d] } set name [NewName TR] set data [FormData TR "Name Datum TPoints" \ [list $name $eqdatum $tps]] StoreTR -1 $name $data $LFileVisible($file) } } foreach rtd $rtl { foreach "rtname rtwps" $rtd {} if { $rtwps != "" } { set wpns "" foreach wpd $rtwps { if { [SlowOpAborted] } { return } # GTM wp comment saved in remark, along with name if in use foreach "lat long wpname commt secs" $wpd {} if { [set ix [IndexNamed WP $wpname]] != -1 } { set commt "$wpname\n$commt" } foreach "posn pfmt datum" \ [FormatPosition $lat $long $eqdatum \ $PositionFormat "" DDD] { break } set date [DateFromSecs $secs] set data [FormData WP "Name Obs PFrmt Posn Datum Date" \ [list $name $commt $pfmt $posn $datum $date]] set wpname [StoreWP $ix $wpname $data 0] lappend wpns $wpname } # GTM route name will be saved in remark set id [NewName RT] set data [FormData RT "IdNumber Obs WPoints" \ [list $id $commt $wps]] StoreRT -1 $id $data $wps $LFileVisible($file) } } set YEAR0 $oldYEAR0 return } ## Shapefile format proc ImportShapefileFrom {fname what} { # import from Shapefile format items of type $what # if $fname=="" ask user to give a file name # $what in {WP, RT, TR, LN} # return 1 on error, 0 on success global SHPPFormt SHPZone SHPDatum SHPAUnit SHPDUnit SHPDim GFPFormt \ GFDUnit GFAUnit GFVisible NNUMPFORMATS MESS TXT INVTXT \ MAXWPINROUTE ZGRID POSTYPE ALSCALEFOR SHOWFILEITEMS set GFVisible $SHOWFILEITEMS if { $fname == "" } { set ok 0 set GFPFormt $TXT($SHPPFormt) set GFDUnit $TXT($SHPDUnit) ; set GFAUnit $TXT($SHPAUnit) set vs "SHPDim GFPFormt SHPZone SHPDatum GFDUnit GFAUnit GFVisible" set pfas [list $NNUMPFORMATS =GFPFormt TXT] set us [list $TXT(M) $TXT(FT)] set ds [list +$TXT(dimens)/[list 3 2] \ !$TXT(optPositionFormat)=FillPFormtMenu/$pfas \ =$TXT(zone) !$TXT(datum)=FillDatumMenu/ \ +$TXT(distunit)/$us +$TXT(altunit)/$us @$TXT(mapitems)] while { [set fn [GMGetFileName $TXT(importfrm) $what r $vs $ds]] \ != ".." } { set SHPPFormt $INVTXT($GFPFormt) if { [BadDatumFor $SHPPFormt $SHPDatum GMMessage] != 0 } { continue } set SHPDUnit $INVTXT($GFDUnit) set SHPAUnit $INVTXT($GFAUnit) if { $ZGRID($SHPPFormt) } { set SHPZone [string trim $SHPZone] while { ! [CheckZone GMMessage $SHPZone $SHPPFormt] } { set SHPZone "" if { ! [GMChooseParams $TXT(zone) SHPZone \ [list =$TXT(zone)]] } { set SHPZone "" return 1 } set SHPZone [string trim $SHPZone] } } else { set SHPZone "" } set basename [file rootname $fn] switch -- [set ext [file extension $fn]] { .shp - .shx - .dbf - "" { set ok 1 ; break } default { if { [GMConfirm [format $MESS(shpext) $ext]] } { set ok 1 ; break } } } } if { ! $ok } { return 1 } } else { # SHPDim SHPPFormt, SHPZone, SHPDatum, SHPDUnit and SHPAUnit assumed to # have been defined set basename [file rootname $fname] } if { [set fsid [GSHPOpenInputFiles $basename]] < 1 } { switch -- $fsid { 0 { set m shpcntopen } -1 { set m shpemptyfile } -2 { set m shpwrongfile } -3 { set m shpoutmem } } GMMessage $MESS($m) GSHPCloseFiles $fsid return 1 } if { [set info [GSHPInfoFrom $fsid]] == 0 } { BUG bad channel ; return 1 } foreach "fwh fno fdim fix dbfn dbfnps" $info {} if { $fno < 1 } { GMMessage $MESS(shpemptyfile) ; GSHPCloseFiles $fsid return 1 } if { $fwh == "UNKNOWN" } { if { $what == "WP" } { GMMessage $MESS(shpwrongfile) ; GSHPCloseFiles $fsid return 1 } } elseif { $fwh != $what && \ ( $what != "LN" || $fwh != "TR" ) } { GMMessage $MESS(shpwrongfile) ; GSHPCloseFiles $fsid return 1 } if { $fwh == "UNKNOWN" || $fwh == "WP" } { set dbfs "" foreach "n x" $dbfnps { lappend dbfs $n } } if { $fdim < $SHPDim && ! [GMConfirm $MESS(shplessdim)] } { GSHPCloseFiles $fsid return 1 } if { $SHPPFormt == "UTM/UPS" } { regexp {^([0-5]?[0-9]|60)([A-HJ-NP-Z])$} $SHPZone x ze zn set zone [list $ze $zn] } else { set zone $SHPZone } if { $POSTYPE($SHPPFormt) == "latlong" } { set iscdist 1 } else { set iscdist [expr 1.0/$ALSCALEFOR($SHPDUnit)] } set iscalt [expr 1.0/$ALSCALEFOR($SHPAUnit)] set zz [expr $fdim+$SHPDim == 6] ; set alt "" set tpfs "latd longd latDMS longDMS" set lpfs "posn" set slowid [SlowOpWindow $TXT(import)] switch $fwh { WP { set wpfs "Name Commt Obs PFrmt Posn Datum Date" if { $zz } { set ixdbfs 6 } else { set ixdbfs 5 } while { $fno } { if { [SlowOpAborted] } { break } incr fno -1 if { [set fd [GSHPGetObj $fsid $fno]] != "" } { if { $fd == 0 || $fd == -1 } { BUG bad GSHPGetObj ; return } if { [set name [lindex $fd 0]] == "" } { set name [NewName WP] set chgdname "" } elseif { ! [CheckName Ignore $name] } { if { [set nname [AskForName $name]] == "" } { continue } set chgdname $name ; set name $nname } else { set chgdname "" } set commt [MakeComment [lindex $fd 1]] if { ! [CheckDate Ignore [set date [lindex $fd 2]]] } { set date "" } set x [expr $iscdist*[lindex $fd 3]] set y [expr $iscdist*[lindex $fd 4]] if { [set posn [ConvertPos $SHPPFormt $zone $x $y \ $SHPDatum $SHPPFormt]] == -1 } { continue } if { $chgdname != "" } { set obs "$TXT(oname): $chgdname" set sep "\n" } else { set obs "" ; set sep "" } foreach n $dbfs v [lindex $fd $ixdbfs] { if { $v != "" } { set obs "${obs}${sep}$n: $v" set sep "\n" } } set pd [list $name $commt $obs $SHPPFormt $posn $SHPDatum \ $date] if { $zz && ! ([BadAltitude [set alt [lindex $fd 5]]] || \ $alt < -1e35) } { set alt [expr $iscalt*$alt] set fs [linsert $wpfs end Alt] lappend pd $alt } else { set fs $wpfs } set pd [FormData WP $fs $pd] StoreWP [IndexNamed WP $name] $name $pd $GFVisible } } } RT { set wpfs "Name PFrmt Posn Datum" while { $fno } { if { [SlowOpAborted] } { break } incr fno -1 if { [set fd [GSHPGetObj $fsid $fno]] != "" } { if { $fd == 0 || $fd == -1 } { BUG bad GSHPGetObj ; return 1 } if { [set name [lindex $fd 0]] == "" || \ ! [CheckNumber Ignore $name] } { set name [NewName RT] } set commt [MakeComment [lindex $fd 1]] if { [set np [lindex $fd 2]] < 1 } { GMMessage $MESS(voidRT) ; continue } set wpns "" while { $np } { if { [SlowOpAborted] } { break } incr np -1 if { [set pd [GSHPReadNextPoint $fsid]] == -2 } { break } if { $pd == 0 || $pd == -1 } { BUG bad GSHPReadNextPoint ; return 1 } set x [expr $iscdist*[lindex $pd 0]] set y [expr $iscdist*[lindex $pd 1]] if { [set posn [ConvertPos $SHPPFormt $zone $x $y \ $SHPDatum $SHPPFormt]] == -1 } { continue } lappend wpns [set wpn [NewName WP]] set wdt [list $wpn $SHPPFormt $posn $SHPDatum] if { $zz && ! ([BadAltitude [set alt [lindex $pd 2]]] \ || $alt < -1e35) } { set alt [expr $iscalt*$alt] set fs [linsert $wpfs end Alt] lappend wdt $alt } else { set fs $wpfs } StoreWP -1 $wpn [FormData WP $fs $wdt] 0 } if { [set np [llength $wpns]] == 0 } { GMMessage $MESS(voidRT) ; continue } if { $np > $MAXWPINROUTE } { GMMessage [format $MESS(toomuchWPs) $MAXWPINROUTE] } set fd [FormData RT "IdNumber Commt WPoints" \ [list $name $commt $wpns]] StoreRT [IndexNamed RT $name] $name $fd $wpns $GFVisible } } } TR { while { $fno } { if { [SlowOpAborted] } { break } incr fno -1 if { [set fd [GSHPGetObj $fsid $fno]] != "" } { switch -- $fd { -1 - -2 { BUG bad GSHPGetObj ; return 1 } -3 { SlowOpFinish $slowid $MESS(shpoutmem) ; return 1 } } if { ! [CheckString Ignore [set name [lindex $fd 0]]] } { set name [NewName $what] } set commt [MakeComment [lindex $fd 1]] if { [set np [lindex $fd 2]] < 1 } { GMMessage $MESS(voidTR) ; continue } set ssts [lindex $fd 3] set pts "" if { $what == "TR" } { while { $np } { if { [SlowOpAborted] } { break } incr np -1 if { [set pd [GSHPReadNextPoint $fsid]] == -2 } { break } if { $pd == 0 || $pd == -1 } { BUG bad GSHPReadNextPoint ; return 1 } set x [expr $iscdist*[lindex $pd 0]] set y [expr $iscdist*[lindex $pd 1]] set tpd [ConvertPos $SHPPFormt $zone \ $x $y $SHPDatum DMS] if { $zz && \ ! ([BadAltitude [set alt [lindex $pd 2]]] \ || $alt < -1e35) } { set alt [expr $iscalt*$alt] set fs [linsert $tpfs end alt] lappend tpd $alt } else { set fs $tpfs } lappend pts [FormData TP $fs $tpd] } if { [set np [llength $pts]] == 0 } { GMMessage $MESS(voidTR) ; continue } set fd [FormData TR \ "Name Obs TPoints Datum SegStarts" \ [list $name $commt $pts $SHPDatum $ssts]] StoreTR [IndexNamed TR $name] $name $fd $GFVisible } else { # LN while { $np } { if { [SlowOpAborted] } { break } incr np -1 if { [set pd [GSHPReadNextPoint $fsid]] == -2 } { break } if { $pd == 0 || $pd == -1 } { BUG bad GSHPReadNextPoint ; return 1 } set x [expr $iscdist*[lindex $pd 0]] set y [expr $iscdist*[lindex $pd 1]] if { [set posn [ConvertPos $SHPPFormt $zone \ $x $y $SHPDatum $SHPPFormt]] == -1 } { continue } set dt [list $posn] if { $zz && \ ! ([BadAltitude [set alt [lindex $pd 2]]] \ || $alt < -1e35) } { set alt [expr $iscalt*$alt] set fs [linsert $lpfs end alt] lappend dt $alt } else { set fs $lpfs } lappend pts [FormData LP $fs $dt] } if { [set np [llength $pts]] == 0 } { GMMessage $MESS(voidLN) ; continue } set fd [FormData LN \ "Name Obs LPoints Datum PFrmt SegStarts" \ [list $name $commt $pts $SHPDatum $SHPPFormt $ssts]] StoreLN [IndexNamed LN $name] $name $fd $GFVisible } } } } UNKNOWN { while { $fno } { if { [SlowOpAborted] } { break } incr fno -1 if { [set fd [GSHPGetObj $fsid $fno]] != "" } { switch -- $fd { -1 - -2 { BUG bad GSHPGetObj ; return 1 } -3 { SlowOpFinish $slowid $MESS(shpoutmem) ; return 1 } } foreach "npts ssts dbfvs" $fd {} if { $what == "TR" } { set pfrmt DMS } else { set pfrmt $SHPPFormt } set pts "" while { $npts } { if { [SlowOpAborted] } { break } incr npts -1 if { [set pd [GSHPReadNextPoint $fsid]] == -2 } { break } if { $pd == 0 || $pd == -1 } { BUG bad GSHPReadNextPoint ; return 1 } set x [expr $iscdist*[lindex $pd 0]] set y [expr $iscdist*[lindex $pd 1]] if { [set posn [ConvertPos $SHPPFormt $zone \ $x $y $SHPDatum $pfrmt]] == -1 } { continue } if { ! $zz || [BadAltitude [set alt [lindex $pd 2]]] \ || $alt < -1e35 } { set alt "" } else { set alt [expr $iscalt*$alt] } lappend pts [list $posn $alt] } if { $pts == "" } { GMMessage $MESS(void$what) ; continue } set name [NewName $what] set obs "" ; set sep "" foreach n $dbfs v $dbfvs { if { $v != "" } { set obs "${obs}${sep}$n: $v" set sep "\n" } } switch $what { RT { set wpfs "Name PFrmt Posn Datum" set wpns "" foreach pt $pts { if { [SlowOpAborted] } { break } lappend wpns [set wpn [NewName WP]] foreach "posn alt" $pt {} set wdt [list $wpn $pfrmt $posn $SHPDatum] if { $zz && $alt != "" } { set fs [linsert $wpfs end Alt] lappend wdt $alt } else { set fs $wpfs } StoreWP -1 $wpn [FormData WP $fs $wdt] 0 } if { [llength $wpns] > $MAXWPINROUTE } { GMMessage [format $MESS(toomuchWPs) \ $MAXWPINROUTE] } set fd [FormData RT "IdNumber Obs WPoints" \ [list $name $obs $wpns]] StoreRT -1 $name $fd $wpns $GFVisible } TR { set tps "" foreach pt $pts { if { [SlowOpAborted] } { break } foreach "tpd alt" $pt {} if { $alt != "" } { set fs [linsert $tpfs end alt] lappend tpd $alt } else { set fs $tpfs } lappend tps [FormData TP $fs $tpd] } set fd [FormData TR \ "Name Obs TPoints Datum SegStarts" \ [list $name $obs $tps $SHPDatum $ssts]] StoreTR -1 $name $fd $GFVisible } LN { set lps "" foreach pt $pts { if { [SlowOpAborted] } { break } foreach "posn alt" $pt {} set dt [list $posn] if { $alt != "" } { set fs [linsert $lpfs end alt] lappend dt $alt } else { set fs $lpfs } lappend lps [FormData LP $fs $dt] } set fd [FormData LN \ "Name Obs LPoints Datum PFrmt SegStarts" \ [list $name $obs $lps $SHPDatum $pfrmt $ssts]] StoreLN -1 $name $fd $GFVisible } } } } } } GSHPCloseFiles $fsid SlowOpFinish $slowid "" return 0 } #### # MGM contribution #### import/export from/to file in MapSend and Meridian formats proc Export_MapSend {file what ixs} { # MF contribution: code by MGM moved out from general export procs fconfigure $file -translation {binary binary} ExportMapSend$what $file $ixs return } proc Export_Meridian {file what ixs} { # MF contribution: code by MGM moved out from general export procs ExportMeridian$what $file $ixs return } proc ReadMapSendHeader {file} { global ms_content ms_ver set hlen 0 binary scan [read $file 1] "c" hlen set tmp [read $file $hlen] set ms_ver 1 set teststr "" scan $tmp "%*s%*2s%d" ms_ver set ms_content 0 set tmp [ReadBinData $file [list long]] set ms_content [lindex $tmp 0] return $ms_content } proc ReadString {file} { set slen 0 binary scan [read $file 1] c slen set slen [expr $slen & 0xFF] set tmpstr [read $file $slen] return $tmpstr } proc WriteString {file str} { puts -nonewline $file [binary format c [string length $str]] puts -nonewline $file $str return } proc ReadMapSendTP {file} { global ms_ver set longd 0 set latd 0 set alt 0 set tm 0 set valid 0 set cs 0 # Endianess,word len issues here !!! set tmp [ReadBinData $file [list double double long long long]] set longd [lindex $tmp 0] set latd [lindex $tmp 1] set alt [lindex $tmp 2] set tm [lindex $tmp 3] set valid [lindex $tmp 4] # centiseconds if { $ms_ver >= 30 } { binary scan [read $file 1] "c" cs } set ns "latd longd latDMS longDMS alt date secs" set latd [expr $latd * -1] # MF change: using FormatLatLong instead of CreatePos set p [FormatLatLong $latd $longd DMS] set dt [DateFromSecs [expr $tm - 567648000]] set tp "" if {$valid} { set tp [FormData TP $ns [concat $p $alt [list $dt] [expr $tm%86400]]] } return $tp } proc WriteMapSendTP {file tp} { global DataIndex TPlatDMS TPlongDMS TPdate set lat [expr [lindex $tp $DataIndex(TPlatd) ] * -1] set long [lindex $tp $DataIndex(TPlongd) ] set dt [lindex $tp $DataIndex(TPdate)] set alt [lindex $tp $DataIndex(TPalt)] set secs [lindex $tp $DataIndex(TPsecs)] WriteBinData $file [list double double long long long byte] \ [list $long $lat [expr int($alt)] [expr $secs + 567648000] 1 0] return } proc ReadMapSendWP {file} { global ms_ver LFileVisible SYMBOLS MAG_SYMTAB set wpnam [ReadString $file] set wpcom [ReadString $file] set num 0 binary scan [read $file 4] i num set longd 0 set latd 0 set alt 0 set icon 0 set stat 0 binary scan [read $file 1] c icon binary scan [read $file 1] c stat set tmp [ReadBinData $file [list double double double]] set alt [lindex $tmp 0] set longd [lindex $tmp 1] set latd [lindex $tmp 2] set latd [expr $latd * -1] # MF change: using FormatLatLong instead of CreatePos set p [FormatLatLong $latd $longd DMS] set ns "Name Commt Posn Symbol Alt" set sym [lindex $MAG_SYMTAB $icon] # MF contribution: setting undefined symbol to default if { $sym == "" } { global DEFAULTSYMBOL set sym $DEFAULTSYMBOL } set wp [FormData WP $ns [list $wpnam $wpcom $p $sym $alt]] set ix [IndexNamed WP $wpnam] StoreWP $ix $wpnam $wp $LFileVisible($file) return } proc WriteMapSendWP {file widx cnt} { global WPPosn WPAlt WPName WPCommt WPSymbol MAG_SYMTAB WriteString $file $WPName($widx) WriteString $file $WPCommt($widx) set latd [lindex $WPPosn($widx) 0] set longd [lindex $WPPosn($widx) 1] set snum [lsearch -exact $MAG_SYMTAB $WPSymbol($widx)] #altitude # MF contribution: access to altitude array set wpa [lindex $WPAlt($widx) 0] if {$wpa == "" } {set wpa 0} #write index,symbol,status,alt,pos WriteBinData $file [list long byte byte double double double]\ [list $cnt $snum 2 $wpa $longd [expr $latd * -1]] return } proc ReadMapSendRT {file} { global ms_ver LFileVisible # Read the route header, blocks set rtnam [ReadString $file] set tmp [ReadBinData $file [list long long]] set num [lindex $tmp 0] set block_cnt [lindex $tmp 1] set i 0 set wps "" while { $i < $block_cnt } { lappend wps [ReadMapSendRTBlock $file] # need to accomodate errors here !!! incr i } set stages "" set id 1 set obs "" set ix [IndexNamed RT $id] set l [FormData RT "IdNumber Commt Obs WPoints Stages" \ [list $id "" $obs $wps $stages]] StoreRT $ix $id $l $wps $LFileVisible($file) return } proc ReadMapSendRTBlock {file} { # Read a route block global ms_ver LFileVisible SYMBOLS set longd 0 set latd 0 set icon 0 set stat 0 set rtwpnam [ReadString $file] set tmp [ReadBinData $file [list long double double]] set num [lindex $tmp 0] set longd [lindex $tmp 1] set latd [expr [lindex $tmp 2] * -1] binary scan [read $file 1] c icon return $rtwpnam } proc Import_Meridian {file what how} { # Matt.Martin _AT_ ieee.org # MF contribution: added $what argument, not used global LFileEOF LFileVisible LFileLNo MESS ms_ver PDTYPE # track points set tps "" set date [Now] set dt "" ; set ixs "" ; set ns "" set line [gets $file] set ftype [string range $line 5 7] switch $ftype { RTE - WPL { set block_cnt 0 while { [string range $line 5 7] == "WPL" } { # Strip checksum and LF/CR #regsub {\*..\r?\n?$} [gets $file] "X" line regsub "\\*...\*\$" $line "" line set thedat [lrange [UnPackData [split $line ""] \ [concat [list string] $PDTYPE(WPIN)]] 1 7] AddMagWPT [lindex [ConvWPData [list $thedat]] 0] incr block_cnt # get the next line set line [gets $file] } # get route info set dat "" while { [string range $line 5 7] == "RTE" } { # need to accomodate errors here !!! set thedat [lrange [UnPackData [split $line ""] \ [concat [list string] $PDTYPE(RTIN)]] 1 8] lappend dat $thedat set line [gets $file] } InDataRT $dat } TRK { set block_cnt 0 while { [string length $line]} { # process each line at a time set tmp [lrange [UnPackData [split [string range $line 0 \ [expr [string length $line] -4]] ""] \ [concat [list string] $PDTYPE(TRIN)]] 1 8] lappend tps [lindex [ConvTPData $tmp] 1] incr block_cnt set line [gets $file] } set tname [NewName TR] set ix [IndexNamed TR $tname] set data [FormData TR "Name Obs Datum TPoints" \ [list $tname $block_cnt "WGS 84" $tps]] StoreTR $ix $tname $data $LFileVisible($file) } } return } proc Import_MapSend {file what how} { # Matt.Martin _AT_ ieee.org # MF contribution: added $what argument, not used global LFileEOF LFileVisible LFileLNo MESS ms_ver # track points set tps "" set date [Now] set dt "" ; set ixs "" ; set ns "" fconfigure $file -translation {binary binary} set ftype [ReadMapSendHeader $file] switch $ftype { 1 { set wp_cnt 0 # waypoint count set tmp [ReadBinData $file [list long]] set block_cnt [lindex $tmp 0] set i 0 set wps "" while { $i < $block_cnt } { ReadMapSendWP $file # need to accomodate errors here !!! incr i } # get route count set rt_cnt 0 set tmp [ReadBinData $file [list long]] set rt_cnt [lindex $tmp 0] set i 0 while { $i < $rt_cnt } { ReadMapSendRT $file # need to accomodate errors here !!! incr i } } 2 { # getting track data # read track name set tname [ReadString $file] # get block count set block_cnt 0 set tmp [ReadBinData $file [list long]] set block_cnt [lindex $tmp 0] set i 0 while { $i < $block_cnt } { lappend tps [ReadMapSendTP $file] # need to accomodate errors here !!! incr i } set ix [IndexNamed TR $tname] set data [FormData TR "Name Obs Datum TPoints" \ [list $tname $block_cnt "WGS 84" $tps]] StoreTR $ix $tname $data $LFileVisible($file) } } return } proc MapSendHeader {file type} { puts -nonewline $file [binary format c 0xd] puts -nonewline $file "4D533334 MS34" WriteBinData $file [list long] [list $type] return } proc ExportMeridianWP {f items} { set cnt 0 foreach i $items { # MF contribution if { [SlowOpAborted] } { return } #-- incr cnt set outdat [PrepMagWPData $i] puts -nonewline $f [join [MakeMagPacket WPL $outdat] ""] } return } proc ExportMeridianRT {f items} { global RTWPoints # First, Dump out all waypoints set wplist "" foreach i $items { # MF contribution if { [SlowOpAborted] } { return } #-- set wps [Apply "$RTWPoints($i)" IndexNamed WP] foreach w $wps { # only add to list if not there already if { [lsearch -exact $wplist $w] == -1 } { lappend wplist $w } } } ExportMeridianWP $f $wplist # Then the routes foreach i $items { # MF contribution if { [SlowOpAborted] } { return } #-- set wps [Apply "$RTWPoints($i)" IndexNamed WP] set lncnt [expr int(([llength $wps] + 1 )/2)] set lnnum 1 while { [llength $wps]} { set outdat [PrepMagRTdata [lindex $wps 0] [lindex $wps 1] \ $lncnt $lnnum $i] set wps [lreplace $wps 0 1] puts -nonewline $f [join [MakeMagPacket RTE $outdat] ""] incr lnnum } } return } proc ExportMeridianTR {f items} { global TRTPoints TRDatum set cnt 0 foreach i $items { # MF contribution: only change the datum if needed if { [SlowOpAborted] } { return } if { $TRDatum($i) != "WGS 84" } { set tps [ChangeTPsDatum $TRTPoints($i) $TRDatum($i) "WGS 84"] } else { set tps $TRTPoints($i) } #-- incr cnt foreach p $tps { # setup the packet # MF change: datum conversion made above set outdat [PrepMagTRData [lreplace $p 2 3]] # add the checksum and write puts -nonewline $f [join [MakeMagPacket TRK $outdat] ""] } } return } proc DumpMapSendWP {f items} { WriteBinData $f [list long] [list [llength $items]] set cnt 0 foreach i $items { incr cnt WriteMapSendWP $f $i $cnt } } proc ExportMapSendWP {f items} { MapSendHeader $f 1 DumpMapSendWP $f $items WriteBinData $f [list long] [list 0] return } proc ExportMapSendRT {f items} { global RTWPoints RTData RTIdNumber WPName WPPosn WPSymbol MAG_SYMTAB # MF contribution set badrts "" ## # First, Dump out all waypoints set wplist "" foreach i $items { # MF contribution if { ! [CheckNumber Ignore $RTIdNumber($i)] } { lappend badrts $i continue } ## set wps [Apply "$RTWPoints($i)" IndexNamed WP] foreach w $wps { # only add to list if not there already if { [lsearch -exact $wplist $w] == -1 } { lappend wplist $w } } } # MF contribution if { [set n [llength $badrts]] > 0 } { global MESS GMMessage [format $MESS(cantsaveRTid) $n] } ## MapSendHeader $f 1 DumpMapSendWP $f $wplist ############################################################# # Then the routes ############################################################# # number of routes WriteBinData $f [list long] [list [llength $items]] foreach i $items { # MF contribution if { $i == [lindex $badrts 0] } { set badrts [lreplace $badrts 0 0] continue } ## set wps [Apply "$RTWPoints($i)" IndexNamed WP] set lncnt [expr int(([llength $wps] + 1 )/2)] # route name WriteString $f $RTIdNumber($i) #route num, block cnt WriteBinData $f [list long long] [list $RTIdNumber($i) [llength $wps]] set wpnum 1 foreach w $wps { # name WriteString $f $WPName($w) # wp index # long set longd [lindex $WPPosn($w) 1] # lat set latd [lindex $WPPosn($w) 0] # sym set snum [lsearch -exact $MAG_SYMTAB $WPSymbol($w)] incr wpnum WriteBinData $f [list long double double byte] \ [list [expr [lsearch $wplist $w]+1] $longd \ [expr $latd * -1] $snum] } } return } proc ExportMapSendTR {of ixs} { global TRName TRTPoints MapSendHeader $of 2 set i [lindex $ixs 0] WriteString $of $TRName($i) WriteBinData $of [list long] [list [llength $TRTPoints($i)]] foreach tp $TRTPoints($i) { WriteMapSendTP $of $tp } return } gpsman-6.4.4.2/gmsrc/datumell.tcl0000644000175000017500000011672512224351120014716 0ustar migmig# # This file is part of: # # gpsman --- GPS Manager: a manager for GPS receiver data # # Copyright (c) 1998-2013 Miguel Filgueiras migfilg@t-online.de # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. # # File: datumell.tcl # Last change: 6 October 2013 # ## user-definitions: datums, ellipsoids, geo-reference files, renaming ## methods, plug-ins # each definition is represented by a list of data fields # # indices in table DefSpecs [more details in proc Definition]: # # KIND,predef name of global with menu description of predefined # objects, or empty if only user-definitions # KIND,dfields list of identifiers of data fields in definition # the first field is always for definition identifier, unique for # each kind of definition, and is never included here # KIND,fnames list of tokens giving the format of field names # KIND,ftypes list of tokens giving the widgets/constraints for # field values # KIND,fdtypes list of types (string, atom or list) of field values # except the identifier, only for use with proc SaveUserDefined # KIND,datarr name of global array for the definitions of this kind # KIND,ulist name of global list for user definitions of this kind # KIND,baddef name of proc that returns true if definition has errors; # called with kind, action, name and data list as arguments # KIND,savecomm name of proc that saves user definitions of this kind # called with kind, action, name and data list as arguments; must # return 0 on error array set DefSpecs { datum,predef PREDEFDATUMDESCR datum,dfields {ellpsd dx dy dz reserved nb ex ey ez nsat latS latN longW longE} datum,fnames {|name |ellpsd =dx =dy =dz reserved |rmrk =ex =ey =ez "=# sat" |latS |latN |longW |longE} datum,ftypes {entry ">FillDefsMenu ellpsd" float float float reserved text poss:float>-1 poss:float>-1 poss:float>-1 poss:float>-1 poss:lat poss:lat poss:long poss:long} datum,datarr GDATUM datum,ulist UDatums datum,baddef Ignore datum,savecomm SaveUserDatumElls ellpsd,predef PREDEFELLIPSOIDDESCR ellpsd,dfields {a invf nb} ellpsd,fnames {|name =a =1/f |rmrk} ellpsd,ftypes {entry float>0 float>0 text} ellpsd,datarr ELLPSDDEF ellpsd,ulist UEllipsoids ellpsd,baddef Ignore ellpsd,savecomm SaveUserDatumElls backgrnd,predef "" backgrnd,dfields {file nb} backgrnd,fnames {|name |file |rmrk} backgrnd,ftypes {entry file=MapBkInfo text} backgrnd,fdtypes {string string} backgrnd,datarr BACKGRNDS backgrnd,ulist UBackgrnds backgrnd,baddef Ignore backgrnd,savecomm SaveUserDefined renamethod,predef "" renamethod,dfields {nb method} renamethod,fnames {|name |rmrk |operators} renamethod,ftypes {entry text apply:RenameMethod} renamethod,fdtypes {string list} renamethod,datarr RENMETHS renamethod,ulist URenMeths renamethod,baddef Ignore renamethod,savecomm SaveUserDefined plugin,predef PREDEFPLUGINDESCR plugin,dfields {nb unavailif params code where} plugin,fnames {|name |rmrk |unavailif |params |tclcode |where} plugin,ftypes {entry text entry entry text text} plugin,fdtypes {string list list list list} plugin,datarr PLUGIN plugin,ulist UPlugIns plugin,baddef BadUserPlugIn plugin,savecomm SaveUserPlugIns } proc Define {dtype args} { # create a dialog for a new definition # $dtype in {datum, ellpsd, backgrnd, renamethod, plugin} # $args if defined is taken as the list of initial field values # return name of new definition or "" if operation is cancelled global DefSpecs return [Definition $dtype $DefSpecs($dtype,fnames) \ $DefSpecs($dtype,ftypes) $args {create revert cancel}] } proc Inspect {dtype name args} { # create dialog for inspecting/editing a definition # $dtype in {datum, ellpsd, backgrnd, renamethod, plugin} global DefSpecs set datarr $DefSpecs($dtype,datarr) ; set ulist $DefSpecs($dtype,ulist) global $datarr $ulist set as {change revert create forget cancel} if { $DefSpecs($dtype,predef) != "" } { # there are GPSMan definitions that cannot be changed if { [lsearch -exact [set $ulist] $name] == -1 } { set as {create revert cancel} } } set d [linsert [set [set datarr]($name)] 0 $name] Definition $dtype $DefSpecs($dtype,fnames) $DefSpecs($dtype,ftypes) $d $as return } proc GetDefFields {dtype name fs} { # return list of field values for definition of given type and name # $fs is list of field names (as in DefSpecs array) # result is empty if definition does not exist; unknown fields are # ignored silently global DefSpecs set datarr $DefSpecs($dtype,datarr) global $datarr if { [catch {set data [set [set datarr]($name)]}] } { return "" } set res "" ; set dflds $DefSpecs($dtype,dfields) foreach f $fs { if { [set ix [lsearch -exact $dflds $f]] != -1 } { lappend res [lindex $data $ix] } } return $res } proc SaveUserDatumElls {args} { # save user-defined datums and ellipsoids # return 0 on error global UFile UDatums UEllipsoids GDATUM ELLPSDDEF MESS if { $UDatums == "" && $UEllipsoids == "" } { if { [file exists $UFile(datum,ell)] && \ [catch {file delete -- $UFile(datum,ell)}] } { GMMessage $MESS(cantwrtdtel) } return 0 } if { [catch {set f [open $UFile(datum,ell) w]}] } { GMMessage $MESS(cantwrtdtel) return 0 } puts $f "" puts $f "# $MESS(written) GPSMan [NowTZ]" puts $f "# $MESS(editrisk)" puts $f "" puts -nonewline $f "set UDatums \{" WriteQuoteList $f $UDatums puts $f "\}" puts $f "" if { $UDatums != "" } { puts $f "array set GDATUM \{" foreach d $UDatums { WriteQuote $f $d set l $GDATUM($d) puts -nonewline $f " \{" WriteQuote $f [lindex $l 0] puts $f "" puts $f " [lindex $l 1] [lindex $l 2] [lindex $l 3]" puts -nonewline $f " [lindex $l 4] " WriteQuote $f [lindex $l 5] puts $f "\}" puts $f "" } puts $f "\}" puts $f "" } puts -nonewline $f "set UEllipsoids \{" WriteQuoteList $f $UEllipsoids puts $f "\}" puts $f "" if { $UEllipsoids != "" } { puts $f "array set ELLPSDDEF \{" foreach d $UEllipsoids { WriteQuote $f $d set l $ELLPSDDEF($d) puts $f " \{[lindex $l 0] [lindex $l 1]" WriteQuote $f [lindex $l 2] puts $f "\}" puts $f "" } puts $f "\}" puts $f "" } close $f return 1 } proc SaveUserDefined {kind args} { # save user definition # $kind in {backgrnd, renamethod, plugin} # return 0 on error global UFile DefSpecs MESS global $DefSpecs($kind,datarr) $DefSpecs($kind,ulist) set ulist [set $DefSpecs($kind,ulist)] if { $ulist == {} } { if { [file exists $UFile($kind)] && \ [catch {file delete -- $UFile($kind)}] } { GMMessage $MESS(cantwrtdefs) return 0 } return 1 } if { [catch {set f [open $UFile($kind) w]}] } { GMMessage $MESS(cantwrtdefs) return 0 } set datarr $DefSpecs($kind,datarr) puts $f "" puts $f "# $MESS(written) GPSMan [NowTZ]" puts $f "# $MESS(editrisk)" puts $f "" puts -nonewline $f "set $DefSpecs($kind,ulist) \{" WriteQuoteList $f $ulist puts $f "\}" puts $f "" puts $f "array set $datarr \{" foreach d $ulist { WriteQuote $f $d puts -nonewline $f " \{" foreach v [set [set datarr]($d)] t $DefSpecs($kind,fdtypes) { switch $t { atom { puts $f $v } string { WriteQuote $f $v ; puts $f "" } list { puts $f [list $v] } } } puts $f "\}" puts $f "" } puts $f "\}" puts $f "" close $f return 1 } proc BadUserPlugIn {kind act name data} { # check plug-in definition # $kind is plugin # $act in {change, create, forget} (depends on proc DefAction) # $name is the plug-in unique name # $data is list with all the values except short name (depends on # proc DefAction) # return 1 on error global MESS if { $act == "forget" } { return 0 } # check the parameters and "where" lists if { [set where [lindex $data end]] == {} } { GMMessage $MESS(badpluginwhere) return 1 } foreach t $where { foreach {patt type widget} $t { break } if { [llength $t] != 3 || $patt == "" || \ [lsearch -exact {button menu} $type] == -1 || \ $widget == "" } { GMMessage $MESS(badpluginwhere) return 1 } } if { [llength [lindex $data 2]] & 1 == 1 } { GMMessage $MESS(badpluginparam) return 1 } foreach {n p} [lindex $data 2] { if { [string index $n 0] != "_" } { GMMessage $MESS(badpluginparam) return 1 } } return 0 } proc SaveUserPlugIns {kind act name data} { # update data on available plug-ins and save definitions # $kind is plugin # $act in {change, create, forget} (depends on proc DefAction) # $name is the plug-in unique name # $data is list with all the values except short name (depends on # proc DefAction) # call proc SaveUserDefined for saving # return 0 on error global PLGSForWindow set where [lindex $data end] if { $act != "create" } { # change or forget # start by forgetting old references to this plugin foreach p [array names PLGSForWindow] { set ts {} foreach t $PLGSForWindow($p) { if { [lindex $t 0] != $name } { lappend ts $t } } if { $ts == {} } { unset PLGSForWindow($p) } else { set PLGSForWindow($p) $ts } } } if { $act != "forget" } { # create or change SetUpPlugIn $name $where } return [SaveUserDefined $kind] } proc UserDefinitions {} { # set up user definitions as they may be needed when revising options global DefSpecs UProjs UFile USERDIR PLUGIN foreach t {datum ellpsd backgrnd renamethod plugin} { # data array may be needed below global $DefSpecs($t,ulist) $DefSpecs($t,datarr) set $DefSpecs($t,ulist) {} } if { [file readable [set UFile(datum,ell) [file join $USERDIR datums]]] } { # assumed to be in system encoding source $UFile(datum,ell) } SetUpNZGrids set UProjs {} if { [file readable [set UFile(proj,grid) [file join $USERDIR projs]]] } { SetupUserProjs } foreach t {backgrnd renamethod plugin} f {mapbacks renamethod plugins} { if { [file readable [set UFile($t) [file join $USERDIR $f]]] } { # assumed to be in system encoding source $UFile($t) } } foreach plugin [set $DefSpecs(plugin,ulist)] { SetUpPlugIn $plugin [lindex $PLUGIN($plugin) end] } return } proc FillDefsMenu {kind menu commdargs args} { # fill menu of definitions both prefined or user-defined # $kind in {datum, ellpsd, backgrnd, renamethod, plugin} # $commdargs is callback and first arguments of menu entries to which # are appended the entry and $menu by proc FillMenu # if $args is not empty it is a list of menu entries to be added to # the beginning of the menu global DefSpecs TXT global $DefSpecs($kind,ulist) set ulist [set $DefSpecs($kind,ulist)] # avoid clashes with special denotations used by proc FillMenu if { [regexp {@|(---)} $ulist] } { set l {} foreach x $ulist { if { [regexp {^(@|(---))} $x] } { lappend l " $x" } else { lappend l $x } } set ulist $l } if { $DefSpecs($kind,predef) != "" } { global $DefSpecs($kind,predef) set descr [set $DefSpecs($kind,predef)] if { $ulist != {} } { set ud [linsert $ulist 0 "$TXT(userdefs)..."] set descr [linsert $descr 0 @ $ud ---] } } else { set descr $ulist } set descr [concat $args $descr] FillMenu $menu $commdargs $descr return } proc Definition {kind fields types data acts} { # open a dialog for creating/inspecting/editing a definition of an # object # $kind must be an index of TXT, and is used as an argument to # proc DefAction that must be updated for each new kind # return name of new/changed definition or "" if operation is cancelled # or definition is forgotten # the dialog will contain widgets for the name of the defined # object and its parameters; in the next 3 lists the name corresponds # always to the first element; these 3 lists are all aligned: # $fields is a list with elements under the form: # "reserved" field to be hidden and not saved # =TEXT field with label TEXT # |TEXT field with label $TXT(TEXT) # $types is a list with elements that can be # "reserved" field to be hidden and set to "_" when saving # poss:EL field that can be either void or the description EL # "entry" for an entry with any text (the name cannot be void) # "text" for any text (but the name cannot be void) # "file=FTYPE" for a file path (entry and select button) of type # FTYPE (see $filetypes in proc GMStart, setup.tcl); can be # void or refer to a non-existing file # >PROC_AS for a value in a menu filled in by a call to PROC_AS # that is a string with a procedure name possibly followed # by space separted initial arguments; two arguments will # be appended: the menu and the command to be invoked by # a selection; this command has two arguments: the selected # value and the menu # apply:PROC for a text that cannot be directly changed by the # user; clicking on it causes PROC to be called with the # field as argument; PROC must return either an empty list # for no-operation or a new value for the field; the field # must be a pair with the text to be shown to the user and # an internal representation of it; the field is kept in # the global Datell($widget,value) # any of the types accepted by proc BadParam (check.tcl) # $data is a list (may be empty) of initial values for all entries; # it is truncated to the length of $fields # $acts are the possible actions allowed in the set: # {cancel, create, change, revert, forget} # the dialog grabs the focus but cannot be kept raised because of menus global Datell EPOSX EPOSY COLOUR MESS TXT OBSWIDTH OBSHEIGHT LISTHEIGHT \ DefCommand foreach x "kind types data" { set Datell($x) [set $x] } set Datell(grabs) [grab current] GMToplevel .datell $kind +$EPOSX+$EPOSY {} \ {WM_DELETE_WINDOW {set DefCommand cancel}} {} frame .datell.fr -relief flat -borderwidth 5 -bg $COLOUR(selbg) label .datell.fr.title -text $TXT($kind) -relief sunken set frs .datell.fr.frsel frame $frs -relief flat -borderwidth 0 set data [lrange $data 0 [expr [llength $fields]-1]] set n 0 foreach f $fields t $types d $data { switch -glob $f { reserved { incr n continue } |* { set lab $TXT([string range $f 1 end]) } =* { set lab [string range $f 1 end] } } label $frs.l$n -text $lab set vw $frs.v$n regsub {poss:} $t "" t switch -glob -- $t { entry { entry $vw -width 30 ShowTEdit $vw $d 1 } text { frame $vw set txt $vw.txt text $txt -wrap word -width 70 -height 5 \ -exportselection true -yscrollcommand [list $vw.sv set] $txt insert 1.0 $d TextBindings $txt scrollbar $vw.sv -command [list $txt yview] grid $txt -row 0 -column 0 -sticky nesw grid $vw.sv -row 0 -column 1 -sticky ns } file=* { regsub {file=} $t "" ftype frame $vw entry $vw.fn -width 50 ShowTEdit $vw.fn $d 1 button $vw.sel -text $TXT(select) \ -command "DefSelectFile $ftype $vw" grid $vw.fn -column 0 -row 0 -sticky nesw grid $vw.sel -column 1 -row 0 -sticky e } >* { set mn $vw.mn menubutton $vw -text $d -relief raised -direction below \ -menu $mn menu $mn -tearoff 0 \ -postcommand "[string range $t 1 end] $mn DefMenuSel" } apply:* { regsub {apply:} $t "" comm # keep field value in Datell array set Datell($vw,value) $d frame $vw set txt $vw.txt text $txt -wrap word -width 70 -height 5 \ -exportselection true -yscrollcommand [list $vw.sv set] bind $txt [list DefApply $comm $vw] BalloonBindings $txt clicktoedit scrollbar $vw.sv -command [list $txt yview] $txt insert 1.0 [lindex $d 0] $txt configure -state disabled grid $txt -row 0 -column 0 -sticky nesw grid $vw.sv -row 0 -column 1 -sticky ns } default { entry $vw -width 15 $vw insert 0 $d } } grid configure $frs.l$n -column 0 -row $n -sticky nesw grid configure $vw -column 1 -row $n -sticky nesw incr n } set frb .datell.fr.frb frame $frb -relief flat -borderwidth 0 foreach e $acts { button $frb.b$e -text $TXT($e) \ -command "$frb.b$e configure -state normal ; \ set DefCommand $e" pack $frb.b$e -side left } pack .datell.fr.title $frs $frb -side top -pady 5 pack .datell.fr update idletasks # cannot use RaiseWindow because of menus grab .datell while 1 { tkwait variable DefCommand switch $DefCommand { cancel { DestroyRGrabs .datell $Datell(grabs) return "" } revert { set n 0 foreach t $Datell(types) d $Datell(data) { set vw $frs.v$n regsub {poss:} $t "" t switch -glob $t { text { $vw.txt delete 1.0 end ; $vw.txt insert 1.0 $d } >* { $vw configure -text $d } reserved { } file=* { $vw.fn delete 0 end ; $vw.fn insert 0 $d } apply:* { set txt $vw.txt $txt configure -state normal $txt delete 1.0 end $vw insert 1.0 [lindex $d 0] $txt configure -state disabled set Datell($vw,value) $d } entry - default { $vw delete 0 end ; $vw insert 0 $d } } incr n } } create { set nd [DefData $Datell(kind) $frs $Datell(types)] if { [regexp {^[0-9]+$} $nd] } { focus $frs.v$nd continue } set name [lindex $nd 0] if { [DefAction create $Datell(kind) $name "" \ [lreplace $nd 0 0]] } { DestroyRGrabs .datell $Datell(grabs) return $name } } change { set nd [DefData $Datell(kind) $frs $Datell(types)] if { [regexp {^[0-9]+$} $nd] } { focus $frs.v$nd continue } set name [lindex $nd 0] set oldname [lindex $Datell(data) 0] if { [DefAction change $Datell(kind) $name $oldname \ [lreplace $nd 0 0]] } { DestroyRGrabs .datell $Datell(grabs) return $name } } forget { set d $Datell(data) ; set name [lindex $d 0] if { [DefAction forget $Datell(kind) $name $name \ [lreplace $d 0 0]] } { DestroyRGrabs .datell $Datell(grabs) return "" } } } } # not used return } proc DefApply {comm frtext} { # call command $comm to let the user edit a field # $comm is called with the current field value and must return either # an empty list for no-operation or a new field value # the field value is a list whose head is a text description to be # shown in $frtext.txt # the current field value is kept in global $Datell($frtext,value) global Datell if { [set nv [$comm $Datell($frtext,value)]] != {} } { set text $frtext.txt $text configure -state normal $text delete 1.0 end ; $text insert 1.0 [lindex $nv 0] $text configure -state disabled set Datell($frtext,value) $nv } return } proc DefSelectFile {ftype fr} { # get absolute file path and set appropriate entry in frame $fr global TXT File if { [set fn [GMGetFileName $TXT(select) $ftype r {} {}]] != ".." } { $fr.fn delete 0 end $fr.fn insert 0 $File($ftype) } return } proc DefMenuSel {value menu} { # a $value was selected in $menu [winfo parent $menu] configure -text $value return } proc DefData {kind frs types} { # collect and check data in the definition dialog # $kind gives the kind of object being defined (used in error messages) # $frs is the frame with the widgets containing the data # $types as in proc Definition # return list with values or an integer on error giving the number of the # widget (from 0) with bad value global TXT MESS Datell set nd "" ; set n 0 foreach t $types { set vw $frs.v$n set poss [regsub {poss:} $t "" t] switch -glob $t { entry { set d [string trim [$vw get]] if { $n == 0 && $d == "" } { GMMessage $MESS(namevoid) return 0 } } text { set d [string trim [$vw.txt get 1.0 end] " \n"] } file=* { set d [string trim [$vw.fn get]] } >* { set d [$vw cget -text] } apply:* { set d $Datell($vw,value) } reserved { set d "_" } default { set d [$vw get] if { ! $poss && $d != "" && [BadParam $TXT($kind) $t $d] } { return $n } } } lappend nd $d incr n } return $nd } proc DefAction {act kind name oldname data} { # try to act on definition of object under $name (was $oldname) # $act in {change, create, forget} # $kind in {datum, ellpsd, backgrnd, renamethod, plugin} # $data is list with all the values except name (not used if $act==forget) # it is assumed that for each kind there a list of names of user-defined # objects, data array indexed by the object name and a proc that is to # be called upon a successful action # this proc does NOT check whether definitions are in use when # changing/forgetting # changes here may affect the procedure called for each kind of definition # return 0 if action fails, and 1 otherwise global MESS TXT DefSpecs foreach v "datarr ulist baddef savecomm" { set $v $DefSpecs($kind,$v) } global $datarr $ulist if { [$baddef $kind $act $name $data] } { return 0 } switch $act { create { if { [lsearch -exact [array names $datarr] $name] != -1 } { GMMessage $MESS(idinuse) return 0 } set $ulist [lsort -dictionary [linsert [set $ulist] 0 $name]] set [set datarr]($name) $data } change { if { $name != $oldname } { if { [lsearch -exact [array names $datarr] $name] != -1 } { GMMessage $MESS(idinuse) return 0 } set $ulist [lsort -dictionary \ [linsert [Delete [set $ulist] $oldname] 0 $name]] unset [set datarr]($oldname) } set [set datarr]($name) $data } forget { if { ! [GMConfirm [format $MESS(askforget) $TXT($kind)]] } { return 0 } set $ulist [Delete [set $ulist] $oldname] unset [set datarr]($oldname) } } return [$savecomm $kind $act $name $data] } proc RenameMethod {descmeth} { # create dialog to edit a WP renaming method # $descmeth is either empty or a pair with a textual description # and a list for the internal representation of the method: # keep1st -- keep 1st char, further changes act on remaining chars # reset -- restart with initial name undoing any previous changes # case:X -- change case, X in {tolower, toupper} # maxlgth:N -- cut to a maximum of N chars # inslt:S -- insert S at left # insrt:S -- insert S at right # replc:XY -- replace chars by mapping head of XY to its tail # element; both must be strings of same length # delany:S -- delete all chars that also appear in string S # rsub:RS -- apply regsub -all taking head of RS as regular # expression and its tail element as substitution # specification # accifnew -- accept if result is a new name # guntilnew:P -- generate names using the head of P as prefix # followed by a number; the tail element of P is # the number of digits to be used; numbers start # from 1 and all possible values are tried until # a new name is found; if none there is no side-effect # return an empty list if no change was made, or a pair as $descmeth global Datell COLOUR TXT MESS EPOSX EPOSY TYPES if { [winfo exists .renameth] } { raise .renameth ; bell ; return } set Datell(renameth,orgtxt) [lindex $descmeth 0] set Datell(renameth,orglst) [lindex $descmeth 1] set Datell(renameth,test) "" set Datell(renameth,testchk) "" toplevel .renameth wm protocol .renameth WM_DELETE_WINDOW \ { set Datell(renameth,act) cancel } wm title .renameth "$TXT(renamethod)/GPS Manager" wm transient .renameth wm geometry .renameth +$EPOSX+$EPOSY frame .renameth.fr -relief flat -borderwidth 5 -bg $COLOUR(selbg) label .renameth.fr.title -text $TXT(renamethod) -relief sunken frame .renameth.fr.frm # sequence of operations set frt .renameth.fr.frm.frt frame $frt set txt $frt.txt text $txt -wrap none -width 50 -height 25 -exportselection true \ -yscrollcommand "$frt.yscr set" -xscrollcommand "$frt.xscr set" \ -cursor arrow $txt tag configure msel -background $COLOUR(selbg) foreach ev {Button-3 ButtonRelease-3} a {move stop} { bind $txt <$ev> "RenameMText $a %x %y" } bind $txt "RenameMText sel %x %y ; break" bind $txt break bind $txt "RenameMText enter-down %X %Y ; break" foreach ev {B3-Motion Any-Enter B3-Leave} a {go enter leave} { bind $txt <$ev> "RenameMText $a %X %Y" } scrollbar $frt.xscr -orient horizontal -command "$txt xview" scrollbar $frt.yscr -command "$txt yview" frame $frt.ftb foreach x {del clearall} { button $frt.ftb.$x -text $TXT($x) -command "RenameMText $x" } BalloonButton $frt.ftb.hlp renmove_hlp # widgets in this frame are used in other procs set fra .renameth.fr.frm.fra frame $fra label $fra.add -text $TXT(add) grid $fra.add -row 0 -column 0 -sticky w -ipadx 50 set row 1 set acts [list keep1st reset case maxlgth inslt insrt replc \ delany rsub accifnew guntilnew] foreach act $acts { set fargs $fra.fargs$act frame $fargs set col -1 # these widgets are used in proc RenameMAdd button $fargs.addop -text $TXT($act) -width 20 \ -command "RenameMAdd $act $fargs" grid $fargs.addop -row 0 -column 0 grid [BalloonButton $fargs.h$act ${act}_hlp] -row 0 -column 1 set acol 2 switch $act { case { foreach v {toupper tolower} { radiobutton $fargs.$v -text $TXT($v) \ -variable Datell(renameth,argcase) \ -value $v -anchor w -selectcolor $COLOUR(check) grid $fargs.$v -row 0 -column $acol -sticky ew -padx 5 incr acol } $fargs.toupper select } maxlgth { entry $fargs.arg -width 5 -justify right grid $fargs.arg -row 0 -column $acol -padx 5 } inslt - insrt - delany { entry $fargs.arg -width 20 TextBindings $fargs.arg grid $fargs.arg -row 0 -column $acol -padx 5 } replc - rsub { foreach x {1 2} { entry $fargs.arg$x -width 20 TextBindings $fargs.arg$x grid $fargs.arg$x -row 0 -column $acol -padx 5 incr acol } } keep1st - accifnew - reset {} guntilnew { label $fargs.atit -text $TXT(ndigits) -width 23 \ -anchor e entry $fargs.arg -width 5 -justify right grid $fargs.atit -row 0 -column $acol -padx 5 -sticky e grid $fargs.arg -row 0 -column [incr acol] -sticky w } } grid $fargs -row $row -column [incr col] -sticky w incr row } # test area set frtr .renameth.fr.frtr frame $frtr button $frtr.try -text $TXT(applyto) -command RenameMTest entry $frtr.name -width 25 TextBindings $frtr.name bind $frtr.name \ { set Datell(renameth,test) "" ; set Datell(renameth,testchk) "" } label $frtr.res -width 25 -textvariable Datell(renameth,test) \ -relief raised set hlp [BalloonButton $frtr.hlp rentest_hlp] label $frtr.chk -text $TXT(check): -width 6 label $frtr.chkr -textvariable Datell(renameth,testchk) -width 6 pack $frtr.try $frtr.name $frtr.res $hlp -side left -padx 3 pack $frtr.chk -side left -padx 5 pack $frtr.chkr -side left # control buttons set frb .renameth.fr.frb frame $frb foreach c {ok revert cancel} { button $frb.$c -text $TXT($c) \ -command "set Datell(renameth,act) $c" pack $frb.$c -side left } RenameMFill # in $frt grid $txt -row 0 -column 0 -sticky nesw grid $frt.yscr -row 0 -column 1 -sticky ns grid $frt.xscr -row 1 -column 0 -sticky ew grid $frt.ftb.del $frt.ftb.clearall $frt.ftb.hlp grid $frt.ftb -row 2 -column 0 -columnspan 2 # in .renameth.fr.frm grid $frt -row 0 -column 0 -sticky nesw -pady 15 grid $fra -row 0 -column 1 -sticky w -padx 3 grid rowconfigure $frt 0 -weight 1 grid columnconfigure $frt 0 -weight 1 grid rowconfigure .renameth.fr.frm 0 -weight 1 grid columnconfigure .renameth.fr.frm 0 -weight 1 pack .renameth.fr.title pack $frb -side bottom -pady 5 pack $frtr -side bottom -pady 5 # must be the last one pack .renameth.fr.frm -fill both -expand 1 -pady 5 pack .renameth.fr -fill both -expand 1 grid rowconfigure .renameth.fr 1 -weight 1 grid columnconfigure .renameth.fr 1 -weight 1 grid rowconfigure .renameth 0 -weight 1 grid columnconfigure .renameth 1 -weight 1 update idletasks # cannot use RaiseWindow because of menus set grabs [grab current] grab .renameth while 1 { tkwait variable Datell(renameth,act) switch $Datell(renameth,act) { cancel { set res {} break } revert { if { [GMConfirm $MESS(askrevert)] } { RenameMFill } } ok { if { [set res $Datell(renameth,lst)] == {} } { GMMessage $MESS(emptyrmeth) ; continue } set descr [string trim [$txt get 1.0 end] "\n"] append descr "\n" set res [list $descr $res] break } } } DestroyRGrabs .renameth $grabs destroy .renameth return $res } proc RenameMFill {} { # use original method as described in the Datell array to fill in # the edit window and (re-)initialise other Datell elements global Datell set Datell(renameth,lst) $Datell(renameth,orglst) set Datell(renameth,move) {} set Datell(renameth,test) "" ; set Datell(renameth,testchk) "" set frt .renameth.fr.frm.frt set txt $frt.txt $txt configure -state normal $txt delete 1.0 end $txt insert 1.0 $Datell(renameth,orgtxt) $txt configure -state disabled return } proc RenameMAdd {act fr} { # add a new operation to renaming method being edited # $act see proc RenameMethod # $fr is frame containing widgets with title and arguments, the # first one being the title global Datell TXT MESS # get arguments if any from widgets set descr $TXT($act) set op $act switch $act { keep1st - accifnew - reset {} case { append descr " " $TXT($Datell(renameth,argcase)) append op ":" $Datell(renameth,argcase) } maxlgth - guntilnew { set v [string trim [$fr.arg get]] if { ! [CheckNumber GMMessage $v] } { return } if { $v < 1 && $op == "guntilnew" } { GMMessage [format $MESS(xcantbey) $TXT(ndigits) 0] return } append descr " " $v append op ":" $v } inslt - insrt - delany - guntilnew { if { [set str [$fr.arg get]] == "" } { GMMessage $MESS(strgvoid) return } append descr " " $str append op ":" [list $str] } replc { set str1 [$fr.arg1 get] ; set str2 [$fr.arg2 get] if { [string length $str1] != [string length $str2] } { GMMessage $MESS(samelgth) return } append descr " " $str1 " --> " $str2 append op ":" [list $str1 $str2] } rsub { set s1 [$fr.arg1 get] ; set s2 [$fr.arg2 get] if { [catch {regsub -all -- "{$s1}" aaa "{$s2}" x} s] } { GMMessage $MESS(rschkargs) return } append descr " " $s1 " ; " $s2 append op ":" [list $s1 $s2] } } set txt .renameth.fr.frm.frt.txt $txt configure -state normal $txt insert end "- $descr\n" $txt configure -state disabled lappend Datell(renameth,lst) $op return } proc RenameMArgs {op} { # the description of an operation was selected: show its arguments # $op internal representation of the operation global Datell set fra .renameth.fr.frm.fra regexp {^([^:]+)} $op x opn set fr $fra.fargs$opn regsub "$opn:" $op "" val switch $opn { keep1st - accifnew - reset {} case { set Datell(renameth,argcase) $val } maxlgth - guntilnew { $fr.arg delete 0 end $fr.arg insert 0 $val } inslt - insrt - delany - guntilnew { $fr.arg delete 0 end $fr.arg insert 0 [lindex $val 0] } replc - rsub { foreach s $val k {1 2} { $fr.arg$k delete 0 end $fr.arg$k insert 0 $s } } } return } proc RenameMTest {} { # test method being defined with string given by user global Datell MESS TXT set fr .renameth.fr.frtr set Datell(renameth,test) "" ; set Datell(renameth,testchk) "" if { [set str [$fr.name get]] == "" } { GMMessage $MESS(namevoid) return } if { [set meth $Datell(renameth,lst)] == 0 } { return } set Datell(renameth,test) [RenameMethApply $meth $str {} GMMessage] if { [CheckName Ignore $Datell(renameth,test)] } { set Datell(renameth,testchk) $TXT(ok) } else { set Datell(renameth,testchk) $TXT(failed) } return } proc RenameMText {op args} { # attend to events on method description widget # $op in # {sel, del, clearall, move, go, stop, enter, enter-down, leave} # $args is empty for del and either %x,%y for sel, move, stop or %X,%Y global Datell set txt .renameth.fr.frm.frt.txt set tb .renamethmv switch $op { sel { # select/deselect a line foreach {x y} $args {} if { [set ix [$txt index @$x,$y]] == -1 } { return } regexp {^([^.]+)} $ix xx line if { [$txt get $line.0 $line.end] == "" } { return } if { ! [catch {set ix [$txt index msel.first]}] } { $txt tag remove msel msel.first msel.last if { $ix == "$line.0" } { return } } $txt tag add msel $line.0 $line.end RenameMArgs [lindex $Datell(renameth,lst) [expr $line-1]] } del { if { [catch {set ix [$txt index msel.first]}] } { bell ; return } regexp {^([^.]+)} $ix xx line $txt configure -state normal $txt delete $line.0 "$line.end + 1c" $txt configure -state disabled # text indices start from 1 incr line -1 set Datell(renameth,lst) [lreplace $Datell(renameth,lst) \ $line $line] } clearall { $txt configure -state normal $txt delete 1.0 end $txt configure -state disabled set Datell(renameth,lst) {} } move { # start moving a line foreach {x y} $args {} if { [set ix [$txt index @$x,$y]] == -1 } { return } regexp {^([^.]+)} $ix xx line if { [set chs [$txt get $line.0 $line.end]] == "" } { return } if { $Datell(renameth,move) == {} } { set Datell(renameth,move) in } NewBalloon $tb $chs \ +[expr $x+[winfo rootx $txt]+9]+[expr \ $y+[winfo rooty $txt]+9] set Datell(renameth,move,txt) $chs set Datell(renameth,move,line) $line } enter-down { if { $Datell(renameth,move) == "out" } { if { [winfo exists $tb] } { set Datell(renameth,move) in foreach {X Y} $args {} wm geometry $tb +[expr $X+9]+[expr $Y+9] } else { set Datell(renameth,move) {} } } } enter { if { $Datell(renameth,move) != {} } { destroy $tb ; set Datell(renameth,move) {} } } go { if { $Datell(renameth,move) == "in" && [winfo exists $tb] } { foreach {X Y} $args {} wm geometry $tb +[expr $X+9]+[expr $Y+9] } } stop { if { $Datell(renameth,move) == "in" && [winfo exists $tb] } { destroy $tb ; set Datell(renameth,move) {} foreach {x y} $args {} if { [set ix [$txt index @$x,$y]] == -1 } { return } regexp {^([^.]+)} $ix xx line set old $Datell(renameth,move,line) if { $line == $old } { return } $txt configure -state normal $txt delete $old.0 "$old.end + 1c" $txt insert $line.0 "$Datell(renameth,move,txt)\n" $txt configure -state disabled # text indices start from 1 incr old -1 ; incr line -1 set op [lindex $Datell(renameth,lst) $old] set lst [lreplace $Datell(renameth,lst) $old $old] set Datell(renameth,lst) [linsert $lst $line $op] } } leave { if { $Datell(renameth,move) == "in" } { set Datell(renameth,move) out } } } return } proc RenameMethApply {method str unames errproc} { # apply a WP renaming method to a string # $method is a list described in proc RenameMethod # $unames is a list of names not to be used # return an empty string when there is an error or the result is in # $unames or is in use in the data-base, in both cases calling # $errproc with message global MESS TXT # apply operators (if any) set old $str set res "" foreach op $method { switch -glob -- $op { keep1st { # keep 1st char, further changes act on remaining chars append res [string index $str 0] set str [string replace $str 0 0] } reset { # restart with given name undoing any previous changes set str $old set res "" } case:* { # tolower / toupper regsub "case:" $op "" op set str [string $op $str] } maxlgth:* { # trim to length regsub "maxlgth:" $op "" n set str [string range $str 0 [expr $n-1]] } inslt:* { # insert left regsub "inslt:" $op "" s set s [lindex $s 0] append s $str set str $s } insrt:* { # insert right regsub "insrt:" $op "" s append str [lindex $s 0] } replc:* { # map chars according to the given two strings # that have the same length regsub "replc:" $op "" p foreach {s1 s2} $p {} set s1 [split $s1 ""] set s2 [split $s2 ""] foreach c1 $s1 c2 $s2 { set str [string map [list $c1 $c2] $str] } } delany:* { # delete all chars that also appear in given string regsub "delany:" $op "" s foreach c [split [lindex $s 0] ""] { set str [string map [list $c {}] $str] } } rsub:* { # apply "regsub -all" to given regular expression # and substitution specification regsub "rsub:" $op "" p foreach {re ssp} $p {} if { [catch {regsub -all -- $re $str $ssp str}] } { $errproc $MESS(rschkargs) return "" } } accifnew { # accept result if it is a new name set r $res append r $str if { [lsearch -exact $unames $r] == -1 && \ [IndexNamed WP $r] == -1 } { return $r } } guntilnew:* { # generate names using current result as prefix # followed by a number with given number of digits # until either a new name is found and returned, # or all values were tried in which case nothing happens regsub "guntilnew:" $op "" nd set n 1 ; set lim1 [expr int(pow(10,$nd))] set fmt "%0${nd}d" set pre $res append pre $str # this may be too slow... set sid [SlowOpWindow $TXT(gennames)] for { set n 1 } { $n < $lim1 } { incr n } { set name "$pre[format $fmt $n]" if { [lsearch -exact $unames $name] == -1 && \ [IndexNamed WP $name] == -1 } { SlowOpFinish $sid "" return $name } if { $n%50 == 0 && [SlowOpAborted] } { break } } SlowOpFinish $sid "" } } } append res $str if { [lsearch -exact $unames $res] != -1 || \ [IndexNamed WP $res] != -1 } { $errproc "$MESS(nameinuse): $res" return "" } return $res } gpsman-6.4.4.2/gmsrc/map.tcl0000644000175000017500000041156112224351120013660 0ustar migmig# # This file is part of: # # gpsman --- GPS Manager: a manager for GPS receiver data # # Copyright (c) 1998-2013 Miguel Filgueiras migfilg@t-online.de # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. # # File: map.tcl # Last change: 6 October 2013 # # Includes contributions by # - Brian Baulch (baulchb _AT_ onthenet.com.au) marked "BSB contribution" # - Stefan Heinen (stefan.heinen _AT_ djh-freeweb.de) marked "SH contribution" # - David Gardner (djgardner _AT_ users.sourceforge.net) marked "DJG contribution" # - Rudolf Martin (rudolf.martin _AT_ gmx.de) marked "RM contribution" ## tags used: # waypoints: WP WP=$name forWP=$ix lab=$name sq2 # possibly: inRT=$RTix inRT=:$number # labels of WP: WP WPn forWP=$ix lab=$name txt # possibly: inRT=$RTix inRT=:$number # symbols of WP: WP WPsy lab=$name syforWP=$ix # lines of RSs (RT stages): # RT forRT=$ix from=$itWP to=$itWP stno=$number (>=0) line # labels of RSs: RT forRT=$ix lab txt # trackpoints: TR forTR=$ix inTR=$ix lab=$ix-$number sq2 # on first point: TRfirst TR=$ix # labels of TP: TR forTR=$ix inTR=$ix lab=$ix-$number txt # lines in TRs: TR forTR=$ix line # first point in LNs: LN forLN=$ix LNfirst LN=$ix sq2 # lines in LNs: LN forLN=$ix line # lines for measuring distance: measure mseg=$number (>0) # for animation: # - points: sq2 an=$no # possibly: lastfor=$no # - lines: line an=$no # - blinking image: lab an=$no anblink=$no # when saving map: temp # for RT under definition: mkRT # - line from WP to cursor: mkRTfrom mkRTfrline mkRTtrans # - point under cursor: mkRTfrom mkRTcursor mkRTtrans # - line from cursor to WP (when editing RS): mkRTtoline mkRTtrans # - stage: mkRTedge from=$itWP to=$itWP stno=$number line # background images in grid: mapimage forIm=$dx,$dy # background images not in grid: mapimage forIm=$number # when loading background image ($n in {1, 2}): # - WP name to place when geo-referencing map: mapfix mapfixname # - name of 3rd WP when adjusting map: mapfix mapfixthird # - temporary lines when fixing map: mapfix mapfixline=$n # - lines when adjusting map: mapadjust mapfixline=$n # - temporary points when adjusting map: mapfix mappoint=$n # when simplifying/converting TR to RT/TR, with $w a window path, # $n a natural number: # - lines in converted RT/TR: exp=$w expconv=$w line # - turnpoints in converted RT/TR: exp=$w expconv=$w sq2 lab=$n.$n # - TR elements: exp=$w expTR=$w (in addition to normal tags) ## ### map bindings # # - by event # # & scroll up (move map down) slowly # & scroll NE (move map SW) slowly # & scroll down (move map up) slowly # & scroll SW (move map NE) slowly # & scroll left (move map right) slowly # & scroll SE (move map NW) slowly # & scroll NW (move map SE) slowly # & scroll right (move map left) slowly # & scroll up (move map down) fast # & scroll down (move map up) fast # & create waypoint # # & panning slowly % <---- SH # # & create waypoint, or # & add waypoint to route being edited on map (if any) # & open item (if over item) # & open waypoint menu (if over waypoint); otherwise # & Unix: open route menu if editing it on the map # & non-Unix: finish edition of route on map # & delete waypoint from route being edited on map (if any) # # & panning fast # & cancel edition of route on map # # & stop motion of waypoint (if one moving) # & Unix: finish edition of route on map # & non-Unix: open waypoint menu (if over waypoint); otherwise # & non-Unix: open route menu if editing it on the map # & edit previous stage of route being edited on map (if any) # & mark position to measure distance and compute azimuth # (not when loading image or editing a route on map) # # & edit next stage of route being edited on map (if any) # # & scroll up (move map down) # & scroll up (move map down) fast # & scroll left (move map right) fast # & scroll left (move map right) # & scroll down (move map up) # & scroll down (move map up) fast # & scroll right (move map left) fast # & scroll right (move map left) # # - by action # # scroll up (move map down) slowly & # scroll up (move map down) & # scroll up (move map down) fast & , # # scroll down (move map up) slowly & # scroll down (move map up) & # scroll down (move map up) fast & , # # scroll left (move map right) slowly & # scroll left (move map right) & # scroll left (move map right) fast & # # scroll right (move map left) slowly & # scroll right (move map left) & # scroll right (move map left) fast & # # scroll NE (move map SW) slowly & # scroll SE (move map NW) slowly & # scroll SW (move map NE) slowly & # scroll NW (move map SE) slowly & # # panning slowly & # panning fast & # # create waypoint & , # # stop motion of waypoint (if one moving) & # # open item (if over item) & # # measure distance/azimuth & # # open waypoint menu (if over waypoint) & Unix: # & non-Unix: # # add waypoint to route being edited on map (if any) & # delete waypoint from route being edited on map (if any) & # edit previous stage of route being edited on map (if any) # & # edit next stage of route being edited on map (if any) # & # open route menu if editing it on the map & Unix: # & non-Unix: # # finish edition of route on map & Unix: # & non-Unix: # cancel edition of route on map & # ### # general bindings are set in proc SetMapBindings # other bindings are set in procs: # MapCreateWP, PutMapRTWPRS, PutMapTREls # changes in scrolling/panning bindings should be reflected in # proc MapBackNGPlaceWP proc SetMapBindings {} { # set cursor and initial bindings for map items and perform other # initializations # a logo or "dummy" text is created for this purpose and then destroyed global Map Logo MAPTYPES MAPW2 MAPH2 UNIX LNSREACT $Map configure -cursor crosshair if { $UNIX } { bind $Map "focus $Map ; MapCursor" bind $Map { focus . ; UnMapCursor } } else { # SH contribution: focus when creating but no focus changes when # entering/leaving focus $Map bind $Map MapCursor bind $Map { UnMapCursor } } # changes in scrolling/panning bindings should be reflected in # proc MapBackNGPlaceWP # scrolling in N-S, E-W bind $Map { ScrollMap y scroll -1 units ; MapCursorUpdate } bind $Map { ScrollMap y scroll -1 pages ; MapCursorUpdate } bind $Map { ScrollMap y scroll 1 pages ; MapCursorUpdate } bind $Map { ScrollMap y scroll 1 units ; MapCursorUpdate } bind $Map { ScrollMap x scroll -1 units ; MapCursorUpdate } bind $Map { ScrollMap x scroll 1 units ; MapCursorUpdate } # scrolling in NE-SW, NW-SE bind $Map { ScrollMap y scroll -1 units ScrollMap x scroll 1 units ; MapCursorUpdate } bind $Map { ScrollMap y scroll 1 units ScrollMap x scroll -1 units ; MapCursorUpdate } bind $Map { ScrollMap y scroll -1 units ScrollMap x scroll -1 units ; MapCursorUpdate } bind $Map { ScrollMap y scroll 1 units ScrollMap x scroll 1 units ; MapCursorUpdate } # panning # SH contribution: marking during motion and panning with # Control-Motion at a lower speed bind $Map {$Map scan mark %x %y; MapCursorMotion %x %y} bind $Map "$Map scan dragto %x %y 1; \ SetVisibleOrigin x ; SetVisibleOrigin y ; MapCursorUpdate" bind $Map "$Map scan dragto %x %y ; SetVisibleOrigin x ; \ SetVisibleOrigin y ; MapCursorUpdate" # BSB contribution: wheelmouse scrolling bind $Map { ScrollMap y scroll 25 units ; MapCursorUpdate } bind $Map { ScrollMap y scroll -25 units ; MapCursorUpdate } bind $Map { ScrollMap y scroll 1 pages MapCursorUpdate } bind $Map { ScrollMap y scroll -1 pages MapCursorUpdate } bind $Map { ScrollMap x scroll 1 pages MapCursorUpdate } bind $Map { ScrollMap x scroll -1 pages MapCursorUpdate } bind $Map { ScrollMap x scroll 25 units MapCursorUpdate } bind $Map { ScrollMap x scroll -25 units MapCursorUpdate } set ts [linsert $MAPTYPES 0 dummy] if { $Logo != "" } { $Map create image $MAPW2 $MAPH2 -image $Logo -anchor center -tags $ts } else { $Map create text 0 0 -tags $ts } foreach m $MAPTYPES { $Map bind $m { HighLight } $Map bind $m { LowLight } } if { $LNSREACT } { $Map bind LN { HighLight } $Map bind LN { LowLight } } after 5000 "$Map delete dummy" bind $Map { SafeSingleClick 1 MarkMapPoint %x %y } bind $Map { SafeCompoundClick 1 Ignore ; break } # bindings of mkRTtrans tag that did not work under some window managers # are now set in this way foreach e "Control-1 Shift-1 Shift-2 Button-3 Control-3 Control-Shift-3" { bind $Map <$e> "MapBinding $e %x %y ; break" } bind $Map { MapMeasure %x %y } # BSB contribution bind $Map { MarkMapPoint %x %y } return } proc MapBinding {event x y} { # answer to a map event global UNIX MapMakingRT switch $event { Control-1 { if { $MapMakingRT } { # SH contribution: roles of B-3 and Control-1 in non-Unix if { $UNIX} { MapRTMenu -1 $x $y } else { MapFinishRT $x $y } } } Shift-1 { if { $MapMakingRT } { MapDelFromRT sel } } Button-3 { if { $MapMakingRT } { # SH contribution: roles of B-3 and Control-1 in non-Unix if { $UNIX} { MapFinishRT $x $y } else { MapRTMenu -1 $x $y } } else { StopMapWPMoving } } Control-3 { if { $MapMakingRT} { MapChangeRTLastRS } } Control-Shift-3 { if { $MapMakingRT} { MapChangeRTNextRS } } Shift-2 { if { $MapMakingRT} { MapCancelRT ask close } } } return } ### cursor: marking, moving proc MarkMapPoint {x y} { # mark point on map if map is not void global Map MapEmpty MapWPMoving MapMakingRT MapScale MapLoading \ MapLoadWPs MapLoadWPNs MapLoadPos MapPFormat MapPFDatum OVx OVy \ CRHAIRx CRHAIRy EdWindow Datum CREATIONDATE set xx [expr $OVx+$x-$CRHAIRx] ; set yy [expr $OVy+$y-$CRHAIRy] switch -glob $MapLoading { 0 { if { ! $MapEmpty } { if { $MapWPMoving != -1 } { eval MapMoveWP [MapToPosn $xx $yy] return } elseif { $MapMakingRT } { # this was a binding of mkRTtrans tag that # did not work under some window managers MapAddToRT $x $y return } else { # create new WP if { [winfo exists $EdWindow(WP)] } { Raise $EdWindow(WP) ; bell ; return } foreach "latd longd" [MapToPosn $xx $yy] { break } foreach "p pfmt datum" \ [FormatPosition $latd $longd $Datum \ $MapPFormat $MapPFDatum DDD] { break } set opts [list create revert cancel] if { $CREATIONDATE } { GMWPoint -1 $opts \ [FormData WP "PFrmt Posn Datum Date" \ [list $pfmt $p $datum [Now]]] } else { GMWPoint -1 $opts \ [FormData WP "Commt PFrmt Posn Datum" \ [list [DateCommt [Now]] $pfmt $p $datum]] } } } } NoRot=3 { # display first waypoint set MapLoadPos(origin,x) $xx ; set MapLoadPos(origin,y) $yy MapCreateWP $xx $yy [lindex $MapLoadWPs 0] [lindex $MapLoadWPNs 0] # change tags of line segments foreach a "1 2" { set it [$Map find withtag mapfixline=$a] $Map dtag $it mapfix ; $Map addtag mapadjust withtag $it } set dmx $MapLoadPos(dmx,1) ; set dmy $MapLoadPos(dmy,1) if { [set dir $MapLoadPos(dir)] == "x" } { # compute coefficients of line (y=a x+b) set MapLoadPos(a) [expr -1.0*$dmy/$dmx] set MapLoadPos(b) [expr $yy-$MapLoadPos(a)*$xx] } else { # compute coefficients of line (x=a y+b) set MapLoadPos(a) [expr -1.0*$dmx/$dmy] set MapLoadPos(b) [expr $xx-$MapLoadPos(a)*$yy] } set MapLoadPos(bound) $MapLoadPos(origin,$dir) set c dm$dir # Does 2nd point lie to the right (East), or above (North) the 1st # in the terrain? set MapLoadPos(rtab) [expr $MapLoadPos($c,1) > 0] set MapLoading NoRot=end ; set MapScale 1e6 MapCursor } NoRot=end { if { $MapLoadPos(scale) > 1e5 } { bell } else { foreach a "1 2" { set ix [lindex $MapLoadWPs $a] $Map delete forWP=$ix syforWP=$ix eval MapCreateWP $MapLoadPos(adj,$a) $ix \ {[lindex $MapLoadWPNs $a]} } set MapScale $MapLoadPos(scale) .wmapload.fr.bns.ok configure -state normal } } Affine*=[1-3] - LeastSquares=* { # type of transformation and number of points to be placed regexp (.*)=(.*) $MapLoading z how n incr n -1 set MapLoadPos($n,x) $xx ; set MapLoadPos($n,y) $yy if { [set ix [lindex $MapLoadWPs $n]] == -1 && \ [set ix [DefineCtrlPoint .wmapload $n \ .wmapload.fr.frbx.bx 0]] == -1 } { MapLoadBkCancel return } MapCreateWP $xx $yy [lindex $MapLoadWPs $n] \ [lindex $MapLoadWPNs $n] set MapLoading ${how}=$n $Map delete mapfixname MapCursor if { $n == 0 } { .wmapload.fr.bns.ok configure -state normal } # continuation to either MapLoadBkDialDone or MapLoadBkCancel } } return } proc MapCursor {} { # start following pointer on map if map is not void global Map MapEmpty MapMakingRT MapRTCurrent MapLoading MapLoadWPNs \ MapLoadPos MAPCOLOUR MapEditingRS MapRTNext DEFTRTWIDTH switch -glob $MapLoading { Affine*=[1-3] - LeastSquares=* { $Map delete mapfix regsub .*= $MapLoading "" n incr n -1 $Map create text 100 100 -fill $MAPCOLOUR(mapsel) -anchor sw \ -text [lindex $MapLoadWPNs $n] -justify left \ -tags [list map mapfix mapfixname] } NoRot=3 { $Map delete mapfix foreach a "1 2" { set ts [list map mapfix mapfixline=$a] eval $Map create line $MapLoadPos(pos,$a) \ -fill $MAPCOLOUR(mapsel) -width 2 -tags {$ts} } $Map create text 100 100 -fill $MAPCOLOUR(mapsel) -anchor sw \ -text [lindex $MapLoadWPNs 0] -justify left \ -tags [list map mapfix mapfixname] } NoRot=end { $Map delete mapfix # create two circles for 2nd and 3rd WPs foreach a "1 2" { $Map create oval 100 100 105 105 -fill $MAPCOLOUR(mapsel) \ -tags [list mapfix mappoint=$a] } $Map create text 100 100 -fill $MAPCOLOUR(mapsel) -anchor sw \ -text [lindex $MapLoadWPNs 2] -justify center \ -tags [list map mapfix mapfixthird] $Map create text 100 100 -fill $MAPCOLOUR(mapsel) -anchor sw \ -text [lindex $MapLoadWPNs 1] -justify left \ -tags [list map mapfix mapfixname] } 0 { if { ! $MapEmpty && $MapMakingRT } { if { $MapEditingRS } { set x [lindex $MapRTNext 0] set y [lindex $MapRTNext 1] $Map create line $x $y $x $y -fill $MAPCOLOUR(mkRT) \ -arrow first -smooth 0 -width $DEFTRTWIDTH \ -tags [list mkRT mkRTtoline mkRTtrans] } set x [lindex $MapRTCurrent 0] ; set y [lindex $MapRTCurrent 1] $Map create line $x $y $x $y -fill $MAPCOLOUR(mkRT) \ -arrow first -smooth 0 -width $DEFTRTWIDTH \ -tags [list mkRT mkRTfrom mkRTfrline mkRTtrans] $Map create oval [expr $x-3] [expr $y-3] \ [expr $x+3] [expr $y+3] -fill $MAPCOLOUR(mkRT) \ -tags [list mkRT mkRTfrom mkRTcursor mkRTtrans] } } } return } proc UnMapCursor {} { # stop following pointer on map if map is not void global Map MapEmpty MapMakingRT MapLoading XCoord YCoord CursorPos \ UNIX RealTimeLogAnim switch -glob $MapLoading { Affine*=* - NoRot=* - LeastSquares=* { $Map delete mapfix # SH contribution: do not raise .wmapload under non-Unix if { $UNIX && [winfo exists .wmapload] } { Raise .wmapload } } 0 { if { ! $MapEmpty } { catch { unset CursorPos } set XCoord "" ; set YCoord "" if { $MapMakingRT } { $Map delete mkRTtrans # SH contribution: do not raise .gmRT under non-Unix if { $UNIX && [winfo exists .gmRT] } { Raise .gmRT } } elseif { $UNIX && $RealTimeLogAnim && \ [winfo exists .simdrive] } { # raise driving simulator window Raise .simdrive } } } } return } proc MapCursorMotion {x y} { # compute coordinates of pointer on map if map is not void global Map MapEmpty MapScale OVx OVy CursorPos MapMakingRT MapRTCurrent \ MapLoading MapLoadPos MapWPMoving CRHAIRx CRHAIRy \ MapEditingRS MapRTNext set CursorPos [list $x $y] set xx [expr $OVx+$x-$CRHAIRx] ; set yy [expr $OVy+$y-$CRHAIRy] switch -glob $MapLoading { Affine*=[1-3] - LeastSquares=* { # move name of WP to be placed $Map coords mapfixname $xx $yy } NoRot=3 { # move name of 1st WP and lines to the other two WPs $Map coords mapfixname $xx $yy foreach a "1 2" { $Map coords mapfixline=$a $xx $yy \ [expr $xx+$MapLoadPos(dx,$a)] [expr $yy+$MapLoadPos(dy,$a)] } } NoRot=end { # move names and positions of 2nd and 3rd WPs # move 2nd on its line; then place 3rd according to scale set bound $MapLoadPos(bound) ; set rtab $MapLoadPos(rtab) if { $MapLoadPos(dir) == "x" } { # $rtab!=0 means that segment is to the right of 1st point # assuming vector (0,1) in terrain coordinates to point North if { $rtab } { if { $xx < $bound } { set xx $bound } } elseif { $xx > $bound } { set xx $bound } set yy [expr $MapLoadPos(a)*$xx+$MapLoadPos(b)] } else { # $rtab!=0 means that segment is above the 1st point # assuming vector (0,1) in terrain coordinates to point North # y-coordinates in the canvas grow South! if { $rtab } { if { $yy > $bound } { set yy $bound } } elseif { $yy < $bound } { set yy $bound } set xx [expr $MapLoadPos(a)*$yy+$MapLoadPos(b)] } # move 2nd point $Map coords mappoint=1 [expr $xx-3] [expr $yy-3] \ [expr $xx+3] [expr $yy+3] $Map coords mapfixname $xx [expr $yy-8] # compute scale (m/pixel) set dx0 [expr $xx-$MapLoadPos(origin,x)] set dy0 [expr $yy-$MapLoadPos(origin,y)] if { [set d0 [expr sqrt($dx0*$dx0+$dy0*$dy0)]] < 1e-15 } { set sc 1e6 } else { set sc [expr 1.0*$MapLoadPos(dist)/$d0] } # compute coords of 3rd point and move it set x3 [expr $MapLoadPos(origin,x)+1.0*$MapLoadPos(dmx,2)/$sc] set y3 [expr $MapLoadPos(origin,y)-1.0*$MapLoadPos(dmy,2)/$sc] $Map coords mappoint=2 [expr $x3-3] [expr $y3-3] \ [expr $x3+3] [expr $y3+3] $Map coords mapfixthird $x3 [expr $y3-8] MapScaleChange $sc set MapLoadPos(adj,1) [list $xx $yy] set MapLoadPos(adj,2) [list $x3 $y3] set MapLoadPos(scale) $sc } 0 { if { ! $MapEmpty } { SetMapCoords $xx $yy if { $MapMakingRT } { set cx [lindex $MapRTCurrent 0] set cy [lindex $MapRTCurrent 1] $Map coords mkRTfrline $xx $yy $cx $cy $Map coords mkRTcursor [expr $xx-2] [expr $yy-2] \ [expr $xx+2] [expr $yy+2] if { $MapEditingRS } { set cx [lindex $MapRTNext 0] set cy [lindex $MapRTNext 1] $Map coords mkRTtoline $cx $cy $xx $yy } } if { $MapWPMoving != -1 } { BalloonMotion $x $y } } } } return } proc MapCursorUpdate {} { # update cursor coordinates after scrolling global CursorPos if { ! [catch {set CursorPos}] } { eval MapCursorMotion $CursorPos } return } ### measuring proc MapMeasure {x y} { # measuring a distance along a line on the map # this proc is used both for starting the operation and for adding each # new point # $x,$y are the map coordinates of point global MapEmpty MapLoading MapMakingRT MapMeasure FixedFont \ OVx OVy CRHAIRx CRHAIRy DPOSX DPOSY TXT COLOUR Map if { $MapEmpty || $MapMakingRT || $MapLoading != 0 } { return } set xx [expr $OVx+$x-$CRHAIRx] ; set yy [expr $OVy+$y-$CRHAIRy] set pn [MapToPosn $xx $yy] if { $MapMeasure == "" } { # list with total distance, number of segments, followed by # positions and coordinates for each point set MapMeasure [list 0 0 $pn $xx $yy] return } # used elsewhere set w .mapmeasure if { ! [winfo exists $w] } { GMToplevel $w distazim +[expr $DPOSX+100]+[expr $DPOSY+100] {} \ {WM_DELETE_WINDOW MapMeasureEnd} {} frame $w.fr -relief flat -borderwidth 5 -bg $COLOUR(dialbg) label $w.fr.fromto -text $TXT(distazim) frame $w.fr.fr1 -relief flat -borderwidth 0 label $w.fr.fr1.dist -width 15 -font $FixedFont -anchor w label $w.fr.fr1.bear -width 15 -font $FixedFont -anchor w frame $w.fr.frsel -relief flat -borderwidth 0 button $w.fr.frsel.loop -text $TXT(loop) -command MapMeasureLoop button $w.fr.frsel.back -text $TXT(undo) -command MapMeasureUndo button $w.fr.frsel.cr -text $TXT(crtLN) -command MapMeasureCreateLN button $w.fr.frsel.cnc -text $TXT(cancel) -command MapMeasureEnd pack $w.fr -side top pack $w.fr.fr1.dist $w.fr.fr1.bear -side left -padx 5 pack $w.fr.frsel.loop $w.fr.frsel.back $w.fr.frsel.cr \ $w.fr.frsel.cnc -side left -padx 5 pack $w.fr.fromto $w.fr.fr1 $w.fr.frsel -side top -pady 5 } MapMeasureAdd $pn $xx $yy return } proc MapMeasureAdd {posn xx yy} { # add new point to measure line updating the map and the dialog window # unless distance to last point is less than 1 metre global MapMeasure Map Datum DSCALE DTUNIT TXT set pp [lindex $MapMeasure end-2] set xxp [lindex $MapMeasure end-1] set yyp [lindex $MapMeasure end] foreach "dist nsegs p1" $MapMeasure { break } if { [set dist [expr $dist+[ComputeDist $pp $posn $Datum]]] < 1e-3 } { bell ; return } lappend MapMeasure $posn $xx $yy set MapMeasure [lreplace $MapMeasure 0 1 $dist [incr nsegs]] set dist [format "%8.3f" [expr $dist*$DSCALE]] set bear [format "%5d" [ComputeBear $p1 $posn $Datum]] $Map create line $xxp $yyp $xx $yy -width 4 -arrow last -fill green \ -tags [list measure mseg=$nsegs] set w .mapmeasure $w.fr.fr1.dist configure -text "$dist $DTUNIT" $w.fr.fr1.bear configure -text "$bear $TXT(degrees)" return } proc MapMeasureCreateLN {} { # create LN from measurement line # there must be at least two points global MapMeasure EdWindow Datum MapPFormat MapPFDatum if { [llength $MapMeasure] < 8 } { bell ; return } if { [winfo exists $EdWindow(LN)] } { bell ; Raise $EdWindow(LN) return } set lps "" foreach "p xx yy" [lrange $MapMeasure 2 end] { foreach "latd longd" $p { break } set p [lindex \ [FormatPosition $latd $longd $Datum $MapPFormat $MapPFDatum] 0] lappend lps [FormData LP posn [list $p]] } GMLine -1 {create revert cancel} [FormData LN "Datum PFrmt LPoints" \ [list $MapPFDatum $MapPFormat $lps]] return } proc MapMeasureLoop {} { # add segment from current to first point # there must be at least two points global MapMeasure if { [llength $MapMeasure] < 8 } { bell ; return } eval MapMeasureAdd [lrange $MapMeasure 2 4] return } proc MapMeasureUndo {} { # delete last segment of measurement line or finish if there is # only one global Map MapMeasure Datum DSCALE DTUNIT TXT foreach "dist nsegs p1" $MapMeasure { break } if { $nsegs < 2 } { MapMeasureEnd return } $Map delete mseg=$nsegs set lp [lindex $MapMeasure end-2] set MapMeasure [lrange $MapMeasure 0 end-3] set pp [lindex $MapMeasure end-2] set dist [expr $dist-[ComputeDist $pp $lp $Datum]] set MapMeasure [lreplace $MapMeasure 0 1 $dist [incr nsegs -1]] set dist [format "%8.3f" [expr $dist*$DSCALE]] set bear [format "%5d" [ComputeBear $p1 $pp $Datum]] set w .mapmeasure $w.fr.fr1.dist configure -text "$dist $DTUNIT" $w.fr.fr1.bear configure -text "$bear $TXT(degrees)" return } proc MapMeasureEnd {} { # finish measuring distances global Map MapMeasure set MapMeasure "" $Map delete measure destroy .mapmeasure return } ### scrolling and resizing proc ScrollMapTo {x0 y0 x y} { # scroll map so that point at ($x0,$y0) is shown at ($x,$y), # pixel coordinates relative to canvas origin global Map MapRange ScrollMap x moveto [expr [lindex [$Map xview] 0]+($x0-$x)/$MapRange(x)] ScrollMap y moveto [expr [lindex [$Map yview] 0]+($y0-$y)/$MapRange(y)] return } proc ScrollMap {dim args} { # scroll map and set corresponding coordinate of origin of visible region # $dim in {x, y}, $args suitable to {x,y}view command global Map eval $Map ${dim}view $args SetVisibleOrigin $dim return } proc SetVisibleOrigin {dim} { # set coordinate of origin of visible region # $dim in {x, y} global Map OV$dim MapRange set sc [lindex [$Map ${dim}view] 0] set OV$dim [expr $sc*$MapRange($dim)+$MapRange(${dim}0)] return } proc MapResize {} { global Map MAPW2 MAPH2 MapWidth MapHeight global OVx OVy set cx [expr $MAPW2+$OVx] ; set cy [expr $MAPH2+$OVy] set MapWidth [winfo width $Map] ; set MapHeight [winfo height $Map] set MAPW2 [expr $MapWidth/2] ; set MAPH2 [expr $MapHeight/2] SetMapBounds ScrollMapTo $cx $cy [expr $MAPW2+$OVx] [expr $MAPH2+$OVy] return } ### highlighting items proc HighLightWP {ix syit} { # highlight WP representation global Map MAPCOLOUR $Map itemconfigure forWP=$ix -fill $MAPCOLOUR(mapsel) return } proc HighLight {} { # highlight mapped item where the pointer is currently on global Map MAPCOLOUR set ts [$Map itemcget [set it [$Map find withtag current]] -tags] if { [set i [lsearch -glob $ts {forRT=*}]] != -1 } { set t [lindex $ts $i] $Map itemconfigure $t -fill $MAPCOLOUR(mapsel) regsub forRT= $t "" ix $Map itemconfigure inRT=$ix -fill $MAPCOLOUR(mapsel) return } if { [set i [lsearch -glob $ts {forWP=*}]] != -1 } { regsub forWP= [lindex $ts $i] "" ix set syit [$Map find withtag syforWP=$ix] HighLightWP $ix $syit return } if { [set i [lsearch -glob $ts {syforWP=*}]] != -1 } { regsub syforWP= [lindex $ts $i] "" ix HighLightWP $ix $it return } if { [set i [lsearch -glob $ts {for??=*}]] != -1 } { $Map itemconfigure [lindex $ts $i] -fill $MAPCOLOUR(mapsel) } return } proc LowLight {} { # finish highlighting a mapped item global MAPCOLOUR Map RTColour TRColour LNColour set ts [$Map itemcget [$Map find withtag current] -tags] if { [set i [lsearch -glob $ts {forRT=*}]] != -1 } { set t [lindex $ts $i] regsub forRT= $t "" ix if { $ix != -1 } { set c $RTColour($ix) } else { set c $MAPCOLOUR(RT) } $Map itemconfigure $t -fill $c $Map itemconfigure inRT=$ix -fill $MAPCOLOUR(WP) return } if { [set i [lsearch -glob $ts {forWP=*}]] != -1 } { $Map itemconfigure [lindex $ts $i] -fill $MAPCOLOUR(WP) # $Map delete syframe ## this avoids an infinite loop; don't ask me why... # update idletasks return } if { [set i [lsearch -glob $ts {syforWP=*}]] != -1 } { regsub syforWP= [lindex $ts $i] "" ix $Map itemconfigure forWP=$i -fill $MAPCOLOUR(WP) # cannot "$Map delete syframe": infinite loop... return } if { [set i [lsearch -glob $ts {forTR=*}]] != -1 } { set t [lindex $ts $i] regsub forTR= $t "" ix if { $ix != -1 } { set c $TRColour($ix) } else { set c $MAPCOLOUR(TR) } $Map itemconfigure $t -fill $c $Map itemconfigure inTR=$ix -fill $MAPCOLOUR(TP) return } if { [set i [lsearch -glob $ts {forLN=*}]] != -1 } { set t [lindex $ts $i] regsub forLN= $t "" ix if { $ix != -1 } { set c $LNColour($ix) } else { set c $MAPCOLOUR(LN) } $Map itemconfigure $t -fill $c } return } ### map bounds proc SetMapBounds {} { # set map bounds according to mapped items and configure map buttons global Map MapBounds MapEmpty MapRange MapWPMoving MapMakingRT WConf \ MAPW2 MAPH2 MapWidth MapHeight MapTransfTitle PrevCentre set MapBounds [$Map bbox all] if { [$Map find all] != "" } { # enlarge bounds so that corners can be scrolled to window centre set mbs "" foreach i "0 1 2 3" d [list $MAPW2 $MAPH2 $MAPW2 $MAPH2] \ s "-1 -1 1 1" { lappend mbs [expr $s*$d+[lindex $MapBounds $i]] } set MapBounds $mbs foreach d "x y" i "0 1" ii "2 3" l [list $MapWidth $MapHeight] { set MapRange($d) \ [expr [lindex $MapBounds $ii]-[lindex $MapBounds $i]] set MapRange(${d}0) [lindex $MapBounds $i] } set st normal $Map configure -scrollregion $MapBounds SetVisibleOrigin x ; SetVisibleOrigin y set PrevCentre [list [lindex [$Map xview] 0] [lindex [$Map yview] 0]] } else { set st disabled set MapEmpty 1 ; set MapTransfTitle "" MapMeasureEnd foreach b $WConf(mapdatum) { $b configure -state normal } set MapRange(x) $MapWidth ; set MapRange(y) $MapHeight set MapRange(x0) 0 ; set MapRange(y0) 0 $Map configure -scrollregion [list 0 0 $MapWidth $MapHeight] set MapMakingRT 0 StopMapWPMoving } ChangeOnState mapstate $st return } ### scale proc MapScaleToShow {scale} { # compute distance and unit to show for map scale in metre/pixel global DSCALE MAPSCLENGTH DTUNIT SUBDTUNIT SUBDSCALE if { [set v [expr $DSCALE*$MAPSCLENGTH*$scale/1000.0]] < 0.999 } { set u $SUBDTUNIT ; set v [expr 1.0*$v/$SUBDSCALE] } else { set u $DTUNIT } return "[format %.2f $v] $u" } proc MapScaleFromDist {d} { # compute scale in metre/pixel from distance shown on map window global DSCALE MAPSCLENGTH return [expr $d*1000.0/$DSCALE/$MAPSCLENGTH] } proc MapScaleChange {value} { # show change in map scale # $value is either a scale in metre/pixel when geo-referencing image, # or distance to show on map window global MpW MapLoading DTUNIT SUBDTUNIT SUBDSCALE if { $MapLoading != 0 } { if { $value > 1e5 } { $MpW.frm.frmap3.fr3.cv.val configure -text ? update idletasks return } set txt [MapScaleToShow $value] } else { if { $value < 1 } { set u $SUBDTUNIT ; set value [expr 1.0*$value/$SUBDSCALE] if { [expr int($value)] != $value } { set value [format %.2f $value] } } else { set u $DTUNIT } set txt "$value $u" } $MpW.frm.frmap3.fr3.cv.val configure -text $txt update idletasks return } proc FixMapScale {proj} { # compute map scale after a foreign geo-referencing file was used # by evaluating the distance between the inverse projections of # the map center and a point to its right at $MAPSCLENGTH pixels # assume that the MPData array has the map projection parameters and # that the map transformation has been set up # cannot call proc MapToPosn because proc MapProjectionIs has not # been called yet global MapTransf MapScale MAPSCLENGTH MAPW2 MAPH2 MPData MAPPARTPROJ foreach n "1 2" xm "$MAPW2 [expr $MAPW2+$MAPSCLENGTH]" { set pt [MapInvert${MapTransf}Transf $xm $MAPH2] if { ! [catch {set mp $MAPPARTPROJ($proj)}] } { set proj $mp } set p$n [eval Proj${proj}Invert MPData $pt] } set MapScale \ [expr 1000.0*[ComputeDist $p1 $p2 $MPData(datum)]/$MAPSCLENGTH] return } proc MapScaleSet {d} { # apply map scale change # $d is number of distance units represented by $MAPSCLENGTH pixels global Map MapScale MAPW2 MAPH2 MapMakingRT MapRTCurrent MapLoading \ MapRange OVx OVy MapTransf MapEmpty MESS MapEditingRS MapRTNext if { $MapLoading != 0 } { return } set s [MapScaleFromDist $d] if { $s == $MapScale } { return } if { ! $MapEmpty && ! [MapNewScale${MapTransf}Transf $s] } { GMMessage $MESS(transfcantscale) return } SetCursor . watch MapScaleChange $d set r [expr $MapScale*1.0/$s] set MapScale $s # pixel coordinates of centre, relative to canvas origin after scaling set xms [expr $r*($OVx+$MAPW2)] ; set yms [expr $r*($OVy+$MAPH2)] # scale map items foreach item [$Map find withtag sq2] { set cs [$Map coords $item] # coordinates of the centre of the square set x0 [expr [lindex $cs 0]+1] ; set y0 [expr [lindex $cs 1]+1] set dx [expr ($r-1)*$x0] ; set dy [expr ($r-1)*$y0] set ts [$Map gettags $item] if { [set i [lsearch -glob $ts {lab=*}]] != -1 } { set t [lindex $ts $i] } else { set t $item } $Map move $t $dx $dy } foreach item [$Map find withtag {line||lab}] { set cs "" foreach c [$Map coords $item] { lappend cs [expr $r*$c] } eval $Map coords $item $cs } if { $MapMakingRT } { set x [expr $r*[lindex $MapRTCurrent 0]] set y [expr $r*[lindex $MapRTCurrent 1]] set MapRTCurrent [list $x $y [lindex $MapRTCurrent 2]] if { $MapEditingRS } { set x [expr $r*[lindex $MapRTNext 0]] set y [expr $r*[lindex $MapRTNext 1]] set MapRTNext [list $x $y [lindex $MapRTNext 2]] } } # compute new bounds and origin of visible part SetMapBounds # scroll old centre (xms,yms) to new centre ScrollMapTo $xms $yms [expr $OVx+$MAPW2] [expr $OVy+$MAPH2] ResetCursor . return } ### abstract mapping procedures ## conversions between geodetic positions and map coordinates proc MapFromPosn {latd longd datum} { # compute map coordinates from position global MapEmpty MapLoading MapScale MapProjPointProc MapProjInitProc \ MapProjection MapTransf MAPW2 MAPH2 WConf MPData MTData Datum \ RealTimeLogOn RealTimeLogAnim ASKPROJPARAMS if { $MapEmpty && ! $MapLoading } { set MapEmpty 0 catch { unset MPData } ; catch { unset MTData } foreach b $WConf(mapdatum) { $b configure -state disabled } # do not ask for parameters confirmation if getting real-time log and # animating it set oask $ASKPROJPARAMS if { $RealTimeLogOn && $RealTimeLogAnim } { set ASKPROJPARAMS 0 } set pt [$MapProjInitProc $MapProjection MPData $Datum \ [list [list $latd $longd $datum]]] set ASKPROJPARAMS $oask # default transformation: no rotation # default initial location on map: $MAPW2 $MAPH2 eval MapInitNoRotTransf $MapScale $pt $MAPW2 $MAPH2 } else { set pt [$MapProjPointProc MPData $latd $longd $datum] } return [eval MapApply${MapTransf}Transf $pt] } proc MapToPosn {xm ym} { # compute latitude and longitude in projection datum from map coordinates global MapProjInvertProc MapTransf set pt [MapInvert${MapTransf}Transf $xm $ym] return [eval $MapProjInvertProc MPData $pt] } proc SetMapCoords {xm ym} { # set map cursor coordinates in selected format global MapProjInvertProc MapTransf MapPFormat MapPFDatum XCoord YCoord \ MapZone Datum ZGRID POSTYPE set pt [MapInvert${MapTransf}Transf $xm $ym] foreach "latd longd" [eval $MapProjInvertProc MPData $pt] { break } set p [lindex \ [FormatPosition $latd $longd $Datum $MapPFormat $MapPFDatum] 0] switch $POSTYPE($MapPFormat) { latlong - nzgrid - mh { set MapZone "" foreach "XCoord YCoord" [lrange $p 2 end] { break } } utm { set XCoord [expr round([lindex $p 4])] set YCoord [expr round([lindex $p 5])] set MapZone "[lindex $p 2][lindex $p 3]" } grid { foreach "MapZone XCoord YCoord" [lrange $p 2 end] { break } } } return } ### displaying items proc MapCreateWP {x y wpix name} { # create WP representation on map # return rectangle item global Map WPCommt WPSymbol WPDispOpt MAPCOLOUR ICONHEIGHT MapFont UNIX set its [set it [$Map create rectangle [expr $x-1] [expr $y-1] \ [expr $x+1] [expr $y+1] -fill $MAPCOLOUR(WP) \ -outline $MAPCOLOUR(WP) \ -tags [list WP WP=$name forWP=$wpix lab=$name sq2]]] switch [set o $WPDispOpt($wpix)] { name - s_name { lappend its [$Map create text $x [expr $y-6-$ICONHEIGHT/2.0] \ -text $name -fill $MAPCOLOUR(WP) -font $MapFont \ -justify center \ -tags [list WP WPn forWP=$wpix lab=$name txt]] } comment - s_comment { set t $WPCommt($wpix) lappend its [$Map create text $x [expr $y-6-$ICONHEIGHT/2.0] \ -text $t -fill $MAPCOLOUR(WP) -font $MapFont \ -justify center \ -tags [list WP WPn forWP=$wpix lab=$name txt]] } } if { [string first s $o] == 0 } { set syim [lindex [SymbolImageName $WPSymbol($wpix)] 0] lappend its [$Map create image $x $y -anchor center \ -image $syim -tags [list WP WPsy syforWP=$wpix lab=$name]] } # SH contribution: use B-3 in non-Unix systems instead of Control-1 if { $UNIX } { set event "" set com "SafeCompoundClick 1 MapWPMenu $wpix" } else { set event "" set com "MapWPMenu $wpix" } foreach m $its { $Map bind $m "SafeCompoundClick 1 OpenItem WP $wpix" $Map bind $m $event $com } return $it } proc PutMapWP {ix} { # map WP with given index # return map item for the rectangle global Datum WPName WPPosn WPDatum WPMBack MapEmpty if { $MapEmpty && [set mbak $WPMBack($ix)] != "" } { LoadMapBack $mbak } set p [MapFromPosn [lindex $WPPosn($ix) 0] [lindex $WPPosn($ix) 1] \ $WPDatum($ix)] return [MapCreateWP [lindex $p 0] [lindex $p 1] $ix $WPName($ix)] } proc PutMapRT {ix} { # map RT with given index # return -1 if RT contains a WP either unknown or being edited, or # the operation was aborted, otherwise 1 global RTWPoints RTStages RTMBack MapEmpty if { $MapEmpty && [set mbak $RTMBack($ix)] != "" } { LoadMapBack $mbak } return [PutMapRTWPRS $ix $RTWPoints($ix) $RTStages($ix) \ [list RT forRT=$ix] inRT=$ix] } proc PutMapRTWPRS {ix wps rss rttags wptag} { # map RT having the WPs in $wps, RSs in $rss, adding $rttags to RT # elements and $wptag (unless void) to WPs # $ix may be -1, in which case there will be no bindings to open # the RT # the colour is taken to be indexed by the head of $rttags # return -1 if RT contains a WP either unknown or being edited, # or if operation was aborted, and 1 otherwise # slow operation dialog only used if $xi!=-1, "mkRT" not in $rttags and # there are more than 100 WPs global WPDispl EdWindow GMEd Map MAPCOLOUR MESS TXT DataIndex MapFont \ RTWidth RTColour DEFTRTWIDTH if { $ix != -1 && [lindex $wps 100] != "" && \ [lsearch -exact $rttags mkRT] == -1 } { set slow 1 set sid [SlowOpWindow $TXT(displ)] } else { set slow 0 SetCursor . watch } set its "" foreach wp $wps { if { $slow && [SlowOpAborted] } { UnMapRT $ix SlowOpFinish $sid "" return -1 } set wpix [IndexNamed WP $wp] if { [set it [$Map find withtag WP=$wp]] == "" } { if { $wpix == -1 } { set m "$MESS(cantmapRTunkn) $wp" } elseif { [winfo exists $EdWindow(WP)] && \ $GMEd(WP,Index) == $wpix } { set m "$MESS(cantmapRTed): $wp" } else { set m "" } if { $m != "" } { if { $slow } { SlowOpFinish $sid $m } else { GMMessage $m ResetCursor . } return -1 } set it [PutMapWP $wpix] set WPDispl($wpix) 1 SetDisplShowWindow WP $wpix select } lappend its $it if { $wptag != "" } { $Map addtag $wptag withtag forWP=$wpix } } if { $ix != -1 } { set wdth $RTWidth($ix) ; set colour $RTColour($ix) } else { set wdth $DEFTRTWIDTH ; set colour $MAPCOLOUR(RT) } if { [lindex $rttags 0] == "mkRT" } { set colour $MAPCOLOUR(mkRT) } set cs [$Map coords [set it0 [lindex $its 0]]] # coordinates of the centre of the square set x0 [expr [lindex $cs 0]+1] ; set y0 [expr [lindex $cs 1]+1] set ixlab $DataIndex(RSlabel) set k 0 foreach it [lrange $its 1 end] st $rss { if { $slow && [SlowOpAborted] } { UnMapRT $ix SlowOpFinish $sid "" return -1 } if { $it != "" } { set cs [$Map coords $it] set x [expr [lindex $cs 0]+1] ; set y [expr [lindex $cs 1]+1] set ts [concat $rttags [list from=$it0 to=$it stno=$k line]] set zs [$Map create line $x0 $y0 $x $y -arrow last -smooth 0 \ -fill $colour -width $wdth -tags $ts] if { [set sl [lindex $st $ixlab]] != "" } { set xl [expr ($x0+$x)/2] ; set yl [expr ($y0+$y)/2] set ts [linsert $rttags end lab txt] lappend zs [$Map create text $xl $yl \ -text $sl -fill $colour -font $MapFont \ -justify center -tags $ts] } if { $ix != -1 } { foreach l $zs { $Map bind $l \ "SafeCompoundClick 1 OpenItem RT $ix" $Map lower $l $it0 } } else { foreach l $zs { $Map lower $l $it0 } } set x0 $x ; set y0 $y ; set it0 $it incr k } } if { $slow } { SlowOpFinish $sid "" } else { ResetCursor . } return 1 } proc PutMapTREls {ix tps segsts datum tags} { # map TR elements # $ix is index of TR or -1; used for tagging # $tps is list of TR points with given $datum # $segsts is list of indices (!=0) of TR points starting segments # $tags is tags to add to all created canvas items (may be void) # slow operation dialog only used if there are more then 100 TPs # return -1 if operation was aborted, 1 otherwise global MAPCOLOUR Map TRName TRWidth TRColour DEFTTRWIDTH TRNUMBERINTVL \ MapFont TXT TRINFO if { [lindex $tps 101] != "" } { set slow 1 set sid [SlowOpWindow $TXT(displ)] } else { set slow 0 SetCursor . watch } set res 1 set tags1 [linsert $tags 0 TR forTR=$ix inTR=$ix] set tags2 [linsert $tags 0 TR forTR=$ix line] set its "" ; set i 1 if { $ix != -1 } { set name $TRName($ix) ; set wdth $TRWidth($ix) set colour $TRColour($ix) } else { set name "(???)" ; set wdth $DEFTTRWIDTH set colour $MAPCOLOUR(TR) } foreach tp $tps { if { $slow && [SlowOpAborted] } { set res -1 ; break } set p [MapFromPosn [lindex $tp 0] [lindex $tp 1] $datum] set x [lindex $p 0] ; set y [lindex $p 1] set it [$Map create rectangle [expr $x-1] [expr $y-1] \ [expr $x+1] [expr $y+1] -fill $colour \ -outline $colour \ -tags [linsert $tags1 0 lab=$ix-$i sq2]] if { $i == 1 } { $Map addtag TRfirst withtag $it $Map addtag TR=$ix withtag $it } $Map bind $it "SafeCompoundClick 1 OpenItem TR $ix" lappend its $it if { $TRNUMBERINTVL && $i%$TRNUMBERINTVL == 0 } { set t [$Map create text $x [expr $y-8] -text $i \ -fill $colour -font $MapFont -justify center \ -tags [linsert $tags1 0 lab=$ix-$i txt]] $Map bind $t "SafeCompoundClick 1 OpenItem TR $ix" } switch $TRINFO { number { set bbi [list ={$name}:$i] } date { set bbi [list ={$name}:[lindex $tp 4]] } } BalloonBindings "$Map lab=$ix-$i" $bbi incr i } if { $res == 1 && [set rts [lreplace $its 0 0]] != "" } { set cs [$Map coords [set it0 [lindex $its 0]]] # coordinates of centre of the square set x0 [expr [lindex $cs 0]+1] ; set y0 [expr [lindex $cs 1]+1] set tpn 1 ; set nsst [lindex $segsts 0] foreach it $rts { if { $slow && [SlowOpAborted] } { set res -1 ; break } set cs [$Map coords $it] set x [expr [lindex $cs 0]+1] ; set y [expr [lindex $cs 1]+1] if { $nsst == $tpn } { set segsts [lreplace $segsts 0 0] set nsst [lindex $segsts 0] } else { set l [$Map create line $x0 $y0 $x $y -smooth 0 \ -fill $colour -width $wdth -tags $tags2] $Map bind $l "SafeCompoundClick 1 OpenItem TR $ix" $Map lower $l $it0 } set x0 $x ; set y0 $y incr tpn } } if { $slow } { if { $res == -1 } { $Map delete forTR=$ix } SlowOpFinish $sid "" } else { ResetCursor . } return $res } proc PutMapTR {ix} { # map TR with given index # return -1 if operation was aborted, 1 otherwise global TRTPoints TRSegStarts TRDatum TRMBack MapEmpty if { $MapEmpty && [set mbak $TRMBack($ix)] != "" } { LoadMapBack $mbak } return [PutMapTREls $ix $TRTPoints($ix) $TRSegStarts($ix) $TRDatum($ix) ""] } proc PutMapLNEls {ix lps segsts datum tags} { # map LN elements # $ix is index of LN or -1; used for tagging # $lps is list of LN points with given $datum # $segsts is list of indices (!=0) of LN points starting segments # $tags is tags to add to all created canvas items (may be void) # slow operation dialog only used if there are more then 100 LPs # return -1 if operation was aborted, 1 otherwise global MAPCOLOUR Map LNWidth LNColour DEFTLNWIDTH Datum TXT LNSREACT if { [lindex $lps 101] != "" } { set slow 1 set sid [SlowOpWindow $TXT(displ)] } else { set slow 0 SetCursor . watch } set res 1 if { $ix == -1 } { set colour $MAPCOLOUR(LN) ; set width $DEFTLNWIDTH } else { set colour $LNColour($ix) ; set width $LNWidth($ix) } set tgs [linsert $tags 0 LN forLN=$ix LNfirst LN=$ix sq2] set lp [lindex $lps 0] foreach "latd longd" [lindex $lp 0] { break } foreach "x0 y0" [MapFromPosn $latd $longd $datum] {} set its [$Map create rectangle [expr $x0-1] [expr $y0-1] \ [expr $x0+1] [expr $y0+1] -fill $colour \ -outline $colour -tags $tgs] set tgs [linsert $tags 0 LN forLN=$ix line] set lpn 1 ; set nsst [lindex $segsts 0] foreach lp [lreplace $lps 0 0] { if { $slow && [SlowOpAborted] } { $Map delete forLN=$ix set res -1 break } foreach "latd longd" [lindex $lp 0] { break } foreach "x y" [MapFromPosn $latd $longd $datum] {} if { $nsst == $lpn } { set segsts [lreplace $segsts 0 0] set nsst [lindex $segsts 0] } else { $Map create line $x0 $y0 $x $y -smooth 0 -fill $colour \ -width $width -tags $tgs } set x0 $x ; set y0 $y incr lpn } if { $res != -1 && $LNSREACT } { $Map bind forLN=$ix "SafeCompoundClick 1 OpenItem LN $ix" } if { $slow } { SlowOpFinish $sid "" } else { ResetCursor . } return $res } proc PutMapLN {ix} { # map LN with given index # return -1 if operation was aborted, 1 otherwise global LNLPoints LNSegStarts LNDatum LNMBack MapEmpty if { $MapEmpty && [set mbak $LNMBack($ix)] != "" } { LoadMapBack $mbak } return [PutMapLNEls $ix $LNLPoints($ix) $LNSegStarts($ix) $LNDatum($ix) ""] } proc PutMapGREl {wh ix} { # map GR element of given kind and index # return -1 if the element cannot be unmapped/mapped, otherwise 1 global ${wh}Displ if { [set ${wh}Displ($ix)] } { if { ! [UnMap $wh $ix] } { return -1 } } return [PutMap $wh $ix] } proc PutMapGR {ix} { # map GR with given index # use slow operation window explicitly only for WPs if there are more # than 100 # return -1 if an element cannot be unmapped/mapped, otherwise 1 global GRConts TXT set res 1 foreach p $GRConts($ix) { foreach "wh es" $p {} if { $wh == "LAP" } { continue } if { $wh == "WP" && [lindex $es 100] != "" } { set slow 1 set sid [SlowOpWindow $TXT(displ)] } else { set slow 0 } foreach e $es { if { $slow && [SlowOpAborted] } { SlowOpFinish $sid "" return -1 } elseif { [set ex [IndexNamed $wh $e]] == -1 || \ [PutMapGREl $wh $ex] == -1 } { set res -1 } } if { $slow } { SlowOpFinish $sid "" } } return $res } proc PutMap {wh ix} { # put item with index $ix and of type $wh (in $TYPES) on map # if possible # set map bounds and change display button in show windows global Map ${wh}Displ set r [PutMap$wh $ix] SetMapBounds if { $r == -1 } { set [set wh]Displ($ix) 0 return 0 } set [set wh]Displ($ix) 1 SetDisplShowWindow $wh $ix select return 1 } proc PutMapAnimPoint {mpos no centre} { # display point for animation $no at map position given by # first two elements of $mpos; scroll to centre if $centre # draw line from previous point if there is one global Map MAPCOLOUR OVx OVy MAPW2 MAPH2 FRAMEIMAGE DEFTTRWIDTH set x [lindex $mpos 0] ; set y [lindex $mpos 1] if { [set itl [$Map find withtag lastfor=$no]] != "" } { set cs [$Map coords $itl] set x1 [expr [lindex $cs 0]+1] ; set y1 [expr [lindex $cs 1]+1] $Map create line $x $y $x1 $y1 -smooth 0 -fill $MAPCOLOUR(anim) \ -width $DEFTTRWIDTH -tags [list an=$no line] $Map dtag $itl lastfor=$no set blit [$Map find withtag anblink=$no] $Map coords $blit $x $y } else { $Map create image $x $y -anchor center \ -image $FRAMEIMAGE -tags [list lab an=$no anblink=$no] after 500 "MapBlink anblink=$no 1" } set it [$Map create rectangle [expr $x-1] [expr $y-1] [expr $x+1] \ [expr $y+1] -fill $MAPCOLOUR(anim) -outline $MAPCOLOUR(anim) \ -tags [list an=$no lastfor=$no sq2]] SetMapBounds if { $centre } { # scroll new point to centre ScrollMapTo $x $y [expr $OVx+$MAPW2] [expr $OVy+$MAPH2] } return } proc MapBlink {tag state} { # make items with $tag blink on map # $state toggles between 1 and 0 global Map set on 0 foreach it [$Map find withtag $tag] { set on 1 if { $state } { $Map lower $it } else { $Map raise $it } } if { $on } { after 500 "MapBlink $tag [expr 1-$state]" } return } proc UnMapWP {ix} { # delete WP with index $ix from map # fails if WP belongs to a mapped RT global Map WPName MapWPMoving set it [$Map find withtag WP=$WPName($ix)] ; set ts [$Map gettags $it] if { [lsearch -glob $ts {inRT=*}] == -1 } { $Map delete forWP=$ix syforWP=$ix if { $MapWPMoving == $ix } { StopMapWPMoving } return 1 } return 0 } proc UnMapRT {ix} { # delete RT with index $ix from map global Map $Map delete forRT=$ix foreach it [$Map find withtag inRT=$ix] { $Map dtag $it inRT=$ix } return 1 } proc UnMapTR {ix} { # delete TR with index $ix from map global Map $Map delete forTR=$ix return 1 } proc UnMapLN {ix} { # delete LN with index $ix from map global Map $Map delete forLN=$ix return 1 } proc UnMapGR {ix} { # delete from map all items in GR with index $ix or in its subgroups # unmapping of some items may fail, but others will be unmapped global GRConts set r 1 set wps "" foreach p $GRConts($ix) { set wh [lindex $p 0] if { $wh != "WP" } { if { $wh == "LAP" } { continue } foreach e [lindex $p 1] { if { [set eix [IndexNamed $wh $e]]==-1 || ![UnMap $wh $eix] } { set r 0 } } } else { set wps [concat $wps [lindex $p 1]] } } foreach wp $wps { if { [set eix [IndexNamed WP $wp]]==-1 || ![UnMap WP $eix] } { set r 0 } } return $r } proc UnMap {wh ix args} { # delete item with index $ix and of type $wh (in $TYPES) from map # $args not used, but needed because of callback in menus # if possible global Map ${wh}Displ if { [set r [UnMap$wh $ix]] } { set [set wh]Displ($ix) 0 SetDisplShowWindow $wh $ix deselect } SetMapBounds return $r } ### moving a WP proc StartMapWPMoving {ix} { # WP with index $ix is to be placed elsewhere on map global MapWPMoving MESS WPName after 5 "BalloonCreate 0 [list =[format $MESS(movingWP) $WPName($ix)]]" set MapWPMoving $ix return } proc MapMoveWP {latd longd} { # place WP at a new position for $Datum global EdWindow GMEd MapWPMoving MapPFormat WPPosn WPPFrmt WPName WPDatum \ Datum MapPFDatum set ix $MapWPMoving StopMapWPMoving if { [winfo exists $EdWindow(WP)] && $GMEd(WP,Index) == $ix } { bell ; Raise $EdWindow(WP) return } set name $WPName($ix) foreach "posn frmt datum" \ [FormatPosition $latd $longd $Datum $MapPFormat $MapPFDatum DDD] { break } set WPPosn($ix) $posn ; set WPPFrmt($ix) $frmt set WPDatum($ix) $datum MoveOnMap WP $ix $name 0 $name ChangeWPInRTWindows $name $name 1 UpdateItemWindows WP $ix return } proc StopMapWPMoving {} { global MapWPMoving if { $MapWPMoving != -1 } { destroy .balloon } set MapWPMoving -1 return } ### updating item coordinates proc MoveOnMap {wh ix oldname diffname newname} { # change mapped item with index $ix # $wh in $TYPES # if $diffname is set $oldname is different from $newname global WPDispOpt Map WPName MapMakingRT MapRTCurrent MapEditingRS MapRTNext if { $wh != "WP" } { UnMap $wh $ix ; PutMap $wh $ix } else { # change WP set it [$Map find withtag WP=$oldname] set ts [$Map gettags $it] if { [set iz [lsearch -glob $ts {inRT=*}]] == -1 } { UnMap WP $ix ; PutMap $wh $ix return } $Map delete forWP=$ix syforWP=$ix PutMap WP $ix # add inRT=* tags while { 1 } { set t [lindex $ts $iz] regsub inRT= $t "" rx $Map addtag inRT=$rx withtag forWP=$ix set ts [lrange $ts [expr $iz+1] end] if { [set iz [lsearch -glob $ts {inRT=*}]] == -1 } { break } } set ni [$Map find withtag WP=$WPName($ix)] set x [$Map coords $ni] set y [lindex $x 1] ; set x [lindex $x 0] if { $MapMakingRT } { if { [lindex $MapRTCurrent 2]==$it } { set MapRTCurrent [list $x $y $ni] } if { $MapEditingRS && [lindex $MapRTNext 2]==$it } { set MapRTNext [list $x $y $ni] } } foreach lf [$Map find withtag from=$it] { $Map dtag $lf from=$it ; $Map addtag from=$ni withtag $lf set cs [lreplace [$Map coords $lf] 0 1 $x $y] eval $Map coords $lf $cs } foreach lt [$Map find withtag to=$it] { $Map dtag $lt to=$it ; $Map addtag to=$ni withtag $lt set cs [lreplace [$Map coords $lt] 2 3 $x $y] eval $Map coords $lt $cs } } return } ### updating WP symbol proc ChangeMapWPSymbol {ix symbol} { # change symbol of mapped WP if there is one global Map if { [set it [$Map find withtag syforWP=$ix]] != -1 } { foreach "x y" [$Map coords $it] { break } set ts [$Map gettags $it] $Map delete $it set syim [lindex [SymbolImageName $symbol] 0] $Map create image $x $y -anchor center -image $syim -tags $ts } return } ### saving and clearing mao proc SaveMap {fmt} { # save map in graphics file format # $fmt is either PS, or in $ImgOutFormats (if the Img library is loaded) global Map OVx OVy MapWidth MapHeight SaveCanvas $Map [list $OVx $OVy \ [expr $OVx+$MapWidth] [expr $OVy+$MapHeight]] $fmt file return } proc PrintMap {} { # print map to postscript printer global Map OVx OVy MapWidth MapHeight SaveCanvas $Map [list $OVx $OVy \ [expr $OVx+$MapWidth] [expr $OVy+$MapHeight]] PS printer return } proc ClearMap {} { # clear map after confirmation global MESS if { [GMConfirm $MESS(okclrmap)] } { DoClearMap } return } proc DoClearMap {} { # delete all map items even if being edited global MpW Map MapLoading MapScale MapScInitVal MapImageItems \ MapImageFile WConf XCoord YCoord MapZone \ EdWindow GMEd TYPES MapMakingRT if { $MapMakingRT } { MapCancelRT dontask close } # RTs (if they exist) must be dealt with first if { [set i [lsearch -exact $TYPES RT]] != -1 } { set types [linsert [lreplace $TYPES $i $i] 0 RT] } else { set types $TYPES } foreach wh $types { if { [winfo exists $EdWindow($wh)] } { set GMEd($wh,Displ) 0 set GMEd($wh,Data) [lreplace [set GMEd($wh,Data)] end end 0] $EdWindow($wh).fr.frdw.displayed deselect } global ${wh}Displ foreach n [array names ${wh}Displ] { set ${wh}Displ($n) 0 } } eval $Map delete [$Map find all] set MapImageItems "" ; catch { unset MapImageFile } SetMapBounds set MapLoading 0 StopMapWPMoving set XCoord "" ; set YCoord "" ; set MapZone "" $MpW.frm.frmap3.fr3.mn configure -state normal foreach b $WConf(mapdatum) { $b configure -state normal } MapScaleChange $MapScInitVal set MapScale [MapScaleFromDist $MapScInitVal] ChangeOnState mapstateback disabled return } ### menu for item on map proc MapCreateMenu {wh title} { # create menu on map for item of type $wh with a dummy entry # labelled $TXT($title) # return path of menu # SH contribution: no need for menubutton as in previous versions global Map TXT set mb $Map.m$wh destroy $mb menu $mb -tearoff 0 $mb add command -label $TXT($title) -state disabled $mb add separator return $mb } proc MapWPMenu {ix} { # create menubutton and menus to put, on map, items in relation to # mapped WP with given index, or for starting making a RT from it, or # for creating a new WP at given distance and bearing global Map TXT WPName LsW MAXMENUITEMS MapBounds DSCALE EdWindow \ GMEd UNIX set wp $WPName($ix) set mapitem [$Map find withtag WP=$wp] set cs [$Map coords $mapitem] set sx [expr [lindex $cs 0]+1] ; set sy [expr [lindex $cs 1]+1] # SH contribution: no need for menubutton as in previous versions set menu [MapCreateMenu WP withWP] if { [winfo exists $EdWindow(WP)] && $GMEd(WP,Index) == $ix } { set st disabled } else { set st normal } $menu add command -label $TXT(move) -state $st \ -command "StartMapWPMoving $ix" if { [winfo exists $EdWindow(RT)] } { set st disabled } else { set st normal } $menu add command -label $TXT(startRT) -state $st \ -command "MapMakeRT $ix $sx $sy" foreach f "displ clear" tg "d c" { set mn $menu.$tg $menu add cascade -label "$TXT($f) ..." -menu $mn menu $mn -tearoff 0 $mn add cascade -label "$TXT(within) ..." -menu $mn.within menu $mn.within -tearoff 0 foreach d "1 5 10 20 50 100 200 300 500" { $mn.within add command -label $d \ -command "MapWPsWithin $f [expr $d/$DSCALE] $ix" } $mn add cascade -label "$TXT(inrect) ..." -menu $mn.rect set mw $mn.rect menu $mw -tearoff 0 set n 0 ; set m 0 foreach it [$LsW.frlWP.frl.box get 0 end] { if { $wp != $it } { if { $n > $MAXMENUITEMS } { $mw add cascade -label "$TXT(more) ..." -menu $mw.m$m set mw $mw.m$m ; menu $mw -tearoff 0 set n 0 ; incr m } $mw add command -label $it -command "MapWPsInRect $f $ix $it" incr n } } $mn add cascade -label "$TXT(nameRT) ..." -menu $mn.rts menu $mn.rts -tearoff 0 $mn.rts add command -label $TXT(forthisWP) \ -command "MapRTsFor $ix $f" $mn.rts add command -label $TXT(formappedWPs) \ -command "MapRTsForMappedWPs $f" } $menu add command -label $TXT(newWPatdb) -command "CreateWPAtDistBear $ix" # SH contribution: no need for "close menu" entry in non-Unix systems if { $UNIX } { $menu add command -label $TXT(closemenu) -command "destroy $menu" } eval $menu post [winfo pointerxy .] return } proc MapRTMenu {ix x y} { # create menubutton for RT on map or being built on map ($ix==-1) global TXT OVx OVy MapEditingRS MapEditedRS MapRTLast Map CRHAIRx CRHAIRy \ UNIX set xx [expr $OVx+$x-$CRHAIRx] ; set yy [expr $OVy+$y-$CRHAIRy] foreach it [$Map find overlapping $xx $yy [expr $xx+10] [expr $yy+10]] { set ts [$Map gettags $it] if { [set i [lsearch -glob $ts forWP=*]] != -1 } { regsub forWP= [lindex $ts $i] "" wpix MapWPMenu $wpix return } } # SH contribution: no need for menubutton as in previous versions set menu [MapCreateMenu RT route] if { $MapEditingRS } { $menu add command -label $TXT(stop) -command MapFinishRTLastWP } else { $menu add cascade -label $TXT(stop) -menu $menu.mnf menu $menu.mnf -tearoff 0 # SH contribution: exchange roles of B-3 and Control-1 in # non-Unix systems if { $UNIX } { $menu.mnf add command -label $TXT(here) -accelerator "" \ -command "MapFinishRT $x $y" } else { $menu.mnf add command -label $TXT(here) -accelerator "" \ -command "MapFinishRT $x $y" } $menu.mnf add command -label $TXT(atprevwp) -command MapFinishRTLastWP } $menu add command -label $TXT(cancel) -accelerator "" \ -command "MapCancelRT ask close" if { $MapRTLast != 0 } { $menu add cascade -label $TXT(del) -menu $menu.mnd menu $menu.mnd -tearoff 0 $menu.mnd add command -label $TXT(prevwp) -accelerator "" \ -command "MapDelFromRT sel" if { $MapEditingRS && $MapEditedRS == 0 } { set st disabled } else { set st normal } $menu.mnd add command -label $TXT(firstwp) -state $st \ -command "MapDelFromRT 0" } if { $MapEditingRS } { if { $MapEditedRS != 0 } { $menu add command -label $TXT(chglstrs) \ -accelerator "" -command MapChangeRTLastRS } if { $MapEditedRS != $MapRTLast-1 } { $menu add command -label $TXT(chgnxtrs) \ -accelerator "" -command MapChangeRTNextRS } $menu add command -label $TXT(contnend) -command MapContRTEnd } elseif { $MapRTLast != 0 } { $menu add command -label $TXT(chglstrs) -accelerator "" \ -command MapChangeRTLastRS } # SH contribution: no need for "close menu" entry in non-Unix systems if { $UNIX } { $menu add command -label $TXT(closemenu) -command "destroy $menu" } eval $menu post [winfo pointerxy .] return } ### editing a RT proc MapEditRT {} { # start editing on map RT currently in the RT edit window # this is assumed to be launched from the RT edit window global Map GMEd RTDispl RTWPoints MapMakingRT MapRTLast MAPCOLOUR MESS if { $MapMakingRT } { bell ; return } if { [.gmRT.fr.fr3.fr31.frbx.bxn size] == 0 } { GMMessage $MESS(needs1wp) return } if { [set rtix $GMEd(RT,Index)] != -1 } { if { $RTDispl($rtix) } { UnMapRT $rtix } set wps $RTWPoints($rtix) } else { set wps [.gmRT.fr.fr3.fr31.frbx.box get 0 end] } if { [PutMapRTWPRS -1 $wps {} {mkRT mkRTedge} {}] == -1 } { return } set i -1 foreach nwp $wps { set wpix [IndexNamed WP $nwp] $Map addtag inRT=:$i withtag forWP=$wpix incr i } set MapMakingRT 1 ; set MapRTLast $i GMRouteMapEdit set it [$Map find withtag WP=$nwp] set cs [$Map coords $it] MapStartRTEdit $rtix [expr [lindex $cs 0]+1] [expr [lindex $cs 1]+1] $it return } proc MapMakeRT {wpix x y} { # start making and mapping a RT for a mapped WP global Map MapMakingRT MapRTLast EdWindow WPName if { $MapMakingRT } { bell ; return } if { [winfo exists $EdWindow(RT)] } { Raise $EdWindow(RT) ; bell ; return } set MapMakingRT 1 ; set MapRTLast 0 set n $WPName($wpix) set it [$Map find withtag WP=$n] $Map addtag inRT=:-1 withtag forWP=$wpix GMRoute -1 {create cancel} [FormData RT "WPoints Displ" [list [list $n] 1]] MapStartRTEdit -1 $x $y $it return } proc MapStartRTEdit {rtix x y wpit} { # prepare RT to be edited on map global Map MapRTCurrent MapRTLast MapRTNewWPs MapEditingRS MapEditedRS \ MAPCOLOUR DEFTRTWIDTH set MapEditingRS 0 ; set MapEditedRS -1 set MapRTCurrent [list $x $y $wpit] set MapRTNewWPs "" GMRouteSelect end foreach it [$Map find withtag mkRT] { foreach t [$Map gettags $it] { if { [regexp {^mkRT} $t] } { $Map dtag $it $t } } } $Map create line $x $y $x $y -fill $MAPCOLOUR(mkRT) -arrow first \ -smooth 0 -width $DEFTRTWIDTH \ -tags [list mkRT mkRTfrom mkRTfrline mkRTtrans] $Map create oval [expr $x-3] [expr $y-3] [expr $x+3] [expr $y+3] \ -fill $MAPCOLOUR(mkRT) \ -tags [list mkRT mkRTfrom mkRTcursor mkRTtrans] # all bindings of mkRTtrans tag are now set on the canvas return } proc MapFinishRTLastWP {} { # stop editing RT in the map global MapMakingRT TXT UNIX if { $MapMakingRT } { MapDestroyRT GMRouteMapEditEnd } if { ! $UNIX } { # SH contribution focus .gmRT } return } proc MapFinishRT {x y} { global MapMakingRT TXT UNIX if { $MapMakingRT } { MapAddToRT $x $y MapFinishRTLastWP } if { ! $UNIX } { # SH contribution focus .gmRT } return } proc MapAddToRT {x y} { global Map MapMakingRT MapRTCurrent MapRTLast MapRTNewWPs OVx OVy WPName \ CRHAIRx CRHAIRy MAPCOLOUR MapPFormat MapPFDatum CREATIONDATE \ Datum MapEditingRS MapRTNext MapEditedRS MapWPMoving GMEd \ DEFTRTWIDTH if { ! $MapMakingRT || $MapWPMoving != -1 } { return } set xx [expr $OVx+$x-$CRHAIRx] ; set yy [expr $OVy+$y-$CRHAIRx] set its [$Map find overlapping [expr $xx-3] [expr $yy-3] \ [expr $xx+3] [expr $yy+3]] set ix -1 foreach it $its { set ts [$Map gettags $it] if { [set i [lsearch -glob $ts {*forWP=*}]] != -1 } { set t [lindex $ts $i] regsub .*forWP= $t "" ix set name $WPName($ix) # cannot repeat last WP if { $name == [.gmRT.fr.fr3.fr31.frbx.box get end] } { bell ; return } break } } if { $ix == -1 } { # create new WP at $xx,$yy foreach "latd longd" [MapToPosn $xx $yy] { break } foreach "p pfmt datum" \ [FormatPosition $latd $longd $Datum $MapPFormat $MapPFDatum DDD] { break } set name [NewName WP] if { $CREATIONDATE } { set data [FormData WP "Name PFrmt Posn Datum Date" \ [list $name $pfmt $p $datum [Now]]] } else { set data [FormData WP "Name Commt PFrmt Posn Datum" \ [list $name [DateCommt [Now]] $pfmt $p $datum]] } set ix [CreateItem WP $data] PutMap WP $ix lappend MapRTNewWPs $name } set maprttag (mkRTedge||forRT=$GMEd(RT,Index)) if { $MapEditingRS } { # start and end points of the new stage set fromit [$Map find withtag WP=$name] set toit [lindex $MapRTNext 2] # change previous stage to end at $xx,$yy set oldst stno=$MapEditedRS set oldit [$Map find withtag $oldst&&$maprttag] set cs [$Map coords $oldit] $Map coords $oldit [lreplace $cs 2 3 $xx $yy] $Map itemconfigure $oldit -fill $MAPCOLOUR(mkRT) $Map dtag $oldit to=$toit ; $Map addtag to=$fromit withtag $oldit set stno [lindex $MapEditedRS 0] # renumber RT items after this RS set nxt [expr $MapEditedRS+1] for { set n $MapRTLast } { $n > $nxt } { set n $i } { set i [expr $n-1] foreach it [$Map find withtag (stno=$i)&&$maprttag] { $Map dtag $it stno=$i ; $Map addtag stno=$n withtag $it } foreach it [$Map find withtag inRT=:$i] { $Map dtag $it inRT=:$i ; $Map addtag inRT=:$n withtag $it } } # old end point of stage foreach it [$Map find withtag inRT=:$MapEditedRS] { $Map dtag $it inRT=:$MapEditedRS $Map addtag inRT=:$nxt withtag $it } $Map addtag inRT=:$MapEditedRS withtag forWP=$ix # create a new stage from the new point to the old end point set cs [$Map coords $fromit] set xx [expr [lindex $cs 0]+1] ; set yy [expr [lindex $cs 1]+1] set is [$Map create line $xx $yy \ [lindex $MapRTNext 0] [lindex $MapRTNext 1] \ -fill $MAPCOLOUR(mapsel) -arrow last -smooth 0 \ -width $DEFTRTWIDTH -tags [list \ mkRT mkRTedge from=$fromit to=$toit stno=$nxt line]] set MapEditedRS $nxt set sel $nxt set MapRTCurrent [list $xx $yy $fromit] $Map coords mkRTfrom $xx $yy $xx $yy } else { $Map addtag inRT=:$MapRTLast withtag forWP=$ix set toit [$Map find withtag WP=$name] set cs [$Map coords $toit] set xx [expr [lindex $cs 0]+1] ; set yy [expr [lindex $cs 1]+1] $Map coords mkRTfrom $xx $yy $xx $yy set oldit [lindex $MapRTCurrent 2] set is [$Map create line [lindex $MapRTCurrent 0] \ [lindex $MapRTCurrent 1] $xx $yy \ -fill $MAPCOLOUR(mkRT) -arrow last -smooth 0 \ -width $DEFTRTWIDTH -tags [list \ mkRT mkRTedge to=$toit from=$oldit stno=$MapRTLast line]] set MapRTCurrent [list $xx $yy $toit] set sel end } GMRTChange insa $name GMRouteSelect $sel incr MapRTLast .gmRT.fr.fr3.frbt.del configure -state normal return } proc MapDelFromRT {which} { # delete WP from RT being built on map but fail if there is # only one # $which is either 0 (for 1st WP) or "sel" (for previous one) # GMRTChange will call MapDelRT1st or MapDelRTPrevious on success global MapMakingRT MapRTLast if { $MapMakingRT } { if { $MapRTLast == 0 } { bell ; return } GMRTChange del $which } return } proc MapDelRT1st {delwp} { # update map by deleting first WP on RT under construction on map global Map MapRTLast MapRTNewWPs MapEditedRS MapEditingRS GMEd if { $MapEditingRS } { if { $MapEditedRS == 0 } { if { $MapRTLast == 1 } { MapContRTEnd } else { MapChangeRTNextRS } } else { incr MapEditedRS -1 } } set maprttag (mkRTedge||forRT=$GMEd(RT,index)) # zero or one items will have this tag foreach it [$Map find withtag (stno=0)&&$maprttag] { $Map delete $it } foreach it [$Map find withtag inRT=:-1] { $Map dtag $it inRT=:-1 } if { [set i [lsearch -exact $MapRTNewWPs $delwp]] != -1 && \ [lsearch -exact [.gmRT.fr.fr3.fr31.frbx.box get 0 end] $delwp] == \ -1 } { set MapRTNewWPs [lreplace $MapRTNewWPs $i $i] Forget WP [IndexNamed WP $delwp] } incr MapRTLast -1 # renumber items set i -1 while { $i < $MapRTLast } { set nxt [expr $i+1] foreach it [$Map find withtag (stno=$nxt)&&$maprttag] { $Map dtag $it stno=$nxt ; $Map addtag stno=$i withtag $it } foreach it [$Map find withtag inRT=:$nxt] { $Map dtag $it inRT=:$nxt ; $Map addtag inRT=:$i withtag $it } set i $nxt } return } proc MapDelRTPrevious {prevwp delwp} { # update map by deleting previous WP on RT under construction on map # $delwp is name of deleted WP # $prevwp is name of WP preceding $delwp global Map MapRTLast MapRTCurrent MapRTNewWPs MapEditingRS MapEditedRS \ MapRTNext GMEd MAPCOLOUR DEFTRTWIDTH set maprttag (mkRTedge||forRT=$GMEd(RT,index)) if { $MapEditingRS } { if { $MapEditedRS == 0 } { MapDelRT1st $delwp return } # zero or one items will have this tag foreach it [$Map find withtag (stno=$MapEditedRS)&&$maprttag] { $Map delete $it } incr MapEditedRS -1 set sel [set stno $MapEditedRS] } else { set stno [expr $MapRTLast-1] set sel end } incr MapRTLast -1 set cit [$Map find withtag WP=$prevwp] set cs [$Map coords $cit] set xx [expr [lindex $cs 0]+1] ; set yy [expr [lindex $cs 1]+1] $Map coords mkRTfrom $xx $yy $xx $yy set MapRTCurrent [list $xx $yy $cit] # zero or one items will have this tag foreach it [$Map find withtag (stno=$stno)&&$maprttag] { $Map delete $it } foreach it [$Map find withtag inRT=:$stno] { $Map dtag $it inRT=:$stno } if { [set i [lsearch -exact $MapRTNewWPs $delwp]] != -1 && \ [lsearch -exact [.gmRT.fr.fr3.fr31.frbx.box get 0 end] $delwp] == \ -1 } { set MapRTNewWPs [lreplace $MapRTNewWPs $i $i] Forget WP [IndexNamed WP $delwp] } # renumber items set i $stno while { $i < $MapRTLast } { set nxt [expr $i+1] foreach it [$Map find withtag (stno=$nxt)&&$maprttag] { $Map dtag $it stno=$nxt ; $Map addtag stno=$i withtag $it } foreach it [$Map find withtag inRT=:$nxt] { $Map dtag $it inRT=:$nxt ; $Map addtag inRT=:$i withtag $it } set i $nxt } if { $MapEditingRS } { GMRouteSelect $MapEditedRS # create RS set toit [lindex $MapRTNext 2] set is [$Map create line $xx $yy \ [lindex $MapRTNext 0] [lindex $MapRTNext 1] \ -fill $MAPCOLOUR(mapsel) -arrow last -smooth 0 \ -width $DEFTRTWIDTH -tags [list mkRT mkRTedge to=$toit \ from=$cit stno=$MapEditedRS line]] } else { GMRouteSelect $MapRTLast } return } proc MapCancelRT {ask close} { # cancel construction of RT on map # $ask is "ask" if cancellation must be confirmed when defining a new RT # $close is "close" if RT window must be closed global MapMakingRT MapRTNewWPs MESS TXT GMEd if { $MapMakingRT && \ ( $GMEd(RT,Index) != -1 || $ask != "ask" || \ [GMConfirm [format $MESS(askforget) $TXT(nameRT)]] ) } { MapDestroyRT foreach wp $MapRTNewWPs { Forget WP [IndexNamed WP $wp] } if { $close == "close" } { GMButton RT cancel } } return } proc MapDestroyRT {} { # destroy RT being made on map but display the original RT if it # was already there global Map MapMakingRT MapRTLast GMEd RTDispl set MapMakingRT 0 $Map delete mkRT while { $MapRTLast >= 0 } { incr MapRTLast -1 foreach it [$Map find withtag inRT=:$MapRTLast] { $Map dtag $it inRT=:$MapRTLast } } if { [set ix $GMEd(RT,Index)] != -1 && $RTDispl($ix) } { PutMapRT $ix } return } proc MapChangeRTLastRS {} { # open previous RS for editing when creating RT on map global MapMakingRT MapEditingRS MapEditedRS Map MapRTLast GMEd \ MAPCOLOUR if { ! $MapMakingRT } { return } set maprttag (mkRTedge||forRT=$GMEd(RT,index)) if { $MapEditingRS } { if { $MapEditedRS == 0 } { bell ; return } # restore stage being edited $Map itemconfigure (stno=$MapEditedRS)&&$maprttag -fill $MAPCOLOUR(mkRT) # open stage before this one set n [expr $MapEditedRS-1] } else { set n [expr $MapRTLast-1] } # RM contribution: must have the "mkRT" tag otherwise finds stages of # all routes on map # changed by MF: may have "forRT=$ix" instead if { [set is [$Map find withtag (stno=$n)&&$maprttag]] == {} } { bell ; return } set ts [$Map gettags $is] set tx [lsearch -glob $ts to=*] set fx [lsearch -glob $ts from=*] if { $tx == -1 || $fx == -1 } { BUG "bad tags on stage" } regsub to= [lindex $ts $tx] "" toit regsub from= [lindex $ts $fx] "" fromit MapOpenStage -1 $n $is $fromit $toit return } proc MapChangeRTNextRS {} { # open next RS for editing when creating RT on map global MapMakingRT MapEditingRS MapEditedRS Map MapRTLast GMEd \ MAPCOLOUR if { ! $MapMakingRT || ! $MapEditingRS } { return } if { $MapEditedRS == $MapRTLast-1 } { MapContRTEnd return } # restore stage being edited $Map itemconfigure stno=$MapEditedRS -fill $MAPCOLOUR(mkRT) # open stage after this one set n [expr $MapEditedRS+1] # RM contribution: must have the "mkRT" tag otherwise finds stages of # all routes on map # changed by MF: may have "forRT=$ix" instead set maprttag (mkRTedge||forRT=$GMEd(RT,index)) if { [set is [$Map find withtag (stno=$n)&&$maprttag]] == {} } { bell ; return } set ts [$Map gettags $is] set tx [lsearch -glob $ts to=*] set fx [lsearch -glob $ts from=*] if { $tx == -1 || $fx == -1 } { BUG "bad tags on stage" } regsub to= [lindex $ts $tx] "" toit regsub from= [lindex $ts $fx] "" fromit MapOpenStage -1 $n $is $fromit $toit return } proc MapContRTEnd {} { # finish editing RSs and continue at the end of RT being created on map global MapMakingRT MapEditingRS Map MapRTLast MapRTCurrent MapEditedRS \ GMEd MAPCOLOUR DEFTRTWIDTH if { ! $MapMakingRT || ! $MapEditingRS } { return } set maprttag (mkRTedge||forRT=$GMEd(RT,index)) $Map itemconfigure (stno=$MapEditedRS)&&$maprttag -fill $MAPCOLOUR(mkRT) set n [expr $MapRTLast-1] if { [set wpit [$Map find withtag sq2&&inRT=:$n]] == "" } { BUG "no item for WP at end" } set cs [$Map coords $wpit] set x [expr [lindex $cs 0]+1] ; set y [expr [lindex $cs 1]+1] set MapRTCurrent [list $x $y $wpit] set MapEditingRS 0 GMRouteSelect end $Map delete mkRTtrans $Map create line $x $y $x $y -fill $MAPCOLOUR(mkRT) -arrow first \ -smooth 0 -width $DEFTRTWIDTH \ -tags [list mkRT mkRTfrom mkRTfrline mkRTtrans] $Map create oval [expr $x-3] [expr $y-3] [expr $x+3] [expr $y+3] \ -fill $MAPCOLOUR(mkRT) \ -tags [list mkRT mkRTfrom mkRTcursor mkRTtrans] return } ## editing RT stage proc MapOpenStage {ix stno it fromit toit} { # open RT stage for editing on map # $ix is RT index, -1 if RT is being built on map # $stno is stage number (from 0) # $it is map item of line representing the stage # $fromit, $toit are the map items for the start and end WPs global MapMakingRT MapEditingRS Map MapRTCurrent MapRTNext MapEditedRS \ MAPCOLOUR DEFTRTWIDTH if { $ix != -1 } { GMMessage "not yet" ; return } if { ! $MapMakingRT } { return } set MapEditedRS $stno GMRouteSelect $stno $Map itemconfigure $it -fill $MAPCOLOUR(mapsel) set cs [$Map coords $fromit] set xx [expr [lindex $cs 0]+1] ; set yy [expr [lindex $cs 1]+1] set MapRTCurrent [list $xx $yy $fromit] set cs [$Map coords $toit] set xx [expr [lindex $cs 0]+1] ; set yy [expr [lindex $cs 1]+1] set MapRTNext [list $xx $yy $toit] $Map create line $xx $yy $xx $yy -fill $MAPCOLOUR(mkRT) \ -arrow first -smooth 0 -width $DEFTRTWIDTH \ -tags [list mkRT mkRTtoline mkRTtrans] set MapEditingRS 1 return } ### displaying or clearing sets of items proc MapWPsWithin {how d ix} { # map or clear all WPs with distance $d of WP with index $ix # $how in {displ, clear} # when clearing the given WP will not be cleared # slow operation dialog used if there are more than 100 WPs global WPName WPPosn WPDatum WPDispl EdWindow GMEd TXT set wpixs [array names WPName] if { [lindex $wpixs 100] != "" } { set slow 1 set sid [SlowOpWindow $TXT(displ)] } else { set slow 0 SetCursor . watch } if { [winfo exists $EdWindow(WP)] } { set edix $GMEd(WP,Index) } else { set edix -1 } set displ [string compare $how clear] set p1 $WPPosn($ix) ; set d1 $WPDatum($ix) SetDatumData $d1 foreach ix2 $wpixs { if { $slow && [SlowOpAborted] } { break } if { $ix2 != $ix && (($displ && ! $WPDispl($ix2)) || \ (! $displ && $WPDispl($ix2))) } { set p2 $WPPosn($ix2) ; set d2 $WPDatum($ix2) if { $d1 != $d2 } { set p2 [ToDatum [lindex $p2 0] [lindex $p2 1] $d2 $d1] } if { $d >= [lindex [ComputeDistFD $p1 $p2] 0] } { MapOrClear WP $displ $ix2 $edix } } } SetMapBounds if { $slow } { SlowOpFinish $sid "" } else { ResetCursor . } return } proc MapWPsInRect {how ix1 wp2} { # map or clear all WPs in the rectangle defined by the WPs with index $ix1 # and name $wp2 # $how in {displ, clear} # when clearing the WP with index $ix1 will not be cleared # slow operation dialog used if there are more than 100 WPs global WPName WPPosn WPDatum WPDispl EdWindow GMEd set wpixs [array names WPName] if { [lindex $wpixs 100] != "" } { set slow 1 set sid [SlowOpWindow $TXT(displ)] } else { set slow 0 SetCursor . watch } if { [winfo exists $EdWindow(WP)] } { set edix $GMEd(WP,Index) } else { set edix -1 } set displ [string compare $how clear] set p1 $WPPosn($ix1) ; set d1 $WPDatum($ix1) SetDatumData $d1 set ix2 [IndexNamed WP $wp2] set p2 $WPPosn($ix2) ; set d2 $WPDatum($ix2) if { $d1 != $d2 } { set p2 [ToDatum [lindex $p2 0] [lindex $p2 1] $d2 $d1] } set la1 [lindex $p1 0] ; set lo1 [lindex $p1 1] set la2 [lindex $p2 0] ; set lo2 [lindex $p2 1] if { $la1 >= $la2 } { set lamx $la1 ; set lamn $la2 } else { set lamx $la2 ; set lamn $la1 } if { $lo1 >= $lo2 } { set lomx $lo1 ; set lomn $lo2 } else { set lomx $lo2 ; set lomn $lo1 } foreach ixn $wpixs { if { $slow && [SlowOpAborted] } { break } if { $ixn != $ix1 && (($displ && ! $WPDispl($ixn)) || \ (! $displ && $WPDispl($ixn))) } { set pn $WPPosn($ixn) ; set dn $WPDatum($ixn) if { $d1 != $dn } { set pn [ToDatum [lindex $pn 0] [lindex $pn 1] $dn $d1] } set lan [lindex $pn 0] if { $lamx>=$lan && $lan>=$lamn } { set lon [lindex $pn 1] if { $lomx>=$lon && $lon>=$lomn } { MapOrClear WP $displ $ixn $edix } } } } SetMapBounds if { $slow } { SlowOpFinish $sid "" } else { ResetCursor . } return } proc MapRTsFor {ix how} { # map or clear all RTs that contain the WP with index $ix # $how in {displ, clear} global WPRoute RTDispl EdWindow GMEd set displ [string compare $how clear] if { [winfo exists $EdWindow(RT)] } { set edix $GMEd(RT,Index) } else { set edix -1 } foreach rt $WPRoute($ix) { MapOrClear RT $displ [IndexNamed RT $rt] $edix } return } proc MapRTsForMappedWPs {how} { # map or clear all RTs for all mapped WPs # $how in {displ, clear} global WPName WPDispl foreach ix [array names WPName] { if { $WPDispl($ix) } { MapRTsFor $ix $how } } return } proc MapOrClear {wh displ ix edix} { # map or clear an item of type $wh in {WP, RT} with index $ix # $displ is set if item is to be displayed # $edix is the index of item being edited global GMEd ${wh}Displ EdWindow if { $ix == $edix } { if { $displ } { if { ! $GMEd($wh,Displ) } { PutMap$wh $ix set $GMEd($wh,Displ) 1 ; set ${wh}Displ($ix) 1 $EdWindow($wh).fr.frdw.displayed select } } elseif { $GMEd($wh,Displ) && [UnMap$wh $ix] } { set GMEd($wh,Displ) 0 ; set ${wh}Displ($ix) 0 $EdWindow($wh).fr.frdw.displayed deselect } } elseif { $displ } { PutMap$wh $ix set ${wh}Displ($ix) 1 } elseif { [UnMap$wh $ix] } { set ${wh}Displ($ix) 0 } return } ##### background image ### geo-referencing an image proc MapLoadWPSelect {n} { # select WPs (existing or to be defined) for geo-referencing # $n is either ">=INT" or number of WPs needed # global variables set: # $MapLoadWPDefs is the maximum number of WPs that may be defined # (will be 0 at the end) # $MapLoadWPs is list with indices of WPs (-1 for those to be defined) # $MapLoadWPNs is list of names of WPs ("(?)" for those to be defined) # return number of points selected on success, -1 if operation cancelled global Number MapLoadWPDefs MapLoadWPs MapLoadWPNs MapLoading WPName \ TXT MESS set MapLoadWPs "" ; set MapLoadWPNs "" if { [regexp {^>=([1-9])$} $n x min] } { while 1 { if { $Number(WP) < $min } { set MapLoadWPDefs [expr $min-$Number(WP)] } else { set MapLoadWPDefs 0 } set wps [ChooseItems WP many_0 MapLoadWPDefs [list =$TXT(cwpsdef)]] if { $wps == -1 } { return -1 } if { ! [regexp {^ *(0|([1-9][0-9]*)) *$} $MapLoadWPDefs \ x MapLoadWPDefs] } { GMMessage [format $MESS(nan) $MapLoadWPDefs] continue } set n [expr $MapLoadWPDefs+[llength $wps]] if { $n >= $min } { break } GMMessage [format $MESS(needNpoints) 3] } if { ! [regexp {^([a-zA-Z0-9_]+)=} $MapLoading x how] } { BUG bad contents of MapLoading in proc MapLoadWPSelect return -1 } set MapLoading ${how}=$n set MapLoadWPs $wps foreach ix $wps { lappend MapLoadWPNs $WPName($ix) } } else { if { $Number(WP) < $n } { set missing [expr $n-$Number(WP)] } else { set missing 0 } set no [expr $n-$missing] set MapLoadWPDefs $missing while { $no > 0 } { set ds $MapLoadWPDefs for { set i [expr $MapLoadWPDefs+1] } { $i <= $n } { incr i } { lappend ds $i } set wps [ChooseItems WP many_0 MapLoadWPDefs \ [list +$TXT(cwpsdef)/$ds]] if { $wps == -1 } { return -1 } foreach ix $wps { set nn $WPName($ix) ; set d 0 foreach name $MapLoadWPNs { if { $name == $nn } { set d 1 ; break } } if { $d } { GMMessage [format $MESS(duplicate) $nn] } else { lappend MapLoadWPs $ix ; lappend MapLoadWPNs $nn incr no -1 ; incr n -1 if { $no == 0 } { break } } } if { $MapLoadWPDefs >= $n } { set MapLoadWPDefs $n ; break } } } # number of WPs to be defined later while { $MapLoadWPDefs > 0 } { lappend MapLoadWPs -1 ; lappend MapLoadWPNs "(?)" incr MapLoadWPDefs -1 } return $n } proc LoadMapBack {args} { # load map background # if $args=="" load either an image to be geo-ref'd, or information on # an image and geo-referencing information # otherwise $args is list with name of a background definition and # menu (not used) global Map File MESS if { [$Map find all] != "" && ! [GMConfirm $MESS(clrcurrmap)] } { return } if { $args == "" } { set r [LoadMapFixedBk ""] switch -- [lindex $r 0] { 0 { LoadMapBackImage $File(MapBkInfo) } 1 { eval LoadMapBackGeoRef [lreplace $r 0 0] } } } elseif { [set fn [GetDefFields backgrnd [lindex $args 0] file]] == "" } { BUG backgrnd definition with empty file } else { set r [LoadMapFixedBk $fn] if { [lindex $r 0] == 1 } { eval LoadMapBackGeoRef [lreplace $r 0 0] } } return } proc BadImage {im filename} { # create image SetCursor . watch catch { image delete $im } set r [catch {image create photo $im -file $filename}] ResetCursor . return $r } proc MapCreateOriginImage {path} { # create map background image at origin # clear the map, disable scale and datum, and set image parameters global MpW Map MapImageFile MapImageHeight MapImageWidth MapImageItems \ MapImageGrid MAPW2 MAPH2 WConf DoClearMap $MpW.frm.frmap3.fr3.mn configure -state disabled $MpW.frm.frmap3.fr3.cv.val configure -text ? foreach b $WConf(mapdatum) { $b configure -state disabled } set MapImageFile(0,0) $path set MapImageHeight [image height MapImage] set MapImageWidth [image width MapImage] set MapImageItems [$Map create image 0 0 -image MapImage \ -anchor nw -tags [list map mapimage forIm=0,0]] SetMapBounds # scroll image to centre it ScrollMapTo [expr $MapImageWidth/2.0] [expr $MapImageHeight/2.0] \ $MAPW2 $MAPH2 set MapImageGrid(dxmin) -1 ; set MapImageGrid(dymin) -1 set MapImageGrid(dxn) 3 ; set MapImageGrid(dyn) 3 return } proc LoadMapParams {datum pdata tdata pformt pfdatum scale} { # load map parameters # $pdata, $tdata describe projection and transformation and are pairs # with name and list of pairs with parameter name and value # assume map is empty global MpW Map MPData MTData MapScale MapProjection MapProjTitle \ MapTransf MAPPROJDATA MAPPARTPDATA MAPPARTPROJ MAPPROJAUX set MapScale $scale catch {unset MPData} ; catch {unset MTData} MapProjectionIs [lindex $pdata 0] set MPData(datum) $datum if { [catch {set mp $MAPPARTPROJ($MapProjection)}] } { set mp $MapProjection foreach p [lindex $pdata 1] { set MPData([lindex $p 0]) [lindex $p 1] } if { $MapProjection == "UTM" } { regexp {^([0-9]+)[ ]*([A-Z])$} $MPData(UTMzone) x ze zn set MPData(UTMzone) [list $ze $zn] } } else { foreach e $MAPPROJDATA($mp) v $MAPPARTPDATA($MapProjection) { set MPData($e) $v } if { [lsearch -exact $MAPPROJAUX $mp] != -1 } { Proj${mp}ComputeAux MPData $datum } } ChangeMapDatum $datum # do not reorder this: ChangeMapPFormat $pformt ; ChangeMPFDatum $pfdatum MapTransfIs [lindex $tdata 0] foreach p [lindex $tdata 1] { set MTData([lindex $p 0]) [lindex $p 1] } regsub {\.00 } [MapScaleToShow $scale] " " txt $MpW.frm.frmap3.fr3.cv.val configure -text $txt return } proc LoadMapBackGeoRef {path datum pdata tdata scale ixps csps} { # load geo-referenced map background image # $pdata, $tdata describe projection and transformation and are pairs # with name and list of pairs with parameter name and value # $ixps: list of image grid coordinates and path for subsidiary images in # grid # $csps: list of image canvas coordinates (NW) and path for subsidiary # images not in grid global Map MapImageFile MapImageItems MapImageHeight MapImageWidth \ MapImageGrid MapImageNGrid MapImageNGCs MapEmpty MapPFormat MESS \ MapImageNGW MapImageNGH MapPFDatum foreach ixp $ixps { set p [lindex $ixp 2] if { [BadImage MapImage[lindex $ixp 0],[lindex $ixp 1] $p] } { GMMessage "$MESS(badimage): $p" return } } set MapImageNGrid 0 foreach csp $csps { set p [lindex $csp 2] if { [BadImage MapImage$MapImageNGrid $p] } { GMMessage "$MESS(badimage): $p" return } incr MapImageNGrid } if { [BadImage MapImage $path] } { GMMessage "$MESS(badimage): $path" return } MapCreateOriginImage $path set dxmin 0 ; set dxmax 0 ; set dymin 0 ; set dymax 0 foreach ixp $ixps { foreach "dx dy p" $ixp {} set MapImageFile($dx,$dy) $p set x [expr $MapImageWidth*$dx] ; set y [expr $MapImageHeight*$dy] set it [$Map create image $x $y \ -image "MapImage$dx,$dy" -anchor nw \ -tags [list map mapimage forIm=$dx,$dy]] $Map lower $it lappend MapImageItems $it if { $dx > $dxmax } { set dxmax $dx } if { $dy > $dymax } { set dymax $dy } if { $dx < $dxmin } { set dxmin $dx } if { $dy < $dymin } { set dymin $dy } } set MapImageGrid(dxmin) [expr $dxmin-1] set MapImageGrid(dymin) [expr $dymin-1] set MapImageGrid(dxn) [expr $dxmax+3-$dxmin] set MapImageGrid(dyn) [expr $dymax+3-$dymin] set ni 0 foreach csp $csps { foreach "x y p" $csp {} set MapImageFile($ni) $p ; set MapImageNGCs($ni) $x,$y set MapImageNGW($ni) [image width MapImage$ni] set MapImageNGH($ni) [image height MapImage$ni] set it [$Map create image $x $y -image MapImage$ni -anchor nw \ -tags [list map mapimage forIm=$ni]] $Map lower $it lappend MapImageItems $it incr ni } SetMapBounds LoadMapParams $datum $pdata $tdata $MapPFormat $MapPFDatum $scale set MapEmpty 0 ChangeOnState mapstateback normal return } proc LoadMapBackImage {filename} { # load map background image to be geo-referenced, from file under $filename global MpW MapLoading MapScale MapLdOldScale MapScInitVal EdWindow \ MAPKNOWNTRANSFS MAPTRANSFNPTS CDPData MPData LSqsTransf MESS TXT TYPES # select transformation set ts "" ; set rs "" ; set rlsq "" ; set rlsqf "" foreach t $MAPKNOWNTRANSFS { lappend ts $TXT(TRNSF$t) ; lappend rs $t lappend rlsq lsq=$t ; lappend rlsqf lsqf=$t } lappend ts "@[linsert $ts 0 $TXT(lstsqs)]" \ "@[linsert $ts 0 $TXT(lstsqsfile)]" $TXT(tfwfile) \ $TXT(ozimapfile) $TXT(cancel) lappend rs $rlsq $rlsqf TFW OziMap 0 switch -glob -- [set how [GMSelect $MESS(georefhow) $ts $rs]] { 0 { return } lsq=* { if { ! [regexp {lsq=(.+)$} $how x LSqsTransf] } { BUG LoadMapBackImage regexp lsq= failed } set how LeastSquares } lsqf=* { if { ! [regexp {lsqf=(.+)$} $how x LSqsTransf] } { BUG LoadMapBackImage regexp lsqf= failed } set how LeastSquaresFile } } # load and check image if { [BadImage MapImage $filename] } { GMMessage $MESS(badimage) return } MapCreateOriginImage [file join [pwd] $filename] # save scale set s [$MpW.frm.frmap3.fr3.cv.val cget -text] if { [scan $s %d MapLdOldScale] != 1 } { set MapLdOldScale $MapScInitVal } switch $how { LeastSquaresFile - OziMap - TFW { ReadApplyTransfData $how $filename } default { # disable display of items being edited foreach wh $TYPES { if { [winfo exists $EdWindow($wh)] } { $EdWindow($wh).fr.frdw.displayed configure -state disabled } } # find number of control waypoints needed set n $MAPTRANSFNPTS($how) set MapLoading ${how}=$n # dialog to select/define waypoints and supervise their placement MapLoadBkDial $how $n } } return } proc ReadApplyTransfData {fmt filename} { # load or import transformation data from file and set up projection and # transformation # $fmt in {LeastSquaresFile, OziMap, TFW} # reading procs must return 0 on error or a list whose head is a list of # latd,longd,datum to be projected (possibly empty); the whole list is # passed as a parameter to the transformation initialization proc # initializion procs return 0 on error, or may return a list of WP # names to be displayed (but see below!) global MPData MTData CDPData MESS MapScale MapLoading set MapLoading importing if { $fmt == "LeastSquaresFile" } { set indata [LoadLeastSquaresInfo] set fmt LeastSquares } else { set indata [Import$fmt $filename] } if { $indata != 0 } { set ps [lindex $indata 0] if { [set proj [ChooseDatumProjection $ps]] == 0 } { set indata 0 } } if { $indata == 0 } { MapLoadBkCancel return } catch {unset MPData} ; catch {unset MTData} array set MPData [array get CDPData] if { [set res [MapInit${fmt}Transf $indata $CDPData(main_proj)]] == 0 } { GMMessage $MESS(badTransfargs) MapLoadBkCancel return } MapProjectionIs $proj ChangeMapDatum $CDPData(datum) MapScaleChange $MapScale set MapLoading 0 MapLoadBkDialDone # display WPs if needs be if { $fmt == "LeastSquares" } { foreach name $res { PutMap WP [IndexNamed WP $name] } } return } proc MapLoadBkDial {how n} { # dialog used during map background loading # $how in $MAPKNOWNTRANSFS or LeastSquares # $n is either ">=INT", or number of WPs used for geo-referencing # this dialog is changed by proc DefineCtrlPoint global WPName MapLoadWPs MapLoadWPNs LISTWIDTH TXT MESS COLOUR EPOSX EPOSY if { [set n [MapLoadWPSelect $n]] == -1 } { MapLoadBkCancel return } destroy .wmapload # used elsewhere set w .wmapload GMToplevel $w mapload +[expr $EPOSX+100]+$EPOSY {} \ {WM_DELETE_WINDOW MapLoadBkCancel} {} frame $w.fr -borderwidth 5 -bg $COLOUR(messbg) label $w.fr.title -text $TXT(mapload) -relief sunken message $w.fr.text -aspect 800 -text $MESS(mapadjust) frame $w.fr.frbx listbox $w.fr.frbx.bx -width $LISTWIDTH -relief flat \ -selectmode single -exportselection 1 bind $w.fr.frbx.bx "$w.fr.frbx.bx selection clear 0 end" if { $n < 8 } { $w.fr.frbx.bx configure -height $n pack $w.fr.frbx.bx } else { $w.fr.frbx.bx configure -height 8 \ -yscrollcommand "$w.fr.frbx.bscr set" scrollbar $w.fr.frbx.bscr -command "$w.fr.frbx.bx yview" grid $w.fr.frbx.bx $w.fr.frbx.bscr -sticky ns } frame $w.fr.bns button $w.fr.bns.ok -text $TXT(ok) -command MapLoadBkDialDone \ -state disabled button $w.fr.bns.cnc -text $TXT(cancel) -command MapLoadBkCancel pack $w.fr -side top pack $w.fr.bns.ok $w.fr.bns.cnc -side left pack $w.fr.title $w.fr.text $w.fr.frbx $w.fr.bns -side top -pady 5 if { $how == "NoRot" } { # show WPs in the order they were selected set ix end } else { # show in reverse order because in these cases WPs will be taken # from right to left of $MapLoadWPs by the cursor procedures set ix 0 } foreach name $MapLoadWPNs { $w.fr.frbx.bx insert $ix $name } raise $w update idletasks if { $how == "NoRot" } { MapComputePositions } # control will be assumed by MapCursor, MarkMapPoint and MapLoadBkDialDone return } proc MapLoadRestore {} { # restore interface state after success or failure of map loading global MapLoading MapLoadPos EdWindow TYPES foreach wh $TYPES { if { [winfo exists $EdWindow($wh)] } { $EdWindow($wh).fr.frdw.displayed configure -state normal } } set MapLoading 0 destroy .wmapload catch {unset MapLoadPos} return } proc MapLoadBkDialDone {} { # successful end of map background loading dialog global Map MapLoading MapScale MapLoadWPs MapLoadPos MapEmpty EdWindow \ WPDispl GMEd MESS MPData MTData MapImageNGrid if { $MapLoading != 0 } { catch {unset MTData} set remap 0 switch -glob $MapLoading { Affine* { regexp {(Affine[a-zA-Z_]*)=} $MapLoading x tr if { ! [MapInit${tr}Transf] } { GMMessage $MESS(cantsolve) MapLoadBkCancel return } } LeastSquares=* { if { [MapInitLeastSquaresTransf] == 0 } { GMMessage $MESS(cantsolve) MapLoadBkCancel return } # must re-map all control points incr remap } NoRot=* { MapInitNoRotTransf $MapScale $MapLoadPos(xt0) \ $MapLoadPos(yt0) $MapLoadPos(origin,x) \ $MapLoadPos(origin,y) } } MapScaleChange $MapScale MapLoadRestore $Map delete mapadjust set MapEmpty 0 foreach wpix $MapLoadWPs { if { $remap } { UnMapWP $wpix ; PutMapWP $wpix } set WPDispl($wpix) 1 if { [winfo exists $EdWindow(WP)] && $GMEd(WP,Index) == $wpix } { set GMEd(WP,Displ) 1 set GMEd(WP,Data) [lreplace $GMEd(WP,Data) end end 1] $EdWindow(WP).fr.frdw.displayed select } else { SetDisplShowWindow WP $wpix select } } } set MapEmpty 0 set MapImageNGrid 0 ChangeOnState mapstateback normal return } proc MapLoadBkCancel {} { # cancel loading a map background image global MpW Map MapLoading MapLdOldScale MapImageItems MapEmpty Dfctrl if { [winfo exists .wmapload.frd] } { set Dfctrl 0 return } eval $Map delete [$Map find all] set MapEmpty 1 set MapImageItems "" MapMeasureEnd SetMapBounds if { $MapLoading != 0 } { MapLoadRestore # now $MapLoading is 0 $MpW.frm.frmap3.fr3.mn configure -state normal MapScaleChange $MapLdOldScale } return } proc DefineCtrlPoint {w mpix lbox cancel} { # change map loading dialog to define a control waypoint # $w is parent of frame that will be created and destroyed for # entering the information # $mpix is index of control waypoint in $MapLoadWPs and $MapLoadWPNs # which will be updated with WP index and name on success # $lbox is either "", or listbox in which names of defined waypoints # must be replaced at index $mpix # $cancel is true if Cancel button must be created # binding: Return for create # return WP index, or -1 on failure global PositionFormat TXT MESS NAMEWIDTH Datum CPDatum CPChangedPosn \ CREATIONDATE Dfctrl COLOUR MapLoadWPs MapLoadWPNs DefCPWindow \ INVTXT # used in ancillary procs set DefCPWindow $w destroy $w.frd set Dfctrl 0 set CPChangedPosn 1 ; set CPDatum $Datum frame $w.frd -relief flat -borderwidth 2 -bg $COLOUR(dialbg) label $w.frd.ntitle -text "$TXT(name):" entry $w.frd.id -width $NAMEWIDTH -exportselection 1 ShowTEdit $w.frd.id "" 1 ShowPosnDatum $w.frd $PositionFormat [list ""] DefCPChangeDatum CPDatum \ CPDatum normal 1 CPChangedPosn frame $w.frd.frb -relief flat -borderwidth 0 button $w.frd.frb.ct -text $TXT(create) \ -command "$w.frd.frb.ct configure -state normal ; set Dfctrl 1" button $w.frd.frb.cnc -text $TXT(cancel) \ -command "$w.frd.frb.cnc configure -state normal ; set Dfctrl 0" grid configure $w.frd.ntitle -column 0 -row 0 -sticky w grid configure $w.frd.id -column 1 -row 0 -sticky w grid configure $w.frd.frp -column 0 -row 1 -columnspan 2 -pady 3 grid configure $w.frd.frd -column 0 -row 2 -columnspan 2 grid configure $w.frd.frb.ct -column 0 -row 0 if { $cancel } { grid configure $w.frd.frb.cnc -column 1 -row 0 } grid configure $w.frd.frb -column 0 -row 3 -columnspan 2 -pady 5 pack $w.frd -side top -pady 5 update idletasks set pw [grab current] grab $w bind $w { set Dfctrl 1 ; break } raise $w focus $w.frd.id while 1 { tkwait variable Dfctrl if { $Dfctrl } { set p [PosnGetCheck $w.frd.frp.frp1 $CPDatum GMMessage \ CPChangedPosn] if { $p == "nil" } { bell ; continue } if { [string trim [$w.frd.id get]] == "" } { set name [NewName WP] } else { set name [CheckEntries GMMessage "" \ [list [list $w.frd.id CheckName]]] if { $name == "" } { continue } if { [CheckArrayElement WPName $name] } { GMMessage $MESS(idinuse) continue } } set pf $INVTXT([$w.frd.frp.pfmt cget -text]) if { $CREATIONDATE } { set data [FormData WP \ [list Name Posn PFrmt Datum Date Symbol] \ [list $name $p $pf $CPDatum [Now] mark_x]] } else { set data [FormData WP [list Name Posn PFrmt Datum Symbol] \ [list $name $p $pf $CPDatum mark_x]] } set ix [CreateItem WP $data] set MapLoadWPs [lreplace $MapLoadWPs $mpix $mpix $ix] set MapLoadWPNs [lreplace $MapLoadWPNs $mpix $mpix $name] if { $lbox != "" } { $lbox delete $mpix ; $lbox insert $mpix $name } break } else { set ix -1 ; break } } grab release $w foreach pg $pw { if { [winfo exists $pg] } { grab $pg } } pack forget $w.frd destroy $w.frd return $ix } proc DefCPChangeDatum {datum args} { # change datum of control WP being defined # $args is not used but is needed as this is called-back from a menu global DefCPWindow ChangeDatum $datum CPDatum CPDatum CPChangedPosn $DefCPWindow.frd.frp return } proc MapGeoRefPoints {n} { # in command line mode just return the projected coordinates given # by proc CmdProjCoords # in graphical mode compute planar Cartesian coordinates of $n WPs # for geo-referencing and initialize projection procedure # $MapLoadWPs is list of indices of relevant WPs # assume that .wmapload is being used # return list of coordinates, or -1 on cancel global Datum MapLoadWPs WPPosn WPDatum MapProjInitProc MapProjPointProc \ MapProjection MPData Datum CMDLINE if { $CMDLINE } { return [CmdProjCoords $n] } for { set i 0 ; set ps "" } { $i < $n } { incr i } { if { [set ix [lindex $MapLoadWPs $i]] == -1 && \ [set ix [DefineCtrlPoint .wmapload $i \ .wmapload.fr.frbx.bx 0]] == -1 } { MapLoadBkCancel return -1 } set p $WPPosn($ix) set latd [lindex $p 0] ; set longd [lindex $p 1] if { [set datum $WPDatum($ix)] != $Datum } { set p [ToDatum $latd $longd $datum $Datum] set latd [lindex $p 0] ; set longd [lindex $p 1] } lappend ps [list $latd $longd $Datum] } catch {unset MPData} $MapProjInitProc $MapProjection MPData $Datum $ps set xys "" foreach p $ps { lappend xys [eval $MapProjPointProc MPData $p] } return $xys } proc MapComputePositions {} { # compute lines from 1st to 2nd and 1st to 3rd selected WPs # when loading a map background image with no rotation # set MapLoadPos(xt0),MapLoadPos(yt0) to terrain coords of 1st WP global MapLoadPos MapWidth MapHeight if { [set tcs [MapGeoRefPoints 3]] == -1 } { return } set p0 [lindex $tcs 0] set MapLoadPos(xt0) [set xt0 [lindex $p0 0]] set MapLoadPos(yt0) [set yt0 [lindex $p0 1]] set mx $MapWidth if { $MapHeight > $MapWidth } { set mx $MapHeight } incr mx 10000 # start with 3rd WP, then 2nd foreach a "2 1" { set p [lindex $tcs $a] set xta [lindex $p 0] ; set yta [lindex $p 1] # difference in projected coordinates from first point set MapLoadPos(dmx,$a) [set dx [expr $xta-$xt0]] set MapLoadPos(dmy,$a) [set dy [expr $yta-$yt0]] # $dx/$l is cos of angle of line from 1st point to point and x-axis # $dy/$l is sin of same angle # distance from point to first point set l [expr sqrt(1.0*$dx*$dx+1.0*$dy*$dy)] # difference in canvas coordinates between point and a point on the # line from first point but at distance $mx (out of canvas) set MapLoadPos(dx,$a) [set dxc [expr $mx/$l*$dx]] set MapLoadPos(dy,$a) [set dyc [expr -$mx/$l*$dy]] # position of line from (100,100) to out of canvas, parallel to # line from 1st point to point set MapLoadPos(pos,$a) [list 100 100 [expr 100+$dxc] [expr 100+$dyc]] } # for 2nd WP, using $dx,$dy and $l computed above # axis along which difference in coordinates is larger if { abs($dx) >= abs($dy) } { set MapLoadPos(dir) x } else { set MapLoadPos(dir) y } set MapLoadPos(dist) $l return } proc ClearMapBack {} { # clear map background images global MpW Map MapImageItems MapImageFile MESS if { [GMConfirm $MESS(okclrbkmap)] } { $Map delete mapimage set MapImageItems "" ; catch {unset MapImageFile} $MpW.frm.frmap3.fr3.mn configure -state normal ChangeOnState mapstateback disabled return 1 } return 0 } proc SaveMapBack {args} { # save map background image information # in graphical mode # $args is either "" or file # in command line mode # $args is list with path to image file and file to write on global Map MapImageFile MapScale MapProjection MPData MapTransf MTData \ MAPPARTPROJ MAPPROJDATA MAPTRANSFDATA MapImageNGCs CMDLINE if { $CMDLINE } { set MapImageFile(0,0) [lindex $args 0] set args [lindex $args 1] } elseif { [$Map find withtag mapimage] == "" } { return } set pd $MapProjection if { [catch {set MAPPARTPROJ($MapProjection)}] } { foreach e $MAPPROJDATA($MapProjection) { lappend pd "$e=$MPData($e)" } } set pt $MapTransf foreach e $MAPTRANSFDATA($MapTransf) { lappend pt "$e=$MTData($e)" } set lg "" ; set lc "" foreach n [array names MapImageFile] { if { [string first "," $n] != -1 } { # image in grid if { $n != "0,0" } { lappend lg [list $n $MapImageFile($n)] } } else { lappend lc [list $MapImageNGCs($n) $MapImageFile($n)] } } SaveFileTo $args mapback MapBkInfo $MapImageFile(0,0) $pd $pt $MapScale \ $lg $lc return } proc ExportMapTFW {} { # export parameters of the transformation used for map background image # as a TFW file global Map if { [$Map find withtag mapimage] == "" } { return } ExportTFW [MapAffineParams] return } proc SaveMapParams {args} { # save map projection, transformation, position format of coordinates # and scale when there is no background image # $args is either "" or file global Map MapScale MapProjection MPData MapTransf MTData MapPFormat \ MAPPARTPROJ MAPPROJDATA MAPTRANSFDATA MapPFDatum if { [$Map find withtag mapimage] != "" } { return } set pd $MapProjection if { [catch {set MAPPARTPROJ($MapProjection)}] } { foreach e $MAPPROJDATA($MapProjection) { lappend pd "$e=$MPData($e)" } } set pt $MapTransf foreach e $MAPTRANSFDATA($MapTransf) { lappend pt "$e=$MTData($e)" } SaveFileTo $args mapinfo MapInfo $pd $pt $MapPFormat $MapPFDatum $MapScale return } proc ChangeMapBack {} { # dialog used to change map background images # this dialog may be changed by proc DefineCtrlPoint global MapImageGrid MapImageFile TXT EPOSX EPOSY COLOUR MAPCOLOUR \ MapBackNGSelect MapBackNGIxs MapBackCellW MapBackCellH \ FixedFont # name .wchgmapbak used explicitly below set w .wchgmapbak if { [winfo exists $w] } { Raise $w ; return } GMToplevel $w mpbkchg +$EPOSX+$EPOSY {} \ [list WM_DELETE_WINDOW "destroy $w"] {} set MapBackNGSelect "" # width and height of grid cell set MapBackCellW 43 ; set MapBackCellH 21 frame $w.fr -borderwidth 5 -bg $COLOUR(messbg) label $w.fr.title -text $TXT(mpbkchg) -relief sunken frame $w.fr.frg -relief flat -borderwidth 0 frame $w.fr.frng -relief flat -borderwidth 0 ## images in a grid set rw $MapBackCellW ; set rh $MapBackCellH set wd [expr 3*$rw] ; set hg [expr 3*$rh] set cv $w.fr.frg.grid canvas $cv -width $wd -height $hg -relief sunken \ -xscrollincrement $rw -yscrollincrement $rh # make central 3x3 grid: grid canvas 0,0 is upper left corner of -1,-1 slot for { set dx -1 } { $dx < 2 } { incr dx } { MapColumnBackGrid $cv $dx -1 3 } # extend grid if needs be foreach d "x y" h "Column Row" \ omin "-1 $MapImageGrid(dxmin)" on "3 $MapImageGrid(dxn)" { if { [set d0 $MapImageGrid(d${d}min)] < -1 } { for { set dd $d0 } { $dd < -1 } { incr dd } { Map${h}BackGrid $cv $dd $omin $on set bb [$cv bbox all] set x0 [lindex $bb 0] ; set y0 [lindex $bb 1] set x1 [lindex $bb 2] ; set y1 [lindex $bb 3] $cv configure -width [expr $x1-$x0] -height [expr $y1-$y0] $cv ${d}view scroll -1 units } } if { [set df [expr $d0+$MapImageGrid(d${d}n)]] > 1 } { for { set dd 2 } { $dd < $df } { incr dd } { Map${h}BackGrid $cv $dd $omin $on set bb [$cv bbox all] set x0 [lindex $bb 0] ; set y0 [lindex $bb 1] set x1 [lindex $bb 2] ; set y1 [lindex $bb 3] $cv configure -width [expr $x1-$x0] -height [expr $y1-$y0] } } } foreach ixs [array names MapImageFile] { $cv itemconfigure forIm=$ixs -fill $MAPCOLOUR(fullgrid) } $cv itemconfigure forIm=0,0 -width 4 -outline $MAPCOLOUR(mapsel) set it [$cv create text [expr 1.5*$rw] [expr 1.5*$rh] -anchor center \ -text + -justify center] $cv bind $it "MapBackGridEnter 0 0" $cv bind $it "MapBackGridLeave 0 0" $cv bind $it "MapBackGridSelect 0 0" frame $w.fr.frg.cs label $w.fr.frg.cs.tit -text $TXT(mpbkgrcs): label $w.fr.frg.cs.cs -text 0,0 frame $w.fr.frg.pt label $w.fr.frg.pt.tit -text $TXT(file): label $w.fr.frg.pt.pt -text $MapImageFile(0,0) -width 50 frame $w.fr.frg.bns button $w.fr.frg.bns.ld -text $TXT(load) \ -command "MapBackGridLoad ; \ $w.fr.frg.bns.ld configure -state normal" button $w.fr.frg.bns.clr -text $TXT(clear) -state disabled \ -command "MapBackGridClear ; \ $w.fr.frg.bns.clr configure -state normal" ## images out of grid listbox $w.fr.frng.bx -width 50 -height 8 -relief flat -exportselection 1 \ -yscrollcommand "$w.fr.frng.bscr set" \ -selectmode single -font $FixedFont bind $w.fr.frng.bx { MapBackBoxSetSelect [%W nearest %y] } bind $w.fr.frng.bx { MapBackBoxShow } bind $w.fr.frng.bx { .wchgmapbak.fr.frg.grid delete nongrid } set MapBackNGIxs "" foreach n [lsort [array names MapImageFile]] { if { [string first "," $n] == -1 } { $w.fr.frng.bx insert end $MapImageFile($n) lappend MapBackNGIxs $n } } scrollbar $w.fr.frng.bscr -command "$w.fr.frng.bx yview" frame $w.fr.frng.bns button $w.fr.frng.bns.ld -text $TXT(load) \ -command "MapBackNGridLoad ; \ $w.fr.frng.bns.ld configure -state normal" button $w.fr.frng.bns.clr -text $TXT(clear) -state disabled \ -command "MapBackNGridClear ; \ $w.fr.frng.bns.clr configure -state normal" # frame for defining control waypoint (used by proc DefineCtrlPoint) frame $w.fr.frng.df frame $w.fr.bns button $w.fr.bns.clrall -text $TXT(clearall) -command { if { [ClearMapBack] } { destroy .wchgmapbak } else { .wchgmapbak.fr.bns.clrall configure -state normal } } button $w.fr.bns.ok -text $TXT(ok) -command "destroy $w" pack $w.fr.frg.cs.tit $w.fr.frg.cs.cs -side left pack $w.fr.frg.pt.tit $w.fr.frg.pt.pt -side left pack $w.fr.frg.bns.ld $w.fr.frg.bns.clr -side left pack $w.fr.frg.grid $w.fr.frg.cs $w.fr.frg.pt $w.fr.frg.bns -side top \ -pady 5 pack $w.fr.frng.bns.ld $w.fr.frng.bns.clr -side left grid configure $w.fr.frng.bx -row 0 -column 0 -sticky nesw grid configure $w.fr.frng.bscr -row 0 -column 1 -sticky ns grid configure $w.fr.frng.bns -row 1 -column 0 -columnspan 2 -pady 5 grid configure $w.fr.frng.df -row 2 -column 0 -columnspan 2 -pady 5 pack $w.fr.bns.clrall $w.fr.bns.ok -side left grid configure $w.fr.title -row 0 -column 0 -columnspan 2 grid configure $w.fr.frg -row 1 -column 0 -sticky nesw -pady 5 grid configure $w.fr.frng -row 1 -column 1 -sticky nesw -pady 5 -padx 3 grid configure $w.fr.bns -row 2 -column 0 -columnspan 2 -pady 5 pack $w.fr update idletasks return } proc MapBackGridEnter {dx dy} { # cursor on image grid slot global MAPCOLOUR .wchgmapbak.fr.frg.grid itemconfigure forIm=$dx,$dy \ -fill $MAPCOLOUR(mapsel) return } proc MapBackGridLeave {dx dy} { # cursor out of image grid slot global MAPCOLOUR MapImageFile if { [catch {set MapImageFile($dx,$dy)}] } { set c emptygrid } else { set c fullgrid } .wchgmapbak.fr.frg.grid itemconfigure forIm=$dx,$dy -fill $MAPCOLOUR($c) return } proc MapBackGridSelect {dx dy} { # click on an image grid slot global MAPCOLOUR MapImageFile set fr .wchgmapbak.fr.frg ; set cv $fr.grid set last [$fr.cs.cs cget -text] if { [catch {set p $MapImageFile($dx,$dy)}] } { set p "" $fr.bns.clr configure -state disabled } else { if { "$dx,$dy" != "0,0" } { $fr.bns.clr configure -state normal } } $cv itemconfigure forIm=$last -width 2 -outline black $cv itemconfigure forIm=$dx,$dy -width 4 -outline $MAPCOLOUR(mapsel) .wchgmapbak.fr.frg.cs.cs configure -text $dx,$dy .wchgmapbak.fr.frg.pt.pt configure -text $p return } proc MapBackGridLoad {} { # (re-)load one image for map background global Map MapImageFile MapImageWidth MapImageHeight MapImageItems \ MapImageGrid File MESS TXT MAPCOLOUR set fr .wchgmapbak.fr.frg scan [set cs [$fr.cs.cs cget -text]] %d,%d dx dy if { [set f [GMOpenFile $TXT(loadfrm) Image r]] != ".." } { set filename $File(Image) if { [BadImage MapImage$cs $filename] } { GMMessage $MESS(badimage) return } set MapImageFile($cs) [file join [pwd] $filename] $fr.pt.pt configure -text $MapImageFile($cs) set cv $fr.grid $cv itemconfigure forIm=$cs -fill $MAPCOLOUR(fullgrid) $Map delete forIm=$cs set x [expr $MapImageWidth*$dx] ; set y [expr $MapImageHeight*$dy] set it [$Map create image $x $y \ -image "MapImage$cs" -anchor nw \ -tags [list map mapimage forIm=$cs]] $Map lower $it lappend MapImageItems $it SetMapBounds MapWideBackGrid $cv x $dx Column \ $MapImageGrid(dymin) $MapImageGrid(dyn) MapWideBackGrid $cv y $dy Row \ $MapImageGrid(dxmin) $MapImageGrid(dxn) $fr.bns.clr configure -state normal } return } proc MapBackGridClear {} { # clear one image from map background global Map MapImageFile MapImageItems MapImageGrid MAPCOLOUR MESS set fr .wchgmapbak.fr.frg scan [set cs [$fr.cs.cs cget -text]] %d,%d dx dy if { [GMConfirm "$MESS(okclrbkim) $cs"] } { set it [$Map find withtag forIm=$cs] $Map delete forIm=$cs SetMapBounds $fr.bns.clr configure -state disabled catch {image delete MapImage$cs} catch {unset MapImageFile($cs)} if { [set ix [lsearch -exact $MapImageItems $it]] >= 0 } { set MapImageItems [lreplace $MapImageItems $ix $ix] } set cv $fr.grid $cv itemconfigure forIm=$cs -fill $MAPCOLOUR(emptygrid) if { ([MapShrinkBackGrid $cv x $dx %d,*] | \ [MapShrinkBackGrid $cv y $dy *,%d]) && \ [$cv find withtag forIm=$dx,$dy] == "" } { $cv itemconfigure forIm=0,0 -outline $MAPCOLOUR(mapsel) $fr.cs.cs configure -text 0,0 $fr.pt.pt configure -text $MapImageFile(0,0) } else { $fr.pt.pt configure -text "" } } return } proc MapColumnBackGrid {gr dx dymin dyn} { # make column of grid in dialog used to change map # background images # $gr: canvas with grid # $dx: grid coordinate # $dymin: min grid y-coordinate # $dyn: number of slots along y-coordinate global MapImageGrid MAPCOLOUR MapBackCellW MapBackCellH set m [expr $dymin+$dyn] set rw $MapBackCellW ; set rh $MapBackCellH for { set dy $dymin } { $dy < $m } { incr dy } { set it [$gr create rectangle [expr ($dx+1)*$rw+2] \ [expr ($dy+1)*$rh+2] [expr ($dx+2)*$rw] \ [expr ($dy+2)*$rh] -width 2 -fill $MAPCOLOUR(emptygrid) \ -tags [list grid forIm=$dx,$dy]] $gr bind $it "MapBackGridEnter $dx $dy" $gr bind $it "MapBackGridLeave $dx $dy" $gr bind $it "MapBackGridSelect $dx $dy" } return } proc MapRowBackGrid {gr dy dxmin dxn} { # make row of grid in dialog used to change map # background images # $gr: canvas with grid # $dy: grid coordinate # $dxmin: min grid x-coordinate # $dxn: number of slots along x-coordinate global MapImageGrid MAPCOLOUR MapBackCellW MapBackCellH set m [expr $dxmin+$dxn] set rw $MapBackCellW ; set rh $MapBackCellH for { set dx $dxmin } { $dx < $m } { incr dx } { set it [$gr create rectangle [expr ($dx+1)*$rw+2] \ [expr ($dy+1)*$rh+2] [expr ($dx+2)*$rw] \ [expr ($dy+2)*$rh] -width 2 -fill $MAPCOLOUR(emptygrid) \ -tags [list grid forIm=$dx,$dy]] $gr bind $it "MapBackGridEnter $dx $dy" $gr bind $it "MapBackGridLeave $dx $dy" $gr bind $it "MapBackGridSelect $dx $dy" } return } proc MapWideBackGrid {gr dir c how omin on} { # add external row/column of grid in dialog used to change map # background images if the external row/column becomes non-empty # $gr: canvas with grid # $dir in {x, y} # $c: grid coordinate along $dir # $how in {Row, Column} according to $dir # $omin: min grid coordinate along other direction # $on: number of slots along other direction global MapImageGrid if { $c != 0 } { set chg 0 ; set dd d$dir if { $c == [set m $MapImageGrid(${dd}min)] } { set chg 1 ; set scr -1 incr MapImageGrid(${dd}min) -1 ; incr MapImageGrid(${dd}n) Map${how}BackGrid $gr $MapImageGrid(${dd}min) $omin $on } elseif { $c == [expr $MapImageGrid(${dd}n)+$m-1] } { set chg 1 ; set scr 0 incr MapImageGrid(${dd}n) Map${how}BackGrid $gr [expr $c+1] $omin $on } if { $chg } { set bb [$gr bbox all] set x0 [lindex $bb 0] ; set y0 [lindex $bb 1] set x1 [lindex $bb 2] ; set y1 [lindex $bb 3] $gr configure -width [expr $x1-$x0] -height [expr $y1-$y0] $gr ${dir}view scroll $scr units } } return } proc MapShrinkBackGrid {gr dir c fmt} { # delete external row/column of grid in dialog used to change map # background images if its neighbour becomes empty (external rows # and columns are always empty; minimum size is 3x3, as slot with # origin is never emptied) # return 1 if there was shrinking # $gr: canvas with grid # $dir in {x, y} # $c: grid coordinate along $dir # $fmt in {"%d,*", "*,%d"} global MapImageGrid MapImageFile set chg 0 if { $c != 0 } { set dd d$dir ; set patt [format $fmt $c] if { $c == [set c1 [expr $MapImageGrid(${dd}min)+1]] && \ [NoBackImageAt $patt] } { set chg 1 ; set scr 1 ; incr MapImageGrid(${dd}min) } elseif { $c == [expr $MapImageGrid(${dd}n)+$c1-3] && \ [NoBackImageAt $patt] } { set chg 1 ; set scr 0 } if { $chg } { incr MapImageGrid(${dd}n) -1 set dc [expr 1-$scr-$scr] set cd [expr $c+$dc] ; set patt [format $fmt $cd] foreach it [$gr find withtag grid] { if { [lsearch -glob [$gr gettags $it] forIm=$patt] != -1 } { $gr delete $it } } set bb [$gr bbox all] set x0 [lindex $bb 0] ; set y0 [lindex $bb 1] set x1 [lindex $bb 2] ; set y1 [lindex $bb 3] $gr configure -width [expr $x1-$x0] -height [expr $y1-$y0] $gr ${dir}view scroll $scr units if { abs($c) != 1 } { MapShrinkBackGrid $gr $dir [expr $c-$dc] $fmt } } } return $chg } proc NoBackImageAt {patt} { # check whether there is a loaded image with coordinates of given pattern global MapImageFile if { [lsearch -glob [array names MapImageFile] $patt] == -1 } { return 1 } return 0 } proc MapBackBoxSetSelect {i} { # non-grided image selected in listbox corresponds to $i-th file there global MapBackNGSelect MapBackNGIxs .wchgmapbak.fr.frg.grid delete nongrid set MapBackNGSelect [lindex $MapBackNGIxs $i] .wchgmapbak.fr.frng.bns.clr configure -state normal MapBackBoxShow return } proc MapBackBoxShow {} { # show selected non-grided image over grid if grid canvas is not too small global Map MapBackNGSelect MapBackCellW MapBackCellH MapImageHeight \ MapImageWidth MAPCOLOUR MapImageNGW MapImageNGH if { $MapBackNGSelect != "" } { foreach "x0 y0" [$Map coords forIm=$MapBackNGSelect] {} set scx [expr 1.0*$MapBackCellW/$MapImageWidth] set scy [expr 1.0*$MapBackCellH/$MapImageHeight] set gx0 [expr $MapBackCellW+$x0*$scx] set gy0 [expr $MapBackCellH+$y0*$scy] set gxn [expr $MapBackCellW+($x0+$MapImageNGW($MapBackNGSelect))*$scx] set gyn [expr $MapBackCellH+($y0+$MapImageNGH($MapBackNGSelect))*$scy] .wchgmapbak.fr.frg.grid create rectangle $gx0 $gy0 $gxn $gyn \ -fill $MAPCOLOUR(mapsel) -tags nongrid } return } proc MapBackNGridClear {} { # delete selected non-grided image global Map MapBackNGSelect MapBackNGIxs MapImageNGrid MapImageFile \ MapImageNGCs MapImageItems MapImageNGW MapImageNGH if { $MapBackNGSelect != "" && \ [set it [$Map find withtag forIm=$MapBackNGSelect]] != "" } { $Map delete $it if { $MapImageNGrid == $MapBackNGSelect+1 } { incr MapImageNGrid -1 } catch { unset MapImageFile($MapBackNGSelect) } catch { unset MapImageNGCs($MapBackNGSelect) } catch { unset MapImageNGW($MapBackNGSelect) } catch { unset MapImageNGH($MapBackNGSelect) } if { [set i [lsearch -exact $MapImageItems $it]] != -1 } { set MapImageItems [lreplace $MapImageItems $i $i] } if { [set i [lsearch -exact $MapBackNGIxs $MapBackNGSelect]] != -1 } { set MapBackNGIxs [lreplace $MapBackNGIxs $i $i] .wchgmapbak.fr.frng.bx delete $i .wchgmapbak.fr.frng.bx selection clear 0 end .wchgmapbak.fr.frng.bns.clr configure -state disabled } set MapBackNGSelect "" } return } proc MapBackNGridLoad {} { # (re-) load a non-grided image to background global Map MapImageItems TXT MESS File MapImageNGrid MapImageFile \ MapImageNGCs MapBackNGIxs MapLoadWPs MapLoadPos WPPosn WPDatum \ MapImageNGW MapImageNGH if { [set f [GMOpenFile $TXT(loadfrm) Image r]] != ".." } { set filename $File(Image) ; set n $MapImageNGrid if { [BadImage MapImage$n $filename] } { GMMessage $MESS(badimage) return } set iwd [image width MapImage$n] ; set iht [image height MapImage$n] # geo-reference with 1 ctrl waypoint if { [MapLoadWPSelect 1] == -1 || \ ( $MapLoadWPs == -1 && \ [DefineCtrlPoint .wchgmapbak.fr.frng.df 0 "" 1] == -1 ) || \ [MapBackNGPlaceWP $n $iwd $iht] == -1 } { image delete MapImage$n return } # compute image NW corner canvas coordinates $x,$y # WP canvas coordinates set ix $MapLoadWPs set p [MapFromPosn [lindex $WPPosn($ix) 0] [lindex $WPPosn($ix) 1] \ $WPDatum($ix)] set x [expr round([lindex $p 0]-$MapLoadPos(0,x))] set y [expr round([lindex $p 1]-$MapLoadPos(0,y))] # display image set it [$Map create image $x $y -image "MapImage$n" -anchor nw \ -tags [list map mapimage forIm=$n]] $Map lower $it lappend MapImageItems $it SetMapBounds # update image data set MapImageFile($n) [file join [pwd] $filename] set MapImageNGCs($n) $x,$y set MapImageNGW($n) $iwd ; set MapImageNGH($n) $iht incr MapImageNGrid # update dialog .wchgmapbak.fr.frng.bx insert end $MapImageFile($n) .wchgmapbak.fr.frng.bx selection clear 0 end lappend MapBackNGIxs $n } return } proc MapBackNGPlaceWP {imno wd ht} { # display image MapImage$imno ($wd x $ht) in a canvas and let the user # place WP with index $MapLoadWPs (!= -1) in it # return -1 if operation is cancelled; otherwise WP canvas coordinates # (NW corner of image at 0,0) will be stored in MapLoadPos(0,_) global MapLoadWPs TXT MESS Dfctrl MPOSX MPOSY MapHeight MapWidth COLOUR \ MapNGLoading MapNGRangex MapNGRangey # window name used elsewhere set w .mapng ; set Dfctrl 0 if { [set mw $MapWidth] > $wd } { set mw $wd } if { [set mh $MapHeight] > $ht } { set mh $ht } destroy $w GMToplevel $w mpbkchg +$MPOSX+$MPOSY {} \ {WM_DELETE_WINDOW {set Dfctrl 0}} {} set MapNGLoading 1 set MapNGRangex $wd ; set MapNGRangey $ht frame $w.fr -relief flat -borderwidth 2 -bg $COLOUR(dialbg) message $w.fr.text -aspect 800 -text $MESS(mapadjust) set map $w.fr.map canvas $map -borderwidth 5 -relief groove -confine true \ -scrollregion [list 0 0 $wd $ht] -width $mw -height $mh \ -xscrollincrement 1 -yscrollincrement 1 \ -xscrollcommand "$w.fr.mhscr set" \ -yscrollcommand "$w.fr.mvscr set" scrollbar $w.fr.mhscr -orient horizontal -command "MapNGScroll x" scrollbar $w.fr.mvscr -command "MapNGScroll y" $map create image 0 0 -anchor nw -image MapImage$imno MapNGSetVOrigin x ; MapNGSetVOrigin y $map configure -cursor crosshair bind $map "focus $map ; MapNGCursor" bind $map { focus . ; UnMapNGCursor } bind $map "$map scan mark %x %y; MapNGCursorMotion %x %y" bind $map { MarkMapNGPoint %x %y } bind $map { MarkMapNGPoint %x %y } # scrolling/panning bindings as for $Map bind $map { MapNGScroll y scroll -1 units ; MapNGCursorUpdate } bind $map { MapNGScroll y scroll -1 pages MapNGCursorUpdate } bind $map { MapNGScroll y scroll 1 pages ; MapNGCursorUpdate } bind $map { MapNGScroll y scroll 1 units ; MapNGCursorUpdate } bind $map { MapNGScroll x scroll -1 units ; MapNGCursorUpdate } bind $map { MapNGScroll x scroll 1 units ; MapNGCursorUpdate } bind $map { MapNGScroll y scroll -1 units MapNGScroll x scroll 1 units ; MapNGCursorUpdate } bind $map { MapNGScroll y scroll 1 units MapNGScroll x scroll -1 units ; MapNGCursorUpdate } bind $map { MapNGScroll y scroll -1 units MapNGScroll x scroll -1 units ; MapNGCursorUpdate } bind $map { MapNGScroll y scroll 1 units MapNGScroll x scroll 1 units ; MapNGCursorUpdate } bind $map "$map scan dragto %x %y 1; \ MapNGSetVOrigin x ; MapNGSetVOrigin y ; MapNGCursorUpdate" bind $map "$map scan dragto %x %y ; MapNGSetVOrigin x ; \ MapNGSetVOrigin y ; MapNGCursorUpdate" bind $map { MapNGScroll y scroll 25 units ; MapNGCursorUpdate } bind $map { MapNGScroll y scroll -25 units ; MapNGCursorUpdate } bind $map { MapNGScroll y scroll 1 pages MapNGCursorUpdate } bind $map { MapNGScroll y scroll -1 pages MapNGCursorUpdate } bind $map { MapNGScroll x scroll 1 pages MapNGCursorUpdate } bind $map { MapNGScroll x scroll -1 pages MapNGCursorUpdate } bind $map { MapNGScroll x scroll 25 units MapNGCursorUpdate } bind $map { MapNGScroll x scroll -25 units MapNGCursorUpdate } frame $w.fr.frbs button $w.fr.frbs.ok -text $TXT(ok) -command { set Dfctrl 1 } \ -state disabled button $w.fr.frbs.cnc -text $TXT(cancel) -command { set Dfctrl 0 } pack $w.fr.frbs.ok $w.fr.frbs.cnc -side left grid configure $w.fr.text -row 0 -column 0 -columnspan 2 grid configure $map -row 1 -column 0 -sticky nesw grid configure $w.fr.mvscr -row 1 -column 1 -sticky ns grid configure $w.fr.mhscr -row 2 -column 0 -sticky ew grid configure $w.fr.frbs -row 3 -column 0 -columnspan 2 -pady 5 pack $w.fr # control is taken by the cursor procs; the "Ok" button is only # enabled when the WP is placed in which case the relevant coordinates # are stored in $MapLoadPos(0,x) and $MapLoadPos(0,y) update idletasks set gs [grab current] grab $w RaiseWindow $w tkwait variable Dfctrl DestroyRGrabs $w $gs if { $Dfctrl == 0 } { return -1 } return 0 } proc MapNGScroll {dim args} { # scroll non-grid image map and set corresponding coordinate of origin # of visible region # $dim in {x, y}, $args suitable to xview/yview commands # scrollbar eval .mapng.fr.map ${dim}view $args MapNGSetVOrigin $dim return } proc MapNGSetVOrigin {dim} { # set coordinate of origin of visible region of non-grid image map # $dim in {x, y} global MapNGOV$dim MapNGRange$dim set sc [lindex [.mapng.fr.map ${dim}view] 0] set MapNGOV$dim [expr $sc*[set MapNGRange$dim]] return } proc MapNGCursor {} { # start following pointer on non-grid image map while waypoint is not # placed # name of WP to place is in $MapLoadWPNs global MapLoadWPNs MAPCOLOUR MapNGLoading if { $MapNGLoading } { set map .mapng.fr.map $map delete mapfix $map create text 100 100 -fill $MAPCOLOUR(mapsel) -anchor sw \ -text $MapLoadWPNs -justify left -tags mapfix } return } proc UnMapNGCursor {} { # stop following pointer on non-grid image map .mapng.fr.map delete mapfix return } proc MapNGCursorMotion {x y} { # follow pointer on non-grid image map global MapNGOVx MapNGOVy CRHAIRx CRHAIRy MapNGCursorPos set MapNGCursorPos [list $x $y] .mapng.fr.map coords mapfix [expr $MapNGOVx+$x-$CRHAIRx] \ [expr $MapNGOVy+$y-$CRHAIRy] return } proc MapNGCursorUpdate {} { # update cursor coordinates after scrolling global MapNGCursorPos if { ! [catch {set MapNGCursorPos}] } { eval MapNGCursorMotion $MapNGCursorPos } return } proc MarkMapNGPoint {x y} { # place waypoint on non-grid image map global MapNGOVx MapNGOVy CRHAIRx CRHAIRy MapLoadPos MapNGLoading \ MAPCOLOUR ICONHEIGHT MapFont MapLoadWPs MapLoadWPNs WPSymbol if { $MapNGLoading } { set MapNGLoading 0 set map .mapng.fr.map $map delete mapfix set x [expr $MapNGOVx+$x-$CRHAIRx] ; set y [expr $MapNGOVy+$y-$CRHAIRy] set MapLoadPos(0,x) $x ; set MapLoadPos(0,y) $y $map create rectangle [expr $x-1] [expr $y-1] \ [expr $x+1] [expr $y+1] -fill $MAPCOLOUR(WP) \ -outline $MAPCOLOUR(WP) $map create text $x [expr $y-6-$ICONHEIGHT/2.0] \ -text $MapLoadWPNs -fill $MAPCOLOUR(WP) -font $MapFont \ -justify center set syim [lindex [SymbolImageName $WPSymbol($MapLoadWPs)] 0] $map create image $x $y -anchor center -image $syim .mapng.fr.frbs.ok configure -state normal } return } ## BSB contribution proc LoadIndexedMap {path} { # this loads a fixed or geo-referenced image as background for the map set r [LoadMapFixedBk $path] switch -- [lindex $r 0] { 0 { # no geo-referencing during auto-load } 1 { eval LoadMapBackGeoRef [lrange $r 1 end] } } return } #### locate or clear items on map proc Locate {wh ix it} { # scroll map to get displayed item on centre # $wh in $TYPES # $ix (not in use) is item index # $it is map item for main element of (data-base) item global Map OVx OVy MAPW2 MAPH2 PrevCentre if { [set cs [$Map coords $it]] != "" } { set PrevCentre [list [lindex [$Map xview] 0] [lindex [$Map yview] 0]] ScrollMapTo [lindex $cs 0] [lindex $cs 1] \ [expr $OVx+$MAPW2] [expr $OVy+$MAPH2] } return } proc LocatePrevious {} { # scroll map to get back to previous centre global Map PrevCentre if { [set p $PrevCentre] != "" } { set PrevCentre [list [lindex [$Map xview] 0] [lindex [$Map yview] 0]] ScrollMap x moveto [lindex $p 0] ScrollMap y moveto [lindex $p 1] } return } proc SelectApplyMapped {wh mode comm} { # select one or more items currently displayed on map and apply # a command to them # $wh is type (in $TYPES except GR) of items # $mode is selection mode (1st arg to proc GMChooseFrom) # $comm is command to invoke with the following arguments: # $wh, item index and map item # if $wh in {RT, TR, LN} the map item is for the first point # of the selected item global Map TXT LISTWIDTH RTIdNumber RTWPoints TRName LNName set ns "" ; set ixmits "" switch $wh { WP { foreach it [$Map find withtag WP&&sq2] { set ts [$Map gettags $it] if { [set k1 [lsearch -glob $ts WP=*]] != -1 && \ [set k2 [lsearch -glob $ts forWP=*]] != -1 } { regsub WP= [lindex $ts $k1] "" n regsub forWP= [lindex $ts $k2] "" ix lappend ns [list $n $ix $it] } } } RT { foreach it [$Map find withtag WP&&sq2] { set ts [$Map gettags $it] if { [set k1 [lsearch -glob $ts inRT=*]] != -1 && \ [set k2 [lsearch -glob $ts WP=*]] != -1 } { regsub inRT= [lindex $ts $k1] "" ix regsub WP= [lindex $ts $k2] "" wpn if { [lindex $RTWPoints($ix) 0] == $wpn } { lappend ns [list $RTIdNumber($ix) $ix $it] } } } } TR - LN { foreach it [$Map find withtag ${wh}first] { set ts [$Map gettags $it] if { [set k [lsearch -glob $ts ${wh}=*]] != -1 } { regsub ${wh}= [lindex $ts $k] "" ix if { $ix != -1 } { # test as in previous version... lappend ns [list [set ${wh}Name($ix)] $ix $it] } } } } } if { [set ns [lsort -dictionary -index 0 $ns]] == "" } { return } set lns "" ; set lvs "" foreach t $ns { lappend lns [lindex $t 0] lappend lvs [lreplace $t 0 0] } foreach p [GMChooseFrom $mode [list $TXT(select) $TXT(name$wh)] \ $LISTWIDTH $lns $lvs] { $comm $wh [lindex $p 0] [lindex $p 1] } return } proc SelectApplyUnmapped {wh mode comm} { # select one or more items not currently displayed on map and apply # a command to them # $wh is type (in $TYPES) of items # $mode is selection mode (1st arg to proc GMChooseFrom) # $comm is command to invoke with the following arguments: # $wh, item index global Map TXT TYPES LISTWIDTH Storage set ids [lindex $Storage($wh) 0] global $ids ${wh}Displ set ns "" foreach ix [array names $ids] { if { ! [set ${wh}Displ($ix)] } { lappend ns [list [set [set ids]($ix)] $ix] } } if { [set ns [lsort -dictionary -index 0 $ns]] == "" } { return } set lns "" ; set lvs "" foreach p $ns { lappend lns [lindex $p 0] ; lappend lvs [lindex $p 1] } foreach ix [GMChooseFrom $mode [list $TXT(select) $TXT(name$wh)] \ $LISTWIDTH $lns $lvs] { $comm $wh $ix } return } ### DJG contribution proc NewGroupFromMap {mapped} { # Create a group based on the currently mapped (or unmapped) data global TXT Storage TYPES set ixmits "" # MF change: using $TYPES set whs [Delete $TYPES GR] #-- if ($mapped) { set namebase $TXT(dispitems) foreach wh $whs { set ${wh}ns "" set ids [lindex $Storage($wh) 0] global $ids ${wh}Displ foreach ix [array names $ids] { if { [set ${wh}Displ($ix)] } { lappend ${wh}ns [set [set ids]($ix)] } } } } else { set namebase $TXT(hiditems) foreach wh $whs { set ${wh}ns "" set ids [lindex $Storage($wh) 0] global $ids ${wh}Displ foreach ix [array names $ids] { if { ! [set ${wh}Displ($ix)] } { lappend ${wh}ns [set [set ids]($ix)] } } } } # MF change: leaving out void types and returning if there are no items set contents "" foreach wh $whs { if { [set ${wh}ns] != "" } { lappend contents [list $wh [set ${wh}ns]] } } if { $contents == "" } { bell ; return } #-- # Now find a name for this group # MF change: using proc CreateGRFor CreateGRFor "=$namebase" "" $contents return } gpsman-6.4.4.2/gmsrc/cluster.tcl0000644000175000017500000002603712224351117014572 0ustar migmig# # This file is part of: # # gpsman --- GPS Manager: a manager for GPS receiver data # # Copyright (c) 1998-2013 Miguel Filgueiras migfilg@t-online.de # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. # # File: cluster.tcl # Last change: 6 October 2013 # proc DistCluster {w dtxt dist args} { # make (possibly non-disjoint) groups of WPs that are at less than # given distance (in kilometres) from a WP in GR in window $w # if $args != "", first element is taken as the minimum distance WPs # should be from the centre WP, and other elements as increasing # bounds for new clusters # $dtxt is external representation of distance range # undefined WPs will be left out global WPName WPPosn WPDatum TXT Cluster MESS set Cluster(info) $TXT(collcntr) update idletasks switch [set wpixs [GMGRCollectWPs $w]] { void - error { return } } if { $args != "" } { set min [lindex $args 0] } else { set min 0 } set wgs "" foreach ix $wpixs { if { $ix != -1 } { lappend wgs $ix } } if { $wgs == "" } { GMMessage $MESS(allundef) return } set cls0 "" if { $min == 0 } { set cls0 [Apply $wgs NameOf WP] } else { set cls0 "" foreach w $wgs { lappend cls0 "" } } set bds [lreplace $args 0 0 $dist] if { [set n [llength $bds]] > 1 } { set l "" foreach w $wgs { lappend l "" } for { set i 1 } { $i < $n } { incr i } { set cls$i $l } } set Cluster(info) $TXT(compclstr) update idletasks if { $Cluster(abort) } { return } set nseen 0 foreach ix [array names WPName] { set pos $WPPosn($ix) ; set datum $WPDatum($ix) if { [incr nseen]%10 == 0 } { update if { $Cluster(abort) } { return } } set i 0 foreach wpix $wgs { if { $ix != $wpix } { set db [CompDistBearDatums $WPPosn($wpix) $WPDatum($wpix) \ $pos $datum] if { [set d [lindex $db 0]] >= $min } { set k 0 foreach bd $bds { if { $d <= $bd } { set cl [lindex [set cls$k] $i] lappend cl $WPName($ix) set cls$k [lreplace [set cls$k] $i $i $cl] break } incr k } } } incr i } } set Cluster(info) $TXT(crtgclstrgrs) update idletasks if { $Cluster(abort) } { return } set n 0 ; set k 0 foreach bd $bds { foreach wpix $wgs cl [set cls$k] { if { $cl != "" } { CreateGRFor cluster "$TXT(centre): $WPName($wpix)\n$dtxt" \ [list [list WP $cl]] } } set min $bd incr k } return } proc QuadrCluster {w dlat dlong} { # make (possibly non-disjoint) groups of WPs that belong to each # quadrangle $dlatx$dlong centred at a WP in GR in window $w # undefined WPs will be left out global WPName WPPosn WPDatum TXT MESS Cluster set Cluster(info) $TXT(collcntr) update idletasks switch [set wpixs [GMGRCollectWPs $w]] { void - error { return } } set wgs "" foreach ix $wpixs { if { $ix != -1 } { lappend wgs $ix } } if { $wgs == "" } { GMMessage $MESS(allundef) return } set gd "" ; set datum $WPDatum([lindex $wgs 0]) foreach cix $wgs { set cl($cix) "" set p $WPPosn($cix) if { $WPDatum($cix) != $datum } { set p [ToDatum [lindex $p 0] [lindex $p 1] $WPDatum($cix) $datum] } set gd [AddToGData $gd [lindex $p 0] [lindex $p 1] $cix] } set Cluster(info) $TXT(compclstr) update idletasks if { $Cluster(abort) } { return } set nseen 0 foreach ix [array names WPName] { if { [incr nseen]%1000 == 0 } { update if { $Cluster(abort) } { return } } set p $WPPosn($ix) if { $WPDatum($ix) != $datum } { set p [ToDatum [lindex $p 0] [lindex $p 1] $WPDatum($ix) $datum] } foreach cix [LookupQuadrGData $gd [lindex $p 0] [lindex $p 1] \ $dlat $dlong] { lappend cl($cix) $WPName($ix) } } set Cluster(info) $TXT(crtgclstrgrs) update idletasks if { $Cluster(abort) } { return } set dlatext [ExtDegrees DMSsimpl $dlat] set dlongext [ExtDegrees DMSsimpl $dlong] set n 0 foreach cix $wgs { if { $cl($cix) != "" } { CreateGRFor cluster \ "$TXT(centre): $WPName($cix)\n${dlatext}x$dlongext" \ [list [list WP $cl($cix)]] } } return } proc MakeClusters {w} { # create dialog for gathering the parameters needed for making clusters # centred at the WPs in GR window $w global Cluster PositionFormat TXT EPOSX EPOSY COLOUR MAPCOLOUR \ DISTUNIT DLUNIT destroy .clstr GMToplevel .clstr cluster +$EPOSX+$EPOSY {} \ {WM_DELETE_WINDOW {destroy .clstr}} \ [list "DoMakeClusters $w"] catch { unset Cluster } set Cluster(how) inquadr set Cluster(min) 0 frame .clstr.fr -relief flat -borderwidth 5 -bg $COLOUR(selbg) label .clstr.fr.title -text $TXT(mkclusters) -relief sunken set frs .clstr.fr.frsel frame $frs -relief flat -borderwidth 0 set cw 74 ; set ch 54 set cw2 [expr $cw/2] ; set ch2 [expr $ch/2] radiobutton $frs.riq -text $TXT(quadr) -variable Cluster(how) \ -value inquadr -anchor w -selectcolor $COLOUR(check) canvas $frs.ciq -width $cw -height $ch -relief flat \ -bg $COLOUR(bg) $frs.ciq create rectangle [expr $cw2-30] [expr $ch2-20] \ [expr $cw2+30] [expr $ch2+20] -fill $MAPCOLOUR(mapsel) $frs.ciq create line [expr $cw2-3] $ch2 [expr $cw2+4] $ch2 $frs.ciq create line $cw2 [expr $ch2-4] $cw2 [expr $ch2+4] frame $frs.eiq -relief flat -borderwidth 0 label $frs.eiq.tla -text $TXT(dlat) entry $frs.eiq.ela -textvariable Cluster(dlat) bind $frs.eiq.ela { set Cluster(how) inquadr } label $frs.eiq.tlo -text $TXT(dlong) entry $frs.eiq.elo -textvariable Cluster(dlong) bind $frs.eiq.elo { set Cluster(how) inquadr } set Cluster(pformt) $PositionFormat menubutton $frs.eiq.mf -text $TXT($PositionFormat) -relief raised \ -direction below -menu $frs.eiq.mf.m -width 6 menu $frs.eiq.mf.m -tearoff 0 foreach f "DMS DMM DDD" { set t $TXT($f) $frs.eiq.mf.m add command -label $t \ -command "$frs.eiq.mf configure -text {$t} ; \ set Cluster(pformt) $f" } grid configure $frs.eiq.tla -row 0 -column 0 -sticky w grid configure $frs.eiq.ela -row 0 -column 1 -sticky nesw grid configure $frs.eiq.tlo -row 1 -column 0 -sticky w grid configure $frs.eiq.elo -row 1 -column 1 -sticky nesw grid configure $frs.eiq.mf -row 0 -rowspan 2 -column 3 -sticky ew radiobutton $frs.rbd -text $TXT(distance) -variable Cluster(how) \ -value bydist -anchor w -selectcolor $COLOUR(check) canvas $frs.cbd -width $cw -height $ch -relief flat \ -bg $COLOUR(bg) $frs.cbd create oval [expr $cw2-20] [expr $ch2-20] \ [expr $cw2+20] [expr $ch2+20] -fill $MAPCOLOUR(mapsel) $frs.cbd create oval [expr $cw2-10] [expr $ch2-10] \ [expr $cw2+10] [expr $ch2+10] -fill $COLOUR(bg) $frs.cbd create line [expr $cw2-3] $ch2 [expr $cw2+4] $ch2 $frs.cbd create line $cw2 [expr $ch2-4] $cw2 [expr $ch2+4] frame $frs.ebd -relief flat -borderwidth 0 label $frs.ebd.tmn -text $TXT(min) entry $frs.ebd.emn -textvariable Cluster(min) bind $frs.ebd.emn { set Cluster(how) bydist } label $frs.ebd.tmx -text $TXT(max) entry $frs.ebd.emx -textvariable Cluster(max) bind $frs.ebd.emx { set Cluster(how) bydist } set Cluster(unit) dist=$DISTUNIT menubutton $frs.ebd.mu -text $DLUNIT($DISTUNIT,dist) -relief raised \ -direction below -menu $frs.ebd.mu.m -width 6 menu $frs.ebd.mu.m -tearoff 0 set us "" foreach u "KM NAUTMILE STATMILE" { foreach t "dist subdist" { set nm $DLUNIT($u,$t) if { [lsearch -exact $us $nm] == -1 } { $frs.ebd.mu.m add command -label $nm \ -command "$frs.ebd.mu configure -text {$nm} ; \ set Cluster(unit) $t=$u" lappend us $nm } } } grid configure $frs.ebd.tmn -row 0 -column 0 -sticky w grid configure $frs.ebd.emn -row 0 -column 1 -sticky nesw grid configure $frs.ebd.tmx -row 1 -column 0 -sticky w grid configure $frs.ebd.emx -row 1 -column 1 -sticky nesw grid configure $frs.ebd.mu -row 0 -rowspan 2 -column 3 -sticky ew grid configure $frs.riq -row 0 -column 0 -sticky nesw grid configure $frs.ciq -row 0 -column 1 -sticky nesw grid configure $frs.eiq -row 1 -column 1 -sticky w grid configure $frs.rbd -row 2 -column 0 -sticky nesw grid configure $frs.cbd -row 2 -column 1 -sticky nesw grid configure $frs.ebd -row 3 -column 1 -sticky w frame .clstr.fr.frbs -relief flat -borderwidth 0 button .clstr.fr.frbs.ok -text Ok \ -command ".clstr.fr.frbs.ok configure -state normal ; \ DoMakeClusters $w" button .clstr.fr.frbs.cnc -text $TXT(cancel) -command { destroy .clstr } pack .clstr.fr.frbs.ok .clstr.fr.frbs.cnc -side left -padx 3 pack .clstr.fr.title $frs .clstr.fr.frbs -side top -pady 5 pack .clstr.fr update idletasks return } proc DoMakeClusters {w} { # use information in dialog created by proc MakeClusters to call # the procedures that do the actual computation of clusters global Cluster TXT DSCALEFOR DLUNIT MESS switch $Cluster(how) { bydist { set min $Cluster(min) if { $min == "" } { set min 0 } elseif { ! [CheckFloat GMMessage $min] || \ ! [CheckFloat GMMessage $Cluster(max)] } { return } regexp {(.*)=(.*)} $Cluster(unit) z type unit if { $type == "subdist" } { set sc [expr $DSCALEFOR(sub,$unit)/$DSCALEFOR($unit)] } else { set sc [expr 1.0/$DSCALEFOR($unit)] } set dtxt "$min-${Cluster(max)}$DLUNIT($unit,$type)" set max [expr $sc*$Cluster(max)] set min [expr $sc*$min] } inquadr { set pf $Cluster(pformt) if { ! [CheckLat GMMessage $Cluster(dlat) $pf] || \ ! [CheckLong GMMessage $Cluster(dlong) $pf] } { return } if { [set dlat [Coord $pf $Cluster(dlat) S]] < 0 || \ [set dlong [Coord $pf $Cluster(dlong) W]] < 0 } { GMMessage $MESS(negdlatlong) return } } } set Cluster(info) "..." ; set Cluster(abort) 0 frame .clstr.fr.state -relief flat -borderwidth 0 label .clstr.fr.state.info -width 30 -textvariable Cluster(info) button .clstr.fr.state.ab -text $TXT(abort) \ -command { set Cluster(abort) 1 } pack forget .clstr.fr.frbs pack .clstr.fr.state.info .clstr.fr.state.ab -side top -pady 5 pack .clstr.fr.state -side top -pady 5 update idletasks switch $Cluster(how) { bydist { if { $min == 0 } { DistCluster $w $dtxt $max } else { DistCluster $w $dtxt $max $min } } inquadr { QuadrCluster $w $dlat $dlong } } destroy .clstr return } gpsman-6.4.4.2/gmsrc/search.tcl0000644000175000017500000006057312224351120014353 0ustar migmig# # This file is part of: # # gpsman --- GPS Manager: a manager for GPS receiver data # # Copyright (c) 1998-2013 Miguel Filgueiras migfilg@t-online.de # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. # # File: search.tcl # Last change: 6 October 2013 # proc Search {} { # create dialog for searching items global PositionFormat SDatum Datum SearchWidgets SearchDistance \ SearchWPName SearchWPSymbol SearchRTWP SearchDate \ SearchSpec SearchDomain DEFAULTSYMBOL DPOSX DPOSY COLOUR TXT MESS \ TYPES ICONWIDTH ICONHEIGHT SYMBOLIMAGE NAMEWIDTH YEAR0 MONTHNAMES \ MAXMENUITEMS SUPPORTLAPS set stypes $TYPES if { $SUPPORTLAPS } { lappend stypes LAP } set SearchSpec(_types) $stypes # absolute paths for this window used elsewhere set w .gmsearch if { [winfo exists $w] } { Raise $w ; bell ; return } set SDatum $Datum set SearchWPSymbol $DEFAULTSYMBOL GMToplevel $w search +$DPOSX+$DPOSY . \ [list WM_DELETE_WINDOW "destroy $w"] \ [list "DoSearch $w"] frame $w.fr -relief flat -borderwidth 5 -bg $COLOUR(dialbg) label $w.fr.tit -text $TXT(search) frame $w.fr.wh -relief flat -borderwidth 0 label $w.fr.wh.tit -text $TXT(what): set pre $w.fr.wh.tit # this will make easy some tests even if laps are not supported set SearchSpec(LAP) 0 foreach wh $stypes { set SearchSpec($wh) 0 checkbutton $w.fr.wh.b$wh -text $TXT(name$wh) -anchor w \ -variable SearchSpec($wh) -onvalue 1 -offvalue 0 \ -selectcolor $COLOUR(check) -command "SearchToggle $wh" eval pack $pre $w.fr.wh.b$wh -side left -padx 2 set $pre "" } frame $w.fr.dom -relief flat -borderwidth 0 set SearchDomain Data label $w.fr.dom.tit -text $TXT(where): frame $w.fr.dom.db -relief sunken -borderwidth 1 checkbutton $w.fr.dom.db.b -text $TXT(database) -anchor w \ -variable SearchDomain -onvalue Data -offvalue GR \ -selectcolor $COLOUR(check) -command SearchToggleDomain frame $w.fr.dom.gr -relief sunken -borderwidth 1 checkbutton $w.fr.dom.gr.b -text $TXT(nameGR)(s) -anchor w \ -variable SearchDomain -onvalue GR -offvalue Data \ -selectcolor $COLOUR(check) -command SearchToggleDomain menubutton $w.fr.dom.gr.mb -relief raised -anchor w -width 15 \ -direction below -menu $w.fr.dom.gr.mb.m menu $w.fr.dom.gr.mb.m -tearoff 0 frame $w.fr.strs -relief flat -borderwidth 0 foreach s "name cmmt rmrk" { set SearchSpec($s) 0 frame $w.fr.strs.f$s checkbutton $w.fr.strs.f$s.b -text $TXT($s) -anchor w -width 11 \ -variable SearchSpec($s) -onvalue 1 -offvalue 0 \ -selectcolor $COLOUR(check) entry $w.fr.strs.f$s.e -width 30 -exportselection 1 pack $w.fr.strs.f$s.b $w.fr.strs.f$s.e -side left pack $w.fr.strs.f$s } frame $w.fr.fWPTR -relief flat -borderwidth 0 frame $w.fr.fWPTR.dist -relief flat -borderwidth 0 label $w.fr.fWPTR.dist.tit -text $TXT(distance) frame $w.fr.fWPTR.dist.wpp -relief flat -borderwidth 0 set SearchDistance(how) fromWP frame $w.fr.fWPTR.dist.wpp.wp -relief flat -borderwidth 0 checkbutton $w.fr.fWPTR.dist.wpp.wp.b -text $TXT(fromWP): -width 13 \ -variable SearchDistance(how) -onvalue fromWP -offvalue fromPos \ -selectcolor $COLOUR(check) -anchor w set SearchWPName "" button $w.fr.fWPTR.dist.wpp.wp.it -textvariable SearchWPName \ -width $NAMEWIDTH \ -command "ChItemsCall WP single AssignGlobal SearchWPName" frame $w.fr.fWPTR.dist.wpp.p -relief flat -borderwidth 0 checkbutton $w.fr.fWPTR.dist.wpp.p.b -text $TXT(fromPos): -width 13 \ -variable SearchDistance(how) -onvalue fromPos -offvalue fromWP \ -selectcolor $COLOUR(check) -anchor w frame $w.fr.fWPTR.dist.wpp.p.p -relief sunken -borderwidth 1 ShowPosnDatum $w.fr.fWPTR.dist.wpp.p.p $PositionFormat [list ""] \ SearchChangeDatum SDatum SDatum normal 1 nil frame $w.fr.fWPTR.dir -relief flat -borderwidth 0 label $w.fr.fWPTR.dir.tit -text $TXT(azimuth): set SearchDistance(bearing) "" menubutton $w.fr.fWPTR.dir.dm -textvariable SearchDistance(bearing) \ -relief raised -direction below -width 6 \ -menu $w.fr.fWPTR.dir.dm.m menu $w.fr.fWPTR.dir.dm.m -tearoff 0 foreach b "N NE E SE S SW W NW" { $w.fr.fWPTR.dir.dm.m add command -label $b \ -command "set SearchDistance(bearing) $b ; \ $w.fr.fWPTR.dir.ang configure -state normal" } $w.fr.fWPTR.dir.dm.m add command -label "($TXT(any))" \ -command "set SearchDistance(bearing) {} ; \ $w.fr.fWPTR.dir.ang configure -state disabled" label $w.fr.fWPTR.dir.angtit -text $TXT(opening): set SearchDistance(opendef) 45 set SearchDistance(open) $SearchDistance(opendef) entry $w.fr.fWPTR.dir.ang -textvariable SearchDistance(open) \ -width 4 -exportselection 1 -state disabled label $w.fr.fWPTR.dir.angdtit -text "$TXT(degrees) \($TXT(suggested):" label $w.fr.fWPTR.dir.angd -textvariable SearchDistance(opendef) label $w.fr.fWPTR.dir.angdtit2 -text "\)" frame $w.fr.fWPTR.its -relief flat -borderwidth 0 set SearchSpec(dist) 0 checkbutton $w.fr.fWPTR.its.tit -text "$TXT(nameWP), $TXT(nameTR):" \ -variable SearchSpec(dist) -onvalue 1 -offvalue 0 \ -selectcolor $COLOUR(check) -anchor w -state disabled frame $w.fr.fWPTR.its.spc -relief flat -borderwidth 0 frame $w.fr.fWPTR.its.spc.wt -relief sunken -borderwidth 1 set SearchDistance(range) within checkbutton $w.fr.fWPTR.its.spc.wt.b -text $TXT(within): -width 15 \ -variable SearchDistance(range) -onvalue within -offvalue between \ -selectcolor $COLOUR(check) -anchor w -command SearchBearingAngle set SearchDistance(dist) 10 entry $w.fr.fWPTR.its.spc.wt.d -textvariable SearchDistance(dist) \ -width 5 -exportselection 1 frame $w.fr.fWPTR.its.spc.bt -relief sunken -borderwidth 1 set SearchDistance(from) 10 set SearchDistance(to) 20 checkbutton $w.fr.fWPTR.its.spc.bt.b -text $TXT(between): -width 15 \ -variable SearchDistance(range) -onvalue between -offvalue within \ -selectcolor $COLOUR(check) -anchor w -command SearchBearingAngle entry $w.fr.fWPTR.its.spc.bt.d1 -textvariable SearchDistance(from) \ -width 5 -exportselection 1 bind $w.fr.fWPTR.its.spc.bt.d1 { SearchBearingAngle } label $w.fr.fWPTR.its.spc.bt.sep -text "-" entry $w.fr.fWPTR.its.spc.bt.d2 -textvariable SearchDistance(to) \ -width 5 -exportselection 1 bind $w.fr.fWPTR.its.spc.bt.d2 { SearchBearingAngle } frame $w.fr.fWPsy -relief flat -borderwidth 0 set SearchSpec(symbol) 0 checkbutton $w.fr.fWPsy.b -text "$TXT(nameWP) $TXT(with)" -anchor w \ -variable SearchSpec(symbol) -onvalue 1 -offvalue 0 \ -selectcolor $COLOUR(check) -state disabled menubutton $w.fr.fWPsy.symb -text $TXT(symbol) -relief raised \ -direction below -menu $w.fr.fWPsy.symb.m set mw $w.fr.fWPsy.symb.m menu $mw -tearoff 0 FillSymbolsMenu $mw SearchChangeSymbol canvas $w.fr.fWPsy.symbim -width $ICONWIDTH -height [expr $ICONHEIGHT+2] $w.fr.fWPsy.symbim create image 1 5 -anchor nw \ -image $SYMBOLIMAGE($SearchWPSymbol) label $w.fr.fWPsy.symbname -text $TXT(SY$SearchWPSymbol) frame $w.fr.fRT -relief flat -borderwidth 0 set SearchSpec(RTWP) 0 checkbutton $w.fr.fRT.b -text "$TXT(nameRT) $TXT(with)" -anchor w \ -variable SearchSpec(RTWP) -onvalue 1 -offvalue 0 \ -selectcolor $COLOUR(check) -state disabled set SearchRTWP "" button $w.fr.fRT.wp -textvariable SearchRTWP -width $NAMEWIDTH \ -command "ChItemsCall WP single AssignGlobal SearchRTWP" if { $SUPPORTLAPS } { set trlaps "TR LAP" } else { set trlaps TR } for { set ds "" ; set d 1 } { $d < 32 } { incr d } { lappend ds $d } scan [Today YYYYMMDD] %d cy for { set ys "" ; set y $YEAR0 } { $y <= $cy } { incr y } { lappend ys $y } foreach wh $trlaps { set f $w.fr.f$wh frame $f -relief flat -borderwidth 0 set SearchSpec($wh,date) 0 checkbutton $f.b -text "$TXT(name$wh) $TXT(started)" -anchor w \ -variable SearchSpec($wh,date) -onvalue 1 -offvalue 0 \ -selectcolor $COLOUR(check) -state disabled foreach de "d m y" vs [list $ds $MONTHNAMES $ys] { set SearchDate($wh,$de) "" menubutton $f.$de -textvariable SearchDate($wh,$de) \ -relief raised -direction below -width 5 -menu $f.$de.m menu $f.$de.m -tearoff 0 set mw $f.$de.m $f.$de.m add command -label "($TXT(any))" \ -command "set SearchDate($wh,$de) {}" set n 1 ; set m 0 foreach v $vs { if { $n > $MAXMENUITEMS } { $mw add cascade -label "$TXT(more) ..." -menu $mw.m$m set mw $mw.m$m ; menu $mw -tearoff 0 set n 0 ; incr m } $mw add command -label $v -command "set SearchDate($wh,$de) $v" incr n } } set SearchWidgets($wh) $w.fr.f$wh.b } set SearchWidgets(WP) "$w.fr.fWPsy.b TR/$w.fr.fWPTR.its.tit" set SearchWidgets(RT) "$w.fr.fRT.b" lappend SearchWidgets(TR) WP/$w.fr.fWPTR.its.tit set SearchWidgets(LN) "" set SearchWidgets(GR) "" frame $w.fr.frbt -relief flat -borderwidth 0 button $w.fr.frbt.ok -text $TXT(search) \ -command "$w.fr.frbt.ok configure -state normal ; DoSearch $w" button $w.fr.frbt.cnc -text $TXT(cancel) -command "destroy $w" pack $w.fr.dom.db.b pack $w.fr.dom.gr.b $w.fr.dom.gr.mb -side left -padx 1 pack $w.fr.dom.tit $w.fr.dom.db $w.fr.dom.gr -side left -padx 3 pack $w.fr.fWPTR.dist.wpp.wp.b $w.fr.fWPTR.dist.wpp.wp.it -side left pack $w.fr.fWPTR.dist.wpp.p.p.frp $w.fr.fWPTR.dist.wpp.p.p.frd -side top pack $w.fr.fWPTR.dist.wpp.p.b $w.fr.fWPTR.dist.wpp.p.p -side left pack $w.fr.fWPTR.dist.wpp.wp $w.fr.fWPTR.dist.wpp.p -side top -anchor w pack $w.fr.fWPTR.dist.tit $w.fr.fWPTR.dist.wpp -side left -padx 2 pack $w.fr.fWPTR.dir.tit $w.fr.fWPTR.dir.dm $w.fr.fWPTR.dir.angtit \ $w.fr.fWPTR.dir.ang $w.fr.fWPTR.dir.angdtit \ $w.fr.fWPTR.dir.angd $w.fr.fWPTR.dir.angdtit2 -side left -padx 2 pack $w.fr.fWPTR.its.spc.wt.b $w.fr.fWPTR.its.spc.wt.d -side left -padx 2 pack $w.fr.fWPTR.its.spc.bt.b $w.fr.fWPTR.its.spc.bt.d1 \ $w.fr.fWPTR.its.spc.bt.sep $w.fr.fWPTR.its.spc.bt.d2 -side left \ -padx 2 pack $w.fr.fWPTR.its.spc.wt $w.fr.fWPTR.its.spc.bt -side top -pady 2 \ -anchor w pack $w.fr.fWPTR.its.tit $w.fr.fWPTR.its.spc -side left -padx 2 pack $w.fr.fWPTR.dist $w.fr.fWPTR.dir $w.fr.fWPTR.its -side top -anchor w pack $w.fr.fWPsy.b $w.fr.fWPsy.symb $w.fr.fWPsy.symbim \ $w.fr.fWPsy.symbname -side left -padx 2 pack $w.fr.fRT.b $w.fr.fRT.wp -side left -padx 2 pack $w.fr.tit $w.fr.wh $w.fr.dom $w.fr.strs -side top -pady 5 pack $w.fr.fWPTR $w.fr.fWPsy $w.fr.fRT -side top -pady 5 \ -anchor w foreach wh $trlaps { set f $w.fr.f$wh pack $f.b $f.d $f.m $f.y -side left -padx 2 pack $f -side top -pady 5 -anchor w } pack $w.fr.frbt.ok $w.fr.frbt.cnc -side left -padx 5 pack $w.fr.frbt -side top -pady 5 pack $w.fr update idletasks # apparently there is no need for a grab here # but if there is must take care of previous grabs (proc DestroyRGrabs) # cannot use RaiseWindow because of the menus return } proc DoSearch {w} { # begin search global SearchSpec SearchPattern SearchDistance SDatum SearchWPName \ SearchRTWP WPDatum WPPosn AzimuthDegrees DSCALE MESS INVTXT if { [set stypes $SearchSpec(_types)] == "" } { GMMessage $MESS(mustchoose1type) return } set whs "" foreach wh $stypes { if { $SearchSpec($wh) } { lappend whs $wh } } foreach s "name cmmt rmrk" { if { $SearchSpec($s) } { set SearchPattern($s) [$w.fr.strs.f$s.e get] } } if { $SearchSpec(dist) } { switch $SearchDistance(how) { fromWP { set ix [IndexNamed WP $SearchWPName] if { $ix != -1 } { set SearchDistance(pos) $WPPosn($ix) set Sdatum $WPDatum($ix) } else { GMMessage $MESS(badWP) return } } fromPos { set z $w.fr.fWPTR.dist.wpp.p.p.frp set p [PosnGetCheck $z.frp1 $SDatum GMMessage nil] if { $p == "nil" } { return } set SearchDistance(pos) $p set SearchDistance(pformt) $INVTXT([$z.pfmt cget -text]) } } if { $SearchDistance(bearing) != "" } { if { ! [CheckNumber GMMessage $SearchDistance(open)] } { return } if { $SearchDistance(open) > 359 || $SearchDistance(open) == 0 } { GMMessage $MESS(badangle) return } set SearchDistance(hangle) [expr $SearchDistance(open)/2.0] set SearchDistance(azimuth) \ $AzimuthDegrees($SearchDistance(bearing)) } else { set SearchDistance(hangle) 180 set SearchDistance(azimuth) 0 } switch $SearchDistance(range) { within { if { ! [CheckFloat GMMessage $SearchDistance(dist)] } { return } set SearchDistance(low) 0 set SearchDistance(up) [expr $DSCALE*$SearchDistance(dist)] } between { if { ! [CheckFloat GMMessage $SearchDistance(from)] || \ ! [CheckFloat GMMessage $SearchDistance(to)]} { return } set SearchDistance(low) [expr $DSCALE*$SearchDistance(from)] set SearchDistance(up) [expr $DSCALE*$SearchDistance(to)] } } } if { $SearchSpec(RTWP) && $SearchRTWP == "" } { GMMessage $MESS(badWP) return } if { [SearchFor $whs] } { destroy $w } return } proc SearchDescription {} { # return a text with the search constraints which are described # by global variables (see proc SearchForAny) and the state of the # search window global SearchDomain SearchDomGR GRName SearchSpec SearchPattern \ SearchDistance SearchWPName SDatum SearchWPSymbol \ SearchRTWP SearchDate TXT SUPPORTLAPS if { $SearchDomain == "GR" } { set ddomgr "" ; set p "" foreach ix $SearchDomGR { lappend ddomgr "${p}$GRName($ix)" set p ", " } } else { set ddomgr "" } set ddom "$TXT(srchdd1) $TXT(srchdd2$SearchDomain)${ddomgr}" set dstrs "" ; set p "" ; set fstrs "" foreach s "name cmmt rmrk" { if { $SearchSpec($s) } { lappend dstrs "${p}$TXT($s):$SearchPattern($s)" set p ", " ; set fstrs "\n" } } set ddist "" ; set f "" if { $SearchSpec(dist) } { switch $SearchDistance(how) { fromWP { set ddistfrom "$TXT(from) $SearchWPName" } fromPos { set pf $TXT($SearchDistance(pformt)) set p [lrange $SearchDistance(pos) 2 end] set ddistfrom "$TXT(from) $pf $p ($SDatum)" } } if { [set b $SearchDistance(bearing)] != "" } { set ddistbear \ " $TXT(azimuth) $b, $TXT(opening) $SearchDistance(open);\n" } else { set ddistbear "" } switch $SearchDistance(range) { within { set ddistrge " $TXT(within) $SearchDistance(dist)" } between { set ddistrge \ " $TXT(between) $SearchDistance(from)..$SearchDistance(to)" } } set ddist "${ddistfrom};\n${ddistbear}$ddistrge" set f ";\n" } set dsymb "" if { $SearchSpec(symbol) } { set dsymb "${f}$TXT(with) $TXT(symbol) $TXT(SY$SearchWPSymbol)" set f ";\n" } set drtwp "" if { $SearchSpec(RTWP) } { set drtwp "${f}$TXT(with) $TXT(nameWP) $SearchRTWP" set f ";\n" } set dtrdt "" if { $SearchSpec(TR,date) } { set dtrdt \ "${f}$TXT(date) $SearchDate(TR,d) $SearchDate(TR,m) $SearchDate(TR,y)" set f ";\n" } set dlapdt "" if { $SUPPORTLAPS && $SearchSpec(LAP,date) } { set dlapdt \ "${f}$TXT(date) $SearchDate(LAP,d) $SearchDate(LAP,m) $SearchDate(LAP,y)" set f ";\n" } if { $f != "" } { set f "\n" } return \ "${ddom}\n${dstrs}${fstrs}${ddist}${dsymb}${drtwp}${dtrdt}${dlapdt}.$f" } proc SearchFor {whs} { # search for items of given types # search constraints are described by global variables (see proc # SearchForAny) # if constraints are void the search will produce all items # search domain is given by $SearchDomain (in {Data, GR}), and # $SearchDomGr (indices of groups to be searched) # search in groups will always be recursive # return 0 if no item found or user wants a new search, 1 otherwise global SearchDomain SearchDomGR Storage Number MESS set lp "" foreach wh $whs { set ids [lindex $Storage($wh) 0] global $ids if { $SearchDomain == "GR" } { set ixs [GRsElements $SearchDomGR 1 $wh] } else { set ixs [array names $ids] } if { [set ns [SearchForAny $ids $ixs $wh]] != "" } { lappend lp [list $wh $ns] } } if { $lp != "" } { return [SearchResults $lp] } GMMessage $MESS(nosuchitems) return 0 } proc SearchForAny {ids ixs wh} { # search for items of type $wh in $TYPES # $ids is storage name for item identifiers # $ixs is indices representing the search domain # constraints on search given by: # $SearchSpec($s), $s in {name, cmmt, rmrk} boolean # $SearchPattern($s) gives pattern to match against identifier, # comment (not for TR, GR), or remark # for WP and TR: # $SearchSpec(dist) boolean # $SearchDistance(pos) is position with $SDatum # $SearchDistance(azimuth) compass direction in degrees # $SearchDistance(hangle) half angle for azimuth range in degrees # $SearchDistance(low) in kms # $SearchDistance(up) in kms # for WP: # $SearchSpec(symbol) boolean, $SearchWPSymbol # for RT: # $SearchSpec(RTWP) boolean, $SearchRTWP # for TR, LAP: # $SearchSpec($wh,date) boolean # $SearchDate($wh,d) day of month (range not checked) or "" # $SearchDate($wh,m) month name or "" # $SearchDate($wh,y) year or "" # return list of names global SearchSpec SearchPattern SDatum SearchWPSymbol \ SearchRTWP SearchDate WPPosn WPDatum RTWPoints TRTPoints TRDatum \ LAPStart if { $ixs == "" } { return "" } foreach s "name rmrk" a "$ids ${wh}Obs" { if { $SearchSpec($s) } { set ixs [SearchFilter $a $ixs $SearchPattern($s)] } } if { $ixs == "" } { return "" } switch $wh { WP { if { $SearchSpec(cmmt) } { set ixs [SearchFilter WPCommt $ixs $SearchPattern(cmmt)] } if { $SearchSpec(symbol) } { set ixs [SearchFilterId WPSymbol $ixs $SearchWPSymbol] } if { $SearchSpec(dist) } { SetDatumData $SDatum set nixs "" foreach ix $ixs { if { [SearchDistConstr $WPPosn($ix) $WPDatum($ix)] } { lappend nixs $ix } } set ixs $nixs } } RT { if { $SearchSpec(cmmt) } { set ixs [SearchFilter RTCommt $ixs $SearchPattern(cmmt)] } if { $SearchSpec(RTWP) } { set nixs "" foreach ix $ixs { foreach wpn $RTWPoints($ix) { if { $SearchRTWP == $wpn } { lappend nixs $ix break } } } set ixs $nixs } } TR { if { $SearchSpec(TR,date) } { set s 3 foreach a "d m y" { if { [set $a $SearchDate(TR,$a)] == "" } { set $a * incr s -1 } } if { $s > 0 } { set nixs "" foreach ix $ixs { set p [lindex $TRTPoints($ix) 0] if { [CompatibleDates $y $m $d [lindex $p 5]] } { lappend nixs $ix } } set ixs $nixs } } if { $SearchSpec(dist) } { SetDatumData $SDatum set nixs "" foreach ix $ixs { set d $TRDatum($ix) foreach p $TRTPoints($ix) { if { [SearchDistConstr $p $d] } { lappend nixs $ix break } } } set ixs $nixs } } LAP { if { $SearchSpec(LAP,date) } { set s 3 foreach a "d m y" { if { [set $a $SearchDate(LAP,$a)] == "" } { set $a * incr s -1 } } if { $s > 0 } { set nixs "" foreach ix $ixs { set secs [lindex $LAPStart($ix) 1] if { [CompatibleDates $y $m $d $secs] } { lappend nixs $ix } } set ixs $nixs } } } } return [lsort [Apply $ixs NameOf $wh]] } proc SearchDistConstr {pos datum} { # check search distance constraint defined as described in proc # SearchForAny # assume SetDatumData $SDatum has been called global SearchDistance SDatum if { $SDatum != $datum } { set pos [ToDatum [lindex $pos 0] [lindex $pos 1] $datum $SDatum] } set db [ComputeDistBearFD $SearchDistance(pos) $pos] set d [lindex $db 0] if { $SearchDistance(low)>$d || $d>$SearchDistance(up) } { return 0 } if { [set dd [expr abs($SearchDistance(azimuth)-[lindex $db 1])]] > 180 } { set dd [expr 360-$dd] } if { $dd > $SearchDistance(hangle) } { return 0 } return 1 } proc SearchFilter {arr ixs patt} { # select indices from $ixs in array $arr whose contents follow pattern global $arr set nixs "" foreach ix $ixs { if { [string match $patt [set [set arr]($ix)]] } { lappend nixs $ix } } return $nixs } proc SearchFilterId {arr ixs str} { # select indices from $ixs in array $arr whose contents is $str global $arr set nixs "" foreach ix $ixs { if { [set [set arr]($ix)] == $str } { lappend nixs $ix } } return $nixs } proc SearchResults {lp} { # present search results described by list of pairs: type, names # this is currently done by creating and opening a group # return 0 if a new search is asked for by the user global TXT MESS EdWindow GRName set ix [CreateGRFor srchres [SearchDescription] $lp] set w [OpenItem GR $ix] switch [GMSelect "$MESS(resultsin) $GRName($ix)" \ [list $TXT(ok) $TXT(another) $TXT(change) $TXT(cancel)] \ "ok another change cancel"] { ok { } another { return 0 } change { destroy $w Forget GR $ix return 0 } cancel { destroy $w Forget GR $ix } } return 1 } proc SearchToggleDomain {} { # make user select groups whose flatenning will be the search domain # if domain is now a set of groups # if selection is cancelled search domain reverts to data-base global SearchDomain SearchDomGR GRName TXT if { $SearchDomain == "Data" } { return } set w .gmsearch $w.fr.dom.gr.mb.m delete 0 end set SearchDomGR [ChooseItems GR] switch [llength $SearchDomGR] { 0 { set SearchDomain Data $w.fr.dom.gr.mb configure -text "" } 1 { $w.fr.dom.gr.mb configure -text $GRName($SearchDomGR) } default { $w.fr.dom.gr.mb configure -text "; $TXT(list) ..." foreach ix $SearchDomGR { $w.fr.dom.gr.mb.m add command -label $GRName($ix) } } } return } proc SearchToggle {wh} { # enable/disable checkbuttons in search window that are specific to # search of $wh (in $TYPES or LAP) items global SearchSpec SearchWidgets if { $SearchSpec($wh) } { set st normal } else { set st disabled } foreach w $SearchWidgets($wh) { switch -glob $w { */* { set l [split $w /] set wh2 [lindex $l 0] ; set w [lindex $l 1] if { $SearchSpec($wh) == $SearchSpec($wh2) } { if { ! $SearchSpec($wh) } { $w deselect } $w configure -state $st } else { $w configure -state normal } } * { if { ! $SearchSpec($wh) } { $w deselect } $w configure -state $st } } } return } proc SearchChangeDatum {datum args} { # change datum of search window # $args is not used but is needed as this is called-back from a menu ChangeDatum $datum SDatum SDatum nil .gmsearch.fr.fWPTR.dist.wpp.p.p.frp return } proc SearchBearingAngle {} { # change suggested default for bearing opening-angle in WP/TR search window global SearchDistance switch $SearchDistance(range) { within { set SearchDistance(opendef) 45 } between { if { [CheckFloat Ignore $SearchDistance(from)] && \ [CheckFloat Ignore $SearchDistance(to)] } { if { $SearchDistance(to) <= 1e-20 } { set SearchDistance(opendef) 45 } else { set SearchDistance(opendef) [expr round(atan( \ 1.0*($SearchDistance(to)-$SearchDistance(from)) \ /$SearchDistance(to))*57.29577951308232087684)] } } else { set SearchDistance(opendef) ??? } } } return } proc SearchChangeSymbol {symbol args} { # change symbol of search window # $args not used, but called back like this global SearchWPSymbol SYMBOLIMAGE TXT set SearchWPSymbol $symbol set fr .gmsearch.fr.fWPsy $fr.symbim delete all $fr.symbim create image 1 5 -anchor nw -image $SYMBOLIMAGE($symbol) $fr.symbname configure -text $TXT(SY$symbol) return } gpsman-6.4.4.2/gmsrc/recdefs.tcl0000644000175000017500000000600412224351120014506 0ustar migmig# # This file is part of: # # gpsman --- GPS Manager: a manager for GPS receiver data # # Copyright (c) 1998-2013 Miguel Filgueiras migfilg@t-online.de # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. # # File: recdefs.tcl # Last change: 6 October 2013 # # Includes contributions by Matt Martin (matt.martin_AT_ieee.org) # marked "MGM contribution" # # general definitions that may depend on the receiver trade-mark set TYPES {WP RT TR LN GR} set PROCTYPES {GMWPoint GMRoute GMTrack GMLine GMGroup} set MAPTYPES {WP RT TR} # types of other information that can be got from receiver (e.g., almanacs) set RECINFO {} set MAX(WP) $MAXWPOINTS set MAX(RT) $MAXROUTES set MAX(TR) $MAXTPOINTS # GR must be the last element of $RECTYPES list switch $MYGPS { Garmin { # RECTYPES and RECINFO may be changed by # proc RecAdjustToProtocols (garmin.tcl) # so they are saved here in ORIGRECTYPES and ORIGRECINFO if { $SUPPORTLAPS } { set RECTYPES {WP RT TR LAP GR} } else { set RECTYPES {WP RT TR GR} } set RECINFO {AL} set ORIGRECTYPES $RECTYPES ; set ORIGRECINFO $RECINFO # possible baud rates set RECBAUDS [list 9600 19200 57600 115200 230400] # character set for names set RECNAMECHARS(Garmin) {^[-A-Z0-9]*$} set RECNAMECHARS(Garmin,mess) "A..Z, 0..9, \"-\"" set UNDEFDATESECS [DateToSecs 1989 12 31 1 0 0] } Lowrance { set RECTYPES {WP IC RT TR GR} set RECNAMECHARS(Lowrance) {^[-A-Z0-9.'()/ ]*$} set RECNAMECHARS(Lowrance,mess) \ "A..Z, 0..9, \"-\", \"'\", \".\", \"/\", \"(\", \")\"" # default values set MAX(IC) 100 set MAXICG 100 set UNDEFDATESECS 0 } Magellan { # MGM contribution set RECTYPES {WP RT TR GR} # MF contribution: from recmodels.tcl, added 4800 for Meridian Platinum set RECBAUDS [list 4800 9600 19200 57600 115200] # character set for names set RECNAMECHARS(Magellan) {.*} set RECNAMECHARS(Magellan,mess) $TXT(any) set UNDEFDATESECS 0 } } ## set the options that depend on the receiver RecModelChange $MYGPS ## user may wish to have no tests... proc RecCanSendAnything {brand} { # use an "accept anything from receiver" setting # $brand in {Garmin, Lowrance, Magellan} global ACCEPTALLCHARS RECTYPES MAX MAXICG set ACCEPTALLCHARS 1 foreach t $RECTYPES { set MAX($t) 1000000 } foreach x "WPOINTS ROUTES WPINROUTE TPOINTS" { global MAX$x set MAX$x 10000000 } switch $brand { Garmin { } Lowrance { set MAXICG 1000000 } Magellan { } } return } gpsman-6.4.4.2/gmsrc/know.tcl0000644000175000017500000007037112224351120014061 0ustar migmig# # This file is part of: # # gpsman --- GPS Manager: a manager for GPS receiver data # # Copyright (c) 1998-2013 Miguel Filgueiras migfilg@t-online.de # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. # # File: know.tcl # Last change: 6 October 2013 # # Includes contributions by Brian Baulch (baulchb_AT_onthenet.com.au) # marked "BSB contribution" # proc NewItem {wh} { # open window for defining a new item # $wh in $TYPES global CREATIONDATE Proc DataDefault set opts {create revert cancel} switch $wh { WP { if { $CREATIONDATE } { GMWPoint -1 $opts [FormData WP Date [list [Now]]] } else { GMWPoint -1 $opts [FormData WP Commt [list [DateCommt [Now]]]] } } default { $Proc($wh) -1 $opts $DataDefault($wh) } } return } proc CreateItem {wh data} { # create a new item of given type and with given data # return index of new item global Index Number WPRoute set ix $Index($wh) incr Index($wh) ; incr Number($wh) ; incr Number(Data) SetItem $wh $ix $data ; ListAdd $wh $ix if { $Number(Data) == 1 } { ChangeOnState datastate normal } if { $wh == "WP" } { set WPRoute($ix) "" } return $ix } proc CreateGRFor {iname obs lp} { # create a GR # $iname is index of TXT to use as prefix for GR name, or is a literal # prefix if given as =PREFIX, or has the form @NAME for a # literal name (if in use, the existing GR will be replaced) # $obs is GR remark # $lp is GR contents # return index of new GR global TXT GRDispl if { [regsub {^@} $iname "" grname] } { set ix [IndexNamed GR $grname] set data [FormData GR "Name Obs Conts" [list $grname $obs $lp]] if { $ix != -1 } { if { $GRDispl($ix) } { UnMapGR $ix } SetItem GR $ix $data UpdateItemWindows GR $ix } else { set ix [CreateItem GR $data] } return $ix } if { ! [regsub {^=} $iname "" pre] } { set pre $TXT($iname) } set n 0 while 1 { set grname [format "$pre %d" $n] if { [IndexNamed GR $grname] == -1 } { set data [FormData GR "Name Obs Conts" [list $grname $obs $lp]] return [CreateItem GR $data] break } incr n } # not used return } proc ItemData {wh index} { # find data for item with given index # $wh in $TYPES or LAP # return list of values in the order given by $Storage($wh) # see GMStart (setup.tcl) for the description of data arrays global Storage set l "" foreach s $Storage($wh) { global $s set l [lappend l [set [set s]($index)]] } return $l } proc FormData {wh names vals} { # create a data list for an item of type $wh (in $TYPES, or LAP, TP, LP) # $names is a list of data array names without the prefix $wh # $vals is a list of values aligned with $names # return list of values in the order given by $DataIndex($wh) # (if $wh in $TYPES or LAP that is the order of $Storage($wh)) using # default values for those not given in $vals # see GMStart (setup.tcl) for the description of data arrays global DataDefault DataIndex set l $DataDefault($wh) foreach n $names v $vals { set i $DataIndex(${wh}$n) set l [lreplace $l $i $i $v] } return $l } proc SetItem {wh index data} { # set data for item with given index # $wh in $TYPES or LAP # see GMStart (setup.tcl) for description of data arrays global Storage IndexOf set ids [lindex $Storage($wh) 0] global $ids set name [lindex $data 0] if { ! [catch {set oldname [set [set ids]($index)]}] && \ $oldname != $name } { unset IndexOf($wh,$oldname) } set IndexOf($wh,$name) $index foreach val $data field $Storage($wh) { global $field set [set field]($index) $val } return } proc UnsetItem {wh index} { # destroy data for item with given index # $wh in $TYPES or LAP # see GMStart (setup.tcl) for description of data arrays global Storage IndexOf set ids [lindex $Storage($wh) 0] global $ids unset IndexOf($wh,[set [set ids]($index)]) foreach field $Storage($wh) { global $field unset [set field]($index) } return } proc UnsetSeveral {wh ixs} { # destroy data for items with given indices # $wh in $TYPES or LAP # see GMStart (setup.tcl) for description of data arrays global Storage IndexOf set ids [lindex $Storage($wh) 0] global $ids foreach ix $ixs { unset IndexOf($wh,[set [set ids]($ix)]) } foreach field $Storage($wh) { global $field foreach ix $ixs { unset [set field]($ix) } } return } proc UnsetAll {wh} { # destroy data for all items with given type # $wh in $TYPES or LAP # see GMStart (setup.tcl) for description of data arrays global Storage IndexOf array unset IndexOf $wh,* foreach arr $Storage($wh) { global $arr unset $arr } return } proc Forget {wh ix} { # forget an item with given index; $wh in $TYPES or LAP global ${wh}Displ RTIdNumber RTWPoints Number MESS TXT # BSB contribution global MYGPS WPName WPNum UnusedICInx UnusedWPInx if { [set ${wh}Displ($ix)] && $wh != "LAP" && ! [UnMap $wh $ix] && \ $wh != "GR" } { GMMessage [format $MESS(cantfgt) $TXT(name$wh)] return 0 } switch $wh { WP { # BSB contribution if { $MYGPS == "Lowrance" } { if { [string match "ICON*" $WPName($ix)] } { lappend UnusedICInx $WPNum($ix) } else { lappend UnusedWPInx $WPNum($ix) } } } RT { UnsetWPRoute $RTIdNumber($ix) $RTWPoints($ix) } } ListDelete $wh $ix ; UnsetItem $wh $ix incr Number($wh) -1 ; incr Number(Data) -1 if { $Number(Data) == 0 } { ChangeOnState datastate disabled } return 1 } proc ForgetSeveral {wh ixs} { # forget several items with given indices; $wh in $TYPES or LAP # $ixs has the same order of $ListInds($wh) although with some # elements missing # proc based on proc Forget global ${wh}Displ RTIdNumber RTWPoints Number MESS TXT \ MYGPS WPName WPNum UnusedICInx UnusedWPInx if { $wh == "GR" || $wh == "LAP" } { set fs $ixs ; set cf [expr -[llength $ixs]] } else { set fs "" ; set cf 0; set nf 0 foreach ix $ixs { if { [set ${wh}Displ($ix)] && ! [UnMap $wh $ix] } { set nf 1 continue } switch $wh { WP { if { $MYGPS == "Lowrance" } { if { [string match "ICON*" $WPName($ix)] } { lappend UnusedICInx $WPNum($ix) } else { lappend UnusedWPInx $WPNum($ix) } } } RT { UnsetWPRoute $RTIdNumber($ix) $RTWPoints($ix) } } lappend fs $ix incr cf -1 } if { $nf } { GMMessage [format $MESS(cantfgt) $TXT(name$wh)] } } incr Number($wh) $cf ; incr Number(Data) $cf if { $Number($wh) == 0 } { if { $Number(Data) == 0 } { ChangeOnState datastate disabled } ChangeOnStateList $wh disabled UnsetAll $wh ; ListDeleteAll $wh } else { UnsetSeveral $wh $fs ; ListDeleteSeveral $wh $fs } return } proc AllIndicesForType {wh types} { # return list of pairs with type and list of indices for all items # of either all $types if $wh==Data, or for type $wh # in the former case, the order of the list is that imposed by $types # and this may be important when writing to files in a format that # imposes a specific order in the data global Storage Number if { $wh != "Data" } { set ids [lindex $Storage($wh) 0] global $ids set ixs [array names $ids] return [list [list $wh $ixs]] } set lp "" foreach wh $types { if { $Number($wh) > 0 } { set ids [lindex $Storage($wh) 0] global $ids set ixs [array names $ids] lappend lp [list $wh $ixs] } } return $lp } proc IndexNamed {wh name} { # find index for item with given name; $wh in $TYPES or LAP global IndexOf if { [catch {set ix $IndexOf($wh,$name)}] } { return -1 } return $ix } proc NameOf {wh ix} { # return name of item with given index; $wh in $TYPES or LAP global Storage set ids [lindex $Storage($wh) 0] global $ids return [set [set ids]($ix)] } proc NewName {wh args} { # return an unused valid name for an item of type $wh in $TYPES # $args may be the previous name if $wh==WP # that may be used as prefix of new name if formed of acceptable chars # in other cases use numbers from 0 with prefix "${wh}-" unless $wh==RT global NAMELENGTH MAXROUTES ACCEPTALLCHARS RECNAMECHARS set pre ${wh}- ; set k 0 switch $wh { WP { set oldname [lindex $args 0] if { $oldname != "" && \ ($ACCEPTALLCHARS || [CheckName Ignore $oldname]) } { set pre [string range $oldname 0 [expr $NAMELENGTH-3]] } if { [set d [expr $NAMELENGTH-[string length $pre]]] > 9 } { set d 9 } set max [expr int(pow(10,$d))-1] while 1 { # will loop forever if more than 100000 are generated... set n "${pre}[format %0${d}d $k]" if { [IndexNamed WP $n] == -1 } { return $n } if { $k == $max } { incr d ; set k 0 if { [set pre [string range $pre 0 end-1]] == "" } { return [NewName WP ZY-] } } else { incr k } } } RT { while 1 { if { [IndexNamed RT [incr k]] == -1 } { return $k } } } default { while 1 { set name ${pre}[format %06d [incr k]] if { [IndexNamed $wh $name] == -1 } { return $name } } } } # not used return } proc SetWPRoute {rt wps} { # insert (in order) RT name $rt in list of RTs of each known WP # whose name belongs to $wps global WPRoute foreach wp $wps { if { [set ix [IndexNamed WP $wp]] != -1 } { if { [lsearch -exact $WPRoute($ix) $rt] == -1 } { lappend WPRoute($ix) $rt set WPRoute($ix) [lsort $WPRoute($ix)] } } } return } proc UnsetWPRoute {rt wps} { # delete RT name $rt in list of RTs of each given WP # that is defined global WPRoute foreach wp $wps { set ix [IndexNamed WP $wp] if { $ix != -1 } { set wi [lsearch -exact $WPRoute($ix) $rt] if { $wi != -1 } { set WPRoute($ix) [lreplace $WPRoute($ix) $wi $wi] } } } return } proc RenameWPRoute {oldname newname wps} { # change RT name in list of RTs of each given WP # that is defined or add new name if old not found global WPRoute foreach wp $wps { set ix [IndexNamed WP $wp] if { $ix != -1 } { set wi [lsearch -exact $WPRoute($ix) $oldname] if { $wi != -1 } { set WPRoute($ix) [lreplace $WPRoute($ix) $wi $wi \ $newname] } else { lappend $WPRoute($ix) $newname } set WPRoute($ix) [lsort $WPRoute($ix)] } } return } proc DateCommt {date} { # create comment from date global COMMENTLENGTH NOLOWERCASE regsub -all {:|\.} $date "" date if { [string length $date] > $COMMENTLENGTH } { set date [string range "$date" 0 [expr $COMMENTLENGTH-1]] } if { $NOLOWERCASE } { return [string toupper "$date"] } return $date } ## operations on groups proc GRsElements {ixs rec wh} { # find elements of type $wh (in $TYPES or LAP) in groups with # given indices; if $wh==GR the initial GRs are included in the result; # undefined elements are not included # $rec is 1 if search is recursive # return list of indices global GMember catch { unset GMember } if { $wh == "GR" } { foreach ix $ixs { set GMember($ix) 1 } } GRsElsCollect $ixs $rec $wh set l [array names GMember] catch { unset GMember } return $l } proc GRsElsCollect {ixs rec wh} { # mark defined elements of type $wh (in $TYPES or LAP) in groups with # given indices # $rec is 1 if search is recursive # marked elements with index $i will have GMember($i) set global GRConts GMember foreach ix $ixs { foreach p $GRConts($ix) { if { [lindex $p 0] == $wh } { foreach e [lindex $p 1] { if { [set eix [IndexNamed $wh $e]] != -1 } { set GMember($eix) 1 } } if { ! $rec } { break } } if { $rec && [lindex $p 0] == "GR" } { set rixs [Apply [lindex $p 1] IndexNamed GR] while { [set i [lsearch -exact $rixs -1]] != -1 } { set rixs [lreplace $rixs $i $i] } GRsElsCollect $rixs 1 $wh } } } return } proc GRWPNames {conts} { # find names of WPs in given GR contents # return pair with index of WP-pair entry in $conts, followed by list # of names, on failure the index is meaningless and the list is empty set names {} ; set ics 0 foreach p $conts { if { [lindex $p 0] == "WP" } { set names [lindex $p 1] break } incr ics } return [list $ics $names] } ## renaming items proc InitWPRenaming {} { # this proc must be called before any input operation! # initialize variables before an input operation (get, load, import) # for use with procs AskForName and ReplaceWPName # returns 0 if another renaming operation is under way global ReplNames MESS if { $ReplNames(busy) } { GMMessage $MESS(busytrylater) return 0 } array set ReplNames {busy 1 old {} new {} wps {} grs {} how ask} return 1 } proc EndWPRenaming {} { # this proc must be called after any input operation that stored data! # build a group with renamed WPs as well as GRs in which they occur # after an input operation (get, load, import) global ReplNames if { $ReplNames(old) != {} || $ReplNames(wps) != {} } { set nwps $ReplNames(new) foreach m $ReplNames(wps) { lappend nwps [lindex $m 1] } set lp [list [list WP [lsort -dictionary $nwps]]] if { $ReplNames(grs) != {} } { set ns {} foreach n $ReplNames(grs) { if { [lsearch -exact $ns $n] == -1 && \ [IndexNamed GR $n] != -1 } { lappend ns $n } } lappend lp [list GR [lsort -dictionary $ns]] } CreateGRFor renres "" $lp } set ReplNames(busy) 0 return } proc GetReplNameInGR {name id} { # get replacement for a WP name appearing in a GR # $id is the GR name # return $name if there is no replacement, otherwise the one that # was done last global ReplNames set chg 0 if { [set ix [lsearch -exact $ReplNames(old) $name]] != -1 } { set name [lindex $ReplNames(new) $ix] ; incr chg } foreach t $ReplNames(wps) { if { [lindex $t 0] == $name } { set name [lindex $t 1] ; incr chg break } } if { $chg && [lindex $ReplNames(grs) 0] != $id } { set ReplNames(grs) [linsert $ReplNames(grs) 0 $id] } return $name } proc AskForName {name} { # obtain a replacement for a WP $name which is not valid by one of # - checking if it was already replaced # - letting the user write the new name # - applying a renaming method selected by the user # - generating an automatic replacement # proc InitWPRenaming must be called before the first call to this proc # and proc EndWPRenaming must be called after the renaming operation # is finished # create modal dialog for displaying message # buttons: OK, Cancel # binding: return to accept # return empty string on cancel global MYGPS RECNAMECHARS NAMELENGTH GMResAsk COLOUR EPOSX EPOSY MESS TXT \ ReplNames CMDLINE if { [set ix [lsearch -exact $ReplNames(old) $name]] != -1 } { return [lindex $ReplNames(new) $ix] } if { $ReplNames(how) == "methall" } { set nn [RenameMethApplyTo $name $ReplNames(method) Ignore] lappend ReplNames(old) $name lappend ReplNames(new) $nn return $nn } if { $ReplNames(how) == "genall" || $CMDLINE } { set nn [NewName WP $name] lappend ReplNames(old) $name lappend ReplNames(new) $nn return $nn } GMToplevel .askname change +$EPOSX+$EPOSY . \ {WM_DELETE_WINDOW {set GMResAsk cnc}} \ [list {set GMResAsk ok}] frame .askname.fr -relief flat -borderwidth 5 -bg $COLOUR(confbg) label .askname.fr.title -text "!!!" -relief sunken message .askname.fr.text -aspect 1000 \ -text [format $MESS(replname) $name $NAMELENGTH \ $RECNAMECHARS($MYGPS,mess)] entry .askname.fr.name -width $NAMELENGTH TextBindings .askname.fr.name set fbs .askname.fr.bs frame $fbs -relief flat -borderwidth 0 button $fbs.ok -text $TXT(ok) -command { set GMResAsk ok } foreach x {gen meth} t {generate renamethod} { menubutton $fbs.$x -text $TXT($t) -relief raised -menu $fbs.$x.m menu $fbs.$x.m } $fbs.gen.m add command -label $TXT(forthisWP) \ -command { set ReplNames(how) ask ; set GMResAsk gen } $fbs.gen.m add command -label $TXT(forall) \ -command { set ReplNames(how) genall ; set GMResAsk gen } # 2 menus are needed as not all platforms support cascade commands foreach x {ask methall} t {forthisWP forall} { set mx $fbs.meth.m.$x $fbs.meth.m add cascade -label $TXT($t) -menu $mx menu $mx menu $mx.m -postcommand \ [list FillDefsMenu renamethod $mx.m [list AskForNameMethod $x]] $mx add cascade -label $TXT(use) -menu $mx.m $mx add command -label $TXT(define) \ -command [list AskForNameMethod define-$x {}] } button $fbs.cancel -text $TXT(cancel) \ -command { set GMResAsk cnc } pack $fbs.ok $fbs.gen $fbs.meth $fbs.cancel -side left -pady 5 pack .askname.fr.title .askname.fr.text .askname.fr.name $fbs \ -side top -pady 5 pack .askname.fr -side top update idletasks set gs [grab current] grab .askname RaiseWindow .askname while 1 { tkwait variable GMResAsk switch $GMResAsk { "" { } ok { set res [string trim [.askname.fr.name get]] if { [CheckName Ignore $res] } { if { [lsearch -exact $ReplNames(new) $res] != -1 || \ [IndexNamed WP $res] != -1 } { GMMessage $MESS(idinuse) ; continue } break } bell } gen { set res [NewName WP $name] break } meth { if { $ReplNames(method) == "" } { set ReplNames(how) ask continue } set res [RenameMethApplyTo $name $ReplNames(method) Ignore] break } cnc { set res "" ; break } } } if { $res != "" } { lappend ReplNames(old) $name lappend ReplNames(new) $res } DestroyRGrabs .askname $gs update idletasks return $res } proc AskForNameMethod {how method args} { # a WP renaming method is to be applied # $how in {ask, methall, define-ask, define-methall} indicates # whether the choice is for this or all WPs and if the method is to # be defined # $method is the name of renaming method to use or empty meaning, # unless the method is to be defined, that operation is to be cancelled # $args not in use but is needed because of proc FillMenu # this proc only changes the global variables that force # proc AskForName to do the intended actions global ReplNames GMResAsk if { [regsub {^define-} $how "" how] } { set method [Define renamethod] } set ReplNames(how) $how ; set ReplNames(method) $method # must be the last one set GMResAsk meth return } proc SamePosnDat {posndat1 posndat2} { # check whether two positions are the same # $posndat_ is a list with lat, long (in DDD) and datum foreach "lat1 long1 dat1" $posndat1 { break } foreach "lat2 long2 dat2" $posndat2 { break } if { $posndat1 != $posndat2 } { foreach "lat2 long2" [ToDatum $lat2 $long2 $dat2 $dat1] { break } } return [expr $lat1 == $lat2 && $long1 == $long2] } proc ReplaceWPName {name posndat} { # return a replacement name for a WP being read in # $name is the name to be replaced # $posndat is list with lat, long and datum defining the WP # position (possibly not in the WP datum) # use record of previous replacements # $ReplNames(wps), a list of triples with old name, new name and # position+datum (as $posndat) # this list must be initialized when starting a reading operation (get, # load, import) (see proc InitWPRenaming), and is kept as a stack # with the last replacement done as its head global ReplNames foreach t $ReplNames(wps) { if { [lindex $t 0] == $name && [SamePosnDat $posndat [lindex $t 2]] } { return [lindex $t 1] } } set n [NewName WP $name] set ReplNames(wps) [linsert $ReplNames(wps) 0 [list $name $n $posndat]] return $n } proc SamePosn {ix data} { # check whether the WP with given index has the same position as the # WP with given data even if the datums used are different # return either 1, or list with lat, long (in DDD), and datum # for the position of 2nd WP (but in the datum of 1st) global WPPosn WPDatum DataIndex set ip $DataIndex(WPPosn) set id $DataIndex(WPDatum) set p [lindex $data $ip] ; set d [lindex $data $id] if { $WPDatum($ix) != $d } { set p [ToDatum [lindex $p 0] [lindex $p 1] $d $WPDatum($ix)] } if { [ComputeDist $p $WPPosn($ix) $WPDatum($ix)] < 0.003 } { return 1 } return [list [lindex $p 0] [lindex $p 1] $WPDatum($ix)] } proc AddToNB {nb txt} { # add $txt to remark $nb if { $nb != "" } { return "$nb\n$txt" } return $txt } proc AddOldNameToObs {wh data name} { # add old name to remark field of item of type $wh global TXT DataIndex set in $DataIndex(${wh}Obs) set nb [lindex $data $in] return [lreplace $data $in $in [AddToNB $nb "$TXT(oname): $name"]] } proc WPChangeNames {methname args} { # change names of items of type $wh (not LAP) # $methname is the name of renaming method to use or empty for cancel # $args not in use but is needed because of proc FillMenu # select the items then rename them global MESS TXT NAMELENGTH RENMETHS if { $methname == "" || \ [set ixs [ChooseItems WP many]] == "" } { return } RenameInternalWPs $methname [Apply $ixs NameOf WP] return } proc GMGRRenameWPs {w methname args} { # change names of selected WPs in group window $w # $methname is the name of renaming method to use or empty for cancel # $args not in use but is needed because of proc FillMenu # by construction WP names in a GR are all different global TXT NAMELENGTH if { $methname == "" } { return } if { [set names [GMGRCollectWPNames $w]] != {} && \ [set names [GMChooseFrom many "$TXT(select) $TXT(nameWP)" \ $NAMELENGTH $names $names]] != {} } { RenameInternalWPs $methname $names } return } proc RenameInternalWPs {methname names} { # apply a renaming method to WPs in the data-base or referred to # in a GR # $names is a list of the WP names # $methname is method name # start/end a renaming operation by calling procs InitWPRenaming # and EndWPRenaming, ensuring no other renaming takes place # use proc CheckName to verify the result of the method and # if the result is not acceptable use proc NewName to get a # suitable one # update data-base, map, and edit/show windows global WPName WPRoute WPObs WPDispl RTWPoints GRConts IndexOf \ ReplNames TXT set descmethod [lindex [GetDefFields renamethod $methname method] 0] if { $names == {} || \ [set method [lindex $descmethod 1]] == {} || \ [InitWPRenaming] == 0 } { return } set replold {} ; set replnew {} foreach name $names { if { [set nname [RenameMethApply $method $name \ $replnew Ignore]] == "" || \ ! [CheckName Ignore $nname] } { set nname [NewName WP $name] } lappend replold $name lappend replnew $nname if { [set ix [IndexNamed WP $name]] != -1 } { # update the data-base unset IndexOf(WP,$name) set IndexOf(WP,$nname) $ix set WPName($ix) $nname set WPObs($ix) [AddToNB $WPObs($ix) "$TXT(oname): $name"] # update the items list and edit/show window ListDelete WP $ix ; ListAdd WP $ix UpdateItemWindows WP $ix # update map if { $WPDispl($ix) } { MoveOnMap WP $ix $name 1 $nname } } } # update RTs containing renamed WPs set rtixs {} foreach ixrt [array names RTWPoints] { foreach "chg RTWPoints($ixrt)" \ [ListReplace $RTWPoints($ixrt) $replold $replnew] {} if { $chg } { lappend rtixs $ixrt } } UpdateWPsInWindows RT $rtixs $replold $replnew # update GRs containing renamed WPs set grixs {} foreach grix [array names GRConts] { foreach {ics gwps} [GRWPNames $GRConts($grix)] {} if { $gwps != {} } { foreach {chg gwps} [ListReplace $gwps $replold $replnew] {} if { $chg } { set gwps [lsort -dictionary $gwps] set GRConts($grix) [lreplace $GRConts($grix) $ics $ics \ [list WP $gwps]] lappend grixs $grix } } } UpdateWPsInWindows GR $grixs $replold $replnew set ReplNames(old) $replold set ReplNames(new) $replnew EndWPRenaming return } proc RenameMethApplyTo {name methname errproc} { # apply a renaming method to WP with given $name # $methname is method name # to be used in the context of a renaming operation started by # calling proc InitWPRenaming and ended by calling proc EndWPRenaming # use proc CheckName to verify the result of the method and # if the result is not acceptable use proc NewName to get a # suitable one # return the new name global ReplNames set descmethod [lindex [GetDefFields renamethod $methname method] 0] if { [set method [lindex $descmethod 1]] == {} || \ [set nname [RenameMethApply $method $name \ $ReplNames(new) $errproc]] == "" || \ ! [CheckName $errproc $nname] } { return [NewName WP $name] } return $nname } ## storing data items just read in proc StoreWP {ix name data todispl} { # store WP data just read in # $todispl is true if the WP should be mapped # can only be called after a call to InitWPRenaming (use of ReplaceWPName) # return name of stored WP global WPRoute WPDispl EQNAMEDATA if { $ix != -1 } { if { $EQNAMEDATA == "ovwrt" || [set pd [SamePosn $ix $data]] == 1 } { set olddispl $WPDispl($ix) SetItem WP $ix $data if { $todispl || $olddispl } { set WPDispl($ix) 1 MoveOnMap WP $ix $name 0 $name } UpdateItemWindows WP $ix return $name } # replace name set data [AddOldNameToObs WP $data $name] set name [ReplaceWPName $name $pd] set data [lreplace $data 0 0 $name] } set ix [CreateItem WP $data] if { $todispl } { PutMap WP $ix } return $name } proc StoreRT {ix id data wps todispl} { # store RT data just read in # $todispl is true if the RT should be mapped global RTWPoints RTDispl if { $ix != -1 } { if { $RTDispl($ix) } { UnMapRT $ix set todispl 1 } UnsetWPRoute $id $RTWPoints($ix) SetItem RT $ix $data set RTDispl($ix) $todispl UpdateItemWindows RT $ix } else { set ix [CreateItem RT $data] } if { $todispl } { PutMap RT $ix } SetWPRoute $id $wps return } proc StoreTR {ix id data todispl} { # store TR data just read in # $todispl is true if the TR should be mapped global TRDispl if { $ix != -1 } { if { $TRDispl($ix) } { UnMapTR $ix set todispl 1 } SetItem TR $ix $data set TRDispl($ix) $todispl UpdateItemWindows TR $ix } else { set ix [CreateItem TR $data] } if { $todispl } { PutMap TR $ix } return } proc StoreLN {ix id data todispl} { # store TR data just read in # $todispl is true if the LN should be mapped global LNDispl if { $ix != -1 } { if { $LNDispl($ix) } { UnMapLN $ix set todispl 1 } SetItem LN $ix $data set LNDispl($ix) $todispl UpdateItemWindows LN $ix } else { set ix [CreateItem LN $data] } if { $todispl } { PutMap LN $ix } return } proc StoreLAP {ix name data} { # store LAP data just read in assumed to be a new lap if { $ix != -1 } { SetItem LAP $ix $data UpdateItemWindows LAP $ix } else { set ix [CreateItem LAP $data] } return $ix } proc StoreGR {ix id data todispl} { # store GR data just read in # $todispl is true if the GR should be mapped global GRDispl if { $ix != -1 } { if { $GRDispl($ix) } { UnMapGR $ix set todispl 1 } SetItem GR $ix $data set GRDispl($ix) $todispl UpdateItemWindows GR $ix } else { set ix [CreateItem GR $data] } if { $todispl } { PutMap GR $ix } return } gpsman-6.4.4.2/gmsrc/util.tcl0000644000175000017500000011751712224351120014064 0ustar migmig# # This file is part of: # # gpsman --- GPS Manager: a manager for GPS receiver data # # Copyright (c) 1998-2013 Miguel Filgueiras migfilg@t-online.de # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. # # File: util.tcl # Last change: 6 October 2013 # # Includes contributions by Brian Baulch (baulchb _AT_ onthenet.com.au) # marked "BSB contribution" # ## operations on menus proc FillMenu {menu commdargs descr} { # entry point for recursive call of FillMenuRec # $menu is the parent menu to fill in # $commdargs is the callback and initial arguments to associate to # each terminal entry; this is treated as a list to which will be # appended the entry and $menu (even on sub-menus) # $descr is a list describing the menu contents as follows: # @ LIST create sub-menu whose label is the head of $LIST, and # whose description is the 2nd and following elements of $LIST # --- insert separator # ENTRY create menu entry # sub-menus will be created when menu length would exceed MAXMENUITEMS $menu delete 0 end FillMenuRec $menu $menu $commdargs $descr return } proc FillMenuRec {w menu commdargs descr} { # fill in menus recursively according to description # see proc FillMenu for the meaning of the arguments global MAXMENUITEMS TXT set notsub 1 ; set c 1 ; set dl [llength $descr] foreach item $descr { if { $c == $MAXMENUITEMS && $c != $dl } { $menu add cascade -label "$TXT(more) ..." -menu $menu.m$c set menu $menu.m$c ; destroy $menu ; menu $menu -tearoff 0 set c 1 ; set dl [expr $dl-$MAXMENUITEMS+1] } if { $notsub } { if { $item != "@" } { if { $item != "---" } { set cmd $commdargs lappend cmd $item $w $menu add command -label $item -command $cmd } else { $menu add separator } } else { set notsub 0 ; incr c -1 ; incr dl -1 } } else { set notsub 1 set msub $menu.m$c $menu add cascade -label [lindex $item 0] -menu $msub destroy $msub ; menu $msub -tearoff 0 FillMenuRec $w $msub $commdargs [lrange $item 1 end] } incr c } return } proc FillMenuExec {menu call args} { # fill in menu with elements of list obtained by executing a command # $call is list to which is appended the selected element and which # will be called when a selection is made # $args will be "eval"-uated to obtain the list # text for each element is the element global MAXMENUITEMS TXT if { [winfo exists $menu] } { $menu delete 0 end } set n 0 ; set m 0 foreach f [eval $args] { if { $n > $MAXMENUITEMS } { $menu add cascade -label "$TXT(more) ..." -menu $menu.m$m set menu $menu.m$m destroy $menu ; menu $menu -tearoff 0 set n 0 ; incr m } $menu add command -label $f -command [linsert $call end $f] incr n } return } proc FillPFormtMenu {menu comm args} { # fill in menu with possible position formats # $comm is command to call with selected format followed by each of # $args except the first one # $args is a list whose first element is a list of formats not # to be shown; the other elements are arguments to $comm global GRIDS TXT MAXMENUITEMS NONGRIDFMTS if { [winfo exists $menu] } { $menu delete 0 end } set n 0 ; set m 0 # $GRIDS may change dynamically set fmts [concat $NONGRIDFMTS $GRIDS] foreach f [lindex $args 0] { if { [set i [lsearch -exact $fmts $f]] != -1 } { set fmts [lreplace $fmts $i $i] } } foreach f $fmts { if { $n > $MAXMENUITEMS } { $menu add cascade -label "$TXT(more) ..." -menu $menu.m$m set menu $menu.m$m destroy $menu ; menu $menu -tearoff 0 set n 0 ; incr m } $menu add command -label $TXT($f) \ -command [concat [list $comm $f] [lreplace $args 0 0]] incr n } return } ### positions proc FillPos {w pformt posns state chgvorp} { # create widgets to display positions # $w is path to either an empty frame where a single position in # lists $posns is to be displayed, or to frame that will contain # frames with widgets for each position in $posns # $pformt is the position format (see array POSTYPE, projections.tcl) # $posns is a list of positions (see proc FormatPosition, compute.tcl) # $state in {normal, disabled} # $chgvorp is either "nil" or: # - if there is a single position, the name of global variable to # set to 1 if the user types in any entry and that contains the # current position otherwise; see procs ChangePFormt and # PosnGetCheckEmpty # - else, "=PREFIX" describing global variables used in the same # way for each position; each name has the prefix followed by the # number from 1 of the position # the widgets for each position are created under frames $w.frp$i where $i # is the order from 1 # the frames $w.frp1, $w.frp2, ... are created and packed from top if # they do not exist global TXT POSTYPE switch $POSTYPE($pformt) { latlong { set ns [list $TXT(lat) $TXT(long)] set fs "lat long" ; set ws "12 12" } utm { set ns [list $TXT(ze) $TXT(zn) $TXT(eastng) $TXT(nrthng)] set fs "ze zn eng nng" ; set ws "3 3 8 8" } grid { set ns [list $TXT(zone) $TXT(eastng) $TXT(nrthng)] set fs "zn eng nng" ; set ws "5 8 8" } nzgrid { set ns [list $TXT(eastng) $TXT(nrthng)] set fs "eng nng" ; set ws "8 8" } mh { set ns "" ; set fs mh ; set ws 8 } } if { [winfo children $w] == "" } { # single position, repopulate $w FillEntries $w $fs $ns $ws [lrange [lindex $posns 0] 2 end] $state \ $chgvorp return } set n 1 if { [regsub {^=} $chgvorp "" prefix] } { set nvar 1 } else { set nvar 0 ; set chgvar $chgvorp } foreach posn $posns { set wf $w.frp$n if { ! [winfo exists $wf] } { frame $wf pack $wf -side top } set ep [lrange $posn 2 end] if { $nvar } { set chgvar ${prefix}$n } FillEntries $wf $fs $ns $ws $ep $state $chgvar incr n } return } proc PosnGetCheck {w datum errproc chgvar} { # get and check position in edit/show window # $w is path to parent window of position widgets, whose parent # contains the widget for the position format # $errproc is procedure to call on error # $chgvar is either "nil" or name of global variable to set to # 1 if the user types in any entry and that contains the # current position otherwise # returns "nil" on error or if there are empty fields global MESS if { [set r [PosnGetCheckEmpty $w $datum $errproc $chgvar]] == \ "empty" } { $errproc $MESS(emptypos) return nil } return $r } proc PosnGetCheckEmpty {w datum errproc chgvar} { # get and check position in edit/show window # $w is path to parent window of position widgets, whose parent # contains the widget for the position format # $errproc is procedure to call on error # $chgvar is either "nil" or name of global variable to set to # 1 if the user types in any entry and that contains # the current position otherwise (possibly "") # returns "empty" if there are empty fields, and "nil" on error global MESS INVTXT POSTYPE if { $chgvar != "nil" } { global $chgvar if { [set p [set $chgvar]] == "" } { return empty } if { $p != 1 } { return $p } } set wp [winfo parent $w] set pf $INVTXT([$wp.pfmt cget -text]) switch [set ptype $POSTYPE($pf)] { latlong { set wlat [$w.lat get] ; set wlong [$w.long get] if { $wlat == "" && $wlong == "" } { return empty } if { [CheckLat $errproc $wlat $pf] && \ [CheckLong $errproc $wlong $pf] } { set latdeg [Coord $pf $wlat S] set longdeg [Coord $pf $wlong W] set p [list $latdeg $longdeg $wlat $wlong] } else { return nil } } utm { foreach m "ze zn eng nng" c "ZE ZN Number Number" { set $m [$w.$m get] if { [set $m] == "" } { return empty } elseif { ! [Check$c $errproc [set $m]] } { return nil } } if { $eng != 0 } { set eng [string trimleft $eng "0"] } if { $nng != 0 } { set nng [string trimleft $nng "0"] } set pd [UTMToDegrees $ze $zn $eng $nng $datum] set p [list [lindex $pd 0] [lindex $pd 1] $ze $zn $eng $nng] } grid - nzgrid { foreach m "eng nng" { set $m [$w.$m get] if { [set $m] == "" } { return empty } elseif { ! [CheckFloat $errproc [set $m]] } { return nil } } if { $eng != 0 } { set eng [string trimleft $eng "0"] } if { $nng != 0 } { set nng [string trimleft $nng "0"] } if { $ptype == "grid" } { set gr 1 set zn [$w.zn get] if { ! [CheckZone $errproc $zn $pf] } { if { $zn == "" } { return empty } return nil } } else { set gr 0 ; set zn "" } if { [BadDatumFor $pf $datum GMMessage] != 0 } { return nil } set p [GridToDegrees $pf $zn $eng $nng $datum] if { $p == 0 } { $errproc $MESS(outofgrid) return nil } if { $gr } { lappend p $zn $eng $nng } else { lappend p $eng $nng } } mh { set mh [string trim [$w.mh get] " "] if { $mh == "" } { return empty } if { ! [CheckMHLocator $errproc $mh] } { return nil } set p [linsert [MHLocToDegrees $mh] end $mh] } } if { $chgvar != "nil" } { global $chgvar set $chgvar $p } return $p } proc RevertPos {w pformt ptype posn} { # change position values keeping its format # $w is path to parent window of position widgets, whose parent # contains the widget for the position format # $pformt is position format (see projections.tcl) # $ptype is type of position format (see array POSTYPE, projections.tcl) # $posn is the position (see proc FormatPosition, compute.tcl) global TXT [winfo parent $w].pfmt configure -text $TXT($pformt) switch $ptype { latlong { set bs {lat long} ; set is {2 3} } utm { set bs {ze zn eng nng} ; set is {2 3 4 5} } grid { set bs {zn eng nng} ; set is {2 3 4} } nzgrid { set bs {eng nng} ; set is {2 3} } mh { set bs mh ; set is 2 } } set st [$w.[lindex $bs 0] cget -state] foreach b $bs k $is { $w.$b configure -state normal $w.$b delete 0 end $w.$b insert 0 [lindex $posn $k] $w.$b configure -state $st } return } proc RedrawPos {w pformt posn chgvar st} { # display position under a new format # $w is path to parent window of position widgets, whose parent # contains the widget for the position format # $pformt is the new format (see projections.tcl) # $posn is the position (see proc FormatPosition, compute.tcl) # $chgvar is either "nil" or name of global variable to set to # 1 if the user types in any entry and that contains the # current position otherwise (possibly "") # $st is state for position widgets global TXT foreach s [winfo children $w] { destroy $s } FillPos $w $pformt [list $posn] $st $chgvar return } proc ChangePFormt {pformt dvar dvref w chgvorp st} { # change format of positions in window # $w is path to parent window containing frp$i sub-frames for # each position with $i an integer from 1 # $pformt is position format (see array POSTYPE, projections.tcl) # $chgvorp is either "nil" or: # - if there is a single position, the name of global variable to # set to 1 if the user types in any entry and that contains the # current position otherwise; see procs ChangePFormt and # PosnGetCheckEmpty # - else, "=PREFIX" describing global variables used in the same # way for each position; each name has the prefix followed by the # number from 1 of the position # $dvar is name of global variable or array for datum # $dvref is name of variable or array(element) for datum # $st is state of the position widgets global INVTXT $dvar MESS POSTYPE TXT set opf $INVTXT([$w.pfmt cget -text]) if { $opf == $pformt } { return } set datum [set $dvref] if { [set ndatum [BadDatumFor $pformt $datum Ignore]] == 0 } { set ndatum $datum } if { [regsub {^=} $chgvorp "" prefix] } { set nvar 1 } else { set nvar 0 ; set chgvar $chgvorp } set frs "" ; set posns "" foreach fr [winfo children $w] { if { [regexp {\.frp([0-9]+)$} $fr x n] } { lappend frs $fr if { $nvar } { set chgvar ${prefix}$n } set p [PosnGetCheckEmpty $fr $datum GMMessage $chgvar] if { $p == "nil" } { return } if { $p == "empty" } { set p "" } else { set p [lindex \ [FormatPosition [lindex $p 0] [lindex $p 1] $datum \ $pformt ""] 0] if { [lindex $p 2] == "--" } { GMMessage $MESS(outofgrid) return } } lappend posns $p } } set ot $POSTYPE($opf) ; set nt $POSTYPE($pformt) foreach fr $frs np $posns { if { $chgvorp != "nil" } { if { $nvar } { set chgvar ${prefix}$n } global $chgvar set $chgvar $np } if { $ot == $nt } { RevertPos $fr $pformt $nt $np } else { RedrawPos $fr $pformt $np $chgvar $st } } set $dvref $ndatum $w.pfmt configure -text $TXT($pformt) return } proc ChangeDatum {datum dvar dvref chgvorp posfr st} { # change datum # $posfr is path to parent window containing frp$i sub-frames for # each position with $i an integer from 1 # see proc ChangePFormt for the meaning of the other arguments global $dvar INVTXT MESS POSTYPE set olddatum [set $dvref] if { $olddatum == $datum } { return } set pformt $INVTXT([$posfr.pfmt cget -text]) if { [BadDatumFor $pformt $datum GMMessage] != 0 } { return } if { [regsub {^=} $chgvorp "" prefix] } { set nvar 1 } else { set nvar 0 ; set chgvar $chgvorp } foreach fr [winfo children $posfr] { if { [regexp {\.frp([0-9]+)$} $fr x n] } { if { $nvar } { set chgvar ${prefix}$n } set op [PosnGetCheck $fr $olddatum Ignore $chgvar] if { $op != "nil" } { set np [lindex [FormatPosition [lindex $op 0] [lindex $op 1] \ $olddatum $pformt $datum] 0] RevertPos $fr $pformt $POSTYPE($pformt) $np if { $chgvar != "nil" } { global $chgvar set $chgvar $np } } } } set $dvref $datum return } ## directory listing proc FillDir {w} { # fill in listbox $w with files in a directory # insert "../" at the beginning, followed by sub-directories # and then ordinary files set dl "" ; set fl "" foreach f [lsort [glob -nocomplain *]] { if { [file isdirectory $f] } { set dl [linsert $dl 0 $f] } else { set fl [linsert $fl 0 $f] } } foreach f $fl { $w insert 0 $f } foreach d $dl { $w insert 0 "$d/" } $w insert 0 "../" return } ## operations on windows proc CloseWindows {ws} { # close windows using their specific WM_DELETE_WINDOW command if any foreach w $ws { if { [winfo exists $w] } { if { [set c [wm protocol $w WM_DELETE_WINDOW]] != "" } { catch {eval $c} } else { destroy $w } } } return } proc DestroyRGrabs {w oldgrabs} { # destroy window $w and restore previous grabs destroy $w foreach w $oldgrabs { if { [winfo exists $w] } { grab $w } } return } proc Raise {w} { raise $w ; focus $w return } proc RaiseWindow {w} { # keep a window on top # CANNOT BE USED for windows that create menus: they will disappear! global WindowStack if { [winfo exists $w] } { raise $w if { $WindowStack == "" } { after 2000 RaiseWindowStack } set WindowStack [linsert $WindowStack 0 $w] update idletasks } return } proc RaiseWindowStack {} { # keep a window on top if it is on top of the stack global WindowStack while { $WindowStack != "" } { if { [winfo exists [set w [lindex $WindowStack 0]]] } { raise $w after 2000 RaiseWindowStack update idletasks break } else { set WindowStack [lreplace $WindowStack 0 0] } } return } proc ToggleWindow {w x y} { # from normal to iconic and back (with geometry +$x+$y) # in fact, because some window managers do not iconify windows # just put them at large # in fact, because some window managers do not even deal correctly # with putting windows at large, just raise them... # ... and try to de-iconify them if they are icons global MESS if { [winfo exists $w] } { if { [wm state $w] == "iconic" } { wm deiconify $w ; wm geometry $w +$x+$y } raise $w } else { GMMessage $MESS(windowdestr) } # switch [wm state $w] { # normal { # # wm iconify $w # set g [winfo geometry $w] # if { [regexp {[0-9]+x[0-9]+\+(-?[0-9]+)\+-?[0-9]+} $g z cx] } { # if { $cx < 0 } { # wm geometry $w +$x+$y # raise $w ; focus $w # } else { # wm geometry $w +-10000+-10000 # } # } else { # GMMessage "Bad result from winfo geometry $w: $g" # } # } # iconic { # wm deiconify $w ; wm geometry $w +$x+$y # } # withdrawn { bell } # } return } ## changing state of interface proc ChangeOnState {what st} { # change state of some widgets according to specification in WConf array # $what is index in WConf array # $st in {normal, disabled} # entries of WConf used here are lists of lists; information in each # sublist depends on its 1st element: # menu - 2nd element is a list of pairs with menu path and list of # entries # button (or menubutton) - 2nd element is list of paths global WConf CMDLINE if { $CMDLINE } { return } foreach p $WConf($what) { switch [lindex $p 0] { menu { foreach m [lindex $p 1] { set w [lindex $m 0] foreach e [lindex $m 1] { $w entryconfigure $e -state $st } } } button - menubutton { foreach b [lindex $p 1] { $b configure -state $st } } } } return } ## operations on entries proc CheckEntries {errproc errval descr} { # check values given on entries # $errproc proc to be called on error # $descr is a list of pairs or triplets with: # - path to the entry # - procedure to be called for checking the data, # with the following arguments: # - $errproc # - the contents of the entry # - the argument to checking procedure if it exists # - argument to checking procedure (optional) # return list with contents of entries, or $errval on error set r "" foreach item $descr { set w [lindex $item 0] ; set p [lindex $item 1] set a [lrange $item 2 end] set info [$w get] if { $a != "" } { set ok [$p $errproc $info $a] } else { set ok [$p $errproc $info] } if { $ok } { lappend r $info } else { focus $w return $errval } } return $r } proc FillEntries {w names titles widths vals state chgvar} { # create and fill a set of entries under window $w # $names is a list of names for the widgets # $titles is associated list of titles to show as labels # $widths is associated list of widths # $vals is associated list of initial values # $state in {normal, disabled} # $chgvar is either "" or name of global variable to set to # 1 if the user types or pastes in any entry foreach n $names t $titles l $widths v $vals { if { $n == "" } { return } label $w.${n}title -text "$t:" entry $w.$n -width $l -exportselection 1 $w.$n insert 0 $v TextBindings $w.$n if { $state == "normal" && $chgvar != "" } { bind $w.$n "set $chgvar 1" bind $w.$n "set $chgvar 1" } $w.$n configure -state $state pack $w.${n}title $w.$n -side left -padx 3 } return } proc ShowTEdit {entry string flag} { # show a string on an entry # enable edition and set text bindings according to $flag $entry configure -state normal $entry delete 0 end ; $entry insert 0 $string if { $flag } { TextBindings $entry } else { $entry configure -state disabled } return } ## operations on text proc TextCheckLimit {txt max bgix errbgix} { # change the background of text characters that are beyond the # given number of characters # $bgix is the normal background index in COLOUR array # $errbgix is the error background index in COLOUR array # a tag "ob" is used for this global COLOUR $txt tag delete ob set max "1.0+$max chars" if { [$txt compare end > $max] } { $txt tag add ob $max end $txt tag configure ob -background $COLOUR($errbgix) } else { $txt configure -background $COLOUR($bgix) } return } ## operations on data proc CompareVals {arr i j} { # compare as strings two array elements global $arr return [string compare "[set [set arr]($i)]" "[set [set arr]($j)]"] } proc MergeData {list ps vs} { # put the values $vs into $list in positions $ps # empty elements will be created if positions extend the list set l [llength $list] foreach p $ps v $vs { while { $p >= $l } { lappend list "" incr l } set list [lreplace $list $p $p $v] } return $list } proc MakeSplit {lls ixs} { # split a list of lists into lists of lists according to the given # indices set rs "" set del 0 while 1 { if { $ixs == "" } { lappend rs $lls break } set void 1 set ixn [expr [lindex $ixs 0]-$del] ; set ixs [lreplace $ixs 0 0] incr del $ixn set sl "" ; set rsl "" foreach l $lls { lappend sl [lrange $l 0 [expr $ixn-1]] if { [set sll [lrange $l $ixn end]] != "" } { set void 0 } lappend rsl $sll } lappend rs $sl if { $void } { break } set lls $rsl } return $rs } proc Delete {l x} { # return list obtained from $l by deleting $x if { [set ix [lsearch -exact $l $x]] != -1 } { return [lreplace $l $ix $ix] } return $l } proc Subtract {l1 l2} { # return list obtained from $l1 by deleting all elements in $l2 foreach x $l2 { if { [set ix [lsearch -exact $l1 $x]] != -1 } { set l1 [lreplace $l1 $ix $ix] } } return $l1 } proc Intersect1 {l1 l2} { # return first common element in both lists or empty list if none foreach e $l1 { if { [lsearch -exact $l2 $e] != -1 } { return $e } } return "" } proc ListReplace {l olds news} { # replace in list $l any ocurrences of elements of list $olds # by the aligned elements of list $news # $l may have repeated elements # return pair with flag set if there were replacements and resulting # list set chg 0 foreach o $olds n $news { foreach i [lsearch -exact -all $l $o] { set l [lreplace $l $i $i $n] incr chg } } return [list $chg $l] } proc FindArrayIndices {array val errix} { # check that $val is an element of $array (possibly with repeated values) # return indices of $val on success and $errix on error global $array set l "" ; set n 0 foreach an [array names $array] { if { [set [set array]($an)] == $val } { lappend l $an ; set n 1 } } if { $n } { return $l } return $errix } proc AssignGlobal {var val} { # assign $val to global $var global $var set $var $val return } ## hiding and showing columns of objects in a grid proc CollapseColumn {objs col label type args} { # collapse column $col of objects $objs in a frame managed as grid # and create an object to restore it # $objs must be list of all objects ordered by row (from 0) # $label is title for the new object # $type describes what is the new object and $args: # ==button, $args=="$fr $orient" where # $fr is frame (managed as grid) parent of new button # $orient in {row, col} is how the buttons are shown in $fr # - a label $fr.title is assumed to be the first element of # the row/column # ==menubtentry, $args=="$menu $menubutton" # $menubutton must enabled if it is disabled foreach o $objs { grid forget $o } switch $type { button { set fr [lindex $args 0] set sls [grid slaves $fr] if { [set n [llength $sls]] == 0 } { grid configure $fr.title -row 0 -column 0 -sticky news set n 1 } set b $fr.b$col if { [winfo exists $b] } { if { [lsearch -exact $sls $b] != -1 } { return } } else { button $b -text $label -command \ [list ShowColumn $objs $col $type $fr $b] } if { [lindex $args 1] == "col" } { set r $n ; set c 0 } else { set r 0 ; set c $n } grid configure $b -row $r -column $c -sticky news } menubtentry { set menu [lindex $args 0] ; set menubutton [lindex $args 1] if { [$menubutton cget -state] == "disabled" } { $menubutton configure -state normal } $menu add command -label $label -command \ [list ShowColumn $objs $col $type $menu $menubutton $label] } } return } proc ShowColumn {objs col type args} { # show column $col of objects $objs in a frame managed as grid and # hide/delete object that invoked this command # $objs, $type as in proc CollapseColumn # $type==button, $args=="$fr $button" # if frame has a single slave (assumed to be $fr.title) it is hidden # $type==menubtentry, $args=="$menu $menubutton $label" # if menu becomes empty, menubutton is disabled set r 0 foreach o $objs { grid configure $o -row $r -column $col -sticky news incr r } switch $type { button { grid forget [lindex $args 1] set fr [lindex $args 0] if { [grid slaves $fr] == $fr.title } { grid forget $fr.title } } menubtentry { set menu [lindex $args 0] ; set menubutton [lindex $args 1] set label [lrange $args 2 end] set n [$menu index last] for { set ix 0 } { $ix <= $n } { incr ix } { if { [$menu entrycget $ix -label] == $label } { $menu delete $ix if { $ix+$n == 0 } { $menubutton configure -state disabled } break } } } } return } ## selecting in and scrolling listboxes proc MultSelect {w ix bxs} { # select only one element at index $ix in each listbox in $bxs # with $w the parent window foreach l $bxs { $w.$l selection clear 0 end $w.$l selection set $ix } return } proc MultExtSelect {bx bxs} { # adjust extended selection in each listbox in $bxs that are siblings # of $bx set s [$bx curselection] set w [winfo parent $bx] foreach l $bxs { if { $l != $bx } { $w.$l selection clear 0 end foreach ix $s { $w.$l selection set $ix } } } return } proc ScrollListIndex {box char} { # scroll listbox so that first element with initial >= $char is shown # this is case sensitive! # if none found, scroll to end if { $char == "" } { return } set i 0 foreach e [$box get 0 end] { if { [string compare $char [string range $e 0 0]] <= 0 } { $box see $i return } incr i } $box see end return } proc ScrollMany {boxs args} { foreach b $boxs { eval $b yview $args } return } # BSB contribution: support for wheelmouse scrolling of listboxes proc Mscroll {boxes} { foreach b $boxes { bind $b " ScrollMany [list $boxes] scroll 5 units " bind $b " ScrollMany [list $boxes] scroll -5 units " bind $b " ScrollMany [list $boxes] scroll 1 units " bind $b " ScrollMany [list $boxes] scroll -1 units " bind $b " ScrollMany [list $boxes] scroll 1 pages " bind $b " ScrollMany [list $boxes] scroll -1 pages " } return } ## balloon help (mostly adapted from macau, by the same author) proc BalloonBindings {wci lst} { # set bindings for balloon help # $wci either a window path or a list with canvas path and item or tag # $lst is list of args needed for the call to proc BalloonCreate if { [llength $wci] == 1 } { bind $wci [list Balloon $lst] bind $wci { BalloonMotion %X %Y } bind $wci BalloonDestroy } else { set cv [lindex $wci 0] ; set it [lindex $wci 1] $cv bind $it [list Balloon $lst] $cv bind $it { BalloonMotion %X %Y } $cv bind $it BalloonDestroy } return } proc BalloonButton {path lst} { # create button with given $path to display a balloon help # $lst is list of args needed for the call to proc BalloonCreate # return $path global SYMBOLIMAGE button $path -image $SYMBOLIMAGE(interr) \ -command "BalloonCreate 12000 $lst" bind $path { BalloonMotion %X %Y } bind $path BalloonDestroy return $path } proc Balloon {lst} { global BalloonStart BalloonHelp if { $BalloonHelp } { set BalloonStart [after 2000 "BalloonCreate 10000 $lst"] } return } proc NewBalloon {blln mess geom} { global COLOUR destroy $blln toplevel $blln wm resizable $blln 0 0 wm overrideredirect $blln 1 wm geometry $blln $geom wm group $blln . label $blln.mess -text $mess -relief groove -bg $COLOUR(ballbg) \ -fg $COLOUR(ballfg) pack $blln.mess return } proc BalloonCreate {timeout args} { # $timeout is either 0 or msecs to destroy balloon help global BalloonX BalloonY BalloonEnd TXT COLOUR switch -glob -- [set a0 [lindex $args 0]] { =* { set mess [string range $a0 1 end] } default { if { [catch [list set mess $TXT($a0)]] } { set mess $TXT(nohelp) } } } NewBalloon .balloon $mess +$BalloonX+$BalloonY if { $timeout } { set BalloonEnd [after $timeout "destroy .balloon"] } else { set BalloonEnd "" } return } proc BalloonMotion {x y} { global BalloonX BalloonY set BalloonX [expr $x+9] ; set BalloonY [expr $y+9] if { [winfo exists .balloon] } { wm geometry .balloon +$BalloonX+$BalloonY } return } proc BalloonDestroy {} { global BalloonStart BalloonEnd catch {after cancel $BalloonStart} catch {after cancel $BalloonEnd} destroy .balloon return } ## double-click or qualified single-click vs. single-click bindings # avoid compound clicks being taken as a single-click followed # by some other event # usage in bindings, as in: # bind TAG { SafeSingleClick 1 MYCOMMAND1 ARG1 ... ARGn } # bind TAG { SafeCompoundClick 1 MYCOMMAND2 ARG1 ... ARGk } array set SafeClick { delay,1 300 job,1 "" time,1 1e77 delay,2 300 job,2 "" time,2 1e77 delay,3 300 job,3 "" time,3 1e77 } proc SafeSingleClick {button comm args} { # delay effect of single-click so that it may be cancelled by # a compound-click binding # $button in {1, 2, 3} (see initialization of SafeClick array) # $comm is the command to be executed in answer to the single-click # $args are the arguments to this command if any # the following global array is used # $SafeClick(job,$button) has the job id to be cancelled # $SafeClick(delay,$button) is the delay in ms # $SafeClick(time,$button) is the time of last compound-click if any global SafeClick if { abs([clock clicks -milliseconds]-$SafeClick(time,$button)) < \ $SafeClick(delay,$button) } { return } set SafeClick(time,$button) 1e77 set SafeClick(job,$button) \ [after $SafeClick(delay,$button) eval $comm $args] return } proc SafeCompoundClick {button comm args} { # cancel effect of single-click before executing command (normally # as a result of a compound-click) # $comm is the command to be executed in answer to the single-click # $args are the arguments to this command if any # the same global var as in proc SafeSingleClick is used global SafeClick after cancel $SafeClick(job,$button) set SafeClick(time,$button) [clock clicks -milliseconds] eval $comm $args return } ## canvas proc TurnObject {trk data} { # turn canvas object $trk degrees from vertical north # $data is list with coordinates of rotation centre (x_m, y_m), # tag of object, canvas path and list of coordinates relative to # (x_m, y_m) foreach "xm ym tag cv cs0" $data {} set rad [expr $trk*0.01745329251994329576] set cos [expr cos($rad)] ; set sin [expr sin($rad)] set cs "" foreach "x y" $cs0 { lappend cs [expr round($xm+$x*$cos+$y*$sin)] \ [expr round($ym-$x*$sin+$y*$cos)] } eval $cv coords $tag $cs update idletasks return } proc CanvasChangeFont {cv v vref} { # change font in canvas using proc GMSelectFont # $v is name to declare as global # $vref is reference to set (variable name or array and index) # all canvas items with tag txt will be reconfigured global $v TkDefaultFont if { [set f [GMSelectFont $TkDefaultFont]] == {} } { return } set $vref $f foreach it [$cv find withtag txt] { $cv itemconfigure $it -font $f } return } ## varia proc Measure {text} { # length of a string plus 2 return [expr 2+[string length $text]] } proc Apply {list f args} { # apply proc $f to each element of list # $f is called with arguments $args and list element set r "" foreach i $list { lappend r [$f $args $i] } return $r } proc Undefined {list} { # test whether there is a -1 in list foreach i $list { if { $i == -1 } { return 1 } } return 0 } proc Complement {u l} { # compute the complement to list $u of list $l foreach x $l { if { [set i [lsearch -exact $u $x]] != -1 } { set u [lreplace $u $i $i] } } return $u } #### cursor proc SetCursor {ws c} { # set cursor on each window in list $ws, all its toplevel children and # on the map window to $c # save previous cursors global Map Cursor CursorsChanged CMDLINE if { $CMDLINE } { return } if { $CursorsChanged } { incr CursorsChanged return } set ws [linsert $ws 0 $Map] foreach w $ws { if { [winfo exists $w] } { set Cursor($w) [$w cget -cursor] $w configure -cursor $c foreach sub [winfo children $w] { if { [winfo toplevel $sub] == $sub } { set Cursor($sub) [$sub cget -cursor] $sub configure -cursor $c } } } } set CursorsChanged 1 update idletasks return } proc ResetCursor {ws} { # restore cursor on windows, all their toplevel children and on the # map window to saved one # $ws is list of windows global Map Cursor CursorsChanged CMDLINE if { $CMDLINE } { return } incr CursorsChanged -1 if { $CursorsChanged } { return } set ws [linsert $ws 0 $Map] foreach w $ws { $w configure -cursor $Cursor($w) foreach sub [winfo children $w] { if { [winfo toplevel $sub] == $sub } { if { ! [catch {set Cursor($sub)}] } { $sub configure -cursor $Cursor($sub) unset Cursor($sub) } } } unset Cursor($w) } update idletasks return } ### ISO characters; mainly from procs written by Luis Damas proc TextBindings {w} { # set text bindings according to user options global DELETE ISOLATIN1 if { $ISOLATIN1 && [info commands ISOBindings] != "" } { # the following proc is defined in file isolatin1.tcl # only consulted if $ISOLATIN1 was set at the beginning ISOBindings $w } if { $DELETE } { bind $w "DelCh[winfo class $w] $w ; break" } return } proc DelChEntry {w} { # delete character before insertion point on entry $w delete [expr [$w index insert]-1] return } proc DelChText {w} { # delete character before insertion point on text window $w delete "[$w index insert] -1 chars" return } ### quoting proc QuoteString {string} { # return string under quotes if it has spaces, escaping any quotes in it if { [regexp { } $string] } { regsub -all {\"} $string "\\\"" string return \"$string\" } return $string } proc WriteQuoteList {file list} { # write each element in list under quotes and escape quotes in it if any # do not insert newline at end set n 0 foreach x $list { if { $n != 0 } { puts -nonewline $file " " } puts -nonewline $file [QuoteString $x] set n 1 } return } proc WriteQuote {file string} { # write under quotes $string and escape quotes in it if any # do not insert newline at end puts -nonewline $file [QuoteString $string] return } ### colours proc ColourToDec {c} { # convert name to RGB values global RGBNamed set c [string trim $c " "] if { [string first # $c] == 0 } { set c [string tolower $c] if {! [regexp \ {^#([0-9a-f][0-9a-f])([0-9a-f][0-9a-f])([0-9a-f][0-9a-f])$} \ $c x h2 h1 h0] } { return -1 } scan $h2 "%x" b2 ; scan $h1 "%x" b1 ; scan $h0 "%x" b0 return [list $b2 $b1 $b0] } if { [array names RGBNamed $c] == "" } { return -1 } return $RGBNamed($c) } proc DecToColour {c2 c1 c0} { # convert RGB in decimal-triplet to hexadecimal representation return [format "#%06x" [expr 65536*$c2+256*$c1+$c0]] } proc ColourMatch {r g b ncs} { # find best-match colour for $r,$g,$b in set described by $ncs # $ncs is a list with for each colour an identifier/code followed by # RGB coordinates # return identifier/code of best-match # algorithm: in RGB space find minimum distance (compare vector # differences) if { [llength $ncs]%4 != 0 } { BUG Bad matching colour set } set min 1000 foreach "name x y z" $ncs { set x [expr $r-$x] ; set y [expr $g-$y] ; set z [expr $b-$z] if { $min > [set d [expr sqrt($x*$x+$y*$y+$z*$z)]] } { set match $name ; set min $d } } return $match } ##### posting to a web service proc WebPost {service login url fieldname message maxlength} { # edit and post a message to a web site # $service is the service name used when asking for login information # $login is set if authorization required # $maxlength == -1 when message can be of any length # use TclCurl # return 0 on failure global GMResConf MESS TXT COLOUR DPOSX DPOSY if { [catch {package require TclCurl}] } { return 0 } set w .webpost set gs [grab current] GMToplevel $w message +$DPOSX+$DPOSY {} . \ {WM_DELETE_WINDOW {set GMResConf 0}} frame $w.fr -borderwidth 5 -bg $COLOUR(confbg) label $w.fr.tit -text $TXT(message) frame $w.fr.ft set txt $w.fr.ft.txt text $txt -wrap word -width 70 -height 10 \ -exportselection true -yscrollcommand [list $w.fr.ft.sv set] $txt insert 1.0 $message if { $maxlength != -1 } { bind $txt [list TextCheckLimit $txt $maxlength bg messbg] } TextBindings $txt scrollbar $w.fr.ft.sv -command [list $txt yview] frame $w.fr.bs button $w.fr.bs.ok -text $TXT(ok) -command { set GMResConf 1 } button $w.fr.bs.cancel -text $TXT(cancel) -command { set GMResConf 0 } grid $txt -row 0 -column 0 -sticky nesw grid $w.fr.ft.sv -row 0 -column 1 -sticky ns pack $w.fr.bs.ok $w.fr.bs.cancel -side left -pady 5 pack $w.fr.tit $w.fr.ft $w.fr.bs -side top -pady 5 pack $w.fr update idletasks set gs [grab current] grab $w RaiseWindow $w tkwait variable GMResConf set message [$txt get 1.0 end] DestroyRGrabs $w $gs update idletasks if { $GMResConf } { if { $maxlength != -1 && [string length $message] > $maxlength } { set message [string replace $message $maxlength end] } set cmd [list configure -verbose 0 -url $url -connecttimeout 2 \ -post 1 -postfields "$fieldname=$message"] if { $login } { if { [set usrpwd [GMLogin $service]] == {} } { return 0 } set usrpwd "[lindex $usrpwd 0]:[lindex $usrpwd 1]" lappend cmd -userpwd $usrpwd } if { [catch {set chandle [curl::init]}] } { return 0 } set cmd [linsert $cmd 0 $chandle] if { [catch {eval $cmd}] || \ [catch {set res [$chandle perform]}] || \ [catch {$chandle reset}] } { return 0 } return 1 } return 0 } gpsman-6.4.4.2/gmsrc/metadata.tcl0000644000175000017500000002202012224351120014647 0ustar migmig# # This file is part of: # # gpsman --- GPS Manager: a manager for GPS receiver data # # Copyright (c) 1998-2013 Miguel Filgueiras migfilg@t-online.de # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. # # File: metadata.tcl # Last change: 6 October 2013 # # abstract data used in command-mode, in configuring the graphical interface, # and in parsing files # year from which seconds are reckoned; MUST BE < 1990 # not necessarily a leap year # dates with years less than YEAR0 will not be accepted # NB: Garmin protocol dates start at 1990 January 1st # Lowrance dates start at 1992 January 1st set YEAR0 1988 ##### properties of known file formats # indices as NAME,PROPERTY where PROPERTY is # # mode I/O mode in {in, out, {in out}} # depends optional dependencies as evaluable code (globals must be # declared), returning 0 on failure # filetype in {unique, single, data} meaning: only one possible type, # several types but each file has only one, other situations # types to be used only if there is a single mode or the types are # the same for in and out: admissible types as a subset of # $TYPES-{GR}; the order must be that imposed by the format # on the data in the file, if there is such an order # io_types to be used if the mode is {in out} and the admissible types # for in and out are different: pair with list of in types # and list of out types as described for "types" # GREls defined if there is support for dealing with GR elements # MODE,params list of parameter names # MODE,pdefts list of default values (or "ERROR" if value must be supplied) # aligned with list of parameter names; missing default # values treated as ""; to get the value of a global # variable use global:VARNAME # param,PNAME list with global variable to set, conversion code from # (external) $val to (internal) $val, constraint on possible # values using $val as local variable and global variables # of previous parameters (in the order given in the list of # names), and, except for Shapefile, widget description as # used by proc GMSetupParams (gendials.tcl); parameters are # first converted in the order of occurrence in the list; # each constraint and global variable are then checked/set # in the same order # includes VR contributions array set FILEFORMAT { GPSMan,mode {in out} GPSMan,filetype data GPSMan,types {WP RT TR LN LAP GR} GPStrans,mode {in out} GPStrans,filetype single GPStrans,types {WP RT TR} GPStrans,GREls 1 Shapefile,mode {in out} Shapefile,depends { global GSHPVersion ; string compare $GSHPVersion "" } Shapefile,filetype single Shapefile,types {WP RT TR LN} Shapefile,GREls 1 Shapefile,in,params {dim pformat zone datum dunit aunit} Shapefile,in,pdefts {3 DDD "" {WGS 84} m m} Shapefile,out,params {dim pformat datum dunit aunit} Shapefile,out,pdefts {3 DDD {WGS 84} m m} Shapefile,param,dim {SHPDim Ignore { expr [lsearch -exact {3 2} $val] != -1 } } Shapefile,param,pformat {SHPPFormt { global INVTXT ; set val $INVTXT($val) } { global NNUMPFORMATS expr [lsearch -exact $NNUMPFORMATS $val] == -1 } } Shapefile,param,zone {SHPZone Ignore { global SHPPFormt ZGRID expr ! $ZGRID($SHPPFormt) || \ {[CheckZone GMMessage $val $SHPPFormt]} ? 1 : 0 } } Shapefile,param,datum {SHPDatum Ignore { global SHPPFormt SHPDatum expr [BadDatumFor $SHPPFormt $SHPDatum GMMessage] == 0 } } Shapefile,param,dunit {SHPDUnit { global INVTXT if { [regexp {[a-z]} $val] } { set val $INVTXT($val) } } { global SHPPFormt ZGRID expr ! $ZGRID($SHPPFormt) || \ [lsearch -exact {M FT} $val] != -1 ? 1 : 0 } } Shapefile,param,aunit {SHPAUnit { global INVTXT if { [regexp {[a-z]} $val] } { set val $INVTXT($val) } } { global SHPDim expr $SHPDim == 2 || [lsearch -exact {M FT} $val] != -1 ? 1 : 0 } } BGA,mode in BGA,filetype unique BGA,types WP BGA,in,params {feature findability air_activity} BGA,in,pdefts {} BGA,param,feature {BGAfeature Ignore { expr 1 } =$TXT(BGAfeature)} BGA,param,findability {BGAfindblty Ignore { expr [regexp -nocase {^[A-DG]?$} $val] } =$TXT(BGAfindblty) } BGA,param,air_activity {BGAairact Ignore { expr [string length $val] < 3 } =$TXT(BGAairact) } EasyGPS,mode in EasyGPS,filetype unique EasyGPS,types WP EasyGPS,GREls 1 Fugawi,mode in Fugawi,filetype unique Fugawi,types WP Fugawi,GREls 1 GD2,mode in GD2,filetype single GD2,types {WP RT TR} GD2,GREls 1 GPX,mode {in out} GPX,filetype data GPX,types {WP RT TR} GPX,GREls 1 GTrackMaker,mode in GTrackMaker,filetype data GTrackMaker,types {WP RT TR} IGC,mode in IGC,filetype unique IGC,types TR IGC,in,params {alt} IGC,in,pdefts {gps} IGC,param,alt {GFOption Ignore { expr [lsearch -exact "gps baro" $val]+1 } {/$TXT(alt)|gps baro} } Kismet,mode in Kismet,filetype unique Kismet,types WP Kismet,in,params {group} Kismet,in,pdefts {0} Kismet,param,group {GFOption Ignore { expr 1 } {@$TXT(nameGR)}} KML,mode {in out} KML,filetype data KML,io_types {WP {WP RT TR}} KML,GREls 1 MapEdit,mode in MapEdit,filetype unique MapEdit,types WP MapGuide,mode in MapGuide,filetype unique MapGuide,types RT MapGuide,in,params {version idno commt rem} MapGuide,in,pdefts {global:MapGuideVersion "" "" ""} MapGuide,param,version {GFVersion Ignore { expr [lsearch -exact "2002 03/04" $val]+1 } {/$TXT(version)|2002 03/04} } MapGuide,param,idno {GFItemId Ignore { expr 1 } =$TXT(numberid)} MapGuide,param,commt {GFItemCommt Ignore { CheckComment GMMessage $val } =$TXT(cmmt) } MapGuide,param,rem {GFItemNB Ignore { expr 1 } =$TXT(rmrk)} MapSend,mode {in out} MapSend,filetype single MapSend,types {WP RT TR} Meridian,mode {in out} Meridian,depends { global GPSREC expr ! [string compare $GPSREC "Magellan"] } Meridian,filetype single Meridian,types {WP RT TR} NMEA,mode in NMEA,depends { global GPSREC expr ! [string compare $GPSREC "Garmin"] } NMEA,filetype unique NMEA,types TR Ozi,mode {in out} Ozi,filetype single Ozi,io_types {WP {WP TR}} Ozi,GREls 1 SimpleText,mode {in out} SimpleText,filetype unique SimpleText,types TR } # compute names of defined formats set ffs "" foreach n [array names FILEFORMAT *,mode] { regsub {,mode$} $n "" n lappend ffs $n } set FILEFORMAT(names) [lsort -dictionary $ffs] ### receiver protocols with external and internal representations array set RECPROTS { Garmin garmin Garmin,Garmin garmin {Garmin,Garmin_USB} garmin_usb Garmin,NMEA nmea Garmin,SText stext Garmin,simul simul } ### known map transformations # number of points needed to define each transformation array set MAPTRANSFNPTS { Affine 3 AffineConf 2 NoRot 3 LeastSquares >=3 } # LeastSquares not added to MAPKNOWNTRANSFS as it is not practical to # give a large number of points in the command line set MAPKNOWNTRANSFS {Affine AffineConf NoRot} ### source files that are not encoded in ascii array set ENCODED { isolatin1.tcl iso8859-1 i18n-utf8.tcl utf-8 langdeutsch.tcl iso8859-1 langes.tcl iso8859-1 langfr.tcl iso8859-1 langit.tcl iso8859-1 langnl.tcl iso8859-1 langport.tcl iso8859-1 langru.tcl utf-8 } gpsman-6.4.4.2/gmsrc/realtime.tcl0000644000175000017500000005031012224351120014674 0ustar migmig# # This file is part of: # # gpsman --- GPS Manager: a manager for GPS receiver data # # Copyright (c) 1998-2013 Miguel Filgueiras migfilg@t-online.de # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. # # File: realtime.tcl # Last change: 6 October 2013 # #### real time logging control proc GPSRealTimeLogOnOff {} { # start or stop the real time log # change the button label accordingly global TXT RealTimeLogOn WConf if { $RealTimeLogOn } { StopRealTimeLog set txt $TXT(getlog) } else { if { ! [StartRealTimeLog 2] } { return } set txt $TXT(stop) } foreach w $WConf(realtime) type $WConf(realtimetype) { switch $type { button { $w configure -text $txt } menuentry { [lindex $w 0] entryconfigure [lindex $w 1] -label $txt } } } return } proc StartRealTimeLog {interval} { # start real time logging with given $interval in seconds # assume it is currently off # return 0 on failure global GPSProtocol RealTimeLogIntv RealTimeLogOn RealTimeLogLast \ Travelling MESS MYGPS set RealTimeLogIntv $interval switch $GPSProtocol { garmin - garmin_usb { if { ! [GarminStartPVT] } { return 0 } } stext { if { ! [StartSimpleText] } { return 0 } } simul { SimulPVTOn } drivesim { SimulDriveOn } nmea { if { $MYGPS == "Lowrance" } { NMEASetupWindow } elseif { ! [GarminStartNMEA rec] } { return 0 } } lowrance { NMEASetupWindow } default { GMMessage $MESS(rltmnotsupp) return 0 } } if { $Travelling } { TravelRealTimeOn } set RealTimeLogLast 0 set RealTimeLogOn 1 return 1 } proc StopRealTimeLog {} { # stop real time logging # assume it is currently on global GPSProtocol RealTimeLogOn RealTimeLogAnim Travelling MYGPS switch $GPSProtocol { garmin - garmin_usb { GarminStopPVT } lowrance - nmea { if { $MYGPS == "Lowrance" } { NMEAOff } else { GarminStopNMEA } } stext { StopSimpleText } simul { SimulPVTOff } drivesim { SimulDriveOff } } if { $RealTimeLogAnim } { AnimStopRealTime set RealTimeLogAnim 0 } if { $Travelling } { TravelRealTimeOff } set RealTimeLogOn 0 return } ##### real time log window and hook to animation procs proc UseRealTimeData {data} { # use position, velocity and time data # UTC time - as a list with y m d h mn s # position - as a list with latd, longd (for datum WGS 84) # pos fix - in {error, _, 2D, 3D, 2D-diff, 3D-diff, GPS, DGPS, Auto, # simul} # pos error - as a list with # estimated position error EPE in metres # estimated horizontal error EPH in metres # estimated vertical error in metres # altitude - signed number in metres # velocity vector - as list with vlat vlong valt, m/s # course over ground - degrees # number of satellites in view # HDOP - horizontal dilution of precision # speed - km/h # any value may be "_" or have a "_" to mean non-available data global TXT DateFormat RealTimeLogIntv RealTimeLogLast RealTimeLogAnim \ PVTLast PVTState PVTElapsed PVTZero PVTPosns PVTSecs PVTInterval \ PVTDFile GPSProtocol MYGPS Travelling CMDLINE set date [lindex $data 0] if { $date == "_" } { if { [string first "garmin" $GPSProtocol] == 0 || \ ($MYGPS == "Garmin" && $GPSProtocol == "nmea") } { Log "UPVTD> bad date: $date" } if { $Travelling } { TravelBadDate } return } set date [eval LocalTimeAndUTC $date UTC] set secs [eval DateToSecs $date] set PVTInterval $RealTimeLogIntv if { [llength $data] < 10 } { return } foreach "x rpos fix err alt velv trk nsat hdop speed" $data { break } if { $rpos == "_" || $secs-$RealTimeLogLast < $RealTimeLogIntv } { return } set RealTimeLogLast $secs foreach "epe eph epv" $err {} foreach "velx vely velz" $velv {} if { $RealTimeLogAnim } { AnimNextRealTime $rpos "WGS 84" $secs } set posn [eval FormatLatLong $rpos DMS] set flat [lindex $posn 2] ; set flong [lindex $posn 3] if { $Travelling } { TravelData [lrange $date 3 5] $posn $flat $flong $fix $alt \ $velx $vely $velz $trk $speed } if { $PVTState != "on" } { return } # recording if { ! [winfo exists .pvt] } { RealTimeLogWindow } if { $PVTZero < 0 } { set PVTZero $secs } set PVTElapsed " [FormatTime [expr $secs-$PVTZero]]" lappend PVTSecs $secs lappend PVTPosns $posn set vals [list [format "%4d." [incr PVTLast]] \ [eval FormatDate $DateFormat $date] \ $flat $flong \ [RTimeFormat $alt %7.1f] \ $TXT(posfix$fix) \ [RTimeFormat $epe %5.1f] \ [RTimeFormat $eph %5.1f] \ [RTimeFormat $epv %5.1f] \ [RTimeFormat $velx %7.1f] \ [RTimeFormat $vely %7.1f] \ [RTimeFormat $velz %7.1f] \ [RTimeFormat $trk %3.1f]] if { $PVTDFile != "" } { RTimeDumpLine $vals } if { ! $CMDLINE } { set fx .pvt.fri.frtbx ; set col 0 foreach b "n d lat long alt fix epe eph epv velx vely velz trk" \ v $vals { if { [$fx.bx$b size] == 0 && $v == "" } { CollapseColumn "$fx.tit$b $fx.bx$b" $col \ [lindex $TXT(PVTflds) $col] \ menubtentry .pvt.frs.frbt.show.m .pvt.frs.frbt.show } incr col $fx.bx$b insert end $v ; $fx.bx$b see end } } update return } proc RealTimeLogWindow {} { # create window for displaying real-time log # columns with empty first values will be collapsed global RealTimeLogIntv RealTimeLogAnim DATEWIDTH TXT MPOSX MPOSY COLOUR \ PVTLast PVTState PVTStateExt PVTElapsed PVTZero PVTPosns \ PVTSecs PVTInterval PVTDumping PVTDFile CMDLINE FixedFont set PVTLast 0 set PVTElapsed "" ; set PVTZero -1 set PVTPosns "" ; set PVTSecs "" if { $CMDLINE } { return } set fx .pvt.fri.frtbx set PVTInterval $RealTimeLogIntv set PVTStateExt $TXT(animon) set PVTDumping 0 ; set PVTDFile "" trace variable PVTState w RTimeStateChange trace variable PVTInterval w RTimeIntervalChange GMToplevel .pvt realtimelog +[expr $MPOSX+10]+[expr $MPOSY+80] {} \ {WM_DELETE_WINDOW RTimeCancel} {} label .pvt.tit -text $TXT(realtimelog) frame .pvt.fri -relief flat -borderwidth 5 -bg $COLOUR(messbg) # see above for initialization of $fx frame $fx -relief flat -borderwidth 0 # see below for creation of $fb and $show set fb .pvt.frs.frbt set show $fb.show ; set mn $show.m set col 0 foreach b "n d lat long alt fix epe eph epv velx vely velz trk" \ m "5 $DATEWIDTH 10 10 4 4 4 4 4 6 6 6 4" \ t $TXT(PVTflds) { button $fx.tit$b -width $m -text $t -font $FixedFont \ -command [list CollapseColumn "$fx.tit$b $fx.bx$b" $col \ $t menubtentry $mn $show] BalloonBindings $fx.tit$b hide listbox $fx.bx$b -height 15 -width $m -relief flat \ -yscrollcommand "$fx.bscr set" \ -selectmode single -exportselection false bind $fx.bx$b { MultSelect [winfo parent %W] [%W nearest %y] \ "bxn bxd bxlat bxlong bxalt bxfix bxepe bxeph bxepv \ bxvelx bxvely bxvelz bxtrk" } bind $fx.bx$b { set i [%W nearest %y] ; set n [%W get $i] set ww [winfo toplevel %W] MultSelect [winfo parent %W] $i \ "bxn bxd bxlat bxlong bxalt bxfix bxepe bxeph bxepv \ bxvelx bxvely bxvelz bxtrk" if { $n != "" } { MarkPoint PVT $ww $i } } grid configure $fx.tit$b -column $col -row 0 -sticky news grid configure $fx.bx$b -column $col -row 1 -sticky news incr col } set boxes [list $fx.bxd $fx.bxn $fx.bxlat $fx.bxlong \ $fx.bxalt $fx.bxfix $fx.bxepe $fx.bxeph $fx.bxepv \ $fx.bxvelx $fx.bxvely $fx.bxvelz $fx.bxtrk] scrollbar $fx.bscr -command [list ScrollMany $boxes] Mscroll $boxes grid configure $fx.bscr -column $col -row 1 -sticky news frame .pvt.frs -relief flat -borderwidth 0 # $fb == .pvt.frs.frbt frame $fb -relief flat -borderwidth 0 button $fb.rest -text $TXT(restart) \ -command "RTimeRestart ; $fb.rest configure -state normal" button $fb.pause -text $TXT(pause) \ -command "RTimePause ; $fb.pause configure -state normal" menubutton $show -text $TXT(show) -relief raised \ -direction below -menu $show.m -state disabled menu $show.m -tearoff 0 set fb1 ${fb}1 frame $fb1 -relief flat -borderwidth 0 button $fb1.stan -text $TXT(animation) \ -command "set RealTimeLogAnim 1 ; \ $fb1.stan configure -state normal" button $fb1.totr -text $TXT(mkTR) \ -command "RTimeToTR ; $fb1.totr configure -state normal" set mn $fb1.save.m menubutton $fb1.save -text $TXT(save) -relief raised \ -direction below -menu $mn menu $mn -tearoff 0 $mn add command -label $TXT(exstglog) \ -command { SaveFile comp PVTData } $mn add checkbutton -label $TXT(contnsly) -selectcolor $COLOUR(check) \ -variable PVTDumping -command RTimeDump frame .pvt.frs.int -relief flat -borderwidth 0 set fs .pvt.frs.int label $fs.sl -text $TXT(slow) -width 6 scale $fs.sp -orient horizontal -from 1 -to 101 -showvalue 1 \ -width 8 -length 150 -variable PVTInterval \ -label "$TXT(rtimelogintv) (s):" label $fs.fst -text $TXT(fast) -width 6 grid configure $fs.fst -column 0 -row 0 -sticky news grid configure $fs.sp -column 1 -row 0 -sticky news grid configure $fs.sl -column 2 -row 0 -sticky news frame .pvt.frs.st -relief flat -borderwidth 0 set ft .pvt.frs.st label $ft.tit -text $TXT(state): label $ft.st -width 10 -textvariable PVTStateExt label $ft.tm -width 15 -textvariable PVTElapsed button .pvt.cnc -text $TXT(cancel) -command RTimeCancel pack $fb.rest $fb.pause $show -side top -pady 3 -fill x pack $fb1.stan $fb1.totr $fb1.save -side top -pady 3 -fill x pack $fx pack $fs $ft $fb $fb1 -side left -padx 10 pack $ft.tit $ft.st $ft.tm -side left pack .pvt.tit .pvt.fri .pvt.frs .pvt.cnc -side top -pady 5 return } proc RTimeFormat {f fmt} { if { $f == "_" } { return "" } return [format $fmt $f] } proc RTimeCancel {} { global PVTState PVTDFile set PVTState abort if { $PVTDFile != "" } { close $PVTDFile } trace vdelete PVTState w RTimeStateChange trace vdelete PVTInterval w RTimeIntervalChange destroy .pvt return } proc RTimeToTR {} { # make a TR from the PVT data global PVTSecs PVTPosns set fx .pvt.fri.frtbx set tpfs "latd longd latDMS longDMS date secs alt" set i 0 ; set tps "" foreach p $PVTPosns s $PVTSecs { if { "$p" != "" } { lappend p [$fx.bxd get $i] $s [$fx.bxalt get $i] lappend tps [FormData TP $tpfs $p] } incr i } if { "$tps" == "" } { bell ; return } set opts "create revert cancel" GMTrack -1 $opts [FormData TR "Datum TPoints" [list "WGS 84" $tps]] return } proc RTimeRestart {} { # continue after a pause or restart logging # clear information in PVT window if restarting global RealTimeLogLast PVTSecs PVTPosns PVTLast PVTState PVTElapsed PVTZero if { "$PVTState" == "pause" } { set PVTState on } else { set PVTSecs "" ; set PVTPosns "" set RealTimeLogLast 0 set PVTLast 0 ; set PVTState on ; set PVTElapsed "" ; set PVTZero -1 set fx .pvt.fri.frtbx foreach b "n d lat long alt fix epe eph epv velx vely velz trk" { $fx.bx$b delete 0 end } } return } proc RTimePause {} { # pause or continue after a pause global PVTState if { "$PVTState" == "pause" } { set PVTState on } else { set PVTState pause } return } proc RTimeStateChange {n no op} { # called by trace when $PVTState has been changed global PVTState PVTStateExt TXT set PVTStateExt $TXT(anim$PVTState) return } proc RTimeIntervalChange {n no op} { # called by trace when $PVTInterval has been changed # if there is an animation window for the log set Anim(speed,-1) # that has a trace on it; otherwise set RealTimeLogIntv directly global PVTInterval RealTimeLogIntv Anim if { [winfo exists .anim-1] } { after 0 "set Anim(speed,-1) [expr $PVTInterval-51]" } else { set RealTimeLogIntv $PVTInterval } return } proc RTimeDump {} { # start/stop dumping continuously global PVTDFile PVTDumping TXT if { $PVTDFile == "" } { if { [set PVTDFile [GMOpenFile $TXT(saveto) PVTData wapp]] == ".." } { set PVTDumping 0 ; set PVTDFile "" } else { SavePVTData $PVTDFile } } else { close $PVTDFile set PVTDFile "" } return } proc RTimeDumpLine {vals} { # dump PVT data (except line number) unless only one fix is to be # got (in command-line mode) in which case set the appropriate # global to the PVT data global PVTDFile RealTimeGettingFix if { $RealTimeGettingFix != 0 } { if { $RealTimeGettingFix == 1 } { set RealTimeGettingFix $vals } return } set sep "" foreach v [lreplace $vals 0 0] { puts -nonewline $PVTDFile "${sep}$v" set sep "\t" } puts $PVTDFile "" flush $PVTDFile return } ##### driving simulator proc SimulDriveOn {} { # simulate PVT by generating fake PVT data lists and calls to # proc UseRealTimeData # the data lists are computed from user actions in a driving window global SimulDrive COLOUR TXT EPOSX EPOSY SPUNIT MESS set w .simdrive if { [winfo exists $w] } { Raise $w ; return } set SimulDrive(data) "" set SimulDrive(mess) "" GMToplevel $w drivesim +$EPOSX+$EPOSY {} \ {WM_DELETE_WINDOW {GMMessage $MESS(chgrecprot)}} \ [list {SimulDriveChange speed 5} \ {SimulDriveChange speed -5} \ {SimulDriveChange turn 1} \ {SimulDriveChange turn -1} \ {SimulDriveChange turnval 0} \ {SimulDriveControl 0} \ "focus $w ; SimulDriveControl 1"] frame $w.fr -borderwidth 2 -bg $COLOUR(messbg) frame $w.fr.frsw # steering wheel set swwd 74 ; set swht 74 set cwl $w.fr.frsw.c_whl canvas $cwl -width $swwd -height $swht -relief flat -bg $COLOUR(dialbg) if { $swwd >= $swht } { set sl $swht } else { set sl $swwd } set sl [expr int($sl*0.8)] set x0 [expr ($swwd-$sl)/2] ; set xe [expr $x0+$sl] set y0 [expr ($swht-$sl)/2] ; set ye [expr $y0+$sl] $cwl create oval $x0 $y0 $xe $ye -fill $COLOUR(dialbg) -width 4 \ -outline green set xm [expr $swwd/2] ; set sl [expr $sl*0.5] set fx 2 ; set fy 2 set d [expr $sl/6] ; set d1 [expr $sl/10] set gx 5 ; set gy 3 set d2 [expr $sl/4] set ps [list [expr $xm-$sl+$fx] [expr $xm-$fy] \ [expr $xm-$sl+$d] [expr $xm-$d1] \ [expr $xm+$sl-$d] [expr $xm-$d1] \ [expr $xm+$sl-$fx] [expr $xm-$fy] \ [expr $xm+$sl-$gx] [expr $xm+$gy] \ [expr $xm+$d2] [expr $xm+$d1] \ [expr $xm+$d] [expr $xm+$d] [expr $xm-$d] [expr $xm+$d] \ [expr $xm-$d2] [expr $xm+$d1] \ [expr $xm-$sl+$gx] [expr $xm+$gy] \ [expr $xm-$sl+$fx] [expr $xm-$fy]] eval $cwl create polygon $ps -fill green -tags wheel set cs "" foreach "x y" $ps { lappend cs [expr $x-$xm] [expr $y-$xm] } set d 3 ; set m [expr $xm+$d] ; set n [expr $xm-$d] $cwl create oval $n $n $m $m -fill black set SimulDrive(wheel) [list $xm $xm wheel $cwl $cs] # speed bar scale $w.fr.frsw.speed -length $swht -from 500 -to 0 -showvalue 1 \ -width 20 -label $SPUNIT -variable SimulDrive(speed) \ -command SimulDriveSpeedChange # help BalloonButton $w.fr.frsw.bhlp rthlpdsim # steering buttons set i -1 foreach b "left straight right" op "turn turnval turn" v "1 0 -1" { button $w.fr.frsw.b$b -text $TXT($b) -width 6 \ -command "$w.fr.frsw.b$b configure -state normal ; \ SimulDriveChange $op $v" grid $w.fr.frsw.b$b -row 1 -column [incr i] -sticky ew } grid $w.fr.frsw.bhlp -column 0 -row 0 -sticky es grid $cwl -column 1 -row 0 grid $w.fr.frsw.speed -column 2 -row 0 -sticky wns # message label $w.fr.mess -textvariable SimulDrive(mess) -width 15 -fg red frame $w.fr.frbs button $w.fr.frbs.start -text $TXT(startfrom) -command SimulDriveStart grid $w.fr.frbs.start foreach x "frsw mess" { grid $w.fr.$x } grid $w.fr.frbs -pady 5 grid $w.fr RaiseWindow $w update idletasks return } proc SimulDriveControl {flag} { # pointer left from/returned to window global SimulDrive TXT if { $SimulDrive(data) != "" && ! $flag } { set SimulDrive(mess) $TXT(outofctrl) } else { set SimulDrive(mess) "" } return } proc SimulDriveSpeedChange {val} { # change in speed scale: start if needs be global SimulDrive MESS if { $SimulDrive(data) == "" } { GMMessage $MESS(drvsimoff) } return } proc SimulDriveChange {what d} { # $what in {speed, turn, turnval} # $d is change in value unless $what==turnval in which case is new value global SimulDrive MESS if { $SimulDrive(data) == "" } { GMMessage $MESS(drvsimoff) } elseif { $what == "turnval" } { set SimulDrive(turn) $d TurnObject $d $SimulDrive(wheel) } else { incr SimulDrive($what) $d if { $what == "turn" } { if { $SimulDrive(turn) > 180 } { set SimulDrive(turn) 180 } elseif { $SimulDrive(turn) < -180 } { set SimulDrive(turn) -180 } TurnObject $SimulDrive(turn) $SimulDrive(wheel) } } return } proc SimulDriveStart {} { # fix the initial point and start the simulation global SimulDrive Number WPPosn WPDatum RealTimeLogOn MESS if { $Number(WP) == 0 } { GMMessage $MESS(needWP) return } if { [set ix [ChooseItems WP]] == "" } { return } set ix [lindex $ix 0] set p $WPPosn($ix) if { $WPDatum($ix) != "WGS 84" } { set p [ToDatum [lindex $p 0] [lindex $p 1] \ $WPDatum($ix) "WGS 84"] } else { set p [lrange $p 0 1] } foreach x "trk turn speed" { set SimulDrive($x) 0 } TurnObject 0 $SimulDrive(wheel) set SimulDrive(secs) [clock seconds] set date [clock format $SimulDrive(secs) -format "%Y %m %d %H %M %S"] regsub -all { 0([0-9])} $date { \1} date set SimulDrive(data) [list $date $p simul {_ _ _} _ {0 0 0} _ _ _ 0] if { $RealTimeLogOn } { UseRealTimeData $SimulDrive(data) } after 1000 SimulDrivePVT return } proc SimulDrivePVT {} { # generate a fake PVT data list and a call to proc UseRealTimeData # the previous data list is changed in answer to the user actions global SimulDrive RealTimeLogOn DSCALE if { $SimulDrive(data) != "" } { foreach "date pos fix errv alt velv" $SimulDrive(data) { break } set s [clock seconds] set dt [expr $s-$SimulDrive(secs)] set SimulDrive(secs) $s set date [clock format $s -format "%Y %m %d %H %M %S"] regsub -all { 0([0-9])} $date { \1} date if { $SimulDrive(speed) == 0 } { # update time and velocity vector only set SimulDrive(data) [lreplace $SimulDrive(data) 0 0 $date] set SimulDrive(data) [lreplace $SimulDrive(data) 5 5 {0 0 0}] } else { foreach "lat long" $pos { break } foreach "vx vy vz" $velv {} set SimulDrive(trk) \ [expr round($SimulDrive(trk)-$SimulDrive(turn)/6.0)%360] set a [expr $SimulDrive(trk)*0.01745329251994329576] # m/s set sp [expr $SimulDrive(speed)/$DSCALE/3.6] set vx [expr $sp*sin($a)] ; set vy [expr $sp*cos($a)] # plane sailing formulas set dlat [expr $vy*$dt/111120.0] set coslat [expr cos($lat*0.01745329251994329576)] if { $coslat < 1e-15 } { set dlong 0 } else { set dlong [expr $vx*$dt/111120.0/$coslat] } set SimulDrive(data) [list $date \ [list [expr $lat+$dlat] [expr $long+$dlong]] simul $errv \ $alt [list $vx $vy $vz] $SimulDrive(trk) _ _ _] } if { $RealTimeLogOn } { UseRealTimeData $SimulDrive(data) } after 1000 SimulDrivePVT } return } proc SimulDriveOff {} { global SimulDrive destroy .simdrive set SimulDrive(data) "" return } gpsman-6.4.4.2/gmsrc/lowrance_patches.tcl0000644000175000017500000004410212224351120016415 0ustar migmig# # This file is part of: # # gpsman --- GPS Manager: a manager for GPS receiver data # # Copyright (c) 1998-2013 Miguel Filgueiras migfilg@t-online.de # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. # # File: lowrance_patches.tcl # Last change: 6 October 2013 # # this file contains patches to keep the Lowrance support code (in files # lowrance.tcl, lowrance_nmea.tcl, lowrance_symbols.tcl) compatible # with GPSMan after version 5.4.2 # ## possible sources of problems: # - proc StoreWP (know.tcl) can change the name of a WP; this may # have impact on the list of WP names of an incoming RT # # - lowrance*.tcl not adequately protected against SRLFILE and SERIALPORT # being undefined # ## symbols used by Magellan # from magellan.tcl Copyright (c) 2003 Matt Martin (matt.martin _AT_ ieee.org) # needed for importation/exportation of MapSend files (files_foreign.tcl) set MAG_SYMTAB {WP_dot square_green house avn_vortac airport amusement_park casino car_repair boat camping exit 1st_aid avn_vordme buoy fuel deer golf lodging fish large_city light capitol_city boat_ramp medium_city museum danger park store knife_fork mountains diver_down_1 RV_park military scenic small_city oil_field stadium info truck_stop drinking_water wreck zoo} ## use of proc DestroyRGrabs (util.tcl) instead of the destroy command ## and also proc GMToplevel proc CloseInProgrWindow {} { global ProgrWGrabs DestroyRGrabs .inprogr $ProgrWGrabs return } proc FailsInProgrWindow {mess} { # create dialog for signaling operation in progress # fail if window already exists # single button: Abort; no bindings global COLOUR EPOSX EPOSY TXT ProgrWGrabs if { [winfo exists .inprogr] } { Raise .inprogr ; bell ; return 1 } set ProgrWGrabs [grab current] GMToplevel .inprogr commrec +$EPOSX+$EPOSY {} {WM_DELETE_WINDOW bell} {} frame .inprogr.fr -relief flat -borderwidth 5 -bg $COLOUR(messbg) label .inprogr.fr.title -text "..." -relief sunken label .inprogr.fr.text -text "$mess" # button .inprogr.fr.stop -text "STOP" -default active -command "NMEAOff" set fw .inprogr.fr.frc frame $fw -relief flat -borderwidth 0 label $fw.tit -text "Working - please wait" button .inprogr.fr.ok -text "Stop" -state normal \ -command NMEAOff # button .inprogr.fr.ok -text $TEXT(abort) -command NMEAOff pack $fw.tit -side left -padx 0 pack .inprogr.fr -side top pack .inprogr.fr.title .inprogr.fr.text .inprogr.fr.frc \ .inprogr.fr.ok -side top -pady 5 # pack .inprogr.fr.stop -side top -pady 5 update idletasks grab .inprogr.fr.ok RaiseWindow .inprogr return 0 } ## GPSMan RT identifiers can now be a string but Lowrance needs integers proc SendData {command indx} { # transfer data to receiver # first group sent will be the Command Header. This will # be followed by a data group for PUTS (& for some GETS) or will # trigger a reply header & data group for GETS. # Second arg is the data index or zero, as appropriate. global WPName WPNum UnusedWPInx UnusedICInx RTWPoints RTList TRNumDeltas \ PntCount NDeltas CMD CurrentTrack MESS RTIdNumber set data "" switch $command { GetWP - GetICpos - GetRT - GetICgr { set data [PacketHeader $CMD($command) 2] lappend data [CheckSum $data] set suffix [binary format "s" $indx] set d [split $suffix ""] lappend data [lindex $d 0] [lindex $d 1] lappend data [CheckSum $d] } GetTR { set data [PacketHeader $CMD($command) 1] lappend data [CheckSum $data] set suffix [binary format "c" $indx] lappend data $suffix lappend data [CheckSum $suffix] } GetTRd { set deltaslice 20 set sdata [PacketHeader $CMD($command) 3] lappend sdata [CheckSum $sdata] set suffix [binary format "c" $indx] if {$TRNumDeltas < $deltaslice} { set deltas [binary format "s" $TRNumDeltas] set TRNumDeltas 0 } else { set deltas [binary format "s" $deltaslice] set TRNumDeltas [expr ($TRNumDeltas - $deltaslice)] } set d [split $deltas ""] lappend suffix [lindex $d 0] [lindex $d 1] lappend suffix [CheckSum $suffix] set data [concat $sdata $suffix] } PutWP { if { $WPNum($indx) < 0} { set WPNum($indx) [lindex $UnusedWPInx 0] set UnusedWPInx [lreplace $UnusedWPInx 0 0] } set sdata [PacketHeader $CMD($command) 29] lappend sdata [CheckSum $sdata] set tvals [PrepData $command $indx] set packdata [PackData $tvals] lappend packdata [CheckSum $packdata] set data [concat $sdata $packdata] } PutRT { if { ! [regexp {^[0-9]+$} $RTIdNumber($ix)] } { GMMessage [format $MESS(cantsaveRTid) 1] return } set count [array size WPName] set RTList "" foreach pnt $RTWPoints($indx) { set inx [IndexNamed WP $pnt] if { ! [string compare WPNum($inx) "" ] } { if { [llength $unusedWPInx] == 0 } { GMMessage $MESS(noWPinx) ResetCursor . } else { set WPNum($inx) [lindex $UnusedWPInx 0] set UnusedWPInx [lreplace $UnusedWPInx 0 0] } } lappend RTList $WPNum($inx) } set PntCount [llength $RTList] set numbytes [expr ($PntCount * 2) + 16] set data [PacketHeader $CMD($command) $numbytes] lappend data [CheckSum $data] set tvals [PrepData $command $indx] set packdata [PackData $tvals] set chk [CheckSum $packdata] set packdata [concat $packdata [list $chk]] set data [concat $data $packdata] } PutIC { foreach i { $indx } { if { ! [string compare WPNum($i) "" ] } { if { [llength $unusedICInx] == 0 } { GMMessage $MESS(noICinx) ResetCursor . } else { set WPNum($i) [lindex $UnusedICInx 0] set UnusedICInx [lreplace $UnusedICInx 0 0] } } } set count [llength $indx] set data [PacketHeader $CMD(PutICno) 2] lappend data [CheckSum $data] set suffix [binary format "s" $count] set d [split $suffix ""] lappend data [lindex $d 0] [lindex $d 1] [CheckSum $d] GPSInterface PutICno $data for {set i 0} {$i < $count} {incr i} { set inx [lindex $indx $i] set data [PacketHeader $CMD(PutIC) 11] lappend data [CheckSum $data] set tvals [PrepData $command $inx] set packdata [PackData $tvals] lappend packdata [CheckSum $packdata] set data [concat $data $packdata] GPSInterface $command $data } return } PutTR { set CurrentTrack $indx set sdata [PacketHeader $CMD($command) 11] lappend sdata [CheckSum $sdata] set tvals [PrepData $command $indx] set packdata [PackData $tvals] lappend packdata [CheckSum $packdata] set data [concat $sdata $packdata] } PutTRd { if {$PntCount < 40} { set NDeltas $PntCount set PntCount 0 } else { set NDeltas 40 set PntCount [expr $PntCount - 40] } set n [expr $NDeltas * 4 + 3] set data [PacketHeader $CMD($command) $n] lappend data [CheckSum $data] set tvals [PrepData $command $CurrentTrack] set packdata [PackData $tvals] lappend packdata [CheckSum $packdata] set data [concat $data $packdata] } default { set data [PacketHeader $CMD($command) 0] lappend data [CheckSum $data] } } GPSInterface $command $data return } ## change of proc PosType to array POSTYPE ## no need for position type in calls to proc CreatePos ## no need for SFilePFrmt proc WriteHeader1 {file pformt fname} { # write header to file in GPSMan format, using $pformt for positions global TimeOffset Datum FCOMMAND CREATIONDATE \ SFilePFrmt SFileDatum SFileHeader MESS if {[file size $fname] ==0 } { puts $file "$FCOMMAND(comment) $MESS(written) GPSManager [NowTZ]" puts $file "$FCOMMAND(comment) $MESS(editrisk)" puts $file "" puts $file "$FCOMMAND(format) $pformt $TimeOffset $Datum" puts $file "$FCOMMAND(dates) $FCOMMAND($CREATIONDATE)" puts $file "" } set SFilePFrmt($file) $pformt set SFileDatum($file) $Datum set SFileHeader($file) 1 } return } # use of FormatPosition instead of CreatePos proc ConvWPData {d} { # convert WPs data got from receiver into list of lists suitable for # use with SetItem global PositionFormat DEFAULTDISPOPT DATAFOR set wpnum [lindex $d 0] set wpname [lindex $d 4] set date [ConvLowrDate [lindex $d 5]] set s [lindex $d 1] set sym [NameForCodeOf SYMBOL $s] set latd [lindex $d 2] ; set longd [lindex $d 3] foreach "p pfmt datum" \ [FormatPosition $latd $longd "WGS 84" $PositionFormat "" DDD] { break } set all [list Name Num Posn Date Symbol Datum PFrmt] set r [list $wpname $wpnum $p $date $sym $datum $pfmt] set r [FormData WP $all $r] return $r } # use of FormatPosition instead of CreatePos proc ConvICData {d} { # convert Icon data got from receiver into list of lists suitable for # use with SetItem global PositionFormat DEFAULTDISPOPT set id [lindex $d 0] set name [lindex $d 4] set latd [lindex $d 1] ; set longd [lindex $d 2] foreach "p pfmt datum" \ [FormatPosition $latd $longd "WGS 84" $PositionFormat "" DDD] { break } set s [lindex $d 3] set sym [NameForCodeOf SYMBOL $s] set all [list Name Num Posn Symbol Datum PFrmt] set r [list $name $id $p $sym $datum $pfmt] set r [FormData WP $all $r] return $r } # replacing call to CreatePos by call to FormatLatLong proc InDataTR {data} { # add TRs data from receiver to database global Index Number GetDispl foreach p $data { set tps "" set f [lindex $p 0] set id [lindex $f 0] set ix [IndexNamed TR $id] if {$ix == -1} then { foreach d $p { set t [FormatLatLong [lindex $d 3] [lindex $d 4] DMS] lappend t [lindex $d 1] [lindex $d 2] lappend tps $t } set trdata [list [lindex $d 0] $tps] set all [list Name TPoints] set r [FormData TR $all $trdata] StoreTR $ix $id $r $GetDispl } } return } # replacing call to CreatePos by call to FormatLatLong proc NMEAInDataTR {id bulkdata} { # add TRs data from NMEA receiver to database global DataDefault NMEADatum Index Number GetDispl set DataDefault(TR) [list "" "" $NMEADatum "" "" 0] set tps "" set ix [IndexNamed TR $id] if {$ix == -1} then { foreach d $bulkdata { set t [FormatLatLong [lindex $d 3] [lindex $d 4] DMS] lappend t [lindex $d 1] [lindex $d 2] lappend t [lindex $d 5] [lindex $d 6] lappend tps $t } set trdata [list [lindex $d 0] $tps] set all [list Name TPoints] set r [FormData TR $all $trdata] StoreTR $ix $id $r $GetDispl } return } # replacing calls to ConvertDatum by call to ToDatum proc PrepData {cmd inx} { # prepare WPs, RTs, or TRs data to be transferred global GPSMANDAYS PDTYPE WPName WPSymbol WPNum WPCommt WPPosn WPDatum WPDate \ ICIdNumber ICSymbol ICPfrmt ICPosn ICDatum RTList RTIdNumber \ RTCommt TRName TRDatum TRTPoints NDeltas TDeltas TRNumDeltas \ PntCount Choice SYMBOLCODE YEAR0 MONTHNAMES DateFormat CurrentTrack switch $cmd { PutWP { set p $WPPosn($inx) if { [string compare $WPDatum($inx) "WGS 84"] } { set p [ToDatum [lindex $p 0] [lindex $p 1] \ $WPDatum($inx) "WGS 84"] } set latd [lindex $p 0] set longd [lindex $p 1] set sym $SYMBOLCODE($WPSymbol($inx)) if { ! [string compare $WPDate($inx) ""] } { set year0 $YEAR0 ; set YEAR0 1992 set t { %Y %m %d %H %M %S } set s [clock format [clock seconds] -format $t] scan $s "%d %d %d %d %d %d" y m d h mn s set wpdate [DateToSecs $y $m $d $h $mn $s] set YEAR0 $year0 } else { set date [split $WPDate($inx) ": -/."] if { ! [string compare $DateFormat "DDMMMYYYY"] } { scan $date {%d %[a-zA-Z] %d %d %d %d} d mnth y h mn s set m [lsearch -exact $MONTHNAMES $mnth] set month [expr $m + 1] } if { ! [string compare $DateFormat "YYYY-MM-DD"] } { scan $date {%d-%d%-d %d %d %d} month d y h mn s } if { ! [string compare $DateFormat "MMDDYYYY"] } { scan $date {%d %d %d %d %d %d} month d y h mn s } if { ! [string compare $DateFormat "YYYYMMDD"] } { scan $date {%d %d %d %d %d %d} y month d h mn s } set gpsdate [DateToSecs $y $month $d $h $mn $s] set wpdate [expr $gpsdate - ($GPSMANDAYS*24*3600)] } set wpnum [expr $WPNum($inx) - 1] return [list $PDTYPE($cmd) [PrepWPData $WPNum($inx) $WPName($inx) \ $sym $WPCommt($inx) $latd $longd $wpdate ]] } PutRT { set pointlist "" for {set i 0} {$i < $PntCount} {incr i} { lappend pointlist [lindex $RTList $i] } return [list $PDTYPE(PutRT) [PrepRTData $RTIdNumber($inx) \ $PntCount $RTCommt($inx) $pointlist]] } PutIC { set p $WPPosn($inx) if { [string compare $WPDatum($inx) "WGS 84"] } { set p [ToDatum [lindex $p 0] [lindex $p 1] \ $WPDatum($inx) "WGS 84"] } set num [string range $WPName($inx) 4 end] set sym $SYMBOLCODE($WPSymbol($inx)) set latd [lindex $p 0] set longd [lindex $p 1] return [list $PDTYPE($cmd) [PrepICData $num \ $sym $latd $longd]] } PutTR { set TDeltas "" set points "" foreach p $TRTPoints($inx) { lappend points [list [lindex $p 0] [lindex $p 1]] } set pnts "" if { [string compare $TRDatum($inx) "WGS 84"] } { foreach p $points { lappend pnts [ToDatum [lindex $p 0] \ [lindex $p 1] $TRDatum($inx) "WGS 84"] } set points $pnts } foreach p $points { set ymerc [Lat2Merc [lindex $p 0]] set xmerc [Long2Merc [lindex $p 1]] lappend tpoints [list $ymerc $xmerc] } set PntCount [expr [llength $tpoints] -1] set p [lindex $tpoints 0] set y [lindex $p 0] ; set x [lindex $p 1] set yo $y ; set xo $x for {set i 1} {$i <= $PntCount} {incr i} { set p [lindex $tpoints $i] set y1 [lindex $p 0] ; set x1 [lindex $p 1] set dy [expr $y1 - $y] ; set dx [expr $x1 - $x] lappend TDeltas [list $dy $dx] set y $y1 ; set x $x1 } return [list $PDTYPE($cmd) [list $inx $yo $xo $PntCount]] } PutTRd { set deltas "" ; set type $PDTYPE($cmd) for {set i 0} {$i < $NDeltas} {incr i} { set d [lindex $TDeltas 0] lappend deltas [lindex $d 0] [lindex $d 1] lappend type "word" "word" set TDeltas [lreplace $TDeltas 0 0] } return [list $type [concat [list $CurrentTrack $NDeltas] $deltas ]] } } } # needing an args for compatibility with LoadGRElsIn proc GetGPSIn {wh ixs args} { # get data of type $wh (in {WP, RT}), but only to replace items with # given indices $ixs (that may contain -1, meaning that new items # can be created) # $args not used but needed for compatibility with proc LoadGRElsIn global GetSet set GetSet($wh) $ixs DoGetGPS $wh return } ## use of proc GMToplevel to create toplevels proc NMEANoImageMess {} { global NMEANoImage TXT MESS if { [winfo exists .noimg] } { Raise .noimg ; bell ; return 1 } GMToplevel .noimg GMNmea +300+100 {} {WM_DELETE_WINDOW bell} {} label .noimg.lbl -font {helvetica 24 bold} \ -text $MESS(Noimg) pack .noimg.lbl -side top -pady 2 set NMEANoImage 1 return } proc NMEAMapNameWindow {} { global COLOUR EPOSX EPOSY TXT MapName if { [winfo exists .mapname] } { Raise .mapname ; bell ; return 1 } GMToplevel .mapname name -10+0 {} {WM_DELETE_WINDOW bell} {} frame .mapname.fr -relief flat -borderwidth 0 -bg $COLOUR(messbg) label .mapname.fr.txt -text $MapName -font {charter 24 bold} pack .mapname.fr -side right -pady 0 pack .mapname.fr.txt -side left -pady 0 update idletasks RaiseWindow .mapname return 0 } proc NMEASetupWindow {} { global TXT LOGMENU LOGCMD NMEATrackName if { [winfo exists .nmea] } { Raise .nmea ; bell ; return 1 } GMToplevel .nmea "==NMEA" +200+200 {} {WM_DELETE_WINDOW bell} {} pack [frame .nmea.fr0 -relief flat -width 175 -borderwidth 5] pack [label .nmea.fr0.title -text $TXT(NMEASet)] -pady 2 menubutton .nmea.fr0.interval -relief raised -width 10 \ -text $TXT(Interval) -direction left -textvariable LogInterval \ -borderwidth 5 -menu .nmea.fr0.interval.m pack .nmea.fr0.interval -pady 2 menu .nmea.fr0.interval.m -tearoff 0 wm transient .nmea.fr0.interval.m .nmea.fr0.interval foreach t $LOGMENU c $LOGCMD { .nmea.fr0.interval.m add command -label $t \ -command "set NMEALogInterval $c" } pack [frame .nmea.fr1 -relief flat -width 175 -borderwidth 5] pack [frame .nmea.fr1.fr0 -relief flat -width 175 -borderwidth 5] -side left pack [frame .nmea.fr1.fr1 -relief flat -width 175 -borderwidth 5] -side right pack [frame .nmea.fr1.fr0.fr0 -relief flat -width 175 -borderwidth 5] pack [frame .nmea.fr1.fr0.fr1 -relief flat -width 175 -borderwidth 5] pack [frame .nmea.fr1.fr1.fr0 -relief flat -width 175 -borderwidth 5] pack [frame .nmea.fr1.fr1.fr1 -relief flat -width 175 -borderwidth 5] pack [label .nmea.fr1.fr0.fr0.title -text $TXT(Autoload)] -pady 2 button .nmea.fr1.fr0.fr0.auto -text $TXT(load) -relief raised -default normal \ -command LoadAutoMapInfo pack .nmea.fr1.fr0.fr0.auto -pady 2 pack [label .nmea.fr1.fr0.fr1.title -text $TXT(NMEAauto)] -pady 2 button .nmea.fr1.fr0.fr1.logr -text $TXT(start) -relief raised -default normal \ -command "StartNMEALog 0" pack .nmea.fr1.fr0.fr1.logr -pady 2 pack [label .nmea.fr1.fr1.fr0.title -text $TXT(Newtrack)] -pady 4 entry .nmea.fr1.fr1.fr0.track -relief sunken -bd 5 -state normal -width 10 \ -textvariable NMEATrackName pack .nmea.fr1.fr1.fr0.track -pady 4 pack [label .nmea.fr1.fr1.fr1.title -text $TXT(NMEApreload)] -pady 4 button .nmea.fr1.fr1.fr1.logr -text $TXT(start) -relief raised -default normal \ -command "StartNMEALog 1" pack .nmea.fr1.fr1.fr1.logr -pady 4 return 0 } gpsman-6.4.4.2/gmsrc/config.tcl0000644000175000017500000002627512224351120014354 0ustar migmig# # This file is part of: # # gpsman --- GPS Manager: a manager for GPS receiver data # # Copyright (c) 1998-2013 Miguel Filgueiras migfilg@t-online.de # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. # # File: config.tcl # Last change: 6 October 2013 # ## the following values can be set from the options dialog of the interface # language: see lang*.tcl files, the ENCODED array in metadata.tcl, the # language names and the ALLMONTH array in i18n-utf8.tcl, and the # KNOWNLANGS list in main.tcl # currently available: engl for English, port for Portuguese, deutsch for # German, it for Italian, fr for French, nl for Dutch, id for Indonesian, # es for Spanish, ru for Russian set LANG engl # ISO latin1 character composition (accents, cedilla, ...) set ISOLATIN1 1 # Delete-key to delete last character set DELETE 1 # Configuration of main window in {map, lists} ("single" no longer supported) set MWINDOWSCONF map # GPS receiver trade mark and model (if applicable): give trade mark # (one of: Garmin, Lowrance, Magellan) followed by model name. # See file recmodels.tcl for list of known models set GPSREC "Garmin" # default baud rate for serial port switch $GPSREC { Garmin { set SERIALBAUD 9600 } Magellan { set SERIALBAUD 115200 } } # default receiver protocol (only used if $GPSREC=="Garmin"): see possible # values in list RECPROTOCOLS defined for each trade mark in file # recmodels.tcl set DEFTRECPROTOCOL garmin # GPS receiver dependent values (set to Garmin Quest) # accept all characters in names/comments; this may be risky! set ACCEPTALLCHARS 0 set NAMELENGTH 40 set COMMENTLENGTH 40 set MAXWPOINTS 500 set MAXROUTES 50 set MAXWPINROUTE 256 set MAXTPOINTS 10000 set CREATIONDATE 0 set NOLOWERCASE 0 # DJG contribution: (only used if $GPSREC=="Garmin") # whether non-numeric route names should be automatically converted to # numbers when sending them to a receiver requiring numbered routes; this # may overwrite existing routes in the receiver set AutoNumRts 0 #-- # support for laps: only used if $GPSREC=="Garmin" set SUPPORTLAPS 0 # sampling interval for Lowrance receivers in seconds set INTERVAL 3 # default symbol name (GPSMan convention; see symbols.tcl) set DEFAULTSYMBOL WP_dot # and symbol display options (GPSMan convention; see symbols.tcl) set DEFAULTDISPOPT s_name # default for whether items read from a file should be displayed on map set SHOWFILEITEMS 0 # default line widths for routes, tracks and lines set DEFTRTWIDTH 2 set DEFTTRWIDTH 2 set DEFTLNWIDTH 1 # count to show information of track point on map; 0 means no numbers shown set TRNUMBERINTVL 10 # what information to show for a track point, one of: number, date set TRINFO number # whether polylines on map react to mouse events (they should not if # they are seen as part of the background) set LNSREACT 0 # data items with same name will be overwritten (ovwrt) or created under # new name (rename): set EQNAMEDATA ovwrt # keep hidden data (not available for editing) when changing item; # one of: never, ask (at every change), always set KEEPHIDDEN never # default values # possible distance units: KM NAUTMILE STATMILE set DISTUNIT KM # altitude units: M FT set ALTUNIT M # altitude threshold when computing total ascent/descent # in user units; set to 2 when using a barometric altimeter set ALTHRESHOLD 11 # possible position formats: DMS (hdeg, min, sec), DMM (hdeg, min), # DDD (hdeg), UTM/UPS (ze, zn, e, n), # MH (Maidenhead locator, 6 characters) # BNG (British grid: zone, e, n), # CMP (Portuguese military grid: e, n), # GKK (German grid: zone, e, n), # ITM (Irish grid: zone, e, n) # SEG (Swedish grid: e, n) # and maybe other grids (see projections.tcl) set PositionFormat DMS set Datum "WGS 84" # difference in hours to UTC (must be an integer) set TimeOffset 1 # possible date and time formats: # YYYYMMDD (1998.03.20 09:35:23), # YYYY-MM-DD (1998-03-20 09:35:23), # ISO8601 (2004-03-25T09:35:23Z), # MMDDYYYY (03/20/1998 09:35:23), # DDMMMYYYY (20-Mar-1998 09:35:23), # YYYY/MM/DD (1998/03/20-09:35:23) set DateFormat DDMMMYYYY # default map projection and cursor position format when starting # (see projections.tcl) set DEFMAPPROJ UTM set DEFMAPPFRMT UTM/UPS set DEFMAPPFDATUM $Datum # formulae: either more accurate (1) or faster (0) # faster should only be used on very slow computers as these # formulae can give rise to large errors when computing # distances set ACCFORMULAE 1 # ask for confirmation of projection parameters set ASKPROJPARAMS 1 # use window to control slow operations set USESLOWOPWINDOW 1 # provide balloons with help set BalloonHelp 1 # default version for MapGuide (text) export files set MapGuideVersion 2002 # operating system commands considered undefined if set to "" # print file set PRINTCMD "" # display image file set DISPLAYCMD "" # open terminal window set TERMCMD "" ## NOT YET IN USE # HTTP address of the HTML version of the user manual # default in global DEFTMANHTTPADDR defined in gpsman.tcl # set to "" if unavailable set MANHTTPADDR $DEFTMANHTTPADDR # geometry # map dimensions in pixels set MAPWIDTH 800 ; set MAPHEIGHT 550 # length of scale arrow (pixels) set MAPSCLENGTH 300 # initial map scale: 1, 2, 4, 8, ... 512*$DISTUNIT/$MAPSCLENGTH pixel # or, if $DISTUNIT==km: 50, 100, 200, 500 m/$MAPSCLENGTH pixel # else: 150, 300, 600, 2400 ft/$MAPSCLENGTH pixel # actual distance and unit (from the values above) for the scale arrow set MAPSCALE "4 km" # fonts: either "default" or a Tcl/Tk font description # default font set DEFAULTFONT default # fixed font set FIXEDFONT fixed # map font set MAPFONT fixed # travel/navigation font set TRAVELFONT {fixed 12} # plot/graph font set PLOTFONT {fixed 12} # size of icons: either 15x15 (pixels) or 30x30 set ICONSIZE 15x15 # menus set MAXMENUITEMS 20 # dimensions of lists set LISTWIDTH 15 set LISTHEIGHT 22 # initial positions # lists window set LPOSX 40 ; set LPOSY 25 # map window set MPOSX 5 ; set MPOSY 0 # receiver window set RPOSX 10 ; set RPOSY 250 # errors, messages, warnings set EPOSX 340 ; set EPOSY 50 # dialogs set DPOSX 290 ; set DPOSY 50 # offset for dialog for making route on map set DPOSRTMAP -200 # colours # general fore/background set COLOUR(fg) #090980 set COLOUR(bg) #f7f7e0 # error background set COLOUR(messbg) #ff8d90 # confirmation background set COLOUR(confbg) #F0E9C0 # selection background set COLOUR(selbg) #F0E9C0 # input dialog background set COLOUR(dialbg) #dbead0 # receiver offline set COLOUR(offline) #d83232 # receiver online set COLOUR(online) green # selected checkbutton set COLOUR(check) red # balloon help set COLOUR(ballbg) #fef6e1 set COLOUR(ballfg) #8d7f56 # colours on map # selected map item set MAPCOLOUR(mapsel) red # wayponts on map set MAPCOLOUR(WP) #ff6400 # routes on map set MAPCOLOUR(RT) #48C1BC # route being defined on map set MAPCOLOUR(mkRT) #469e36 # tracks on map set MAPCOLOUR(TR) #EF9A00 # track points on map set MAPCOLOUR(TP) #CD69C9 # line colour on map set MAPCOLOUR(LN) #0000AA # map legends set MAPCOLOUR(mapleg) #8B0000 # lines in map animation set MAPCOLOUR(anim) darkblue # slots in map image grid set MAPCOLOUR(emptygrid) white set MAPCOLOUR(selemptygrid) #ffe080 set MAPCOLOUR(fullgrid) #00d8d8 set MAPCOLOUR(selfullgrid) #ffd8d8 # travel/navigation # TRK arrow set MAPCOLOUR(trvtrk) #ffcc00 # vertical speed arrows set MAPCOLOUR(trvvel_z) #ffcc00 # TRN arrows set MAPCOLOUR(trvtrn) red # CTS arrow set MAPCOLOUR(trvcts) red # 2nd CTS arrow set MAPCOLOUR(trvcts2) #c5fbd5 # warnings set MAPCOLOUR(trvwrnimportant) red set MAPCOLOUR(trvwrnnormal) blue set MAPCOLOUR(trvwrninfo) darkgreen # save state on exit, one of: never, ask (when quitting), always set SAVESTATE ask # delete state files after restoring, one of: never, ask, always set DELSTATE ask # permissions of created files set PERMS 0640 # default paper size (one of those whose dimensions are given below) set PAPERSIZE a4 ### the following values can be configured if needs be # paper size without margins set PAGEWIDTH(a4) 184m ; set PAGEHEIGHT(a4) 271m set PAGEWIDTH(a3) 258m ; set PAGEHEIGHT(a3) 379m set PAGEWIDTH(a5) 134m ; set PAGEHEIGHT(a5) 195m set PAGEWIDTH(b4) 250m ; set PAGEHEIGHT(b4) 353m set PAGEWIDTH(b5) 176m ; set PAGEHEIGHT(b5) 250m set PAGEWIDTH(letter) 211m ; set PAGEHEIGHT(letter) 279m # output formats (in Tcl/Tk syntax, similar to C) for floating-point # coordinates in seconds, minutes, degrees, and grades # changes here will not increase the data accuracy! array set COUTFMT { sec %04.1f min %06.3f deg %.5f GRA %.5f } # whether GPSMan data file can be appended to an existing file when saving # WARNING: this may create a file with conflicting time offsets that cannot # be loaded by GPSMan set APPGMDATAFILE 0 # echo on password fields, either "none" or a single character set PASSWDECHO * # options used when importing Kismet .network files # types: which Kismet network types should be converted to waypoints # esymbols: symbols (icons) to use for each encryption under each type # list of pairs with type and list of encryption followed by symbols # Tcl glob patterns can be used for the encryption # symbol names must belong to the list SYMBOLS in GPSMan file symbols.tcl # defsymbol: default symbol for encryption values not covered # prename: which prefix to use for names if the ssid is missing or name # is repeated # namenumber: initial number to add to the prefix when forming name; names # created in this way will only be used if they are acceptable, otherwise # a default name generation procedure will be used array set KISMETOPT { types {infrastructure ad-hoc} esymbols {{infrastructure {None tall_tower * radio_beacon}} {ad-hoc {* beacon}}} defsymbol beacon prename KNET namenumber 1 } gpsman-6.4.4.2/gmsrc/langes.tcl0000644000175000017500000014612712224351120014357 0ustar migmig# # This file is part of: # # gpsman --- GPS Manager: a manager for GPS receiver data # # Copyright (c) 1998-2013 Miguel Filgueiras migfilg@t-online.de # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. # # File: langes.tcl # Last change: 6 October 2013 # # Spanish language file by Alberto Morales (amd77 _AT_ gulic.org) # last input from him: 21 September 2011 # # file langengl.tcl is consulted first; no need for duplicating entries here # only 3 chars long names; check also ALLMONTH in file i18n-utf8.tcl set MONTHNAMES "Ene Feb Mar Abr May Jun Jul Ago Sep Oct Nov Dic" set DLUNIT(KM,dist) km set DLUNIT(KM,subdist) m set DLUNIT(KM,speed) km/h set DLUNIT(KM,area) km2 set DLUNIT(NAUTMILE,dist) "ml mar" set DLUNIT(NAUTMILE,subdist) pie set DLUNIT(NAUTMILE,speed) nudos set DLUNIT(NAUTMILE,area) "ml2" set DLUNIT(STATMILE,dist) "ml ter" set DLUNIT(STATMILE,subdist) pie set DLUNIT(STATMILE,speed) mph set DLUNIT(STATMILE,area) "seccin" set DLUNIT(M,dist) $DLUNIT(KM,subdist) set DLUNIT(FT,dist) $DLUNIT(STATMILE,subdist) set DTUNIT $DLUNIT($DISTUNIT,dist) set SPUNIT $DLUNIT($DISTUNIT,speed) set ARUNIT $DLUNIT($DISTUNIT,area) set ALUNIT $DLUNIT($ALTUNIT,dist) set MESS(RTcomp) "#\tPT\t\t$DTUNIT\tgrados\t$ALUNIT" set MESS(TRcomp) "#\t\t\t\t$ALUNIT\t$DTUNIT\t$DTUNIT\th:m:s\t$SPUNIT\tgrados" set MESS(WPNearest) "PT\t\t$DTUNIT\tgrados" array set MESS { badscale "Valor incorecto para la escala del mapa" oktoexit "Ok para terminar (datos no guardados se perdern)" okclrmap "Ok para borrar el mapa" namelgth "Nombre no puede tener ms de %d caracteres" cmmtlgth "Comentario no puede tener ms de %d caracteres" namevoid "Nombre no puede ser vaco" baddate "Fecha incorrecta; linea" badhdg "Direccin incorrecta %s: debe ser %s o +/-" badcoord "Coordenada con valor o formato incorrecto: \"%s\" debe ser %s" outofrng "Nmero fuera de lmites" UTMZN "Debe ser una letra entre A..H, J..N, o P..Z" badstrg "Caracter(es) incorrecto(s)" strgvoid "Cadena debe tener por lo menos un caracter" nan "\"%s\" no es un nmero" written "Escrito por" undefWP "Ruta %s tiene puntos no definidos; no guardada/exportada" bigRT "Ruta %s > mximo permitido; no exportada" unkndatum "Datum desconocido" badcommdWP "Comando incorrecto al leer puntos; lnea" notabsWP "Punto mal definido (sin tabuladores); lnea" undefinedWP "Referencia a punto desconocido: %s" undefinedTR "Trayecto desconocido" nofieldsWP "Punto mal definido (faltan campos); lnea" excfieldsWP "Punto mal definido (demasiados campos); lnea" badWPsRT "Ruta con lista incorrecta de puntos; lnea" toomuchWPs "Aviso: mas de %d puntos en ruta" badcommdTP "Comando incorrecto a leer puntos de trayecto; lnea" badcommdLP "Comando incorrecto a leer puntos de punto de linea; lnea" badTP "Punto incorrecto en trayecto; lnea" badTPsTR "Trayecto con lista incorrecta de puntos; lnea" badLP "Punto incorrecto en lnea; lnea" badLPsLN "Lnea con lista de puntos incorrecta; lnea" noheader "Fichero no tiene cabecera" loaderr "Error al leer fichero; lnea" unkncommd "Comando desconocido al leer fichero; lnea" noformat "Fichero no comienza con lnea de formato" badformat "Especificacin de formato incorrecta" badRT "Ruta mal especificada; lnea" badRTargs "Parmetros incorrectos para ruta; lnea" badTR "Trayecto mal especificado; lnea" fileact "%s fichero (%s)" filexists "Fichero existente!" GPSok "Conexin correcta" toomany "Demasiados %ss (> %d)" cantfgt "No puedo olvidar %s: pertenece a algo dibujado" cantfgted "No puedo olvidar %s: est siendo editado" cantmapRTunkn "Ruta no dibujada; punto desconocido" cantmapRTed "Ruta no dibujada; punto en edicin" cantrun "No puedo ejecutar" inprogr "Operacin ya iniciada" cantread "No puedo leer del fichero auxiliar" cantwrtopt "No puedo escribir en el fichero de opciones" voidRT "Ruta sin puntos" activeRT "Ruta 0 es la ruta activa; continuar?" voidTR "Trayecto sin puntos" voidLN "Lnea sin puntos" idinuse "Identificador ya est siendo usado" cantunmap "Imposible desvincular %s; pertence a objeto dibujado" askrevert "Volver a datos inciales?" askforget "Olvidarse de este %s?" notimpl "No implementado" forgetall "Olvidar toda la lista de %ss?" counted "Hay %d %ss en la lista" notlisted "Elemento no est en la lista" wrgval "Valor incorrecto para" voidGR "Grupo no tiene elementos" initselfGR "Grupo contiene a si mismo a travs de" GRelout "Comando para elemento fuera de definicin de GR; lnea" badGRels "Grupo con lista de elementos incorrecta; lnea" badcommdGRel "Comando incorrecto al leer elementos de grupo; lnea" notypeforGRel "Elemento sin tipo; lnea" badGRel "Definicin de elemento incorrecta; lnea" check "Intentando conectar" toomanyerr "Demasiados errores; cancelando..." getWP "Recibiendo Puntos" getRT "Recibiendo Rutas" getTR "Recibiendo Trayectos" getLAP "Recibiendo Vueltas" getAL "Recibiendo almanaque" putWP "Enviando Puntos" putRT "Enviando Rutas" putTR "Enviando Trayectos" fillbuffWP "Cargando conjunto de puntos" fillbuffRT "Cargando conjunto de rutas" noACKNAK "Recibido paquete en vez de ACK/NAK; verifique la conexin con el GPS" badplatform "Esta plataforma no permite E/S con el puerto serie" badserial "No puedo acceder al puerto serie %s" nodata "El receptor no tiene %ss" badimage "Fichero de imagen incorrecto" mapadjust "Coloque los puntos en el mapa; pulse Ok al acabar" duplicate "%s ya elegido" clrcurrmap "Borrar mapa existente?" mbkbaddatum "Sin datum vlido" mbkbadscale "La escala no puede ser negativa" mbkbadat "Argumentos incorrectos" edityourrisk "Edite bajo su responsabilidad!" okclrbkmap "Ok para borrar fondo del mapa" okclrbkim "Ok para borrar imagen en" badattrval "Campo opcional invlido (%s): %s" badattr "Nombre de campo opcional desconocido (%s): %s" badSYMBOLcode "Cdigo de smbolo incorrecto" badDISPOPTcode "Cdigo de forma de mostrar incorrecto" goingdown "Opciones guardadas; por favor reinicie" putwhat "Colocar qu tipos de datos?" readwhat "Leer que tipos de datos?" noWPinx "Demasiados puntos para el receptor" noICinx "Demasiados ICs para el receptor" getIC "Recibiendo iconos" serial1 "Prembulo de cabecera incorrecto" serial2 "Recibido comando incorrecto" checksum1 "Suma de verificacin de cabecera incorrecta" checksum2 "Suma de verificacin de datos incorrecta" receiver "No se ha establecido conexin serie!" importonly1 "Slo puede importar 1 tipo de datos" exportonly1 "Slo puede exportar 1 tipo de datos" outdatedprefs "Fichero de opciones tiene que ser actualizado" mustchoose1type "Seleccione al menos 1 tipo de datos" nosuchitems "Ningn elemento tiene esa descripcin" resultsin "Resultados en el Grupo" badWP "Falta punto por definir" badangle "ngulo debe ser >0 y <360 grados" georefhow "Mtodo para geo-referenciar" cantsolve "Ecuaciones sin solucin" transfcantscale "Transformacin actual no permite alterar escala" oldfilefmt "Formato antiguo; por favor, guardar con formato nuevo!" unknProj "Proyeccin desconocida" unknTransf "Transformacin desconocida" badProjargs "Parmetros de proyeccin incorrectos" badTransfargs "Parmetros de transformacin incorrectos" badfield "Pareja atributo=valor incorrecta" badattr "Nombre de atributo incorrecto" missattrs "Faltan atributo(s)" mbkbadproj "Proyeccin incorrecta" mbkbadtransf "Transformacin incorrecta" notUTMproj "Informacin salvada para UTM; continuar con proyeccin" projchg "Confirme parmetros de proyeccin" badparam "Valor incorrecto para %s" connectedto "Conectado a %s" recnotsuppd "Modelo de receptor no reconocido" gotprots "Recibida informacin sobre protocolos" badprots "Informacin sobre protocolos incorrecta" defprots "Usando tabla de protocolos" nohidden "Descartar datos ocultos?" badRS "Etapa de ruta fuera de definicin de RT; lnea" badWPsRSs "Etapa de ruta antes del primer o despus del ltimo punto; lnea" windowdestr "La ventana ha sido destruida!" badhidden "Formato incorrecto del valor oculto" replname "Substituya \"%s\" por un nombre que tenga al menos %d de los siguientes caracteres: %s" badalt "Valor incorrecto para altitud" baddistunit "Unidad de distancia incorrecta para escala de mapa en opciones" badgridzone "Cuadrcula incorrecta" outofgrid "Posicin fuera de la cuadrcula" timeoffnotint "Diferencia horaria debe ser entera" cantchkprot "Este protocolo no permite verificacin" mustconn1st "Primero verifique la conexin con el receptor" rltmnotsupp "Este protocolo en este receptor no permite registro en tiempo real" createdir "Necesita crear directorio %s y reiniciar" oktomkdir "Puedo crear el directorio %s?" projnameabbr "Por favor, dar un nombre y una abreviatura para la nueva proyeccin" abbrevinuse "Abreviatura ya usada" nameinuse "Nombre ya usado" projinuse "Proyeccin est siendo usada; los cambios no tendrn efecto" gridneedsdatum "Definicin incorrecta de cuadrcula %s; datum por definir" badgriddatum "El datum para la cuadrcula %s debe ser %s" cantchggriddatum "Esta cuadrcula debe usar el datum %s" gridinuse "Cuadrcula usada por %s, no puede borrarse; continuar?" gridinusenochg "Cuadrcula usada por %s; cambios sin efecto" cantwrtprgr "No puedo escribir en fichero de proyecciones" cantwrtdtel "No puedo escribir en fichero de datums" movingWP "Colocar %s con botn izquierdo\nCancelar con botn derecho" missingdata "Informacin insuficiente!" needs1wp "Una ruta debe tener al menos 1 punto" emptypos "Posicin con campo(s) vaco(s)" cantwrtsstate "No puedo escribir el fichero de estado: %s" cantrdsstate "No puedo leer del fichero de estado: %s" corruptsstate "Fichero de estado %s con errores" editrisk "Edite bajo su responsabilidad!" savestate "Guardar estado actual?" delsstate "Borrar ficheros de estado?" badmapinfo "Error en fichero de parmetros de mapa" badMHloc "Posicin Maidenhead incorrecta" areais "rea del polgono (no intersectado): %.3f%s" areatoosmall "rea es demasiado pequea (<%s km2)" projarea "Calculando rea proyectada" selfintsct "Puntos repetidos: una ruta no puede intersectarse!" badinvmdist "Error de aproximacin al invertir distancia sobre meridiano" badinvproj "Error de aproximacin al invertir la proyeccin %s" negdlatlong "Diferencia entre lat/long no puede ser negativa!" allundef "No hay definiciones para los puntos del GR" badfloats "Hay errores en las conversiones de nmeros decimales; conectar as mismo?" noprintcmd "Falta comando para imprimir; definirlo en las opciones" cantexecasroot "GPSMan no puede ser ejecutado por root" badargtofunc "Argumento incorrecto a la funcin %s" redefproj "Abreviatura de proyeccin %s coincide con una proyeccin predefinida; renombre su definicin!" couldntcd "Imposible cambiarse al directorio %s" shpext "Extensin %s incorrecta; ok para usar .shp, .shx, .dbf?" shpcntopen "Imposible crear/abrir ficheros Shapefile" shpcntcrtfs "Imposible crear campos Shapefile .dbf" shpcntwrtfs "Imposible escribir campos Shapefile .dbf" shpoutmem "Memoria agotada!" shpemptyfile "Fichero vaco" shpwrongfile "Tipo de fichero incorrecto" shplessdim "Dimensin en fichero menor que la solicitada; continuar?" shpbadWPinRT "WP nmero %d de coordenadas incorrectas ignorado en RT %s" errorGTMread "Error al leer de fichero de GTrackMaker" badGTMvers "Versin no soportada de fichero de GTrackMaker" badGTMfile "Inicio incorrecto de fichero de GTrackMaker" badGTMcounts "Contador(es) negativos en fichero de GTrackMaker" badGTMlat "Latitud incorrecta en fichero de GTrackMaker" badGTMlong "Longitud incorrecta en fichero de GTrackMaker" badGTMdatum "Datum invlido en fichero de GTrackMaker" unobscmap "Error tal vez por haber una ventana/icono sobre el mapa; esperar y volver a intentar?" cantwrtimg "Error al guardar imagen a fichero en formato %s" cantsaveRTid "%d ruta(s) no guardada: identificador no numrico" cantsaveTRid "%d trayecto(s) no guardado: identificador no numrico" badtrvconf "Configuracin inconsistente sustituida por una vaca" drvsimoff "Simulador de conduccin: falta iniciar!" needWP "Simulador de conduccin: es preciso definir puntos antes" chgrecprot "Por favor, seleccionar otro protocolo de receptor" clrtrvlog "Borrar registro de viaje?" frgetGRcs "Olvidar grupo y todos sus elementos?!" nmeainuse "Ya se est capturando registro en tiempo real, o se esta leyendo otro fichero NMEA" badfile "Error al leer desde fichero" RTnoWPname "Los puntos de ruta slo con nombre han dejado de estar soportados" distlarge "Distancia demasiado grande!" convres "%s resultado de conversin creado con el nombre %s" outrngproj "Punto no puede ser proyectado!" badconv "Error en la conversin del parmetro %s: %s" badprmval "Resultado errneo en la conversin del parmetro %s: %s" timeconsmg "La operacin puede durar mucho tiempo: seguir?" badtimeval "Valor incorrecto para la hora" badLAP "LAP incorrecto; lnea" lapncnsdrd "LAP no se toma en cuenta" undefinedTR "Trayecto desconocido" emptymenu "Men vacio; continuar?" cantwrtsymenu "No puedo escribir en fichero de men de smbolos" abbrevhasspaces "El nombre corto no puede tener espacios" needNpoints "Debes dar al menos %s puntos!" twotimeoffsets "Varias diferencias horarias en el fichero" notimeoffset "Falta diferencia horaria en el fichero; usar 0" baddateas "Fecha incorrecta: %s" unknownenc "Codificacin de caracteres desconocida %s" chgbaudto "Cambiando velocidad transmisin para %s; por favor espere..." busytrylater "Otras operaciones en curso; intntelo ms tarde" baudchgfailed "No puedo cambiar velocidad transmisin" obssplit "Resultados de cortar %s llamado \"%s\"" samelgth "Las dos secuencias deben ser del mismo tamao" rschkargs "La llamada a regsub di error; verifique los argumentos" emptyrmeth "Mtodo de substitucin no puede ser vaco" cantwrtdefs "No puedo escribir el fichero de definicin de usuarios" xcantbey "%s no puede ser %s" mustselftfam "Tiene que seleccionar una familia de fuentes" badpluginwhere "Error en argumento \"where\" de complemento; debe ser una lista de triplas" badpluginparam "Error en parmetros de complemento: lista de NAME EXPR, NAME comienza por _" badpluginparamexec "Al ejecutar el complemento %s, parmetro incorrecto: %s" pluginfailed "Complemento %s fall con mensaje: %s" loginto "Acceso a %s" cantwrtdir "No puedo escribir en %s; por favor arregle los permisos" cantcleandir "No pude vaciar el directorio %s" defTERMCMD "La opcion para el comando que abre una ventana de terminal debe ser definida primero" gpOutfile "La salida est en el fichero \"%s\" del directorio de trabajo." gpQuitgnuplot "Pulse Enter en la ventana de xterm para salir de gnuplot." gpModgnuplot "Modifique la vista en la ventana de Gnuplot\ arrastrndo con el ratn (botn izquierdo y derecho).\n\ Despues de cerrar la ventana de Gnuplot encontrar\ la salida en el fichero \"%s\" del directorio de trabajo." htResult1 "Trayecto=\"%s\"" htResult2 "Distancia total=%s Ascenso total=%s Descenso total=%s" htResult3 "Tiempo total=%s Tiempo de descanso=%s(%s) Tiempo en movimiento=%s" htResult4 "%s Cap.plano=%s Cap.asc=%s Cap.desc=%s Tiempo senderismo estimado=%s" srResult1 "Periodos de descanso (>5min) en el trayecto \"%s\"" } set TXT(RTcompflds) "# PT {$DTUNIT} grados {$ALUNIT} etapa etiq" set TXT(TRcompflds) \ "PTS {} {} {} {$ALUNIT} {$DTUNIT} {$DTUNIT} h:m:s {$SPUNIT} grados" set TXT(starttoend) "Inicio: hasta fin %s $DTUNIT;" set TXT(startmax) "mx %s $DTUNIT;" set TXT(WPnearflds) "PT {$DTUNIT} grados" set TXT(within) "Hasta (${DTUNIT}s)" set TXT(between) "Entre (${DTUNIT}s)" array set TXT { GMtit "GPS Manager - versin" exit Salir map Mapa load Leer loadfrm "Leer de" save Guardar saveels "Guardar elementos" saveto "Guardar a" clear Limpiar clearall "Limpiar todo" newWP "Nuevo punto" newRT "Nueva ruta" newTR "Nuevo trayecto" newLN "Nueva lnea" newGR "Nuevo grupo" import Importar importfrm "Importar de" export Exportar exportels "Exportar elementos" exportto "Exportar a" count Contar trueN "Norte Geograf" automagn "Declin Auto" usrdef "Def Usuario" nameWP Punto nameRT Ruta nameTR Trayecto nameLN Lnea nameLP "Punto de lnea" nameGR Grupo namePlot Grfico nameMap Mapa nameRTComp "Clculo de Ruta" nameTRComp "Clculo de Trayecto" nameInfo Informacin GPSrec "Receptor GPS" turnoff Apagar get Buscar put Colocar all Todo select Escoger selection Eleccin options Opciones DMS GMS DMM GMM DDD GGG GRA Grados message Mensaje cancel Cancelar file Fichero ovwrt Sobreescribir app Anexar online "en lnea" offline "fuera de lnea" check Comprobar create Crear revert Releer colour color grey gris mono mono portr horizontal landsc apaisado legend Leyenda incscale "Inclur escala" more "(ms.)" waypoint Punto name Nombre created "Creado en" cmmt Comentario withWP "Con este punto:" displ "Mostrar en mapa" startRT "Iniciar ruta" route Ruta number Nmero numberid "Nmero/Id" insb "Insertar antes" insa "Insertar despus" del Borrar repl "Sustituir por" comp Calcular RTcomp "Clculo de ruta" savecomp "Guardar clculos" totdst "Distancia total" tottime "Tiempo total" totdstng "Distancia total, sin huecos" tottimeng "Tiempo total, sin huecos" totresttime "Tiempo total de descanso (>5min)" avgspmot "Velocidad media en movimiento" track Trayecto chophd "Borrar cabecera" choptl "Borrar cola" incb "Incluir antes" date Fecha newdate "Nueva fecha para el punto siguiente" endprTR "Fin del trayecto anterior" begnxt "Inicio del siguiente" date1st "Fecha para el primer punto del siguiente" TRcomp "Clculos para trayecto" avgsp "Veloc media" maxsp "Veloc mx" minsp "Veloc mn" lat Lat long Long ze ZE zn ZN eastng x nrthng y zone Zona change Cambiar forget Olvidar others Otros opt_Interf "Interfaz de usuario" optLANG Idioma optISOLATIN1 "Acentos y smbolos" optDELETE "DEL borra ltimo caracter" optMWINDOWSCONF "Ventana principal" optSERIALBAUD "Velocidad transmisin" optGPSREC "Modelo de GPS" opt_GPSRecConf "Parmetros del receptor" optACCEPTALLCHARS "Aceptar cualquier carcter" optNAMELENGTH "Longitud mx nombre" optINTERVAL "Intervalo de muestreo" optCOMMENTLENGTH "Longitud mx comentarios" optMAXWPOINTS "N mx de puntos" optMAXROUTES "N mx de rutas" optMAXWPINROUTE "N mx de puntos en ruta" optMAXTPOINTS "N mx de puntos en trayecto" optCREATIONDATE "Receptor tiene fecha de creacin" optNOLOWERCASE "Receptor no tiene minsculas" optDEFAULTSYMBOL "Smbolo habitual de punto" optDEFAULTDISPOPT "Forma habitual de mostrar punto" opt_Data "Datos" optEQNAMEDATA "Datos con el mismo nombre" optKEEPHIDDEN "Mantener datos ocultos" optDatum Datum optTimeOffset "Dif horaria" optACCFORMULAE "Frmulas de mayor precisin" optASKPROJPARAMS "Confirmar parmetros de proyeccin" optBalloonHelp "Globos de ayuda" optTRNUMBERINTVL "Mostrar informacin de punto de trayecto cada" optTRINFO "Informacin de punto de trayecto a mostrar" opt_Formats "Unidades y formatos" optDISTUNIT "Distancia" optALTUNIT "Altura" optUSESLOWOPWINDOW "Ventana para controlar operaciones lentas" optDEFTRECPROTOCOL "Protocolo por defecto" optLNSREACT "LNs asociadas responden al ratn" NAUTMILE "milla nutica" STATMILE "milla terrestre" FT pie optPositionFormat "Formato para posiciones" optDateFormat "Formato para fechas" opt_Geom "Geometra de ventanas" opt_MapGeom "Geometra de mapa" optMAPWIDTH "Ancho del mapa" optMAPHEIGHT "Alto del mapa" optMAPSCLENGTH "Longitud escala de mapa" optMAPSCALE "Escala de mapa" optMAXMENUITEMS "N mx de items en menu" optLPOSX "Pos horiz ventana de listas" optLPOSY "Pos vert ventana de listas" optMPOSX "Pos horiz ventana de mapa" optMPOSY "Pos vert ventana de mapa" optRPOSX "Pos horiz ventana de receptor" optRPOSY "Pos vert ventana de receptor" optEPOSX "Pos horiz ventana de error" optEPOSY "Pos vert ventana de error" optDPOSX "Pos horiz dilogo" optDPOSY "Pos vert dilogo" optDPOSRTMAP "Ajuste ventana RT/mapa" optLISTWIDTH "Anchura de lista" optLISTHEIGHT "Altura de lista" optCOLOUR Colores optCOLOUR,fg Frente optCOLOUR,bg Fondo optCOLOUR,messbg "Fondo para error" optCOLOUR,confbg "Fondo para confirmacin" optCOLOUR,selbg "Fondo para seleccin" optCOLOUR,dialbg "Fondo para preguntas" optCOLOUR,offline "Receptor fuera de lnea" optCOLOUR,online "Receptor en lnea" optCOLOUR,check "Seleccionado botn" optCOLOUR,ballbg "Fondo para ayuda" optCOLOUR,ballfg "Frente para ayuda" optMAPCOLOUR "Colores de mapa" optMAPCOLOUR,mapsel "Item seleccionado en mapa" optMAPCOLOUR,WP "Puntos en mapa" optMAPCOLOUR,RT "Rutas en mapa" optMAPCOLOUR,mkRT "Ruta definida en mapa" optMAPCOLOUR,TR "Trayectos en mapa" optMAPCOLOUR,TP "Puntos de trayecto en mapa" optMAPCOLOUR,LN "Lneas en mapa" optMAPCOLOUR,mapleg "Legendas en mapa" optMAPCOLOUR,anim "Animacin en mapa" optMAPCOLOUR,emptygrid "Sin imagen" optMAPCOLOUR,fullgrid "Con imagen" opt_Fonts "Tipos de letra" optDEFTRTWIDTH "Grosor lnea ruta" optDEFTTRWIDTH "Grosor lnea trayecto" optDEFTLNWIDTH "Grosor lnea lnea" opt_Files "Puerto serie y ficheros" optDEFSPORT "Puerto serie" optSAVESTATE "Guardar estado al salir" optDELSTATE "Borrar ficheros de estado" optPERMS "Permisos de fichero" optPRINTCMD "Comando para imprimir" optPAPERSIZE "Tamao de papel" optMapGuideVersion "Versin de MapGuide" optICONSIZE "Tamao de iconos" red Rojo green Verde blue Azul owner Propietario permgroup Grupo others Otros fread Leer fwrite Escr fexec Ejec YYYYMMDD AAAAMMDD MMDDYYYY MMDDAAAA DDMMMYYYY DDMMMAAAA YYYY-MM-DD AAAA-MM-DD YYYY/MM/DD AAAA/MM/DD mainwd "Ventana principal" distazim "Dist y azimut" nearestWPs "puntos prximos" fromto "Desde %s hasta %s" degrees grados nameWPDistBear "dist y azimut" nameWPNearest "puntos prximos" inrect "En rectngulo" forthisWP "para este punto" formappedWPs "para puntos en mapa" group Grupo element Elemento insert Insertar joinGR "Juntar Grupo" TRtoRT "Conversin de tray a ruta" TRtoLN "Conversion de tray a lnea" TRtoTR "Simplificacin de trayecto" TRRTnpoints "N de puntos a mantener" TRlinedispl "Mostrar resultados" TRTRdispl "Mostrar trayecto" WP PT TP PT LP PL LAP LAP commrec "Comunicacin con receptor" abort Desistir ACKs ACKs NAKs NAKs packets paquetes unnamed "(por definir)" fromTR "Desde tray: %s" mapload "Geo-ref imagen" loadmback Leer savemback "Guardar info geo-ref" chgmback Cambiar clearmback Limpiar backgrnd Fondo nameMapBkInfo "Info sobre fondo" nameMapInfo "Parmetros del mapa" mpbkchg "Cambiar fondo" mpbkgrcs "Posicin de rejilla" nameImage Imagen symbol Smbolo SY1st_aid "Primeros auxilios" SYCATaviation Aviacin SYCATgeneral Genrico SYCATland Terrestre SYCATwater Aqutico SYMOB "Hombre al agua" SYRV_park "Parque de vehculos recreativos" SYWP_buoy_white "Boya, blanca" SYWP_dot "Punto" SYairport "Aeropuerto" SYamusement_park "Parque de atracciones" SYanchor "Ancla" SYanchor_prohib "Ancla prohibida" SYavn_danger "Peligro (avn)" SYbait_tackle "Cebo y aparejo" SYball "Bola" SYbeach "Playa" SYbeacon "Baliza" SYbell "Campana" SYbiker "Ciclista" SYboat "Barco" SYboat_ramp "Rampa para barcos" SYborder "Frontera" SYbot_cond "Condiciones fondo" SYbowling "Bolera" SYbox_blue "Caja, azul" SYbox_green "Caja, verde" SYbox_red "Caja, roja" SYbridge "Puente" SYbuilding "Edificio" SYbuoy_amber "Boya, mbar" SYbuoy_black "Boya, negra" SYbuoy_blue "Boya, azul" SYbuoy_green "Boya, verde" SYbuoy_green_red "Boya, verde roja" SYbuoy_green_white "Boya, verde blanca" SYbuoy_orange "Boya, naranja" SYbuoy_red "Boya, roja" SYbuoy_red_green "Boya, roja verde" SYbuoy_red_white "Boya, roja blanca" SYbuoy_violet "Boya, violeta" SYbuoy_white "Boya, blanca" SYbuoy_white_green "Boya, blanca verde" SYbuoy_white_red "Boya, blanca roja" SYcamping "Camping" SYcapitol_city "Ciudad, estrella" SYcar "Automovil" SYcar_rental "Alquiler de automoviles" SYcar_repair "Taller de automovil" SYcasino "Casino" SYcastle "Castillo" SYcemetery "Cementerio" SYchapel "Capilla" SYchurch "Iglesia" SYcircle_blue "Crculo, azul" SYcircle_green "Crculo, verde" SYcircle_red "Crculo, rojo" SYcircle_x "Crculo con X" SYcivil "Instalacin civil" SYcntct_afro "Afro" SYcntct_alien "Alien" SYcntct_ball_cap "Pelota beisbol" SYcntct_big_ears "Orejas grandes" SYcntct_biker "Ciclista" SYcntct_bug "Cucaracha" SYcntct_cat "Gato" SYcntct_dog "Perro" SYcntct_dreads "Trencitas" SYcntct_female1 "Hembra 1" SYcntct_female2 "Hembra 2" SYcntct_female3 "Hembra 3" SYcntct_goatee "Perilla" SYcntct_kung_fu "Kung fu" SYcntct_pig "Cerdo" SYcntct_pirate "Pirata" SYcntct_ranger "Ranger" SYcntct_smiley "Sonriente" SYcntct_spike "Clavo" SYcntct_sumo "Sumo" SYcoast_guard "GuardaCostas" SYcontrolled "Area controlada" SYcross "Mira" SYcross_3p "Mira 3p" SYcrossing "Cruce" SYdam "Presa" SYdanger "Peligro" SYdeer "Ciervo" SYdiamond_blue "Rombo, azul" SYdiamond_green "Diamante, verde" SYdiamond_red "Diamante, rojo" SYdiver_down_1 "Buceo 1" SYdiver_down_2 "Buceo 2" SYdock "Drsena" SYdollar "Dolar" SYdot "Punto" SYdrinking_water "Agua potable" SYdropoff "Embarcadero" SYduck "Pato" SYelevation "Punto alto" SYexit "Salida" SYexit_no_serv "Salida sin servicios" SYfactory "Fbrica" SYfastfood "Comida rpida" SYfhs_facility "Instalacin FHS" SYfish "Pez" SYfitness "Gimnasia" SYflag "Bandera" SYflag_pin_blue "Alfiler con bandera, azul" SYflag_pin_green "Alfiler con bandera, verde" SYflag_pin_red "Alfiler con bandera, rojo" SYfreeway "Autova" SYfuel "Gasolinera" SYfuel_store "Gasolinera & tienda" SYgeo_name_land "Nombre geogr, tierra" SYgeo_name_man "Nombre geogr, hombre" SYgeo_name_water "Nombre geogr, agua" SYgeocache "Geocache" SYgeocache_fnd "Geocache encontrada" SYglider "Ala delta" SYgolf "Golf" SYheliport "Helipuerto" SYhorn "Claxon" SYhouse "Casa" SYhouse_2 "Casa 2" SYhydrant "Boca de riego" SYice_skating "Patinaje sobre hielo" SYinfo "Informacin" SYintersection "Interseccin" SYis_highway "Autopista" SYknife_fork "Comida" SYladder "Escalera" SYlanding "Aterrizaje" SYlarge_city "Ciudad (grande)" SYlarge_exit_ns "Salida sin servicio (grande)" SYlarge_ramp_int "Cruce con barreras (grande)" SYletter_a_blue "A, azul" SYletter_a_green "A, verde" SYletter_a_red "A, rojo" SYletter_b_blue "B, azul" SYletter_b_green "B, verde" SYletter_b_red "B, rojo" SYletter_c_blue "C, azul" SYletter_c_green "C, verde" SYletter_c_red "C, rojo" SYletter_d_blue "D, azul" SYletter_d_green "D, verde" SYletter_d_red "D, rojo" SYlevee "Dique" SYlight "Faro" SYlodging "Alojamento" SYmany_fish "Banco de peces" SYmany_tracks "Muchos caminos" SYmarina "Marina" SYmark_x "Marca, x" SYmedium_city "Ciudad, media" SYmile_marker "Punto kilomtrico" SYmilitary "Instalaciones militares" SYmine Mina SYmonument "Monumento" SYmountains "Montaas" SYmovie "Cine" SYmug "Jarra" SYmuseum "Museo" SYntl_highway "Autopista nacional" SYnull "(transparente)" SYnull_2 "(vaco)" SYnumber_0_blue "0, azul" SYnumber_0_green "0, verde" SYnumber_0_red "0, rojo" SYnumber_1_blue "1, azul" SYnumber_1_green "1, verde" SYnumber_1_red "1, rojo" SYnumber_2_blue "2, azul" SYnumber_2_green "2, verde" SYnumber_2_red "2, rojo" SYnumber_3_blue "3, azul" SYnumber_3_green "3, verde" SYnumber_3_red "3, rojo" SYnumber_4_blue "4, azul" SYnumber_4_green "4, verde" SYnumber_4_red "4, rojo" SYnumber_5_blue "5, azul" SYnumber_5_green "5, verde" SYnumber_5_red "5, rojo" SYnumber_6_blue "6, azul" SYnumber_6_green "6, verde" SYnumber_6_red "6, rojo" SYnumber_7_blue "7, azul" SYnumber_7_green "7, verde" SYnumber_7_red "7, rojo" SYnumber_8_blue "8, azul" SYnumber_8_green "8, verde" SYnumber_8_red "8, rojo" SYnumber_9_blue "9, azul" SYnumber_9_green "9, verde" SYnumber_9_red "9, rojo" SYoil_field "Campo de petrleo" SYopen_24hr "Abierto 24h" SYoval_blue "Oval, azul" SYoval_green "Oval, verde" SYoval_red "Oval, rojo" SYparachute "Paracadas" SYpark "Parque" SYparking "Aparcamiento" SYpharmacy "Farmacia" SYphone "Telfono" SYpicnic "Picnic" SYpin_blue "Alfiler, azul" SYpin_green "Alfiler, verde" SYpin_red "Alfiler, rojo" SYpizza "Pizzera" SYpolice "Polica" SYpost_office "Correos" SYprivate "Campo privado" SYradio_beacon "Radio baliza" SYramp_int "Cruce con barreras" SYrect_blue "Bloque, azul" SYrect_green "Bloque, verde" SYrect_red "Bloque, rojo" SYreef "Arrecife" SYrestricted "Area restringida" SYrestrooms "WC" SYscenic "Paisaje" SYschool "Colegio" SYseaplane "Base de hidroaviones" SYshopping_cart "Centro comercial" SYshort_tower "Torre, baja" SYshowers "Duchas" SYskiing "Esqu acutico" SYskull "Calavera" SYsmall_city "Ciudad, pequea" SYsnow_skiing "Esqu de montaa" SYsoft_field "Campo suave" SYsquare_blue "Cuadrado, azul" SYsquare_green "Cuadrado, verde" SYsquare_red "Cuadrado, rojo" SYst_highway "Autopista estatal" SYstadium "Estdio" SYstore "Tienda" SYstreet_int "Cruce de calles" SYstump "Tocn" SYsummit "Pico" SYswimming "Natacin" SYtake_off "Despegar" SYtall_tower "Torre, alta" SYtheater Teatro SYtide_pred_stn "Estacin prediccin mareas/corrientes" SYtoll Peaje SYtow_truck "Camin-gra" SYtraceback "Regreso" SYtracks "Caminos" SYtrail_head "Inicio de camino" SYtree "rbol" SYtriangle_blue "Tringulo, azul" SYtriangle_green "Tringulo, verde" SYtriangle_red "Tringulo, rojo" SYtruck_stop "Parada de camiones" SYtunnel "Tnel" SYultralight "Ultra-ligero" SYus_highway "Autopista EEUU" SYweedbed "Lecho de algas" SYweight_station Bscula SYwreck "Naufragio" SYzoo "Zoolgico" psvisible "Slo la parte visible" DISPsymbol "Slo smbolo" DISPs_name "Simb & nombre" DISPs_comment "Simb & comentario" DISPname "Slo nombre" DISPcomment "Slo comentario" dispopt Mostrar mapitems "Mostrar en mapa" nameIC Icono prod Producto WPCapac "Mximo de Puntos" ICCapac "Mximo de Iconos" RTCapac "Mximo de Rutas" TRCapac "Mximo de Trayectos" protcl "Protocolo" ICGraph "Smbolos para iconos" WPperRT "Puntos por ruta" notinGR "no en (sub-)grupo" onlyinGR "slo en (sub-)grupo" loadgrels "Leer elementos" importgrels "Importar elementos" about "Sobre GPSMan..." contrib "Con contribuciones de" errorsto "En caso de errores, contactar:" obsTRToRT "puntos creados por conversin de tray a ruta" obsTRsimpl "Trayecto obtenido por simplificacin" nameLists "Listas" nameData "Datos" MWCmap "Mapa" MWClists "Listas" MWCsingle "Ventana nica" search "Buscar" rmrk "Notas" closeto "Prximo a" with "Con" srchres "ENCONTRADOS" database "Base de datos" where "Dnde" what "Qu" list "lista" distance "Distancia" fromWP "del Punto" fromPos "de posicin" azimuth "Azimut" any "cualquier" opening "Abriendo" suggested "sugerido" another "Otro" srchdd1 "Buscar en" srchdd2Data "todos los datos" srchdd2GR "Grupo(s)" from "de" started "iniciado en" transf "Transf Coords" TRNSFAffine "Afn" TRNSFAffineConf "Afn Conforme" TRNSFNoRot "Conf sin Rot" projection "Proyeccin" lat0 "Lat central" long0 "Long central" lat1 "Lat 1 paralelo" lat2 "Lat 2 paralelo" latF "Lat falso origen" longF "Long falso origen" k0 "Factor de escala" PRJUTM "UTM/UPS" PRJTM "Transversal de Mercator" PRJBMN "Cuadrcula Austriaca BMN" PRJBNG "Cuadrcula Nac Britnica" PRJBWI "ndias Occid Britnicas" PRJCMP "Carta Militar Portugal" PRJCTR "Carta Tecnica Reg (I)" PRJITM "Cuadrcula TM Irlandesa" PRJGKK "Cuadrcula Alemana" PRJLCC1 "Lambert Cnica Conf 1" PRJLCC2 "Lambert Cnica Conf 2" PRJKKJP "Cuadrcula Finlandesa Base" PRJKKJY "Cuadrcula Finlandesa Unif" PRJSEG "Cuadrcula Sueca" PRJMerc1 "Mercator 1" PRJMerc2 "Mercator 2" PRJCS "Cassini-Soldner" PRJAPOLY "Policnica Americana" PRJStereogr "Estereogrfica" PRJTWG "Cuadrcula de Taiwan" PRJSOM "Oblcua de Mercator Suiza" PRJLV03 "Cuadrcula Suiza LV03" PRJIcG "Cuadrcula Islandesa" PRJRDG "Cuadrcula Holandesa" PRJSchreiber Schreiber PRJSphMerc "Mercator Esfrica" PRJEqCyl "Cilndrica Equidistante" dontaskagain "Dejar de preguntar" rename "Usar nombre diferente" oname "Nombre original" never "Nunca" ask "Preguntar" always "Siempre" stage "Etapa" label "Etiqueta" alt "Altura" locate "Encontrar" animation Animacin fast Rpido slow Lento start Inicio pause Pausa speed Velocidad centred "Mantener centrado" state Estado animinit "al inicio/final" animon "en curso" animpause "pausado" animabort "saliendo" realtimelog "Registro de trayectos en tiempo real" garmin Garmin garmin_usb "Garmin USB" nmea "NMEA 0183" stext "Texto simple" simul "simulador" lowrance Lowrance magellan Magellan getlog Capturar stop Parar dolog Registrar show Mostrar hide Esconder posfixerror erro posfix_ ? posfix2D 2D posfix3D 3D posfix2D-diff "2D d" posfix3D-diff "3D d" posfixGPS GPS posfixDGPS DGPS posfixAuto ok posfixsimul simul restart Recomenzar mkTR "Crear trayecto" PVTflds "# t lat long alt fix EPE EPH EPV vel_x vel_y vel_z TRK" namePVTData Registrar mkavgWP "Crear punto promedio" move Mover define Definir open Abrir defs "Definiciones" baseproj "Proyeccin de base" abbrev Abreviatura grid Cuadrcula use Usar unit Unidad feasting "Dist E falsa" fnorthing "Dist N falsa" bounds "Lmites" max "Mx" min "Mn" easting "Dist E" northing "Dist N" fixeddatum "datum obligatorio" elevation "Perfil" usewps "Usar puntos" chgpfrmt "Cambiar formato posiciones" here Aqu atprevwp "En punto anterior" prevwp "punto anterior" firstwp "Primer punto" chglstrs "Editar etapa anterior" chgnxtrs "Editar etapa siguiente" contnend "Aadir al final" closemenu "Cerrar menu" ellpsd Elipsoide datum Datum userdefs "Definiciones propias" edmap "Editar sobre mapa" actual actual rtimelogintv "Intervalo de registro" inca "Incluir despus" invert "Invertir" recwindow "Ventana de receptor" volume "Volumen" latS "Lat S" latN "Lat N" longW "Long W" longE "Long E" no No computations Clculos comparea "Calcular rea" cluster Vecinos centre Centro mkclusters "Agrupar vecinos" quadr Quadrngulo dlat "Diferencia en latitud" dlong "Diferencia en longitud" collcntr "Determinando centros..." compclstr "Calculando vecinos..." crtgclstrgrs "Creando grupos..." chgdatum "Cambiar datum..." print Imprimir prevctr "Centro anterior" printopt "Opciones de impresin" cwpsdef "PTs de control para definir ahora" nextTP "Prximo punto trayecto" generate Generar generateall "Generar todo" width Grosor simplTRto "Simplificar a" exstglog "Registro existente" contnsly "Continuamente" animate "animar" chgmfsize "Cambiar tamao fuente mapa" animabbrev "anim." noanabbr "no anim." zelev "inclinacin Z" xyelev "inclinacin XY" notext "sin leyendas" view "Vista" sideview "Vista lateral" persptv "Perspectiva" optMAPCOLOUR,trvtrk "Flecha TRK" optMAPCOLOUR,trvtrn "Flechas TRN" optMAPCOLOUR,trvcts "Flecha CTS" optMAPCOLOUR,trvcts2 "2a flecha CTS" optMAPCOLOUR,trvvel_z "Flecha para arriba/abajo" optMAPCOLOUR,trvwrnimportant "Aviso importante (nav)" optMAPCOLOUR,trvwrnnormal "Aviso (nav)" optMAPCOLOUR,trvwrninfo "Informacin (nav)" optTRAVELFONTSIZE "Tamao de fuente para viaje" travel Viaje notravel "Fin de viaje" travdisplay "Configurar presentacin" travchgdisplay "Cambiar a presentacin %s" travdsetup "Configurar presentacin de viaje" navMOB "Hombre al agua (MOB)!" startnav "Navegar" navWP "Ir a punto" goback "Regresar" follow "Seguir %s" exactly "exactamente" fromnrst "del punto mas cercano" inrvrs "en sentido contrario" forgetgoal "Olvidar objetivo" suspend "Suspender" resume "Recomenzar" TRVfix "Fix" TRVhour "Tiempo" TRVspeed "Veloc" TRVpos "Pos" TRValt "Alt" TRVtrk "TRK" TRVnxtWP "Para" TRVprvWP "De" TRVete "ETE" TRVeta "ETA" TRVvmg "VMG" TRVxtk "XTK" TRVcts "CTS" TRVtrn "TRN" TRVvel_z "Vel vert" TRVtrkcts "TRK, CTS" TRVdist "Dist" TRVc_trkcts "Flechas TRK/CTS" TRVc_trn "Flechas TRN" TRVc_vel_z "Flechas cima/baixo" add "Aadir" addlabelled "Aadir con nombre" remove "Eliminar" mindist "Distancia de llegada" chggoal "Pasar a siguiente objetivo" chginggoal "Cambiando a siguiente objetivo" chggoalhlp "Cuando cambiar de un\nobjetivo al siguiente\nmientras se sigue ruta/tray" soon pronto late tarde warnings "Avisos" dowarn "Mostrar avisos" warnconf "Configurar avisos" priority Prioridad high alta medium media low baja warnprox "Distancia a punto <" warnanchor "Distancia a punto >" warnspeed "Velocidad >" warntrn "TRN (abs)>" warnvspeed "Vel vertical" warnxtk "XTK (abs)>" fntsize "Tamao de fuente" trvhlpbox "Usar botn derecho para reordenar los elementos de abajo" trvhlpbxs "Usar botn derecho para reordenar los elementos de la lista" trvwarrv "Llegando a %s!" trvwleave "Saliendo de %s!" trvwspeed "Velocidad > %s!" trvwtrn "TRN > %s!" trvwvspeed "Vel vert fuera de [%s,%s]!" trvwxtk "XTK > %s!" trvwnolog "Registro en tiempo real detenido!" trvwnopos "Posiciones anteriores no disponibles" trvwuwps "Ruta tiene puntos (s) no definidos" trvwchg "Yendo ahora hacia %s" drivesim "simulador de conduccin" startfrom "Comenzar de..." outofctrl "Fuera de control!" right Derecha left Izquierda straight "De frente" rthlpdsim "Teclas de flecha: girar, des/acelerar\nEspacio: de frente" hiddendata "Datos ocultos" Ghidden_class Clase Ghidden_subclass Subclase Ghidden_lnk_ident "Id etapa" Ghidden_colour Color Ghidden_attrs Atributos Ghidden_depth Profundidad Ghidden_state Estado Ghidden_country Pas Ghidden_facility Facility Ghidden_city Ciudad Ghidden_addr Direccin Ghidden_int_road "Cruce de vas" Ghidden_dtyp "Mostrar+tipo" Ghidden_ete "ETE" Ghidden_display "Mostrar?" Ghidden_yes S Ghidden_no No Ghidden_user "Usuario" Ghidden_user_symbol "Usuario (slo smbolo)" Ghidden_non_user "Interno" Ghidden_avn_airport "Aeropuerto" Ghidden_avn_inters "Interseccin (av)" Ghidden_avn_NDB "NDB" Ghidden_avn_VOR "VOR" Ghidden_avn_airp_rway "Lmite de pista (aeropuerto)" Ghidden_avn_airp_int "Interseccin (aeropuerto)" Ghidden_avn_airp_NDB "NDB (aeropuerto)" Ghidden_map_pt "Punto (mapa)" Ghidden_map_area "rea (mapa)" Ghidden_map_int "Interseccin (mapa)" Ghidden_map_addr "Direccin (mapa)" Ghidden_map_line "Lnea (mapa)" Ghidden_locked Bloqueado Ghidden_default "Normal" Ghidden_black Negro Ghidden_white Blanco Ghidden_red Rojo Ghidden_dark_red "Rojo oscuro" Ghidden_green Verde Ghidden_dark_green "Verde oscuro" Ghidden_blue Azul Ghidden_dark_blue "Azul oscuro" Ghidden_yellow Amarillo Ghidden_dark_yellow "Amarillo oscuro" Ghidden_magenta Magenta Ghidden_dark_magenta "Magenta oscuro" Ghidden_cyan Cyan Ghidden_dark_cyan "Cyan oscuro" Ghidden_light_gray "Gris claro" Ghidden_dark_gray "Gris oscuro" Ghidden_transparent Transparente Ghidden_line Lnea Ghidden_link Etapa Ghidden_net Red Ghidden_direct Directo Ghidden_snap "Discreto(snap)" Ghidden_temp Temperatura Ghidden_time "Marca de tiempo" Ghidden_cat Categora renres "NUEVO NOMBRE" forgetGRcs "Olvidar grupo" optDEFMAPPROJ "Proyeccin de mapa" optDEFMAPPFRMT "Coordenadas del mapa" optDEFMAPPFDATUM "Datum de coordenadas del mapa" undo Deshacer UTMzone zona tfwfile "fichero TFW" ok Ok newWPatdb "Nuevo punto hacia..." PRJLamb93 "Lambert 93" PRJLambNTFe "NTF IIet" PRJLambNTF "NTF" NTFzone zona loop "Ciclar" crtLN "Crear lnea" PRJAEA "Albers Equivalente" PRJLEAC "Lambert Eq Cnica" PRJTAlbers "Teale Albers" polasp "Aspecto polar" north Norte south Sur distunit "Unidad de distancia" altunit "Unidad de altitud" params "Argumentos" dimens "Dimensiones" version "Versin" opinprogr "Realizando operacin" working "Ejecutando" aborted "Abortado!" errwarn "Error(es)/aviso(s)!" changegroupsymbol "Cambiar smbolo" ozimapfile "fichero Ozi Map" info "Informacin" climbrate "Ritmo de Ascenso" BGAfeature "BGA Caracterstica" BGAfindblty "BGA Encontrabilidad" BGAairact "BGA Actividad aerea" dispitems "Elementos mostrados" hiditems "Elementos ocultos" mkgrp "Crear Grupo" optAutoNumRts "Numerar Rutas automticamente al enviar" numberfrom0 "Configurar contador a 0" items "Elementos" optSUPPORTLAPS "Soporte para Vueltas" nameLAP "Vuelta" duration "Duracin" calrs "Caloras" syusrmenu "Personalizar men de smbolo" cfgsymenu "Configurar men de smbolo" insmnb "Inserta submen antes" insmna "Inserta submen despus" opensbmn "Abrir submen" clssbmn "Cerrar submen" syhlpbx "Usar botn derecho para\nreordenar los elementos de la lista" lapsrun Correr fromfile "desde fichero" fromdef "desde definicin" mbaktoload "Fondo para cargar" none "ninguno" nameAL "Almanaque" alm_svid "id satlite" alm_week "semana" alm_datatime "tiempo ref datos" alm_clockc1 "cpef corr reloj s" alm_clockc2 "coef corr reloj s/s" alm_ecc "excentricidad" alm_sqrta "raiz cuadr a" alm_mnanom "anomala promedio" alm_argprgee "arg perigeo" alm_rightasc "ascensin recta" alm_rtrightasc "veloc ascensin r" alm_inclin "inclinacin" alm_health "salud" lstsqs "Mnimos cuadrados" lstsqsfile "Fichero de Mnimos cuadrados" mapfitWPs "Mostrar puntos de ajuste en mapa" showfitinfo "Mostrar informacin de ajuste" xtcoord "xt" ytcoord "yt" delta "d" residual "rt" rmsxydev "media_cuadr(x,y-desviaciones)" resstderr "erro std residual" chgdev "Cambiar puerto" alt_cumula "Ascenso acumulado" alt_cumuld "Descenso acumulado" maxalt "Altitud mxima" minalt "Altitud mnima" optSHOWFILEITEMS "Normalmente mostrar en mapa elementos leidos" vertgridlines "Rejilla vertical" convert "Convertir" split "Cortar" bysel "por puntos seleccionados" byseg "en segmentos" openits "Abrir %s" chgname "Sustituir nombres" clicktoedit "Pulsar para editar" renamethod "Mtodo de renombrado" operators "Operadores" keep1st "mantener primer caracter" keep1st_hlp "Mantener primer caracter\noperaciones siguientes en caracteres restantes" reset "recomenzar" reset_hlp "Recomenzar con nombre inicial deshaciendo cambios anteriores" case "may/minsculas" case_hlp "Todas las letras en maysuclas/minsculas" maxlgth "mxima longitud" maxlgth_hlp "Limitar nmero de caracteres a nmero" inslt "insertar por la izquierda" inslt_hlp "La cadena a insertar antes del actual caracter" insrt "insertar por la derecha" insrt_hlp "La cadena a insertar al final" replc "sustituir" replc_hlp "Cada caracter en la primera cadena ser sustituido por\nel correspondiente en la segunda" delany "borrar todos" delany_hlp "Todos los caracteres en la cadena sern borrados del nombre" rsub "sutitucin con expr.reg" rsub_hlp "Dar expr.reg y especificacin de sustitucin\nMs detalles en manual" accifnew "aceptar si nuevo" accifnew_hlp "Aceptar resultado si es un nombre nuevo" guntilnew "anexar numero hasta nuevo" guntilnew_hlp "Probar todos los posibles valores del nmero hasta que se encuentre un nombre nuevo" ndigits "Nmero de dgitos" gennames "Generando nombres..." rentest_hlp "Probar mtodo actual con el nombre dado" renmove_hlp "Usar boton derecho para reordenar lneas" tolower "minsculas" toupper "maysculas" applyto "Aplicar a" forall "para todos" selfont "Seleccin de fuente" default "Habitual" size "Tamao" units "Unidades" points "puntos" pixels "pixels" weight "Peso" normal "normal" bold "negrita" slant "Inclinada" roman "roman" italic "cursiva" underline "Subrayada" overstrike "Tachada" optDEFAULTFONT "Tipo de letra, por defecto" optFIXEDFONT "Tipo de letra, monoespaciada" optMAPFONT "Tipo de letra, mapa" optTRAVELFONT "Tipo de letra, viaje" optPLOTFONT "Tipo de letra, grficos" failed "fall" plugin "Complemento" unavailif "No disponible si" tclcode "Cdigo Tcl" uname "Nombre de Usuario" pword "Clave de Acceso" remember "Recordar" wptotwitter "Punto a Twitter" wptotwitternb "Enviar posicin, datum, altitud, nombre y comentario del punto a Twitter con tags #GPSMan #waypoint" exportTFW "Exportar fichero TFW" nametfwfile "Fichero TFW" gpTRtoGnuplot2d "Perfil (Gnuplot)" gpTRtoGnuplot2d_nb "Mostrar grfico de altitud con los datos de trayecto usuando el programa externo GNUPLOT" gpTRtoGnuplot3d "Perspectiva (Gnuplot)" gpTRtoGnuplot3d_nb "Mostrar grfico 3D de altitud con los datos de trayecto usando el programa externo GNUPLOT" gpParam2d "Parmetros para grfico 2D de Gnuplot" gpParam3d "Parmetros para grfico 3D de Gnuplot" gpFilename "Fichero" gpCanwidth "Ancho del dibujo" gpCanheight "Altura del dibujo" gpSTotals "Mostrar totales" gpLeft "Lado izquierdo" gpRight "Lado derecho" gpNone "Ninguno" gpSRests "Mostrar descansos" gpRest "Descanso" gpSymText "Smbolo+Texto" gpSymTime "Smbolo+Tiempo" gpText "Texto" gpSym "Smbolo" gpSHours "Mostrar horas" gpTimetop "Tiempo arriba" gpTimebot "Tiempo abajo" gpSSpeed "Mostrar velocidad" gpHike "A pie" gpBike "Bicicleta" gpDrive "Coche" gpGlide "Volando" gpLimitDist "Distancia mxima del punto al trayecto (km)" gpLimitStat "Longitud mnima en el trayecto para el mismo punto (km)" gpDirection "Direccin" gpForward "Adelante" gpBackward "Atrs" gp2D_hlp "Si el nombre de grupo es igual al del trayecto,\n\ los puntos de este grupo se mostrarn\n\ dependiendo de las distancias dadas.\n\ Cuando no exista un nombre de grupo,\n\ se escogern los puntos de una lista o se cancela." gpGenerated "Generado con Gnuplot por GPSMan" gpModify "Modificar la vista con el ratn. Salga para guardar imagen." htCalcHikeTime "Calcular tiempo de recorrido" htCalcHikeTime_nb "Calcular tiempo de recorrido con la frmula de DAV" htHeader "Tiempo estimado de recorrido (sin descansos) con la frmula de \ \"Deutscher Alpenverein\" con parmetros dados" htFooter1 "Capacidad en una hora." htFooter2 "El tiempo sugerido de descanso es 20min despus de 2 horas (15%)." srShowRest_nb "Mostrar descansos > 5min." srTRTime "Tiempo de trayecto" srTotals "Totales" optALTHRESHOLD "Lmite de altitud" optDISPLAYCMD "Comando para mostrar fichero de imagen" optTERMCMD "Comando para abrir ventana de terminal" optMANHTTPADDR "Direccin HTTP del manual de usuario" } # the following definitions must be coherent with $TXT array set INVTXT { GMS DMS GMM DMM GGG DDD Grados GRA UTM/UPS UTM/UPS MH MH PT WP RT RT TR TR PL LP LAP LAP GR GR } # changes by Miguel Filgueiras to RM contribution set TXT(srChainage) $TXT(totdst) set TXT(srShowRest) $TXT(gpSRests) set TXT(gpSym) $TXT(symbol) set TXT(srRest) $TXT(gpRest) gpsman-6.4.4.2/gmsrc/projs_main.tcl0000644000175000017500000017420412224351120015244 0ustar migmig# # This file is part of: # # gpsman --- GPS Manager: a manager for GPS receiver data # # Copyright (c) 1998-2013 Miguel Filgueiras migfilg@t-online.de # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. # # File: projs_main.tcl # Last change: 6 October 2013 # # Includes contributions by # - Sandor Laky (laky.sandor_at_freemail.hu) marked "SL contribution" # - Miguel Filgueiras (to code by others) marked "MF contribution/change" ### most of this code used to be at the end of file projections.tcl ### general initialization procedure for all main projections # see also the comments before the procedures for UTM in projections.tcl proc ProjInit {proj data datum ps} { # changes here must be reflected on proc BadProjSetup below # initialize projection parameters # $ps is a list of latd,longd,datum to be projected # should call proc ProjParams if its parameters may be changed by # the user and if $ASKPROJPARAMS is true # should call proc to compute auxiliary parameters if any # must return projection of first position in $ps global $data TMPARAM LNTFPARAMS ASKPROJPARAMS foreach "latd longd posdatum" [lindex $ps 0] { break } if { $posdatum != $datum } { foreach "latd longd" \ [ToDatum $latd $longd $posdatum $datum] { break } } set ${data}(datum) $datum set askauxcomp 1 switch $proj { UTM { # only the first position is used # no parameters can be changed by the user set askauxcomp 0 set p [DegreesToUTM $latd $longd $datum] scan [lindex $p 0] %0d ze set zn [lindex $p 1] set ${data}(UTMzone) [list $ze $zn] set ${data}(m_0) [expr -183+6.0*$ze] set res [list [lindex $p 2] [lindex $p 3]] } TM { # take averages of latitudes and of longitudes as central # coordinates, and use k0=0.9996 foreach "${data}(lat0) ${data}(long0)" \ [AverageLatLong $latd $longd $datum $ps] {} set ${data}(k0) 0.9996 if { $ASKPROJPARAMS } { ProjParams change TM $data } set res [ConvToTM $latd $longd [set ${data}(lat0)] \ [set ${data}(long0)] [set ${data}(k0)] $datum] set askauxcomp 0 } BMN - CTR - GKK - KKJP - TWG { # special cases of TM # take averages of longitudes to find long0, and use lat0=0 set long0 [AverageLong $longd $datum $ps] foreach "pr lmin lmax delta k0" $TMPARAM($proj) {} if { $long0 < $lmin } { set long0 $lmin } elseif { $long0 > $lmax } { set long0 $lmax } else { set long0 [expr int(1.0*($long0-$lmin+0.5*$delta)/ \ $delta)*$delta+$lmin] } set ${data}(${pr}long0) $long0 set ${data}(m_0) $k0 if { $ASKPROJPARAMS } { ProjParams change $proj $data } set res [ConvToTM $latd $longd 0 [set ${data}(${pr}long0)] \ $k0 $datum] set askauxcomp 0 } LCC1 - Stereogr - SOM { # Lambert Conformal Conic single parallel, # Stereographic and Swiss Oblique Mercator projections # take averages of latitudes and of longitudes as central # coordinates, and use k0=1 # in Stereographic central latitude determines the case: polar, # oblique, equatorial foreach "${data}(lat0) ${data}(long0)" \ [AverageLatLong $latd $longd $datum $ps] {} set ${data}(k0) 1.0 } LCC2 { # Lambert Conformal Conic projection, two parallels # take extremes of latitudes as latitudes of standard parallels, # averages of latitudes and longitudes as false origin coordinates foreach "${data}(latF) ${data}(longF) \ ${data}(lat1) ${data}(lat2)" \ [AverageExtrLatLong $latd $longd $datum $ps] {} } LambNTF { # as LCC2 but with zones with specific parameters # only the first position is used # no parameters can be changed by the user set askauxcomp 0 set p [DegreesToLambNTF $latd $longd $datum] if { [set z [lindex $p 0]] == "--" } { set z II } global LNTFz$z array set $data [array get LNTFz$z] set res [ProjLambNTFPoint $data $latd $longd $datum] } AEA { # Albers Equal Area Conic projection # take extremes of latitudes as latitudes of standard parallels, # average of longitudes as central longitude, 0 for central # latitude foreach "x ${data}(long0) lamax lamin" \ [AverageExtrLatLong $latd $longd $datum $ps] {} if { abs($lamax) < abs($lamin) } { set x $lamax ; set lamax $lamin ; set lamin $x } set ${data}(lat1) $lamax ; set ${data}(lat2) $lamin set ${data}(lat0) 0 } LEAC { # Lambert Equal Area Conic projection # take extreme of latitudes as latitude of standard parallel, # average of longitudes as central longitude, North polar # aspect if extreme latitude is nonnegative, 0 for central # latitude foreach "x ${data}(long0) lamax lamin" \ [AverageExtrLatLong $latd $longd $datum $ps] {} if { abs($lamax) < abs($lamin) } { set lamax $lamin } set ${data}(lat1) $lamax if { $lamax < 0 } { set ${data}(polasp) south } else { set ${data}(polasp) north } set ${data}(lat0) 0 } Merc1 { # Mercator projection, single parallel, ellipsoidal case # take average of longitudes as central longitude, and use k0=1 set ${data}(long0) [AverageLong $longd $datum $ps] set ${data}(k0) 1.0 } Merc2 { # Mercator projection, two parallels # take average of longitudes as central longitude and extreme # latitude (in absolute value) as first standard parallel foreach "x ${data}(long0) lamin lamax" \ [AverageExtrLatLong $latd $longd $datum $ps] {} if { abs($lamin) > $lamax } { set lamax [expr abs($lamin)] } set ${data}(lat1) $lamax } SphMerc - CS { # Mercator projection, single parallel, spherical case # and Cassini-Soldner projection # take average of longitudes and longitudes as central coordinates foreach "${data}(lat0) ${data}(long0)" \ [AverageLatLong $latd $longd $datum $ps] {} } APOLY - EqCyl { # American Polyconic and Equidistant Cylindrical projections # take averages of latitudes as standard latitude set ${data}(lat0) [AverageLat $latd $datum $ps] } Schreiber { # Schreiber projection # all parameters are fixed, except the datum that must use the # "Bessel 1841" ellipsoid if { [EllipsdOf $datum] != "Bessel 1841" } { GMMessage "Datum: Rijks Driehoeksmeting" set datum "Rijks Driehoeksmeting" } ProjSchreiberComputeAux $data $datum set res [ProjSchreiberPoint $data $latd $longd $datum] set askauxcomp 0 } EOV { # Hungarian grid projection: no parameters needed set res [ProjEOVPoint {} $latd $longd $datum] } default { BUG "no initialization proc for projection" set askauxcomp 0 } } if { $askauxcomp } { if { $ASKPROJPARAMS } { ProjParams change $proj $data } Proj${proj}ComputeAux $data $datum set res [Proj${proj}Point $data $latd $longd $datum] } return $res } proc BadProjSetup {data proj latd longd datum} { # this must be kept in line with proc ProjInit (above) # initialize projection for use in command mode # $data is array for the parameters with external parameters and # datum defined, except in the case of "UTM" and "EOV" that only # have datum # return 0 on success, 1 on error global ASKPROJPARAMS $data set ASKPROJPARAMS 0 set aux 0 switch $proj { UTM { if { [catch {set ${data}(UTMzone)}] } { set p [DegreesToUTM $latd $longd $datum] scan [lindex $p 0] %0d ze set zn [lindex $p 1] set ${data}(UTMzone) [list $ze $zn] set ${data}(m_0) [expr -183+6.0*$ze] } } LambNTF { # as LCC2 but with zones with specific parameters # no parameters can be changed by the user set p [DegreesToLambNTF $latd $longd $datum] if { [set z [lindex $p 0]] == "--" } { set z II } global LNTFz$z catch {unset $data} array set $data [array get LNTFz$z] } Schreiber { # Schreiber projection # all parameters are fixed, except the datum that must use the # "Bessel 1841" ellipsoid if { [EllipsdOf [set ${data}(datum)]] != "Bessel 1841" } { set ${data}(datum) "Rijks Driehoeksmeting" } } TM - BMN - CTR - EOV - GKK - KKJP - TWG { } LCC1 - Stereogr - SOM - LCC2 - AEA - LEAC - Merc1 - Merc2 - SphMerc - CS - APOLY - EqCyl { set aux 1 } default { return 1 } } if { $aux } { Proj${proj}ComputeAux $data [set ${data}(datum)] } return 0 } proc AverageExtrLatLong {latd longd datum ps} { # compute the averages of latitudes and longitudes and the minimum and # maximum latitude for $latd,$longd and all positions in $ps except # the first # return list with the two averages followed by the maximum and the minimum set n 1 set sla [set lamx [set lamn $latd]] ; set slo $longd foreach p [lreplace $ps 0 0] { foreach "la lo posdatum" $p { break } if { $posdatum != $datum } { foreach "la lo" \ [ToDatum $la $lo $posdatum $datum] { break } } set sla [expr $sla+$la] ; set slo [expr $slo+$lo] if { $la > $lamx } { set lamx $la } if { $la < $lamn } { set lamn $la } incr n } return [list [expr 1.0*$sla/$n] [expr 1.0*$slo/$n] $lamx $lamn] } proc AverageLatLong {latd longd datum ps} { # compute the averages of latitudes and longitudes for $latd,$longd and # all positions in $ps except the first # return list with the two averages set n 1 foreach p [lreplace $ps 0 0] { foreach "la lo posdatum" $p { break } if { $posdatum != $datum } { foreach "la lo" \ [ToDatum $la $lo $posdatum $datum] { break } } set latd [expr $latd+$la] ; set longd [expr $longd+$lo] incr n } return [list [expr 1.0*$latd/$n] [expr 1.0*$longd/$n]] } proc AverageLat {latd datum ps} { # compute the average of latitudes for $latd and # all positions in $ps except the first set n 1 foreach p [lreplace $ps 0 0] { set la [lindex $p 0] ; set pdatum [lindex $p 2] if { $pdatum != $datum } { set la [lindex [ToDatum $la [lindex $p 1] $pdatum $datum] 0] } set latd [expr $la+$latd] incr n } return [expr 1.0*$latd/$n] } proc AverageLong {longd datum ps} { # compute the average of longitudes for $longd and # all positions in $ps except the first set n 1 foreach p [lreplace $ps 0 0] { set lo [lindex $p 1] ; set pdatum [lindex $p 2] if { $pdatum != $datum } { set lo [lindex [ToDatum [lindex $p 0] $lo $pdatum $datum] 1] } set longd [expr $longd+$lo] incr n } return [expr 1.0*$longd/$n] } ## converting longitudes to -180, 180 (inclusive) or -360, 360 (inclusive) proc NormalLong {long} { # convert longitude in decimal degrees to the -180,180 (inclusive) range if { abs([set x [expr abs($long)*0.00555555555555555556]])-1 > 1e-14 } { set x [expr 0.5*($x+1)] set x [expr (($x-floor($x))-0.5)*360] } else { set x [expr abs($long)] } if { $long < 0 && abs($x-180) > 1e-14 } { return [expr -$x] } return $x } proc NormalLongCentred {long longc} { # convert longitude in decimal degrees to the closest value to $longc in # the -360,360 (inclusive) range set long [NormalLong $long] if { $long <= $longc-180 } { set long [expr $long+360] } elseif { $long > $longc+180 } { set long [expr $long-360] } return $long } ## projection procedures for UTM projection # there may be auxiliary parameters to be computed from the main ones proc ProjUTMComputeAux {data args} { # compute auxiliary parameters from main parameters # $data is name of global array for the parameters # $args is not used but is needed because of uniform way of calling # these procedures global $data set z [set ${data}(UTMzone)] # set the zone to a list of number and letter if it is a string if { [regexp {^([0-9]+)([A-Z])$} $z x ze zn] } { set ${data}(UTMzone) [list $ze $zn] } else { set ze [lindex $z 0] } set ${data}(m_0) [expr -183+6.0*$ze] return } # projection proc is a function of latd,longd,datum to planar Cartesian # coordinates x,y in the terrain proc ProjUTMPoint {data latd longd datum} { # compute planar Cartesian coordinates for given position global $data set prdatum [set ${data}(datum)] if { $datum != $prdatum } { foreach "latd longd" \ [ToDatum $latd $longd $datum $prdatum] { break } } foreach "pze pzn px py" [DegreesToUTM $latd $longd $prdatum] {} foreach "mze mzn" [set ${data}(UTMzone)] {} if { $mze!=$pze || $mzn != $pzn } { foreach "px py" [CompUTMOnZone $latd $longd [set ${data}(m_0)]] { break } } return [list $px $py] } # inverse projection proc is a function of planar Cartesian coordinates in the # terrain to list with latitude and longitude in the datum of the projection proc ProjUTMInvert {data x y} { # return list with latitude and longitude for point at $x,$y in the terrain global $data foreach "ze zn" [set ${data}(UTMzone)] {} set datum [set ${data}(datum)] set p [UTMToDegrees $ze $zn $x $y $datum] return $p } ## Transverse Mercator projection proc ProjTMPoint {data latd longd datum} { # compute planar Cartesian coordinates for given position global $data set prdatum [set ${data}(datum)] if { $datum != $prdatum } { foreach "latd longd" \ [ToDatum $latd $longd $datum $prdatum] { break } } return [ConvToTM $latd $longd [set ${data}(lat0)] \ [set ${data}(long0)] [set ${data}(k0)] $prdatum] } proc ProjTMInvert {data x y} { # return list with latitude and longitude for point at $x,$y in the terrain global $data set datum [set ${data}(datum)] set p [ConvFromTM $x $y [set ${data}(lat0)] [set ${data}(long0)] \ [set ${data}(k0)] $datum] return $p } ## German Grid (Gauss-Krueger-Koordinatensystem) projection # Information provided by Andreas Lange (Andreas.C.Lange_at_GMX.de) # This is a Transverse Mercator projection with zone in [0-6], lat0=0, # lon0=zone*3 (0, 3, 6, 9, 12, 15E), and scale factor at central meridian # of k0=1.0 # Basic Finnish Grid (KKJP) projection # Similar with zone in [1-4], lon0=zone*3+18 (21, 24, 27, 30E) # Taiwan Grid projection # Information provided by Dan Jacobson (jidanni_at_yahoo.com.tw) # Similar with zone in [1-6], lon0=zone*2+113 (115, 117, ..., 125E), # and k0=0.9999 # Carta Tecnica Regionale (CTR), Italian projection # "Le carte topografiche CTR ed il loro uso GPS" # (http://www.gpscomefare.com/guide/tutorialgps/mapdatum.htm) # May 2003 (information kindly sent by Alessandro Palmas) # Similar with zone in [1-2], lon0=zone*6+3 (9, 15), k0=0.9996 # Austrian BMN grid projection # information kindly sent by Alessandro Palmas, July 2003 # Similar with zones M28, M31, M34, lon0=zone_index*3+10.333333, k0=1 proc ProjGKKComputeAux {data args} { # compute auxiliary parameters from main parameters # $data is name of global array for the parameters # $args is not used but is needed because of uniform way of calling # these procedures global $data set ${data}(m_0) 1.0 return } proc ProjKKJPComputeAux {data args} { # compute auxiliary parameters from main parameters # $data is name of global array for the parameters # $args is not used but is needed because of uniform way of calling # these procedures global $data set ${data}(m_0) 1.0 return } proc ProjTWGComputeAux {data args} { # compute auxiliary parameters from main parameters # $data is name of global array for the parameters # $args is not used but is needed because of uniform way of calling # these procedures global $data set ${data}(m_0) 0.9999 return } proc ProjCTRComputeAux {data args} { # compute auxiliary parameters from main parameters # $data is name of global array for the parameters # $args is not used but is needed because of uniform way of calling # these procedures global $data set ${data}(m_0) 0.9996 return } proc ProjBMNComputeAux {data args} { # compute auxiliary parameters from main parameters # $data is name of global array for the parameters # $args is not used but is needed because of uniform way of calling # these procedures global $data set ${data}(m_0) 1.0 return } proc ProjGKKPoint {data latd longd datum} { # compute planar Cartesian coordinates for given position return [Proj_TMZ_Point gkk $data $latd $longd $datum] } proc ProjKKJPPoint {data latd longd datum} { # compute planar Cartesian coordinates for given position return [Proj_TMZ_Point kkjp $data $latd $longd $datum] } proc ProjTWGPoint {data latd longd datum} { # compute planar Cartesian coordinates for given position return [Proj_TMZ_Point twg $data $latd $longd $datum] } proc ProjCTRPoint {data latd longd datum} { # compute planar Cartesian coordinates for given position return [Proj_TMZ_Point ctr $data $latd $longd $datum] } proc ProjBMNPoint {data latd longd datum} { # compute planar Cartesian coordinates for given position return [Proj_TMZ_Point bmn $data $latd $longd $datum] } proc Proj_TMZ_Point {pr data latd longd datum} { # compute planar Cartesian coordinates for given position global $data set prdatum [set ${data}(datum)] if { $datum != $prdatum } { foreach "latd longd" \ [ToDatum $latd $longd $datum $prdatum] { break } } return [ConvToTM $latd $longd 0 [set ${data}(${pr}long0)] \ [set ${data}(m_0)] $prdatum] } proc ProjGKKInvert {data x y} { # return list with latitude and longitude for point at $x,$y in the terrain return [Proj_TMZ_Invert gkk $data $x $y] } proc ProjKKJPInvert {data x y} { # return list with latitude and longitude for point at $x,$y in the terrain return [Proj_TMZ_Invert kkjp $data $x $y] } proc ProjTWGInvert {data x y} { # return list with latitude and longitude for point at $x,$y in the terrain return [Proj_TMZ_Invert twg $data $x $y] } proc ProjCTRInvert {data x y} { # return list with latitude and longitude for point at $x,$y in the terrain return [Proj_TMZ_Invert ctr $data $x $y] } proc ProjBMNInvert {data x y} { # return list with latitude and longitude for point at $x,$y in the terrain return [Proj_TMZ_Invert bmn $data $x $y] } proc Proj_TMZ_Invert {pr data x y} { # return list with latitude and longitude for point at $x,$y in the terrain global $data set datum [set ${data}(datum)] set p [ConvFromTM $x $y 0 [set ${data}(${pr}long0)] \ [set ${data}(m_0)] $datum] return $p } ## Lambert Conic Conformal projections # single standard parallel proc ProjLCC1ComputeAux {data datum} { # compute auxiliary parameters from main parameters # $data is name of global array for the parameters global $data set d [EllipsdData $datum] set a [lindex $d 0] ; set f [lindex $d 1] set es [expr $f*(2-$f)] set e [set ${data}(m_e) [expr sqrt($es)]] set phi0 [expr [set ${data}(lat0)]*0.01745329251994329576] if { [set n [set ${data}(lcc_n) [expr sin($phi0)]]] < 0 } { set ${data}(lcc_sn) -1 } else { set ${data}(lcc_sn) 1 } set m0 [expr cos($phi0)/sqrt(1-$es*$n*$n)] set t0n [expr pow([ExpRedLat $phi0 $n $e],$n)] set F [expr $m0/($n*$t0n)] set aFk0 [set ${data}(m_a) [expr $a*$F*[set ${data}(k0)]]] set ${data}(lcc_rho0F) [expr $aFk0*$t0n] return } proc ProjLCC1Point {data latd longd datum} { # compute planar Cartesian coordinates for given position global $data set prdatum [set ${data}(datum)] if { $datum != $prdatum } { foreach "latd longd" \ [ToDatum $latd $longd $datum $prdatum] { break } } set long0 [set ${data}(long0)] set longd [NormalLongCentred $longd $long0] set phi [expr $latd*0.01745329251994329576] set theta [expr [set ${data}(lcc_n)]* \ ($longd-$long0)*0.01745329251994329576] set t [ExpRedLat $phi [expr sin($phi)] [set ${data}(m_e)]] set rho [expr [set ${data}(m_a)]* \ pow($t,[set ${data}(lcc_n)])] set x [expr $rho*sin($theta)] set y [expr [set ${data}(lcc_rho0F)]-$rho*cos($theta)] return [list $x $y] } proc ProjLCC1Invert {data x y} { # return list with latitude and longitude for point at $x,$y in the terrain global $data set z [expr [set ${data}(lcc_rho0F)]-$y] set thetap [expr atan(1.0*$x/$z)] set rhop [expr [set ${data}(lcc_sn)]*[Hypot $x $z]] set tp [expr pow($rhop/([set ${data}(m_a)]), \ 1.0/[set ${data}(lcc_n)])] set longd [expr $thetap/[set ${data}(lcc_n)]*57.29577951308232087684+ \ [set ${data}(long0)]] set longd [NormalLong $longd] set latd [expr [LatFromRedLat $tp [set ${data}(m_e)]]* \ 57.29577951308232087684] return [list $latd $longd] } # two standard parallels proc ProjLCC2ComputeAux {data datum} { # compute auxiliary parameters from main parameters # $data is name of global array for the parameters global $data MESS set d [EllipsdData $datum] set a [lindex $d 0] ; set f [lindex $d 1] set es [expr $f*(2-$f)] set e [set ${data}(m_e) [expr sqrt($es)]] set phi1 [expr [set ${data}(lat1)]*0.01745329251994329576] set phi2 [expr [set ${data}(lat2)]*0.01745329251994329576] set phiF [expr [set ${data}(latF)]*0.01745329251994329576] set s1 [expr sin($phi1)] ; set s2 [expr sin($phi2)] set t1 [ExpRedLat $phi1 $s1 $e] set t2 [ExpRedLat $phi2 $s2 $e] if { [catch {set m1 [expr cos($phi1)/sqrt(1-$es*$s1*$s1)]}] || \ [catch {set m2 [expr cos($phi2)/sqrt(1-$es*$s2*$s2)]}] || \ [catch {set n [expr (log($m1)-log($m2))/(log($t1)-log($t2))]}] } { GMMessage $MESS(badProjargs) ProjParams change LCC2 $data ProjLCC2ComputeAux $data $datum return } set ${data}(lcc_n) $n if { $n < 0 } { set ${data}(lcc_sn) -1 } else { set ${data}(lcc_sn) 1 } set F [expr $m1/($n*pow($t1,$n))] set aF [set ${data}(m_a) [expr $a*$F]] set tF [ExpRedLat $phiF [expr sin($phiF)] $e] set ${data}(lcc_rho0F) [expr $aF*pow($tF,$n)] return } proc ProjLCC2Point {data latd longd datum} { # compute planar Cartesian coordinates for given position global $data set prdatum [set ${data}(datum)] if { $datum != $prdatum } { foreach "latd longd" \ [ToDatum $latd $longd $datum $prdatum] { break } } set longF [set ${data}(longF)] set longd [NormalLongCentred $longd $longF] set phi [expr $latd*0.01745329251994329576] set theta [expr [set ${data}(lcc_n)]* \ ($longd-$longF)*0.01745329251994329576] set t [ExpRedLat $phi [expr sin($phi)] [set ${data}(m_e)]] set rho [expr [set ${data}(m_a)]* \ pow($t,[set ${data}(lcc_n)])] set x [expr $rho*sin($theta)] set y [expr [set ${data}(lcc_rho0F)]-$rho*cos($theta)] return [list $x $y] } proc ProjLCC2Invert {data x y} { # return list with latitude and longitude for point at $x,$y in the terrain global $data set z [expr [set ${data}(lcc_rho0F)]-$y] set thetap [expr atan(1.0*$x/$z)] set rhop [expr [set ${data}(lcc_sn)]*[Hypot $x $z]] set tp [expr pow($rhop/([set ${data}(m_a)]), \ 1.0/[set ${data}(lcc_n)])] set longd [expr $thetap/[set ${data}(lcc_n)]*57.29577951308232087684+ \ [set ${data}(longF)]] set longd [NormalLong $longd] set latd [expr [LatFromRedLat $tp \ [set ${data}(m_e)]]*57.29577951308232087684] return [list $latd $longd] } # French NTF projection proc ProjLambNTFComputeAux {data datum} { global $data set z [set $data(NTFzone)] global LNTFz$z array set $data [array get LNTFz$z] return } proc ProjLambNTFPoint {data latd longd datum} { return [ProjLCC2Point $data $latd $longd $datum] } proc ProjLambNTFInvert {data x y} { return [ProjLCC2Invert $data $x $y] } # ancillary procs for LCC projections proc ExpRedLat {phi sinphi e} { # compute exp of reduced latitude for $phi # $e is first eccentricity of ellipsoid set se [expr $sinphi*$e] return [expr tan((1.5707963267948966-$phi)/2.0) / \ pow((1.0-$se)/(1.0+$se), $e/2.0)] } proc LatFromRedLat {ts e} { # compute latitude from reduced latitude set eccnth [expr $e/2.0] set phi [expr 1.5707963267948966-2*atan($ts)] set i 16 ; set d 1 while { abs($d) > 1e-10 && [incr i -1] } { set con [expr $e*sin($phi)] set d [expr 1.5707963267948966- \ 2*atan($ts*pow((1-$con)/(1+$con),$eccnth))-$phi] set phi [expr $phi+$d] } return $phi } ## Albers Equal Area Conic and Lambert Equal Area Conic projection # adapted from PROJ4.3.3 proc ProjAEAComputeAux {data datum} { # compute auxiliary parameters from main parameters # $data is name of global array for the parameters global $data set phi1 [expr [set ${data}(lat1)]*0.01745329251994329576] set phi2 [expr [set ${data}(lat2)]*0.01745329251994329576] ComputeAux_AEA_LEAC AEA $data $datum $phi1 $phi2 return } proc ProjAEAPoint {data latd longd datum} { # compute planar Cartesian coordinates for given position global $data MESS set prdatum [set ${data}(datum)] if { $datum != $prdatum } { foreach "latd longd" \ [ToDatum $latd $longd $datum $prdatum] { break } } set long0 [set ${data}(long0)] set longd [NormalLongCentred $longd $long0] set a [set ${data}(m_a)] ; set n [set ${data}(m_1)] set phi [expr $latd*0.01745329251994329576] set lam [expr $n*($longd-$long0)*0.01745329251994329576] set rho [expr [set ${data}(m_3)]-$n* \ [SmallQ [expr sin($phi)] [set ${data}(m_e)] \ [set ${data}(m_0)]]] if { $rho < 0 } { GMMessage $MESS(outrngproj) return [list 0 0] } set rho [expr [set ${data}(m_4)]*sqrt($rho)] set x [expr $a*$rho*sin($lam)] set y [expr $a*([set ${data}(m_5)]-$rho*cos($lam))] return [list $x $y] } proc ProjAEAInvert {data x y} { # return list with latitude and longitude for point at $x,$y in the terrain global $data MESS TXT set a [set ${data}(m_a)] ; set n [set ${data}(m_1)] set datum [set ${data}(datum)] set x [expr $x/$a] set y [expr [set ${data}(m_5)]-$y/$a] if { [set rho [Hypot $x $y]] == 0 } { set lam 0 if { $n > 0 } { set phi 1.5707963267948966 } else { set phi -1.5707963267948966 } } else { if { $n < 0 } { set rho [expr -$rho] ; set x [expr -$x] ; set y [expr -$y] } set phi [expr 1.0*$rho/[set ${data}(m_4)]] set phi [expr 1.0*([set ${data}(m_3)]-$phi*$phi)/$n] if { abs([set ${data}(m_2)]-abs($phi)) > 1e-7 } { set phi [LatAngle $phi [set ${data}(m_e)] \ [set ${data}(m_0)]] if { $phi > 1e19 } { ## return 0 180 on error... GMMessage [format $MESS(badinvproj) $TXT(PRJAEA)/$TXT(PRJLEAC)] return [list 0 180] } } elseif { $phi < 0 } { set phi -1.5707963267948966 } else { set phi 1.5707963267948966 } set lam [expr 1.0*atan2($x,$y)/$n] } set latd [expr $phi*57.29577951308232087684] set longd [expr ($lam*57.29577951308232087684)+[set ${data}(long0)]] return [list $latd [NormalLong $longd]] } proc ProjLEACComputeAux {data datum} { # compute auxiliary parameters from main parameters # $data is name of global array for the parameters global $data set phi2 [expr [set ${data}(lat1)]*0.01745329251994329576] if { [set ${data}(polasp)] == "south" } { set phi1 -1.5707963267948966 } else { set phi1 1.5707963267948966 } ComputeAux_AEA_LEAC LEAC $data $datum $phi1 $phi2 return } proc ProjLEACPoint {data latd longd datum} { return [ProjAEAPoint $data $latd $longd $datum] } proc ProjLEACInvert {data x y} { return [ProjAEAInvert $data $x $y] } # ancillary procedures for AEA and LEAC projections proc ComputeAux_AEA_LEAC {proj data datum phi1 phi2} { global $data MESS if { abs($phi1+$phi2) < 1e-10 } { GMMessage $MESS(badProjargs) ProjParams change $proj $data ProjAEAComputeAux $data $datum return } set d [EllipsdData $datum] set ${data}(m_a) [lindex $d 0] ; set f [lindex $d 1] set es [expr $f*(2-$f)] set e [set ${data}(m_e) [expr sqrt($es)]] set oes [set ${data}(m_0) [expr 1-$es]] set n [set ${data}(m_1) [expr sin($phi1)]] set cosp [expr cos($phi1)] set m1 [expr $cosp/sqrt(1.0-$es*$n*$n)] set ml1 [SmallQ $n $e $oes] if { abs($phi1-$phi2) > 1e-10 } { # secant set s2 [expr sin($phi2)] set m2 [expr cos($phi2)/sqrt(1.0-$es*$s2*$s2)] set ml2 [SmallQ $s2 $e $oes] set n [set ${data}(m_1) [expr ($m1*$m1-$m2*$m2)/($ml2-$ml1)]] } set ${data}(m_2) [expr 1.0-0.5*$oes*log((1.0-$e)/(1.0+$e))/$e] set c [set ${data}(m_3) [expr $m1*$m1+$n*$ml1]] set dd [set ${data}(m_4) [expr 1.0/$n]] set phi0 [expr [set ${data}(lat0)]*0.01745329251994329576] set ${data}(m_5) [expr $dd*sqrt($c-$n*[SmallQ sin($phi0) $e $oes])] return } proc LatAngle {qs te toes} { # compute latitude angle phi-1 set phi [Aasin [expr 0.5*$qs]] if { $te < 1e-7 } { return $phi } for { set i 15 } { $i > 0 } { incr i -1 } { set sinpi [expr sin($phi)] ; set cospi [expr cos($phi)] set con [expr $te*$sinpi] set com [expr 1.0-$con*$con] set dphi [expr 0.5*$com*$com/$cospi* \ ($qs/$toes-$sinpi/$com+0.5/$te* \ log((1.0-$con)/(1.0+$con)))] set phi [expr $phi+$dphi] if { abs($dphi) < 1e-10 } { return $phi } } return 1e20 } proc SmallQ {sinphi e oes} { # compute small q if { $e < 1e-7 } { return [expr $sinphi+$sinphi] } set con [expr $e*$sinphi] return [expr $oes*($sinphi/(1.0-$con*$con)- \ (0.5/$e)*log((1.0-$con)/(1.0+$con)))] } ## Mercator projection: a special case of Lambert Conic Conformal # with the equator as standard parallel # single standard parallel proc ProjMerc1ComputeAux {data datum} { # compute auxiliary parameters from main parameters # $data is name of global array for the parameters global $data set d [EllipsdData $datum] set a [lindex $d 0] ; set f [lindex $d 1] set ${data}(m_a) [expr 1.0*$a*[set ${data}(k0)]] set es [expr $f*(2-$f)] set ${data}(m_e) [expr sqrt($es)] set e4 [expr $es*$es] ; set e6 [expr $e4*$es] set ${data}(m_1) [expr $es* \ (0.5+0.20833333333333333333*$es+0.08333333333333333333*$e4+ \ 0.03611111111111111111*$e6)] set ${data}(m_2) [expr $es* \ (0.14583333333333333333*$es+0.12083333333333333333*$e4+ \ 0.07039930555555555555*$e6)] set ${data}(m_3) [expr $es* \ (0.05833333333333333333*$e4+0.07232142857142857142*$e6)] set ${data}(m_4) [expr 0.02653149801587301587*$es*$e6] return } proc ProjMerc1Point {data latd longd datum} { # compute planar Cartesian coordinates for given position global $data set prdatum [set ${data}(datum)] if { $datum != $prdatum } { foreach "latd longd" \ [ToDatum $latd $longd $datum $prdatum] { break } } set long0 [set ${data}(long0)] set longd [NormalLongCentred $longd $long0] set phi [expr $latd*0.01745329251994329576] set se [expr sin($phi)*[set ${data}(m_e)]] set mm [expr tan((1.5707963267948966+$phi)/2.0)* \ pow((1.0-$se)/(1.0+$se), [set ${data}(m_e)]/2.0)] set x [expr [set ${data}(m_a)]*($longd-$long0)*0.01745329251994329576] set y [expr [set ${data}(m_a)]*log($mm)] return [list $x $y] } proc ProjMerc1Invert {data x y} { # return list with latitude and longitude for point at $x,$y in the terrain global $data set ksi [expr 1.5707963267948966- \ 2*atan(exp(-$y/[set ${data}(m_a)]))] set latd [expr ($ksi+[set ${data}(m_1)]*sin($ksi+$ksi)+ \ [set ${data}(m_2)]*sin(4*$ksi)+ \ [set ${data}(m_3)]*sin(6*$ksi)+ \ [set ${data}(m_4)]*sin(8*$ksi))* \ 57.29577951308232087684] set longd [expr $x/[set ${data}(m_a)]*57.29577951308232087684+ \ [set ${data}(long0)]] return [list $latd [NormalLong $longd]] } # two standard parallels (symmetrical with respect to the equator) proc ProjMerc2ComputeAux {data datum} { # compute auxiliary parameters from main parameters # $data is name of global array for the parameters global $data set d [EllipsdData $datum] set a [lindex $d 0] ; set f [lindex $d 1] set es [expr $f*(2-$f)] set ${data}(m_e) [expr sqrt($es)] set phi1 [expr abs([set ${data}(lat1)])*0.01745329251994329576] set s [expr sin($phi1)] set k0 [expr cos($phi1)/sqrt(1-$es*$s*$s)] set ${data}(m_a) [expr 1.0*$a*$k0] set e4 [expr $es*$es] ; set e6 [expr $e4*$es] set ${data}(m_1) [expr $es* \ (0.5+0.20833333333333333333*$es+0.08333333333333333333*$e4+ \ 0.03611111111111111111*$e6)] set ${data}(m_2) [expr $es* \ (0.14583333333333333333*$es+0.12083333333333333333*$e4+ \ 0.07039930555555555555*$e6)] set ${data}(m_3) [expr $es* \ (0.05833333333333333333*$e4+0.07232142857142857142*$e6)] set ${data}(m_4) [expr 0.02653149801587301587*$es*$e6] return } proc ProjMerc2Point {data latd longd datum} { # compute planar Cartesian coordinates for given position global $data return [ProjMerc1Point $data $latd $longd $datum] } proc ProjMerc2Invert {data x y} { # return list with latitude and longitude for point at $x,$y in the terrain global $data return [ProjMerc1Invert $data $x $y] } ## Mercator projection: a special case of Lambert Conic Conformal # with the equator as standard parallel # single standard parallel, spherical case # adapted from libproj 4.6.1 proc ProjSphMercComputeAux {data datum} { # compute auxiliary parameters from main parameters # $data is name of global array for the parameters global $data set a [lindex [EllipsdData $datum] 0] set lat0 [set ${data}(lat0)] if { $lat0 > 1e-15 } { set k0 [expr cos($lat0*0.01745329251994329576)] } else { set k0 1 } set ${data}(m_a) [expr 1.0*$a*$k0] return } proc ProjSphMercPoint {data latd longd datum} { # compute planar Cartesian coordinates for given position global $data set prdatum [set ${data}(datum)] if { $datum != $prdatum } { foreach "latd longd" \ [ToDatum $latd $longd $datum $prdatum] { break } } set long0 [set ${data}(long0)] set longd [NormalLongCentred $longd $long0] set x [expr [set ${data}(m_a)]*($longd-$long0)*0.01745329251994329576] set y [expr [set ${data}(m_a)]* \ log(tan(0.78539816339744830962+$latd*0.00872664625997164788))] return [list $x $y] } proc ProjSphMercInvert {data x y} { # return list with latitude and longitude for point at $x,$y in the terrain global $data set latd [expr (1.5707963267948966-2*atan(exp(-$y/[set ${data}(m_a)]))) * \ 57.29577951308232087684] set longd [expr $x/[set ${data}(m_a)]*57.29577951308232087684+ \ [set ${data}(long0)]] return [list $latd [NormalLong $longd]] } ## Cassini-Soldner projection proc ProjCSComputeAux {data datum} { # compute auxiliary parameters from main parameters # $data is name of global array for the parameters global $data set d [EllipsdData $datum] set a [set ${data}(m_a) [lindex $d 0]] ; set f [lindex $d 1] set es [set ${data}(m_e) [expr $f*(2-$f)]] set phi0 [expr [set ${data}(lat0)]*0.01745329251994329576] set e4 [expr $es*$es] ; set e6 [expr $es*$e4] set m1 [set ${data}(m_1) [expr 1-0.25*$es-0.046875*$e4-0.01953125*$e6]] set m2 [set ${data}(m_2) [expr 0.375*$es+0.09375*$e4+0.0439453125*$e6]] set m3 [set ${data}(m_3) [expr 0.05859375*$e4+0.0439453125*$e6]] set m4 [set ${data}(m_4) [expr 0.01139322916666666667*$e6]] set ${data}(m_0) [expr $a*($m1*$phi0-$m2*sin($phi0+$phi0)+ \ $m3*sin(4*$phi0)-$m4*sin(6*$phi0))] set se [expr sqrt(1-$es)] set e1 [expr (1.0-$se)/(1+$se)] ; set e12 [expr $e1*$e1] set ${data}(m_5) [expr $e1*(1.5-0.84375*$e12)] set ${data}(m_6) [expr $e12*(1.3125-1.71875*$e12)] set ${data}(m_7) [expr 1.57291666666666666667*$e12*$e1] set ${data}(m_8) [expr 2.142578125*$e12*$e12] return } proc ProjCSPoint {data latd longd datum} { # compute planar Cartesian coordinates for given position global $data set prdatum [set ${data}(datum)] if { $datum != $prdatum } { foreach "latd longd" \ [ToDatum $latd $longd $datum $prdatum] { break } } set long0 [set ${data}(long0)] set longd [NormalLongCentred $longd $long0] set a [set ${data}(m_a)] ; set es [set ${data}(m_e)] set phi [expr $latd*0.01745329251994329576] set cphi [expr cos($phi)] ; set sphi [expr sin($phi)] set A [expr ($longd-$long0)*0.01745329251994329576*$cphi] set A2 [expr $A*$A] ; set A4 [expr $A2*$A2] set t [expr tan($phi)] ; set T [expr $t*$t] set C [expr $es*$cphi*$cphi/(1.0-$es)] set v [expr $a/sqrt(1-$es*$sphi*$sphi)] set M [expr $a*([set ${data}(m_1)]*$phi- \ [set ${data}(m_2)]*sin($phi+$phi)+ \ [set ${data}(m_3)]*sin(4*$phi)- \ [set ${data}(m_4)]*sin(6*$phi))] set x [expr $v*$A*(1-$T*$A2/6.0-(8-$T+8*$C)*$T*$A4/120.0)] set y [expr $M-[set ${data}(m_0)]+$v*$t*(0.5*$A2+(5-$T+6*$C)*$A4/24.0)] return [list $x $y] } proc ProjCSInvert {data x y} { # return list with latitude and longitude for point at $x,$y in the terrain global $data set a [set ${data}(m_a)] ; set es [set ${data}(m_e)] set miu1 [expr ([set ${data}(m_0)]+$y)/($a*[set ${data}(m_1)])] set phi1 [expr $miu1+[set ${data}(m_5)]*sin($miu1+$miu1)+ \ [set ${data}(m_6)]*sin(4*$miu1)+ \ [set ${data}(m_7)]*sin(6*$miu1)+ \ [set ${data}(m_8)]*sin(8*$miu1)] set sphi1 [expr sin($phi1)] set t [expr 1-$es*$sphi1*$sphi1] set v1 [expr $a/sqrt($t)] ; set rho1 [expr $v1*(1-$es)/$t] set t [expr tan($phi1)] ; set T1 [expr $t*$t] set D [expr $x/$v1] ; set D2 [expr $D*$D] set tt [expr (1+3*$T1)*$D2] set lat [expr ($phi1-$v1*$t/$rho1*$D2*(0.5-$tt/24.0))* \ 57.29577951308232087684] set long [expr $D*(1-$T1*$D2/3.0+$tt*$D2/15.0)/cos($phi1)* \ 57.29577951308232087684+[set ${data}(long0)]] return [list $lat [NormalLong $long]] } ## American polyconic projection # adapted from PROJ4.0 proc ProjAPOLYComputeAux {data datum} { # compute auxiliary parameters from main parameters # $data is name of global array for the parameters global $data set d [EllipsdData $datum] set ${data}(m_a) [lindex $d 0] set f [lindex $d 1] set es [set ${data}(m_5) [expr $f*(2-$f)]] MeridDistParams $data $es set phi0 [expr [set ${data}(lat0)]*0.01745329251994329576] set ${data}(m_6) \ [MeridionalDist $data $phi0 [expr sin($phi0)] [expr cos($phi0)]] return } proc ProjAPOLYPoint {data latd longd datum} { # compute planar Cartesian coordinates for given position global $data set prdatum [set ${data}(datum)] if { $datum != $prdatum } { foreach "latd longd" \ [ToDatum $latd $longd $datum $prdatum] { break } } set a [set ${data}(m_a)] set phi [expr $latd*0.01745329251994329576] set lam [expr $longd*0.01745329251994329576] if { abs($phi) <= 1e-10 } { set x [expr $lam*$a] ; set y [expr -$a*[set ${data}(m_6)]] } else { set sp [expr sin($phi)] if { abs([set cp [expr cos($phi)]]) > 1e-10 } { set ms [expr $cp/sqrt(1-[set ${data}(m_5)]*$sp*$sp)/$sp] } else { set ms 0 } set t [expr $lam*$sp] set x [expr $a*$ms*sin($t)] set y [expr $a*(([MeridionalDist $data $phi $sp $cp]- \ [set ${data}(m_6)])+$ms*(1-cos($t)))] } return [list $x $y] } proc ProjAPOLYInvert {data x y} { # return list with latitude and longitude for point at $x,$y in the terrain global $data MESS TXT set a [set ${data}(m_a)] set x [expr 1.0*$x/$a] ; set y [expr 1.0*$y/$a] set y [expr $y+[set ${data}(m_6)]] if { abs($y) <= 1e-10 } { set phi 0 ; set lam $x } else { set r [expr $x*$x+$y*$y] ; set phi $y set es [set ${data}(m_5)] for { set i 0 } { $i < 20 } { incr i } { set sp [expr sin($phi)] ; set cp [expr cos($phi)] set s2ph [expr $sp*$cp] if { abs($cp) < 1e-12 } { GMMessage [format $MESS(badinvproj) $TXT(PRJAPOLY)] set i 0 break } set mlp [expr sqrt(1-$es*$sp*$sp)] set c [expr $sp*$mlp/$cp] set ml [MeridionalDist $data $phi $sp $cp] set mlb [expr $ml*$ml+$r] set mlp [expr (1-$es)/($mlp*$mlp*$mlp)] set dphi [expr ($ml+$ml+$c*$mlb-2.0*$y*($c*$ml+1))/ \ ($es*$s2ph*($mlb-2*$y*$ml)/$c+ \ 2*($y-$ml)*($c*$mlp-1.0/$s2ph)-$mlp-$mlp)] set phi [expr $phi+$dphi] if { abs($dphi) <= 1e-12 } { break } } if { $i == 0 } { GMMessage [format $MESS(badinvproj) $TXT(PRJAPOLY)] } set c [expr sin($phi)] set lam [expr [Aasin [expr $x*tan($phi)*sqrt(1-$es*$c*$c)]]/sin($phi)] } set longd [expr $lam*57.29577951308232087684] set latd [expr $phi*57.29577951308232087684] return [list $latd $longd] } ## Equidistant Cylindrical projection # adapted from libproj 4.6.1 proc ProjEqCylComputeAux {data datum} { # compute auxiliary parameters from main parameters # $data is name of global array for the parameters global $data set a [set ${data}(m_a) [lindex [EllipsdData $datum] 0]] set ${data}(m_0) [expr cos([set ${data}(lat0)]*0.01745329251994329576)*$a] return } proc ProjEqCylPoint {data latd longd datum} { # compute planar Cartesian coordinates for given position global $data set prdatum [set ${data}(datum)] if { $datum != $prdatum } { foreach "latd longd" \ [ToDatum $latd $longd $datum $prdatum] { break } } set x [expr [set ${data}(m_0)]*$longd*0.01745329251994329576] set y [expr [set ${data}(m_a)]*($latd-[set ${data}(lat0)])* \ 0.01745329251994329576] return [list $x $y] } proc ProjEqCylInvert {data x y} { # return list with latitude and longitude for point at $x,$y in the terrain global $data set latd [expr $y/[set ${data}(m_a)]*57.29577951308232087684+ \ [set ${data}(lat0)]] set longd [expr $x/[set ${data}(m_0)]*57.29577951308232087684] return [list $latd [NormalLong $longd]] } ## auxiliary procs for polyconic projection # meridional distance for ellipsoid and inverse proc MeridDistParams {data es} { # compute parameters for meridional distance and inverse functions # saving them at indices m_0, ..., m_4 of array $data global $data set t [expr $es*(0.046875+$es*(0.01953125+$es*0.01068115234375))] set ${data}(m_0) [expr 1-$es*(0.25+$t)] set ${data}(m_1) [expr $es*(0.75-$t)] set t [expr $es*$es] set ${data}(m_2) [expr $t*(0.46875-$es* \ (0.01302083333333333333+$es*0.00712076822916666666))] set t [expr $es*$t] set ${data}(m_3) \ [expr $t*(0.36458333333333333333-$es*0.00569661458333333333)] set ${data}(m_4) [expr $t*$es*0.3076171875] return } proc MeridionalDist {data phi sphi cphi} { # compute meridional distance for given latitude # assume parameters for transformation are in array $data at indices # m_0, ..., m_4 global $data set cphi [expr $cphi*$sphi] set sphi [expr $sphi*$sphi] return [expr [set ${data}(m_0)]*$phi-$cphi* \ ([set ${data}(m_1)]+$sphi* \ ([set ${data}(m_2)]+$sphi* \ ([set ${data}(m_3)]+$sphi*[set ${data}(m_4)])))] } proc LatFromMeridDist {data d} { # compute latitude from given meridional distance # assume parameters for transformation and e^2 are in array $data at # indices m_0, ..., m_4 and m_5 global $data MESS set es [set ${data}(m_5)] set k [expr 1.0/(1-$es)] set phi $d for { set i 0 } { $i < 10 } { incr i } { set s [expr sin($phi)] set t [expr 1.0-$es*$s*$s] set dphi [expr [MeridionalDist $data $phi $s [expr cos($phi)]]* \ ($t*sqrt($t))*$k] set phi [expr $phi-$dphi] if { abs($dphi) < 1e-11 } { return $phi } } GMMessage $MESS(badinvmdist) return $phi } ## Stereographic projection # proc ProjStereogrComputeAux {data datum} { # compute auxiliary parameters from main parameters # $data is name of global array for the parameters global $data set d [EllipsdData $datum] set ${data}(m_a) [lindex $d 0] ; set f [lindex $d 1] set e [set ${data}(m_e) [expr sqrt($f*(2-$f))]] set phi0 [expr [set ${data}(lat0)]*0.01745329251994329576] set k0 [set ${data}(k0)] set t [expr abs($phi0)] if { abs($t-1.5707963267948966) < 1e-10 } { if { $phi0 < 0 } { set mode s_pole } else { set mode n_pole } set ${data}(m_0) [expr 2*$k0/sqrt(pow(1+$e,1+$e)*pow(1-$e,1-$e))] } elseif { $t > 1e-10 } { set mode obliq set t [expr sin($phi0)] set X [expr 2*atan([SSFunc_ $phi0 $t $e])-1.5707963267948966] set t [expr $t*$e] set ${data}(m_0) [expr 2*$k0*cos($phi0)/sqrt(1.0-$t*$t)] set ${data}(m_1) [expr sin($X)] set ${data}(m_2) [expr cos($X)] } else { set mode equat set ${data}(m_0) [expr 2*$k0] set ${data}(m_1) 0 set ${data}(m_2) 1.0 } set ${data}(m_3) $mode return } proc ProjStereogrPoint {data latd longd datum} { # compute planar Cartesian coordinates for given position global $data set prdatum [set ${data}(datum)] if { $datum != $prdatum } { foreach "latd longd" \ [ToDatum $latd $longd $datum $prdatum] { break } } set long0 [set ${data}(long0)] set longd [NormalLongCentred $longd $long0] set e [set ${data}(m_e)] set akm1 [set ${data}(m_0)] set phi [expr $latd*0.01745329251994329576] set lam [expr ($longd-$long0)*0.01745329251994329576] set coslam [expr cos($lam)] ; set sinlam [expr sin($lam)] set sinphi [expr sin($phi)] switch [set ${data}(m_3)] { obliq - equat { set X [expr 2*atan([SSFunc_ $phi $sinphi $e])-1.5707963267948966] set sinX [expr sin($X)] ; set cosX [expr cos($X)] set sinX1 [set ${data}(m_1)] set cosX1 [set ${data}(m_2)] set A [expr $akm1/($cosX1*(1+$sinX1*$sinX+$cosX1*$cosX*$coslam))] set y [expr $A*($cosX1*$sinX-$sinX1*$cosX*$coslam)] set x [expr $A*$cosX] } n_pole { set x [expr $akm1*[ExpRedLat $phi $sinphi $e]] set y [expr -$x*$coslam] } s_pole { set x [expr $akm1*[ExpRedLat [expr -$phi] [expr -$sinphi] $e]] set y [expr $x*$coslam] } } set a [set ${data}(m_a)] set x [expr $x*$sinlam*$a] ; set y [expr $y*$a] return [list $x $y] } proc ProjStereogrInvert {data x y} { # return list with latitude and longitude for point at $x,$y in the terrain global $data MESS TXT set e [set ${data}(m_e)] ; set a [set ${data}(m_a)] set akm1 [set ${data}(m_0)] set long0 [set ${data}(long0)] ; set datum [set ${data}(datum)] set x [expr $x/$a] ; set y [expr $y/$a] if { abs($x)<1e-6 && abs($y)<1e-6 } { return [list [set ${data}(lat0)] $long0] } set rho [Hypot $x $y] set spole 0 switch [set m [set ${data}(m_3)]] { obliq - equat { set sinX1 [set ${data}(m_1)] set cosX1 [set ${data}(m_2)] set tp [expr 2*atan2($rho*$cosX1,$akm1)] set cosphi [expr cos($tp)] ; set sinphi [expr sin($tp)] if { $rho == 0.0 } { set phi_l [Aasin [expr $cosphi*$sinX1]] } else { set phi_l [Aasin [expr $cosphi*$sinX1+($y*$sinphi*$cosX1/$rho)]] } set tp [expr tan(0.5*(1.5707963267948966+$phi_l))] set x [expr $x*$sinphi] set y [expr $rho*$cosX1*$cosphi-$y*$sinX1*$sinphi] set halfpi 1.5707963267948966 set halfe [expr 0.5*$e] } n_pole { set y [expr -$y] set tp [expr -1.0*$rho/$akm1] set phi_l [expr 1.5707963267948966-2*atan($tp)] set halfpi -1.5707963267948966 set halfe [expr -0.5*$e] } s_pole { set spole 1 set tp [expr -1.0*$rho/$akm1] set phi_l [expr 1.5707963267948966-2*atan($tp)] set halfpi -1.5707963267948966 set halfe [expr -0.5*$e] } } for { set i 8 } { [incr i -1] } { set phi_l $phi } { set sinphi [expr $e*sin($phi_l)] set phi [expr 2*atan($tp*pow((1+$sinphi)/(1-$sinphi),$halfe))-$halfpi] if { abs($phi_l-$phi) < 1e-10 } { if { $spole } { set phi [expr -$phi] } if { $x == 0 && $y == 0 } { set longd 0 } else { set longd [expr atan2($x,$y)*57.29577951308232087684] } set latd [expr $phi*57.29577951308232087684] set longd [expr $longd+$long0] return [list $latd $longd] } } ## return 0 180 on error... GMMessage [format $MESS(badinvproj) $TXT(PRJStereogr)] return [list 0 180] } # Schreiber double projection: used for the RDG (Netherlands) grid # this is a special case of the oblique Stereographic projection # proc ProjSchreiberComputeAux {data datum} { # compute auxiliary parameters from main parameters # $data is name of global array for the parameters global $data set phi0 [set ${data}(m_0) 0.91029672689323934677] set lam0 [set ${data}(m_1) 0.09403203751960005358] set e [set ${data}(m_2) 0.08169683122252750299] set k0 0.9999079 # 2*k*R set ${data}(m_3) [expr 12765289.142*$k0] set n 1.00047585668 ; set m 0.003773953832 set tau0 [expr log([SSFunc_ $phi0 [expr sin($phi0)] $e])] set B0 [expr 2*atan(pow(2.7182818284590452354,$n*$tau0+$m))- \ 1.5707963267948966] set ${data}(m_4) [expr sin($B0)] set ${data}(m_5) [expr cos($B0)] return } proc ProjSchreiberPoint {data latd longd datum} { # compute planar Cartesian coordinates for given position global $data set prdatum [set ${data}(datum)] if { $datum != $prdatum } { foreach "latd longd" \ [ToDatum $latd $longd $datum $prdatum] { break } } # just for the sake of those not knowing that this projection # was designed for use in the Netherlands... set long0 5.38763888888888888564 set longd [NormalLongCentred $longd $long0] set n 1.00047585668 ; set m 0.003773953832 set e [set ${data}(m_2)] set phi [expr $latd*0.01745329251994329576] set lam [expr $n*($longd*0.01745329251994329576-[set ${data}(m_1)])] set coslam [expr cos($lam)] ; set sinlam [expr sin($lam)] set sinphi [expr sin($phi)] set tau [expr log([SSFunc_ $phi $sinphi $e])] set B [expr 2*atan(pow(2.7182818284590452354,$n*$tau+$m))- \ 1.5707963267948966] set sinB [expr sin($B)] ; set cosB [expr cos($B)] set sinB0 [set ${data}(m_4)] set cosB0 [set ${data}(m_5)] set tkR [set ${data}(m_3)] set A [expr $tkR/(1+$sinB*$sinB0+$cosB*$cosB0*$coslam)] set x [expr $A*$sinlam*$cosB] set y [expr $A*($sinB*$cosB0-$cosB*$sinB0*$coslam)] return [list $x $y] } proc ProjSchreiberInvert {data x y} { # return list with latitude and longitude for point at $x,$y in the terrain global $data MESS TXT set datum [set ${data}(datum)] set long0 [expr [set ${data}(m_1)]*57.29577951308232087684] if { abs($x)<1e-6 && abs($y)<1e-6 } { set lat0 [expr [set ${data}(m_0)]*57.29577951308232087684] return [list $lat0 $long0] } set n 1.00047585668 ; set m 0.003773953832 set sinB0 [set ${data}(m_4)] set cosB0 [set ${data}(m_5)] set tkR [set ${data}(m_3)] set rho [Hypot $x $y] set Psi [expr 2*atan2($rho,$tkR)] set sinPsi [expr sin($Psi)] set B [Aasin [expr cos($Psi)*$sinB0+$y*$sinPsi*$cosB0/$rho]] set lam [Aasin [expr $x*$sinPsi/$rho/cos($B)]] set longd [expr $lam/$n*57.29577951308232087684+$long0] set tau [expr (log(tan(0.5*(1.5707963267948966+$B)))-$m)/$n] set etau [expr pow(2.7182818284590452354,$tau)] set phi [expr 2*atan($etau)-1.5707963267948966] set e [set ${data}(m_2)] ; set he [expr 0.5*$e] for { set i 0 } { $i < 50 } { incr i } { set esp [expr $e*sin($phi)] set phi_ [expr 2*atan($etau*pow((1+$esp)/(1-$esp),$he))- \ 1.5707963267948966] if { abs($phi_-$phi) < 1e-10 } { set latd [expr $phi*57.29577951308232087684] return [list $latd $longd] } set phi $phi_ } ## return 0 180 on error... GMMessage [format $MESS(badinvproj) $TXT(PRJSchreiber)] return [list 0 180] } ## ancillary procs for Stereographic and Schreiber projections proc SSFunc_ {phit sinphi eccen} { set sinphi [expr $sinphi*$eccen] return [expr tan(0.5*(1.5707963267948966+$phit))* \ pow((1-$sinphi)/(1+$sinphi),0.5*$eccen)] } # Swiss Oblique Mercator projection proc ProjSOMComputeAux {data datum} { # compute auxiliary parameters from main parameters # $data is name of global array for the parameters global $data set d [EllipsdData $datum] set a [lindex $d 0] ; set f [lindex $d 1] set es [expr $f*(2-$f)] set e [set ${data}(m_e) [expr sqrt($es)]] set he [set ${data}(m_0) [expr 0.5*$e]] set oes [expr 1-$es] set roes [set ${data}(m_6) [expr 1.0/$oes]] set phi0 [expr [set ${data}(lat0)]*0.01745329251994329576] set cp [expr cos($phi0)] ; set cp [expr $cp*$cp] set c [set ${data}(m_1) [expr sqrt(1+$es*$cp*$cp*$roes)]] set sp [expr sin($phi0)] set sp0 [set ${data}(m_3) [expr $sp/$c]] set p0 [Aasin $sp0] set ${data}(m_2) [expr cos($p0)] set sp [expr $sp*$e] set ${data}(m_4) [expr log(tan(0.78539816339744833+0.5*$p0))- \ $c*(log(tan(0.78539816339744833+0.5*$phi0))- \ $he*log((1.0+$sp)/(1.0-$sp)))] set ${data}(m_5) [expr $a*[set ${data}(k0)]*sqrt($oes)/(1.0-$sp*$sp)] return } proc ProjSOMPoint {data latd longd datum} { # compute planar Cartesian coordinates for given position global $data set prdatum [set ${data}(datum)] if { $datum != $prdatum } { foreach "latd longd" \ [ToDatum $latd $longd $datum $prdatum] { break } } # just for the sake of those not knowing that this projection # was designed for use in Switzerland... set long0 [set ${data}(long0)] set longd [NormalLongCentred $longd $long0] set phi [expr $latd*0.01745329251994329576] set sp [expr [set ${data}(m_e)]*sin($phi)] set c [set ${data}(m_1)] set phip [expr 2*atan(exp($c*(log(tan(0.78539816339744833+0.5*$phi))- \ [set ${data}(m_0)]*log((1.0+$sp)/(1.0-$sp)))+ \ [set ${data}(m_4)]))-1.5707963267948966] set lam [expr $c*($longd-$long0)*0.01745329251994329576] set cp [expr cos($phip)] set phipp [Aasin [expr [set ${data}(m_2)]*sin($phip)- \ [set ${data}(m_3)]*$cp*cos($lam)]] set akR [set ${data}(m_5)] set x [expr $akR*[Aasin [expr $cp*sin($lam)/cos($phipp)]]] set y [expr $akR*log(tan(0.78539816339744833+0.5*$phipp))] return [list $x $y] } proc ProjSOMInvert {data x y} { # return list with latitude and longitude for point at $x,$y in the terrain global $data MESS TXT set datum [set ${data}(datum)] set akR [set ${data}(m_5)] set phipp [expr 2*(atan(exp(1.0*$y/$akR))-0.78539816339744833)] set lampp [expr 1.0*$x/$akR] set cp [expr cos($phipp)] set phip [Aasin [expr [set ${data}(m_2)]*sin($phipp)+ \ [set ${data}(m_3)]*$cp*cos($lampp)]] set lamp [Aasin [expr $cp*sin($lampp)/cos($phip)]] set e [set ${data}(m_e)] set he [set ${data}(m_0)] ; set c [set ${data}(m_1)] set roes [set ${data}(m_6)] set con [expr ([set ${data}(m_4)]- \ log(tan(0.78539816339744833+0.5*$phip)))/$c] set i 10 while { [incr i -1] } { set esp [expr $e*sin($phip)] set delp [expr ($con+log(tan(0.78539816339744833+0.5*$phip))- \ $he*log((1.0+$esp)/(1.0-$esp)))*(1.0-$esp*$esp)*cos($phip)* \ $roes] set phip [expr $phip-$delp] if { abs($delp) < 1e-10 } { break } } if { $i } { set latd [expr $phip*57.29577951308232087684] set longd [expr 57.29577951308232087684*$lamp/$c+ \ [set ${data}(long0)]] return [list $latd $longd] } ## return 0 180 on error... GMMessage [format $MESS(badinvproj) $TXT(PRJSOM)] return [list 0 180] } # ancillary procedures for Swiss Oblique Mercator and others proc Aasin {v} { # arcsin function global MESS set av [expr abs($v)] if { $av >= 1 } { if { $av > 1.00000000000001 } { GMMessage [format $MESS(badargtofunc) asin] } if { $v < 0 } { return -1.5707963267948966 } return 1.5707963267948966 } return [expr asin($v)] } # ancillary procedures for LCC1, LCC2, Stereographic and Schreiber projections proc Hypot {x y} { # computation of sqrt($x*$x+$y*$y) avoiding overflows if { $x < 0 } { set x [expr -$x] } elseif { $x == 0 } { if { $y < 0 } { return [expr -$y] } return $y } if { $y < 0 } { set y [expr -$y] } elseif { $y == 0 } { return $x } if { $x < $y } { set x [expr 1.0*$x/$y] return [expr $y*sqrt(1+$x*$x)] } set y [expr 1.0*$y/$x] return [expr $x*sqrt(1+$y*$y)] } # # SL contribution # # Implementation of the EOV (Hungarian National Projection) # # 2008-07-15 # # Based on publications by Jozsef Varga Phd. # http://www.agt.bme.hu/staff_h/varga/Osszes/Dok3uj.htm # http://www.agt.bme.hu/staff_h/varga/gps/kezdoknek.html # proc ProjEOVPoint {data latd longd datum} { # compute planar Cartesian coordinates for given position # although this projection computes x for northing and # y for easting, for compatibility with the mapping procedures # this procedure returns the usual (easting, northing) pair, # and the grid coordinates are computed by inversing it # $data is not used # MF change: use the 3 parameter conversion to the HD72 if needed if { $datum != "Hungarian Datum 1972" } { foreach "latd longd" \ [ToDatum $latd $longd $datum "Hungarian Datum 1972"] { break } } # MF changes after this point: for efficiency, original code commented out # HD72 Phi, Lambda to radians set Phi [expr $latd*0.01745329251994329576] set Lambda [expr $longd*0.01745329251994329576] #--- # HD72 Phi, Lambda to spherical phi, lambda ## GRS67 semi-major / semi-minor axis # set a 6378160.0 # set b 6356774.516 ## EOV parameters set k 1.003110007693 set n 1.000719704936 # set Lambda_0 [expr (19.0 + 02.0/60.0 + 54.8584/3600.0) / 360.0 * 2.0*$pi] # set Lambda_0 0.33246029532469185632 ## GRS67 eccentricity # set epsilon [expr sqrt(($a*$a-$b*$b)/($a*$a))] set epsilon 0.0818205680555 # set A [expr pow(tan($pi/4.0+$Phi/2.0), $n)] set A [expr pow(tan(0.785398163397448+0.5*$Phi), $n)] # set B [expr pow((1.0-$epsilon*sin($Phi))/(1.0+$epsilon*sin($Phi)), # $n*$epsilon/2.0)] set sinPhi [expr sin($Phi)] set B [expr pow((1.0-$epsilon*$sinPhi)/(1.0+$epsilon*$sinPhi), \ 0.5*$n*$epsilon)] # set phi [expr 2.0 * atan($k*$A*$B) - $pi/2.0] set phi [expr 2.0 * atan($k*$A*$B) - 1.570796326794897] # set lambda [expr $n*($Lambda-$Lambda_0)] set lambda [expr $n*($Lambda-0.33246029532469185632)] # Spherical phi, lambda to auxiliary phi, lambda ## EOV starting point # set phi_0 [expr (47.0 + 06.0/60.0 + 00.0000/3600.0) / 360.0 * 2.0*$pi] set phi_0 0.8220500776893292307101144 # set phi_a [expr asin(sin($phi)*cos($phi_0) # - cos($phi)*sin($phi_0)*cos($lambda))] set cosphi [expr cos($phi)] set phi_a [expr asin(sin($phi)*cos($phi_0)- \ $cosphi*sin($phi_0)*cos($lambda))] # set lambda_a [expr asin((cos($phi)*sin($lambda))/(cos($phi_a)))] set lambda_a [expr asin(($cosphi*sin($lambda))/cos($phi_a))] # Auxiliary phi, lambda to cartesian x, y (x == northing && y == easting) ## Radius of the "new" Gauss-sphere # set R 6379743.001 ## Reduction (scale factor) # set m_0 0.99993 set Rm_0 6379296.41898993 # set x [expr $R * $m_0 * log(tan($pi/4+$phi_a/2))] # set y [expr $R * $m_0 * $lambda_a] set x [expr $Rm_0 * log(tan(0.78539816339744830961+0.5*$phi_a))] set y [expr $Rm_0 * $lambda_a] # MF change: the false easting and false northing are added by the # grid procedures; return the "raw" easting and northing return [list $y $x] } proc ProjEOVInvert {data x y} { # return list with latitude and longitude for point at $x,$y in the terrain # where $x is the easting and $y the northing (against the EOV convention) # with no false easting/northing added # $data is not used # return 0, 180 if computation of latitude diverges global MESS TXT # Return to the EOV convention ($y == easting && $x == northing) set z $x ; set x $y ; set y $z # MF changes after this point: for efficiency, original code commented out # Cartesian y, x to auxiliary phi, lambda # set R 6379743.001 ## Reduction (scale factor) # set m_0 0.99993 set Rm_0 6379296.41898993 ## Pi :-P # set pi 3.1415926535897932384626434 # set phi_a [expr 2*atan(exp($x/($R*$m_0)))-$pi/2] set phi_a [expr 2*atan(exp($x/$Rm_0))-1.57079632679489661923] # set lambda_a [expr $y/($R*$m_0)] set lambda_a [expr $y/($Rm_0)] # Auxiliary phi, lambda to spherical phi, lambda ## EOV starting point # set phi_0 [expr (47.0 + 06.0/60.0 + 00.0000/3600.0) / 360.0 * 2.0*$pi] # set phi_0 0.82205007768932923029 set cosphi_a [expr cos($phi_a)] # set phi [expr asin( sin($phi_a)*cos($phi_0) + # cos($phi_a)*sin($phi_0)*cos($lambda_a) )] set phi [expr asin( sin($phi_a)*0.680720868959 + \ $cosphi_a*0.732542898787*cos($lambda_a) )] # set lambda [expr asin( (cos($phi_a)*sin($lambda_a)) / cos($phi) )] set lambda [expr asin( ($cosphi_a*sin($lambda_a)) / cos($phi) )] # Spherical phi, lambda to HD72 Phi, Lambda ## GRS67 semi-major / semi-minor axis # set a 6378160.0 # set b 6356774.516 ## EOV parameters set k 1.003110007693 set n 1.000719704936 # set Lambda_0 [expr (19.0 + 02.0/60.0 + 54.8584/3600.0) / 360.0 * 2.0*$pi] # set Lambda_0 0.33246029532469185632 ## GRS67 eccentricity # set epsilon [expr sqrt(($a*$a-$b*$b)/($a*$a))] set epsilon 0.0818205680555 ## Iteration to calculate Phi set Phi $phi set i 0 # set A [expr tan($pi/4+$phi/2)] set A [expr tan(0.785398163397448+0.5*$phi)] set invn [expr 1/$n] while 1 { set B [expr $k *pow( (1-$epsilon*sin($Phi)) / (1+$epsilon*sin($Phi)), \ $n*$epsilon/2)] # set Phi_new [expr 2 * atan(pow($A/$B, 1/$n)) - $pi/2] set Phi_new [expr 2 * atan(pow(1.0*$A/$B, $invn)) - 1.570796326794897] if { abs($Phi-$Phi_new) <= 1.5E-9 } { break } if { [incr i] > 20} { GMMessage [format $MESS(badinvproj) $TXT(PRJEOV)] return [list 0 180] } set Phi $Phi_new } ## Calculate Lambda # set Lambda [expr $Lambda_0 + $lambda/$n] set Lambda [expr 0.33246029532469185632 + $lambda/$n] # MF change: results will be for the HD72 # Convert the result from radian to DD.DDDDDDDD... set la [expr $Phi*57.29577951308232087684] set lo [expr $Lambda*57.29577951308232087684] #--- return [list $la $lo] } gpsman-6.4.4.2/gmsrc/lowrance_symbols.tcl0000644000175000017500000000406512224351120016462 0ustar migmig# # This file is part of: # # gpsman --- GPS Manager: a manager for GPS receiver data # # Copyright (c) 1998-2013 Miguel Filgueiras migfilg@t-online.de # # Copyright (c) 1999 Brian Baulch (baulchb@hotkey.net.au) # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. # # File: lowrance_symbols.tcl # Last change: 6 October 2013 # proc LowranceStdSymbols {} { # set codes for set of standard Lowrance symbols global SYMBOLS SYMBOLCODE UNKNOWNSYMBOLS DEFAULTSYMBOL array set SYMBOLCODE { WP_dot 0 mark_x 1 1st_aid 2 dot 3 house 4 car 5 fuel 6 phone 7 knife_fork 8 airport 9 exit 10 tree 11 mountains 12 camping 13 picnic 14 bridge 15 ladder 16 deer 17 tracks 18 many_tracks 19 skull 20 fish 21 many_fish 22 info 23 wreck 24 anchor 25 boat_ramp 26 flag 27 } set UNKNOWNSYMBOLS $SYMBOLS foreach n [array names SYMBOLCODE] { set i [lsearch -exact $UNKNOWNSYMBOLS $n] if { $i != -1 } { set UNKNOWNSYMBOLS [lreplace $UNKNOWNSYMBOLS $i $i] } } # codes of unknown symbols set to code of default symbol if possible, # otherwise to code of WP_dot if { [lsearch -exact $DEFAULTSYMBOL $UNKNOWNSYMBOLS] == -1 } { set c $SYMBOLCODE($DEFAULTSYMBOL) } else { set c $SYMBOLCODE(WP_dot) } foreach n $UNKNOWNSYMBOLS { set SYMBOLCODE($n) $c } return } gpsman-6.4.4.2/gmsrc/plugins.tcl0000644000175000017500000010512312224351120014556 0ustar migmig# # This file is part of: # # gpsman --- GPS Manager: a manager for GPS receiver data # # Copyright (c) 1998-2013 Miguel Filgueiras migfilg@t-online.de # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. # # File: plugins.tcl # Last change: 6 October 2013 # # Includes contributions by # - Rudolf Martin (rudolf.martin _AT_ gmx.de) marked "RM contribution" # [gnuplot plug-ins from file dated 28 January 2011] # ### which toplevels support plug-ins (used for documentation only) # indices are patterns of toplevel window paths # contents are lists of lists whose heads are widget types (button, menu) # and whose rests are sub-window paths (frame, menu) where the plug-in # widgets or entries will be inserted ## windows, procedures, title index in TXT, comment # . GMInit GMtit main window (map or lists) # .gmWP* GMWPoint waypoint WP edit/show windows # .*.topc GMTRCompute TRcomp TR computation window # .gmRT* GMRoute route RT edit/show windows # .gmTR* GMTrack track TR edit/show windows # .gmLN* GMLine nameLN LN edit/show windows # .gmGR* GMGroup group GR edit/show windows array set PLGSWelcomed { . {{menu fr.frm.top.frmap0.udefs.mn.plugin.exec mpw.fr.frmi.frcoords.udefs.mn.plugin.exec}} .gmWP* {{button .fr.fr6}} .gmRT* {{button .fr.frdw}} .gmTR* {{button .fr.frdw}} .*.topc {{menu .fr.frsel.hgraph.mn.el .fr.frsel.hgraph.mn .fr.frsel.more.mn}} .gmLN* {{button .fr.frdw}} .gmGR* {{button .fr.frdw}} } # check for the following comments inserted in other source files # frame used for plug-ins (see array PLGSWelcomed, plugins.tcl) # menu used for plug-ins (see array PLGSWelcomed, plugins.tcl) # call that must be made from procedures accepting plug-ins # AttachPlugIns $w proc SetUpPlugIn {name where} { # make plug-in known to procedures setting up toplevel windows global PLGSForWindow foreach t $where { foreach {patt type widget} $t { break } set e [list $name $type $widget] if { [catch {set ts $PLGSForWindow($patt)}] } { set PLGSForWindow($patt) [list $e] } else { lappend ts $e set PLGSForWindow($patt) $ts } } return } proc AttachPlugIns {hostwindow} { # make plug-ins available from window $hostwindow using information # in the global array PLGSForWindow from first matched pattern # creates buttons and/or menu entries global PLUGIN PLGSForWindow foreach patt [array names PLGSForWindow] { if { [string match $patt $hostwindow] } { foreach t $PLGSForWindow($patt) { foreach {plugin type sub} $t { break } # if sub-window does not exist do nothing set wd $hostwindow$sub if { ! [winfo exists $wd] } { continue } set pdata $PLUGIN($plugin) foreach {remark unavail params pcode} $pdata { break } set cmd "expr $unavail" if { [catch {set unavail [uplevel #0 $cmd]} err] } { continue } if { $unavail } { set state disabled } else { set state normal } set cmd "" append cmd PlugInExec " " "{$plugin}" " " $hostwindow " " \ [uplevel subst -nocommands \"$params\"] switch $type { button { regsub -all { } $plugin "___" plref set b [button $wd.pl_$plref -text $plugin \ -command $cmd -state $state] BalloonBindings $b "{=$remark}" foreach {col row} [grid size $wd] { break } incr row -1 grid $b -row $row -column $col -padx 10 } menu { $wd add command -label $plugin -command $cmd \ -state $state } } } } } return } proc PlugInExec {plugin window args} { # execute plug-in called from $window # $args is a list of consecutive elements NAME VALUE # a variable NAME being set to VALUE before evaluation of # the plug-in code global PLUGIN MESS foreach {v val} $args { if { [string index $v 0] != "_" } { DisplayInfo [format $MESS(badpluginparamexec) $plugin $p] return } set $v $val } if { [catch {eval [lindex $PLUGIN($plugin) 3]} err] } { DisplayInfo [format $MESS(pluginfailed) $plugin $err] } return } ### predefined plug-ins # names and remarks must be in TXT set PLUGIN($TXT(wptotwitter)) \ [list $TXT(wptotwitternb) \ {[catch {package require TclCurl}]} \ {_ed $ed _ix $index} \ { set _url http://twitter.com/statuses/update.xml set _mess "#GPSMan #waypoint\n" if { $_ed } { global GMEd ChangedPosn set _p [PosnGetCheck .gmWP.fr.frp.frp1 $GMEd(WP,Datum) \ GMMessage ChangedPosn] if { $_p != "nil" } { set _alt [AltitudeList \ [string trim [.gmWP.fr.fr11.alt get]]] if { $_alt == "nil" } { set _alt "" } set _datum $GMEd(WP,Datum) set _name [.gmWP.fr.fr1.id get] set _commt [.gmWP.fr.fr2.commt get] } } else { global WPName WPPosn WPDatum WPAlt WPCommt set _p $WPPosn($_ix) ; set _datum $WPDatum($_ix) set _alt $WPAlt($_ix) set _name $WPName($_ix) ; set _commt $WPCommt($_ix) } if { $_p != "nil" } { global COUTFMT set _lat [lindex $_p 0] ; set _long [lindex $_p 1] append _mess lat= [format $COUTFMT(deg) [lindex $_p 0]] " " \ long= [format $COUTFMT(deg) [lindex $_p 1]] if { $_alt != "" } { append _mess "\nalt=" $_alt } append _mess "\ndatum=" [QuoteString $_datum] if { $_name != "" } { append _mess "\nname=" [QuoteString $_name] } if { $_commt != "" } { append _mess "\ncomment=" [QuoteString $_commt] } WebPost Twitter 1 $_url status $_mess 140 } } \ {{.gmWP* button .fr.fr6}}] ############################################################# # RM contribution ############################################################# ##### # plugin for plotting 2D altitudecharts with gnuplot # contributed by R. Martin 2010 # refer to wrtdials.tcl - proc GMTRCompute # MF change: test gnuplot by executing quit set PLUGIN($TXT(gpTRtoGnuplot2d)) \ [list $TXT(gpTRtoGnuplot2d_nb) \ {[catch {exec gnuplot -e quit}]} \ {_lll {$lll} _speeds {$speeds} _trname {[$window.fr.fr1.id get]} \ _cumula $cumula _cumuld $cumuld _td $td _tt $tt \ _avsp $avsp _minalt $minalt _maxalt $maxalt \ _datum {$datum} _tps {$tps} _rest {$rest}} \ { PCode_TRtoGnuplot2d $_lll $_speeds $_trname $_cumula $_cumuld \ $_td $_tt $_avsp $_minalt $_maxalt $_datum $_tps $_rest } \ {{.*.topc menu .fr.frsel.hgraph.mn.el}}] ##### # plugin for plotting 3D-charts with gnuplot # contributed by R. Martin 2010 # refer to wrtdials.tcl - proc GMTRCompute # MF change: test gnuplot by executing quit set PLUGIN($TXT(gpTRtoGnuplot3d)) \ [list $TXT(gpTRtoGnuplot3d_nb) \ {[catch {exec gnuplot -e quit}]} \ {_tmp3D {$tmp3D} _tmp3D2 {$tmp3D2} _trname {[$window.fr.fr1.id get]}\ _minalt $minalt _maxalt $maxalt _datum {$datum}} \ { PCode_TRtoGnuplot3d $_tmp3D $_tmp3D2 $_trname\ $_minalt $_maxalt $_datum } \ {{.*.topc menu .fr.frsel.hgraph.mn.el}}] # plugin for calculating estimated hiking time # contributed by R. Martin 2010 # refer to wrtdials.tcl - proc GMTRCompute # set PLUGIN($TXT(htCalcHikeTime)) \ [list $TXT(htCalcHikeTime_nb) \ { 0 } \ {_trname {[$window.fr.fr1.id get]} \ _cumula $cumula _cumuld $cumuld _td $td _tt $tt \ _tmt $tmt _trt $trt} \ { global MESS TXT ALSCALE DSCALE lappend htParam [list "DAV " 4 300 500] lappend htParam [list "GROUP " 5 300 600] lappend htParam [list "SINGLE" 5 400 800] # convert to meters set _cumula [expr round($_cumula*$ALSCALE)] set _cumuld [expr round($_cumuld*$ALSCALE)] set _td [format "%4.2f" [expr $_td/$DSCALE]] DisplayInfo $TXT(htHeader) DisplayInfo " " DisplayInfo [format $MESS(htResult1) $_trname] DisplayInfo [format $MESS(htResult2) \ "${_td}km" "${_cumula}m" "${_cumuld}m"] if {$_trt != 0 && $_tt != 0} { set perc [format "%2.0f" \ [expr double([TimeToSecs $_trt])/[TimeToSecs $_tt]*100]] } else { set perc 0 } if {$_tt != 0} { DisplayInfo [format $MESS(htResult3) \ $_tt $_trt "$perc%" $_tmt] } DisplayInfo " " foreach element $htParam { set desc [lindex $element 0] set cap_plain [lindex $element 1] set cap_asc [lindex $element 2] set cap_desc [lindex $element 3] set time_plain [expr $_td/double($cap_plain)] set time_elevation \ [expr $_cumula/double($cap_asc) + $_cumuld/double($cap_desc)] if {$time_plain > $time_elevation} { set hiketime [expr $time_plain + $time_elevation/2] } else { set hiketime [expr $time_elevation + $time_plain/2] } set hiketime [FormatTime [expr $hiketime*3600]] DisplayInfo [format $MESS(htResult4) $desc \ "${cap_plain}km" "${cap_asc}m" "${cap_desc}m" $hiketime] } DisplayInfo " " DisplayInfo $TXT(htFooter1) DisplayInfo $TXT(htFooter2) } \ {{.*.topc menu .fr.frsel.more.mn}}] # plugin for display rest periods in tracks # contributed by R. Martin 2010 # refer to wrtdials.tcl - proc GMTRCompute # # the calculation is done in wrtdials (list $rest) # set PLUGIN($TXT(srShowRest)) \ [list $TXT(srShowRest_nb) \ { 0 } \ {_trname {[$window.fr.fr1.id get]} \ _rest {$rest} _tt $tt _tmt $tmt _trt $trt _td $td}\ { global MESS TXT DTUNIT DisplayInfo [format $MESS(srResult1) $_trname] DisplayInfo " " DisplayInfo [format "%5s %10s %10s %10s"\ "Index" $TXT(srChainage) $TXT(srTRTime) $TXT(srRest)] foreach element $_rest { set i [format "%4.0f" [lindex $element 0]] set chain [lindex $element 1] set tracktime [FormatTime [lindex $element 2]] set resttime [FormatTime [lindex $element 3]] DisplayInfo [format "%5d %8.3f%-5s %8s %8s"\ $i $chain $DTUNIT $tracktime $resttime] } if {$_trt != 0 && $_tt != 0} { set perc [format "%2.0f" \ [expr double([TimeToSecs $_trt])/[TimeToSecs $_tt]*100]] } else { set perc 0 } DisplayInfo " " DisplayInfo $TXT(srTotals) DisplayInfo [format " %8.3f%-5s %8s %8s %s"\ $_td $DTUNIT $_tt $_trt "($perc%)"] } \ {{.*.topc menu .fr.frsel.more.mn}}] # end of RM contribution ### set up predefined plug-ins and menu description set PREDEFPLUGINDESCR {} if { [catch {set uplugins [set $DefSpecs(plugin,ulist)]}] } { set uplugins {} } foreach plugin [lsort -dictionary [array names PLUGIN]] { if { [lsearch -exact $uplugins $plugin] == -1 } { if { [regexp {^(@|(---))} $plugin] } { # avoid clashes with special denotations used by proc FillMenu lappend PREDEFPLUGINDESCR " $plugin" } else { lappend PREDEFPLUGINDESCR $plugin } SetUpPlugIn $plugin [lindex $PLUGIN($plugin) end] } } ##### procedures called from plug-ins ################################################################# # RM contribution ################################################################# ##### proc PCode_TRtoGnuplot2d {_lll _speeds _trname _cumula _cumuld _td _tt\ _avsp _minalt _maxalt _datum _tps _rest} { global MESS TXT DTUNIT ALUNIT SPUNIT DISPLAYCMD USERTMPDIR UNIX \ DateFormat NoImgLib # get settings for gnuplot global _gpParam # set default values array set _gpParam { totals gpRight rests gpSymTime hours gpTimetop speed gpHike help text limit_dist 0.100 limit_stat 0.500 width 800 height 600 } # setting output-filename set _gpParam(filename) "2D_chart_$_trname.png" # set up list of variables set vars {} foreach v {totals rests hours speed filename help limit_dist limit_stat width height} { lappend vars _gpParam($v) } set descs [list\ "~$TXT(gpSTotals)/[list gpLeft gpRight gpNone]"\ "~$TXT(gpSRests)/[list gpSymTime gpSymText gpText gpSym gpNone]"\ "~$TXT(gpSHours)/[list gpTimetop gpTimebot gpNone]"\ "~$TXT(gpSSpeed)/[list gpHike gpBike gpDrive gpGlide gpNone]"\ "=$TXT(gpFilename)"\ "@@gp2D_hlp"\ "=$TXT(gpLimitDist)"\ "=$TXT(gpLimitStat)"\ "=$TXT(gpCanwidth)"\ "=$TXT(gpCanheight)"] set mess $TXT(gpParam2d) while 1 { if { [GMChooseParams $mess $vars $descs] == 0 } { return } if { [CheckNumber GMMessage $_gpParam(width)] && \ [CheckNumber GMMessage $_gpParam(height)] } { break } } set limit_dist $_gpParam(limit_dist) # limit for distance from trackpoint to WP in km # waypoints outside of this delimiter will be discarded set limit_stat $_gpParam(limit_stat) # only one hit within this tracklenght if {$_tt == 0} { # no time information set $_gpParam(hours) "gpNone" set $_gpParam(rests) "gpNone" set $_gpParam(speed) "gpNone" } # checking for bad data foreach a $_lll { foreach "stat alt newsegm" $a { break } # extraction of stat, alt with check if { [regexp \ {^ *-?[0-9]+(\.[0-9]+)?([eE]-?[1-9][0-9]*)? *$} $stat]\ && $alt != "" } { # good data lappend chartdata [list $stat $alt] } } # for setting the labels in the chart we need some altitudes set altbegin [lindex [lindex $chartdata 0] 1] set altend [lindex [lindex $chartdata end-1] 1] # gnuplot generates different scalings set diffalt [expr $_maxalt-$_minalt] foreach l {500 1000 2000 5000 1e70} v {50 100 200 500 1000} { if { $diffalt < $l } { # set min/max to even number set minaltr [expr $v*($_minalt / $v) ] set maxaltr [expr $v*($_maxalt / $v +1) ] set ytics_alt $v break } } set altmid [expr ($minaltr+$maxaltr)/2] # writing stat, alt to temporary datafile set tmp_alt [file join $USERTMPDIR gp_2d_alt.tmp] set fh [open $tmp_alt w] foreach element $chartdata { puts $fh $element } close $fh if { $_gpParam(speed) != "gpNone" } { # writing velocity to temporary datafile set tmp_speed [file join $USERTMPDIR gp_2d_speed.tmp] set fh [open $tmp_speed w] foreach element $_speeds { puts $fh $element } close $fh } if { $_gpParam(hours) != "gpNone" } { # writing hours to temporary datafile set tmp_time [file join $USERTMPDIR gp_2d_time.tmp] set fh [open $tmp_time w] if { $_gpParam(hours) == "gpTimetop" } { set alt_time $maxaltr } else { set alt_time $minaltr } set hour0 99 # first point set tp_sec [lindex [lindex $_tps 0] 5] set ttime [DateIntsFromSecs $tp_sec] set hour [lindex $ttime 3] set minute [format "%02d" [lindex $ttime 4]] if {$minute < 45} { puts $fh [list "0" $alt_time [append hour ":" $minute]] } for {set i 0} {$i < [llength $_tps]} {incr i} { # loop for all tp set tp_sec [lindex [lindex $_tps $i] 5] set ttime [DateIntsFromSecs $tp_sec] set hour [lindex $ttime 3] if {$hour > $hour0} { set chain [lindex [lindex $chartdata $i] 0] puts $fh [list $chain $alt_time [append hour ":00"]] } set hour0 $hour } # last point set minute [format "%02d" [lindex $ttime 4]] if {$minute > 15} { set chain [lindex [lindex $chartdata [incr i -1] ] 0] puts $fh [list $chain $alt_time [append hour ":" $minute]] } close $fh } if { $_gpParam(rests) != "gpNone" } { # writing rest periods to temporary datafile set tmp_rest [file join $USERTMPDIR gp_2d_rest.tmp] set fh [open $tmp_rest w] foreach element $_rest { set chain [expr [lindex $element 1]] if {$_gpParam(rests) == "gpSymTime"} { set resttime [expr round([lindex $element 3]/60.0)] append resttime "min" puts $fh [list $chain $minaltr $resttime] } else { puts $fh [list $chain $minaltr $TXT(gpRest)] } } close $fh } # search for all Waypoints in corresponding group global GRConts WPPosn WPAlt set wpns ""; # list of waypoints # look for the ID of groupname == trackname if { ( $_trname != "" && \ [set ix [IndexNamed GR $_trname]] != -1 ) || \ [set ix [ChooseItems GR single]] != "" } { # look for wp in group foreach p $GRConts($ix) { if { [lindex $p 0] == "WP" } { set wpns [lindex $p 1] break } } } # handle waypoints # write matching waypoints to temporary datafile set foundwpl 0 set foundwph 0 if { $wpns != {} } { set tmp_wpl [file join $USERTMPDIR gp_2d_wpl.tmp] ; # low set tmp_wph [file join $USERTMPDIR gp_2d_wph.tmp] ; # high set fhl [open $tmp_wpl w] set fhh [open $tmp_wph w] while { $wpns != "" } { # when wpns exist look for waypoint-index wpix while { $wpns != "" && \ [set wpix [IndexNamed WP [lindex $wpns 0]]] == -1 } { GMMessage [format $MESS(undefinedWP) [lindex $wpns 0]] set wpns [lreplace $wpns 0 0] } set wpname [lindex $wpns 0] # get lat, lon, alt set wp_lat [lindex $WPPosn($wpix) 0] set wp_lon [lindex $WPPosn($wpix) 1] set wp_alt [lindex $WPAlt($wpix) 0] set wp_alt [UserAltitude $wp_alt] # searching the trackdata set nearestDist 1e10 set nearestIndex -1 set nearestStat 0 set nearestAlt 0 for {set i 0} {$i < [llength $_tps]} {incr i} { # loop for all tp set tp_lat [lindex [lindex $_tps $i] 0] set tp_lon [lindex [lindex $_tps $i] 1] set tp_alt [lindex [lindex $_tps $i] 6] set tp_stat [lindex [lindex $chartdata $i] 0] # get distance waypoint to trackpoint # this is a quick hack with no exact calculation # due to fast computing time # we only calculate the difference in decimaldegrees # and convert to km # limit_dist refers to lat and to long set diff_lat [expr abs($wp_lat - $tp_lat)*111.325] set diff_lon [expr abs($wp_lon - $tp_lon)*111.325* \ cos($tp_lat*3.1415926/180)] if { [expr $tp_stat-$nearestStat] > $limit_stat && \ $nearestIndex != -1 } { # the last found trackpoint is stored # when it lays > $limit_stat behind # check wp_alt if {$wp_alt != "" || [set alt $nearestAlt] == ""} { set alt $wp_alt } if {$alt > $altmid} { puts $fhh [list $nearestStat $alt $wpname] set foundwph 1 } else { puts $fhl [list $nearestStat $alt $wpname] set foundwpl 1 } # reset search of trackdata set nearestDist 1e10 set nearestIndex -1 } if { ($diff_lat < $limit_dist) && ($diff_lon < $limit_dist) } { set currDist [expr $diff_lat + $diff_lon] if { $nearestIndex == -1 || $currDist < $nearestDist} { # found new nearest trackpoint set nearestIndex $i set nearestStat $tp_stat set nearestAlt $tp_alt set nearestDist $currDist } } }; # for-loop for tps if { $nearestIndex > -1 } { # store last found point # check wp_alt if {$wp_alt != "" || [set alt $nearestAlt] == ""} { set alt $wp_alt } if {$alt > $altmid} { puts $fhh [list $nearestStat $alt $wpname] set foundwph 1 } else { puts $fhl [list $nearestStat $alt $wpname] set foundwpl 1 } } set wpns [lreplace $wpns 0 0]; # removes first element }; # while-loop for wps close $fhl close $fhh }; # end if wpns != {} # get the date of the track, only if hours are shown set date "" if { $_gpParam(hours) != "gpNone" } { set date [lindex [lindex $_tps 0] 4] foreach {y m d} [ScanDate $date] { break } if { $d != "" } { set date [FormatDay $DateFormat $y $m $d] set date "($date)" } } # writing gnuplot scriptfile set tmp_script [file join $USERTMPDIR gp_2d_script.plt] set fh [open $tmp_script w] puts $fh "\# gnuplot scriptfile created by GPSMan" puts $fh {reset} # create outputfile, no display on screen puts $fh "set terminal png size $_gpParam(width),$_gpParam(height)" puts $fh "set output \"$_gpParam(filename)\"" puts $fh {set grid} puts $fh {set lmargin 8} puts $fh {set multiplot layout 2,1} puts $fh {set size 1,0.80} puts $fh {set origin 0,0.20} puts $fh "set title \"$_trname $date\"" puts $fh {set format x} puts $fh "set xlabel '$TXT(distance) ($DTUNIT)' offset 0,0.5" puts $fh "set ylabel '$TXT(alt) ($ALUNIT)' offset 2" puts $fh {set style fill solid 0.5 border -1} puts $fh "set label 1 '$TXT(gpGenerated)' at screen 0.98,screen 0.02 right front" puts $fh "set ytics $ytics_alt" if { $_gpParam(totals) == "gpLeft" } { # data left side if {$altbegin > $altmid } { # bottom puts $fh "set label 4 \" $TXT(alt_cumula) = $_cumula $ALUNIT\" at graph 0,graph 0.20 left front" puts $fh "set label 5 \" $TXT(alt_cumuld) = $_cumuld $ALUNIT\" at graph 0,graph 0.15 left front" puts $fh "set label 2 \" $TXT(totdst) = $_td $DTUNIT\" at graph 0,graph 0.10 left front" if {$_tt > 0 } { puts $fh "set label 3 \" $TXT(tottime) = $_tt \" at graph 0,graph 0.05 left front" } } else { # top puts $fh "set label 4 \" $TXT(alt_cumula) = $_cumula $ALUNIT\" at graph 0,graph 0.95 left front" puts $fh "set label 5 \" $TXT(alt_cumuld) = $_cumuld $ALUNIT\" at graph 0,graph 0.90 left front" puts $fh "set label 2 \" $TXT(totdst) = $_td $DTUNIT\" at graph 0,graph 0.85 left front" if {$_tt > 0 } { puts $fh "set label 3 \" $TXT(tottime) = $_tt \" at graph 0,graph 0.80 left front" } } } elseif { $_gpParam(totals) == "gpRight" } { # data right side if {$altend > $altmid } { # bottom puts $fh "set label 4 \" $TXT(alt_cumula) = $_cumula $ALUNIT\" at graph 1,graph 0.20 right front" puts $fh "set label 5 \" $TXT(alt_cumuld) = $_cumuld $ALUNIT\" at graph 1,graph 0.15 right front" puts $fh "set label 2 \" $TXT(totdst) = $_td $DTUNIT\" at graph 1,graph 0.10 right front" if {$_tt > 0 } { puts $fh "set label 3 \" $TXT(tottime) = $_tt \" at graph 1,graph 0.05 right front" } } else { # top puts $fh "set label 4 \" $TXT(alt_cumula) = $_cumula $ALUNIT\" at graph 1,graph 0.95 right front" puts $fh "set label 5 \" $TXT(alt_cumuld) = $_cumuld $ALUNIT\" at graph 1,graph 0.90 right front" puts $fh "set label 2 \" $TXT(totdst) = $_td $DTUNIT\" at graph 1,graph 0.85 right front" if {$_tt > 0 } { puts $fh "set label 3 \" $TXT(tottime) = $_tt \" at graph 1,graph 0.80 right front" } } } # way of display waypoints if { $foundwpl } { set script_wpl ", '$tmp_wpl' with labels left rotate point pt 9 offset -0.50,1.0 notitle" } else { set script_wpl "" } if { $foundwph } { set script_wph ", '$tmp_wph' with labels right rotate point pt 9 offset -0.50,-1.0 notitle" } else { set script_wph "" } # way of display rests if {$_gpParam(rests) == "gpSymText" || $_gpParam(rests) == "gpSymTime"} { set script_rest ", '$tmp_rest' with labels tc lt 1 left rotate point pt 9 lc 1 offset -0.50,0.25 notitle" } elseif {$_gpParam(rests) == "gpText"} { set script_rest ", '$tmp_rest' with labels tc lt 1 left rotate point pt 0 offset -0.50,0.25 notitle" } elseif {$_gpParam(rests) == "gpSym"} { set script_rest ", '$tmp_rest' with point pt 9 lc 1 notitle" } else { set script_rest "" } # way of display timestamps if { $_gpParam(hours) == "gpTimetop" } { set script_time ", '$tmp_time' with labels tc lt 1 center point pt 11 lc 1 offset 0.00,0.50 notitle" } elseif { $_gpParam(hours) == "gpTimebot" } { set script_time ", '$tmp_time' with labels tc lt 1 center point pt 11 lc 1 offset 0.00,0.50 notitle" } else { set script_time "" } puts $fh "plot '$tmp_alt' notitle with filledcurve y1=0 lt rgb \"#009000\" \ $script_wpl $script_wph $script_rest $script_time" if { $_gpParam(speed) != "gpNone" } { # this part defines the velocity chart puts $fh {set notitle} puts $fh {unset label 1} puts $fh {unset label 2} puts $fh {unset label 3} puts $fh {unset label 4} puts $fh {unset label 5} puts $fh {set size 1,0.20} puts $fh {set origin 0,0.02} if {$_gpParam(speed) == "gpHike"} { puts $fh {set yrange [0:8] # setting for hike} puts $fh {set ytics 2} } elseif {$_gpParam(speed) == "gpBike"} { puts $fh {set yrange [0:60] # setting for bike} puts $fh {set ytics 10} } elseif {$_gpParam(speed) == "gpDrive"} { puts $fh {set yrange [0:175] # setting for drive} puts $fh {set ytics 25} } else { puts $fh {set yrange [0:350] # setting for glide} puts $fh {set ytics 50} } puts $fh {set format x ""} puts $fh {set xlabel ""} puts $fh "set ylabel '$TXT(speed) ($SPUNIT)' offset 0.5" puts $fh {set style fill solid 0.5 border -1} puts $fh "plot '$tmp_speed' notitle with filledcurve y1=0 lt rgb \"#009000\",\ '$tmp_speed' notitle with lines lt 4 lw 3 smooth sbezier" } puts $fh {unset multiplot} close $fh # start gnuplot exec gnuplot $tmp_script & if { $NoImgLib } { # displaycmd is only needed when libtk-img isn't installed # then show image with external program, if available if { $DISPLAYCMD != "" } { after 1000 catch {exec $DISPLAYCMD $_gpParam(filename) &} } else { DisplayInfo [format $MESS(gpOutfile) $_gpParam(filename)] } } else { # display result in toplevel window after 1000 set gnuplotImage [image create photo -file $_gpParam(filename)] if { [winfo exists .showimage] } { .showimage.gnuplot configure -image $gnuplotImage focus .showimage raise .showimage } else { # MF changes: use proc GMToplevel to create top level window # and add an Ok button global DPOSX DPOSY GMToplevel .showimage namePlot +$DPOSX+$DPOSY {} {} {} focus .showimage wm title .showimage $_gpParam(filename) label .showimage.gnuplot -image $gnuplotImage button .showimage.ok -text $TXT(ok) \ -command {destroy .showimage} pack .showimage.gnuplot .showimage.ok -side top -pady 5 } } # temporary files in $USERTMPDIR will be deleted by gpsman when starting }; # end gnuplot2d ##### proc PCode_TRtoGnuplot3d {_tmp3D _tmp3D2 _trname\ _minalt _maxalt _datum} { global MESS TXT UNIX TERMCMD USERTMPDIR if { $UNIX && $TERMCMD == "" } { GMMessage $MESS(defTERMCMD) return } # get settings for gnuplot global _gpParam # set default values array set _gpParam { width 800 height 600 direction gpForward } # setting output-filename set _gpParam(filename) "3D_chart_$_trname.png" # set up list of variables set vars {} foreach v {direction filename width height} { lappend vars _gpParam($v) } set descs [list\ "~$TXT(gpDirection)/[list gpForward gpBackward]"\ "=$TXT(gpFilename)"\ "=$TXT(gpCanwidth)"\ "=$TXT(gpCanheight)"] set mess $TXT(gpParam3d) while 1 { if { [GMChooseParams $mess $vars $descs] == 0 } { return } if { [CheckNumber GMMessage $_gpParam(width)] && \ [CheckNumber GMMessage $_gpParam(height)] } { break } } # rounding minalt set _minalt [expr round( [expr $_minalt / 100] ) * 100] # set minalt to even 200 factor if {($_minalt % 200) != 0} { set _minalt [expr $_minalt -100] } # up rounding maxalt for use in gnuplot-zrange, not used yet set _maxalt [expr round( [expr $_maxalt / 100 +1] ) * 100] # writing 3d data to two temporary datafile # the first file generates the color "curtain", the second file # generates the 3d-line # tmp3D contains lat, lon, datum # tmp3D2 contains altitude # we need lat, lon, alt # then lat, lon, min_alt set tmp_ [file join $USERTMPDIR gp_3d.tmp] set tmp_mod [file join $USERTMPDIR gp_3d_mod.tmp] set fh [open $tmp_ w] set fh2 [open $tmp_mod w] # initialise Transverse Mercator projection global ASKPROJPARAMS P3DData set oldask $ASKPROJPARAMS set ASKPROJPARAMS 0 ProjInit TM P3DData $_datum $_tmp3D set ASKPROJPARAMS $oldask set lines [llength $_tmp3D] set els2 {} if { $_gpParam(direction) == "gpForward" } { for {set i 0} {$i < $lines} {incr i} { set lat [lindex [lindex $_tmp3D $i] 0] set lon [lindex [lindex $_tmp3D $i] 1] set dat [lindex [lindex $_tmp3D $i] 2] set alt [lindex $_tmp3D2 $i] # convert position in lat/long signed degrees and given # datum to TM coordinates # return [list $x $y] set p [ProjTMPoint P3DData $lat $lon $dat] set east [expr double([lindex $p 0])/1000 ] set north [expr double([lindex $p 1])/1000 ] set element [list $north $east $alt] lappend els2 [list $north $east $_minalt] puts $fh $element puts $fh2 $element } } else { # backward, sometimes better display for overlaps set lines [expr $lines-1] for {set i $lines} {$i > 0 } {incr i -1} { set lat [lindex [lindex $_tmp3D $i] 0] set lon [lindex [lindex $_tmp3D $i] 1] set dat [lindex [lindex $_tmp3D $i] 2] set alt [lindex $_tmp3D2 $i] # convert position in lat/long signed degrees and given # datum to TM coordinates # return [list $x $y] set p [ProjTMPoint P3DData $lat $lon $dat] set east [expr double([lindex $p 0])/1000 ] set north [expr double([lindex $p 1])/1000 ] set element [list $north $east $alt] lappend els2 [list $north $east $_minalt] puts $fh $element puts $fh2 $element } } puts $fh2 "" foreach element $els2 { puts $fh2 $element } close $fh close $fh2 # search for all Waypoints in corresponding group # global GRConts WPPosn WPDatum WPAlt set wpns ""; # list of waypoints # look for the ID of groupname == trackname if { ( $_trname != "" && \ [set ix [IndexNamed GR $_trname]] != -1 ) || \ [set ix [ChooseItems GR single]] != "" } { # look for wp in group foreach p $GRConts($ix) { if { [lindex $p 0] == "WP" } { set wpns [lindex $p 1] break } } } # handle waypoints # write waypoints to temporary datafile set tmp_wp [file join $USERTMPDIR gp_3d_wp.tmp] set fh [open $tmp_wp w] set foundwp 0 while { $wpns != "" } { # when wpns exist look for waypoint-index wpix while { $wpns != "" && \ [set wpix [IndexNamed WP [lindex $wpns 0]]] == -1 } { GMMessage [format $MESS(undefinedWP) [lindex $wpns 0]] set wpns [lreplace $wpns 0 0] } set wpname [lindex $wpns 0] # get lat and lon set lat [lindex $WPPosn($wpix) 0] set lon [lindex $WPPosn($wpix) 1] set wp_alt [lindex $WPAlt($wpix) 0] set wp_alt [UserAltitude $wp_alt] if { [set alt $wp_alt] == "" } { set alt $_minalt } set dat $WPDatum($wpix) set p [ProjTMPoint P3DData $lat $lon $dat] set east [expr double([lindex $p 0])/1000 ] set north [expr double([lindex $p 1])/1000 ] puts $fh [list $north $east $alt $wpname] set wpns [lreplace $wpns 0 0]; # removes first element set foundwp 1 } close $fh # writing gnuplot scriptfile set tmp_script [file join $USERTMPDIR gp_3d_script.plt] set fh [open $tmp_script w] puts $fh {# gnuplot scriptfile created by GPSMan} puts $fh {reset} puts $fh {set lmargin 8} puts $fh "set title \"$_trname\" " puts $fh "set xlabel '$TXT(easting)'" puts $fh "set ylabel '$TXT(northing)'" puts $fh "set zlabel '$TXT(alt)'" puts $fh "set label 1 '$TXT(gpGenerated)' at screen 0.98,screen 0.02 right front" # use same scaling for 2Dmap, badly don't work in Linux with gnuplot ver 4.2 #puts $fh {set view equal xy} # changing of colors # set palette rgbformulae 7,5,15 #puts $fh {set palette defined ( 0 "black", 1 "blue", 2 "green", 3 "red", 4 "orange" )} puts $fh {set palette defined ( 0 "black", 1 "blue", 2 "red", 3 "orange", 4 "yellow" )} # puts $fh {set datafile separator ","} puts $fh {set xyplane 0} puts $fh {set grid} puts $fh {unset hidden3d} puts $fh {set pm3d} puts $fh {set pm3d corners2color max} if { $foundwp } { puts $fh "splot '$tmp_mod' using 2:1:3 with points pointtype -1 notitle,\ '$tmp_' using 2:1:3 with lines linetype 8 linewidth 2 notitle,\ '$tmp_wp' using 2:1:3:4 with labels left rotate point pt 9 offset 0,0.5 notitle" } else { # no waypoints puts $fh "splot '$tmp_mod' using 2:1:3 with points pointtype -1 notitle,\ '$tmp_' using 2:1:3 with lines linetype 8 linewidth 2 notitle" } puts $fh "pause -1 '$TXT(gpModify)'" # the pause command don't work well with Linux. You have to quit gnuplot # within the xterm that startet gpsman. # Normally you don't look at the xterm and gnuplot will not be closed. # Within windows gnupot-pause opens a new messagebox for closing-command. # We must use pause to change the viewing # create outputfile, no display on screen puts $fh "set terminal png size $_gpParam(width),$_gpParam(height)" puts $fh "set output \"$_gpParam(filename)\"" puts $fh replot close $fh # start gnuplot if { $UNIX } { # start xterminal to get the gnuplot-pause-message # the commandname depends on the linux version exec $TERMCMD -e gnuplot $tmp_script & } else { exec gnuplot $tmp_script & } DisplayInfo [format $MESS(gpModgnuplot) $_gpParam(filename)] if { $UNIX } { DisplayInfo $MESS(gpQuitgnuplot) } # temporary files in $USERTMPDIR will be deleted by gpsman when starting }; # end gnuplot3d # end of RM contribution gpsman-6.4.4.2/gmsrc/elevation.tcl0000644000175000017500000013541312224351120015070 0ustar migmig# # This file is part of: # # gpsman --- GPS Manager: a manager for GPS receiver data # # Copyright (c) 1998-2013 Miguel Filgueiras migfilg@t-online.de # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. # # File: elevation.tcl # Last change: 6 October 2013 # # This file contains mostly code contributed by Alessandro Palmas # (alpalmas _AT_ tin.it) # # Includes contributions by # - Miguel Filgueiras marked "MF change"/"MF contribution" # - Martin Buck (m _AT_ rtin-buck.de) marked "MB contribution" # - Benoit Steiner (benetsteph _AT_ free.fr) marked "BS contribution" # proc GMRTHgraph {w} { # compute data in RT edit/show window and call Hgraph # MF changes: # - if there are undefined WPs discard them and give a warning # - return the result from the call to Hgraph global WPAlt MESS DSCALE set frb $w.fr.fr3.fr31 set dbTot 0 set alTot 0 set lll "" set tmp [expr [$frb.frbx.bxn size]-1] for { set i 0 } { $i < $tmp } { incr i } { #get the elevation set tmpname [$frb.frbx.box get $i];# get the wp name of ith WP set tmpwpindex [IndexNamed WP $tmpname];# get its index (-1 if undef) # MF change: an undefined waypoint should be discarded if { $tmpwpindex == -1 } { DisplayInfo [format $MESS(undefinedWP) $tmpname] continue } set alTot $WPAlt($tmpwpindex) # MF change: leg distances must be computed as the information in # the listbox $frb.frbx.bxd is rounded when displayed and is not # accurate enough set next [$frb.frbx.box get [expr $i+1]] if { [set tmp2 [lindex [CompWPDistBear $tmpname $next] 0]] == "---" } { set tmp2 0 } else { set tmp2 [expr $tmp2*$DSCALE] } # MF change: added start segment flag lappend lll [list $dbTot $alTot 0] # since each leg gives the distance to the next wp, we must save the # current dbtot to be associated to next wp set dbTot [expr $dbTot + $tmp2] } # and now the last one! set tmpname [$frb.frbx.box get $tmp];# get the wp name of ith WP set tmpwpindex [IndexNamed WP $tmpname];# get its index (-1 if undef) # MF change: an undefined waypoint should be discarded if { $tmpwpindex >= 0 } { set alTot $WPAlt($tmpwpindex) # MF change: added start segment flag lappend lll [list $dbTot $alTot 0] } else { DisplayInfo [format $MESS(undefinedWP) $tmpname] } # MF change: added type argument and return the result from Hgraph return [Hgraph $lll elevation] } proc RTHG3D {w} { # MF contribution: this code moved out from proc GMRoute # $w is the RT window # prepare data needed for the call to proc HG3D # MF change: return the result from the call to HG3D global WPPosn WPAlt WPDatum Datum MESS # MF contribution: get list of WP names set box $w.fr.fr3.fr31.frbx.box set wps [$box get 0 end] set tmp "" set tmp2 "" foreach wp $wps { set i [IndexNamed WP $wp];# get its index (-1 if undef) if { $i >= 0 } { lappend tmp [list [lindex $WPPosn($i) 0] \ [lindex $WPPosn($i) 1] $WPDatum($i)] lappend tmp2 $WPAlt($i) } else { # MF contribution: warn if there are undefined WPs DisplayInfo [format $MESS(undefinedWP) $wp] } } # MF change: using $Datum instead of $WPDatum(0) and # return the result from HG3D return [HG3D $tmp $tmp2 $Datum] } proc Hnormalize {x xmin scale} { return [expr ($x-$xmin)*$scale] } ## MB contribution proc Hrescale {c newwidth newheight} { set currentsize [$c coords currentsize] set currentwidth [lindex $currentsize 0] set currentheight [lindex $currentsize 1] # Avoid division by 0 next time if {$currentwidth && $currentheight} { $c scale all 0 0 [expr double($newwidth) / $currentwidth] \ [expr double($newheight) / $currentheight] } return } ##--- proc Hgraph {k what args} { # MF contribution # - when plotting altitudes, $k is now a list of triples with # distance or time, altitude, and a start segment flag; this # flag is used to interrupt the plot # - added new arguments: # $what in {elevation, climbrate, speed} # $args either void or "time" for a time axis in which case $k # is a either list of pairs with seconds and speed, or # a list of triples with seconds, altitude, and start segment flag # if $what=="climbrate", $args=="time" # - avoiding problems if window is resized by replacing use of # HGpxwp array by tags in graph lines # - allowing for more than one plot window at the same time # - some simplifications for efficiency # - using tags and lists with distance/time and altitude for # retrieving and displaying this information later on # - button to extend the ticks in the horizontal axis to the top of # the window and restore them # - changing the text font # - return list with window created #---- global MESS TXT BITMAP # MF contribution global NoImgLib ImgOutFormats DPOSX DPOSY MapWidth MAPH2 PlotWNo \ HGinfo PlotFont if { $args == "time" } { set totdist 0 } else { set totdist 1 } #---- # in list k {x y segstart} triples from a track/route # check to have enough points for a graph if { [llength $k] < 3 } { GMMessage $MESS(missingdata) # MF change: return list with window created if any return {} } # MX and MY are the width and heigth of the canvas # MF contrib: using map width and half map height set MX $MapWidth set MY $MAPH2 if { $what == "climbrate" } { # MF contrib # a time axis is always used in this case set xmin 0 foreach "k valids secs0 xmax ymin ymax" [ClimbRateData $k] {} if { $valids == "" } { GMMessage $MESS(missingdata) # MF change: return list with window created if any return {} } } else { # initializations set xmin 99999 set ymin 99999 set xmax -99999 set ymax -99999 # MF contribution: default value for initial time-stamp set secs0 "" #----- # get max amd min of x and y set valids 0 if { $totdist } { foreach a $k { set x [lindex $a 0] if { ! [regexp \ {^ *-?[0-9]+(\.[0-9]+)?([eE]-?[1-9][0-9]*)? *$} $x] } { continue } set y [lindex $a 1] if { ! [regexp \ {^ *-?[0-9]+(\.[0-9]+)?([eE]-?[1-9][0-9]*)? *$} $y] } { continue } if {$x < $xmin} {set xmin $x} if {$y < $ymin} {set ymin $y} if {$x > $xmax} {set xmax $x} if {$y > $ymax} {set ymax $y} incr valids } } else { # MF contrib # time axis: x-values replaced by differences from first value set kk "" foreach a $k { foreach "x y newsegm" $a { break } if { [regexp \ {^ *-?[0-9]+(\.[0-9]+)?([eE]-?[1-9][0-9]*)? *$} $y] && \ [regexp {^ *[0-9]+ *$} $x] } { if { $secs0 == "" } { set secs0 $x set xmin [set x 0] } else { set x [expr $x-$secs0] } set xmax $x if {$y < $ymin} {set ymin $y} if {$y > $ymax} {set ymax $y} incr valids } lappend kk [list $x $y $newsegm] } set k $kk } } if { $valids < 3 || $xmax == $xmin } { GMMessage $MESS(missingdata) # MF change: return list with window created if any return {} } # the last couple must be wrong to stop (force last print) # MF change: added segment starter flag lappend k {99999 * 0} # now find the right quota lines to plot set yexcursion [expr $ymax-$ymin] if {$yexcursion > 10000.0} { set deltay [expr int($yexcursion/4.0)] } else { foreach mx "5000 2000 1000 500 250 100 50 25 10 5 2 0" \ deltay "1000 500 250 100 50 25 10 5 2.5 1 0.5 0.1" { if {$yexcursion > $mx } { break } } } # put the max at nearest delta, but save true max set trueymax $ymax set ymax [expr ( (int($ymax) / $deltay) + 1) * $deltay] # calculate the scale constants to fit the canvas set scalx [expr 1.0*$MX/($xmax-$xmin)] set scaly [expr 1.0*$MY/($ymax-$ymin)] # MF contribution: name of window with number # changed name in the rest of this procedure set w .graph[incr PlotWNo] #----- #go graphic if { [winfo exists $w] } { # MF change: using proc HgraphClose HgraphClose $w } # MF change: using general proc as for other GPSMan toplevels GMToplevel $w $what +$DPOSX+$DPOSY . \ [list WM_DELETE_WINDOW "HgraphClose $w"] {} #---- # a frame with border to avoid wm corniche to cover inner canvas frame $w.gf -borderwidth 3 # includes MB contributions (expand and fill options) pack $w.gf -expand yes -fill both # CURRENT: use font metrics array set ftarr [font metrics $PlotFont] # one line of text: olot #set olot [expr ($ftarr(-ascent)+$ftarr(-descent)+$ftarr(-linespace))] set olot $ftarr(-linespace) set c [canvas $w.gf.c -height [expr $MY+50+$olot+$olot] \ -width [expr $MX+2] -highlightthickness 0] pack $c -expand yes -fill both # MB contribution # This is a hack that allows us to easily remember the current canvas size $c create line [$c cget -width] [$c cget -height] 0 0 \ -tags currentsize -state hidden bind $c "Hrescale $c %w %h" #---- set bf [frame $w.bf] pack $bf -side bottom # MF change: using proc HgraphClose set b [button $w.bf.b -text $TXT(ok) -command "HgraphClose $w"] # MF change: use of Img lib if { $NoImgLib } { set p [button $w.bf.p -text "$TXT(saveto) PS" \ -command "SaveCanvas $w.gf.c {} PS file" ] } else { set m $w.bf.p.m ; set c $w.gf.c set p [menubutton $w.bf.p -text "$TXT(saveto)..." -menu $m] menu $m $m add command -label PS -command "SaveCanvas $c {} PS file" foreach f $ImgOutFormats { $m add command -label $f -command "SaveCanvas $c {} $f file" } } # MF contrib: save canvas, extend/restore ticks in horizontal axis # and change font button $w.bf.pp -text $TXT(print) \ -command "SaveCanvas $w.gf.c {} PS printer" button $w.bf.btick -text $TXT(vertgridlines) \ -command "HgraphVertGrid $w" button $w.bf.font -text $TXT(optPLOTFONT) \ -command "CanvasChangeFont $c PlotFont PlotFont; $w.bf.font configure -state normal" pack $p $w.bf.pp $w.bf.btick $w.bf.font $b -side left #---- # MF contrib # prepare to record information related to tags array unset HGinfo $c,* set infolist "" ; set infotag 0 #---- # normalize list k # and put in z a list of point to plot set bad "false" set z "" set count 0 set first 1 foreach a $k { incr count # MF change: getting x, y and start segment flag foreach "x tmp newsegm" $a { break } # extraction of x, with check # MF change: merging the tests on x and y in the same if # extraction of y, with check # only the first bad elevation wp is used (start bad zone), # the others are ignored if { ! [regexp \ {^ *-?[0-9]+(\.[0-9]+)?([eE]-?[1-9][0-9]*)? *$} $x] || \ ! [regexp \ {^ *-?[0-9]+(\.[0-9]+)?([eE]-?[1-9][0-9]*)? *$} $tmp] } { if { $bad == "false" } { set bad "true" if { [llength $z] < 4 } { continue };#not enough data to plot # MF contrib: add tag and information list eval $c create line $z -tags {[list primo=$first itg=$infotag]} set HGinfo($c,$infotag) $infolist incr infotag ; set infolist [lrange $infolist end-1 end] set z [lrange $z end-1 end] set first [expr $count-1] } } else { # MF contrib: record information lappend infolist $x $tmp #----- set x [expr int([Hnormalize $x $xmin $scalx])] set y [Hnormalize $tmp $ymin $scaly] set y [expr int($MY-$y)] if { $bad == "true"} { set bad "false" lappend z $x $y if { [llength $z] < 4 } { continue } # MF: add tag and information list eval $c create line $z -fill red -stipple $BITMAP(brokenline) \ -tags {[list profile primo=$first last=$count itg=$infotag]} set HGinfo($c,$infotag) $infolist incr infotag ; set infolist [lrange $infolist end-1 end] set z "" set first $count } elseif { $newsegm == 1 } { # MF contrib: deal with segment starter if { [llength $z] > 2 } { # plot line linking previous points eval $c create line $z \ -tags {[list primo=$first itg=$infotag]} set HGinfo($c,$infotag) [lreplace $infolist end-1 end] incr infotag ; set infolist [lrange $infolist end-3 end] } # plot broken line between last and current points set x0 [lindex $z end-1] ; set y0 [lindex $z end] $c create line $x0 $y0 $x $y -fill DeepPink \ -stipple $BITMAP(brokenline) \ -tags [list profile primo=[expr $count-1] itg=$infotag] set HGinfo($c,$infotag) $infolist incr infotag ; set infolist [lrange $infolist end-1 end] set z "" set first $count } lappend z $x $y } };#foreach if { $what != "climbrate" } { # measures in climb rate do not correspond to points bind $c "HGtest1 $c %x %y" bind $c "HGtest2 $c %x %y" # MF change: BS contribution is only for altitudes if { $what == "elevation" } { # BS contribution: bind $c \ "HGtest3 $c %x %y $totdist [list $secs0]" #===== } #----- } ### # plot quota lines for {set y -1000} { $y < $ymax } { set y [expr $y+$deltay] } { if { $y>$ymin } { set tmp [Hnormalize $y $ymin $scaly] set tmp [expr $MY-$tmp] set tmp [expr int($tmp)] # MF contribution: lowering these items and using $PlotFont set it [$c create text 50 $tmp -fill "red" -text "$y" \ -font $PlotFont -tags txt] $c lower $it set it [$c create line 0 $tmp $MX $tmp -fill "tan" -width 2] $c lower $it } } # for plot data is beautified set trueymax [expr round($trueymax * 10)/10.0] set ymin [expr round($ymin * 10)/10.0] if { $totdist } { set xexcursion [expr round(($xmax-$xmin)*10)/10.0] if {$xexcursion > 10000.0} { set deltax [expr int($xexcursion/4.0)] } else { foreach mx "5000 2000 1000 500 250 100 50 10 5 2 0" \ deltax "2000 1000 250 100 50 25 10 5 1 0.5 0.1" { if {$xexcursion > $mx } { break } } } for {set x 0} {$x < $xmax} { set x [expr $x+$deltax] } { if {($x<$xmax)&&($x>$xmin)} { set tmp [Hnormalize ($x $xmin $scalx)] set tmp [expr int($tmp)] # MF contribution: lowering these items and new tag set it [$c create line $tmp $MY $tmp [expr $MY - 10] \ -fill "tan" -tags vgline] $c lower $it # MF contribution: show value set it [$c create text $tmp [expr $MY+5] -anchor n \ -text $x -fill red -font $PlotFont \ -tags txt] $c lower $it #====== } } } else { # MF contrib # time axis set secs0t [expr $secs0%86400] set time0 [FormatTime $secs0t] if { [string length $time0] == 5 } { set hour0 0 ; scan $time0 %0d:%0d min0 set time0 "00:$time0" } else { scan $time0 %0d:%0d: hour0 min0 } if { [set hrs [expr $xmax/3600]] > 4 } { # mark only full hours set xhr0 [set x [expr ($hour0+1)*3600-$secs0t]] set deltax 3600 set min0 0 ; set min_mx 0 ; set min_d 0 } else { if { $hrs > 1 } { # mark hours and quarters set min_mx 15 ; set min_d 15 } elseif { ($xmax-$hrs*3600)/60 > 5 } { # mark hours and each 5 minutes set min_mx 55 ; set min_d 5 } else { # mark hours and each minute set min_mx 59 ; set min_d 1 } if { $min0 >= $min_mx } { set min0 $min_mx set x [expr ($hour0+1)*3600-$secs0t] } else { set min0 [expr $min0-$min0%$min_d] set x [expr 60*($hour0*60+$min0+$min_d)-$secs0t] } set xhr0 $x ; set deltax [expr $min_d*60] } while 1 { if { $min0 == $min_mx } { set min0 0 if { $hour0 == 23 } { set hour0 0 } else { incr hour0 } } else { incr min0 $min_d } set tmp [expr [Hnormalize $x 0 $scalx]] # MF contrib: using $PlotFont set it [$c create text $tmp $MY -anchor n \ -text [format "%02d:%02d" $hour0 $min0] -fill red \ -font $PlotFont -tags txt] $c lower $it set it [$c create line $tmp $MY $tmp [expr $MY-10] \ -fill "tan" -tags vgline] $c lower $it if { [incr x $deltax] > $xmax } { break } } } # MF contrib: make an invisible tick in the horizontal axis for # keeping track of its normal upper vertical coordinate $c create line 0 [expr $MY-10] 0 $MY -tags hvgline -state hidden #--- # MF change: time values are self-documented, placing extreme values # replaced "h. max"/"h. min" by "max"/"min"; lowering the items # and using $PlotFont set xextrs 50 # CURRENT array set ftarr [font metrics $PlotFont] #set olot [expr ($ftarr(-ascent)+$ftarr(-descent)+$ftarr(-linespace))] set olot $ftarr(-linespace) # if { $totdist } { set it [$c create text [expr $MX - 5] [expr $MY + 30 + $olot] \ -fill "black" -anchor e -text "delta $deltax" \ -font $PlotFont -tags txt] $c lower $it set it [$c create text [expr $MX - 5] [expr $MY + 30 + 2*$olot] \ -fill "black" -anchor e -text "tot. $xexcursion" \ -font $PlotFont -tags txt] $c lower $it } else { set xhr0 [Hnormalize $xhr0 0 $scalx] set deltax [Hnormalize $deltax 0 $scalx] if { abs($xextrs-$xhr0) < 50 } { # try to avoid overlapping of time value and extreme values set xextrs [expr $xhr0+$deltax/2] } } $c create text $xextrs [expr $MY + 30 + $olot] -fill "black" \ -justify "left" -anchor w -text "max: $trueymax" -font $PlotFont \ -tags txt $c create text $xextrs [expr $MY + 30 + 2*$olot] -fill "black" \ -justify "left" -anchor w -text "min: $ymin" -font $PlotFont -tags txt #---- #to be polite, let's return explicitly # MF change: still being polite, return list with window created if any return [list $w] } proc HGtest2 {c x y} { $c delete "oldlt" return } proc HGtest1 {c x y} { # MF contribution: # - avoid problems if window was resized by replacing use of # HGpxwp array by tags in graph lines # - maximum x and y must depend on current window size # - using $PlotFont global PlotFont foreach "mx my" [$c coords currentsize] { break } set my [expr $my*0.85] #search nearest $x associated with wp # - draw vertical line at $x set vline [$c create line $x $my $x 0 -fill tan] # - delete any similar line that is overlapped by it # - find overlap with a graph line, assuming that there is at most one set ptno -1 foreach it [$c find overlapping $x $my $x 0] { set ts [$c gettags $it] if { [lsearch -exact $ts oldlt] != -1 } { $c delete $it } elseif { [set i [lsearch -glob $ts primo=*]] != -1 } { # if this fails, $ptno will be -1 scan [lindex $ts $i] primo=%d ptno set gline $it } } if { $ptno == -1 } { # - no graph line is intersected: clean and return $c delete $vline return } $c addtag oldlt withtag $vline # - get coordinates of graph line and follow them until close to $x set cmp "<" ; set lastx -1e20 foreach "xg yg" [$c coords $gline] { if { $xg < $x } { if { $xg != $lastx } { set pts $ptno ; set lastx $xg } else { lappend pts $ptno } } elseif { $xg == $x } { if { $cmp == "<" } { set cmp "" set pts $ptno } else { lappend pts $ptno } } else { # $xg > $x switch $cmp { < { if { $x-$lastx < $xg-$x } { break } set cmp ">" set pts $ptno ; set lastx $xg } > { if { $xg != $lastx } { break } lappend pts $ptno } "" { break } } } incr ptno } # - prepare label to show point number(s) if { [lindex $pts 1] != "" } { set pts "${cmp}[lindex $pts 0]-[lindex $pts end]" } else { set pts "${cmp}$pts" } #---- if {$x > [expr $mx/2]} { set an "e" set ju "right" } else { set an "w" set ju "left" } $c create oval [expr $x-1] [expr $y-1] [expr $x+1] [expr $y+1] \ -outline tan -fill tan -tags oldlt $c create text $x $y -text $pts -anchor $an -justify $ju -fill tan \ -tags {oldlt txt} -font $PlotFont return } # BS contribution: based on proc HGtest1, display info on plot points proc HGtest3 {c x y dist_or_time secs0} { # MF change global HGinfo DTUNIT SUBDTUNIT PlotFont #====== foreach "mx my" [$c coords currentsize] { break } #search nearest $x associated with wp # - delete any similar line that is overlapped by it # - find overlap with a graph line, assuming that there is at most one # MF change: make sure it has the tag itg=* set ptno -1 foreach it [$c find overlapping $x $my $x 0] { set ts [$c gettags $it] if { [lsearch -exact $ts oldlt] != -1 } { $c delete $it } elseif { [set i [lsearch -glob $ts itg=*]] != -1 } { # solid line regsub itg= [lindex $ts $i] "" infotag set i [lsearch -glob $ts primo=*] scan [lindex $ts $i] primo=%d ptno if { [set i [lsearch -glob $ts last=*]] != -1 } { regsub last= [lindex $ts $i] "" ptnext } else { set ptnext -1 } set gline $it } } if { $ptno == -1 } { # - no graph line is intersected: clean and return return } # BS changes start here set before_x 0 ; set after_x 0 ; set lastx 0 ; set lasty 0 set before_y 0 ; set after_y 0 ; set lastcox 0 ; set lastcoy 0 # search the point on the graph closest to the selected area set pts -1 foreach "xg yg" [$c coords $gline] "cox coy" $HGinfo($c,$infotag) { if { $xg > $x } { set after_x $xg ; set after_y $yg set before_x $lastx; set before_y $lasty if { $x-$before_x <= $after_x-$x } { set alt $lastcoy ; set xval $lastcox set pts [expr $ptno-1] set x $before_x ; set y $before_y } else { if { $ptnext == -1 } { set pts $ptno } else { set pts $ptnext } set alt $coy ; set xval $cox set x $after_x; set y $after_y } break } set lastx $xg ; set lasty $yg ; set lastcox $cox ; set lastcoy $coy incr ptno } if { $pts == -1 } { # cursor was to the right of last line set pts [expr $ptno-1] set alt $coy ; set xval $cox } # BS: Display coordinates of the point # Displays (altitude and distance) or (altitude alone) depending on the # selected graphic # MF change: # - showing user units # - using append to avoid long lines # - altitude and distance/time are retrieved above # Avoided an error when clicked on the last chart point # (at the right of the chart) if {$xval != ""} { #Avoids writing too right of the graph if {$x > $mx-60} { set x_text [expr $mx-60] } else { set x_text [expr $x+20] } # The position of the legend depends on the curve if { $after_y >= $before_y } { set y_text [expr $y-5] } else { set y_text [expr $y+30] } # Avoids writing too high or too low on the graph if {$y_text > $my-40} { set y_text [expr $my-40] } if {$y_text < 20} { set y_text 20 } append comment $pts "\nalt=" [format %5.0f $alt] $SUBDTUNIT if { $dist_or_time == 1 } { append comment "\nd:" [format %5.3f $xval] $DTUNIT } elseif { $secs0 != "" } { append comment "\n" [FormatTime [expr round($xval+$secs0)%86400]] } # The position of the legend depends on the curve # MF ccontrib: clear old information near the legend set its [$c find overlapping [expr $x_text-30] [expr $y_text-30] \ [expr $x_text+110] [expr $y_text+60]] #--- # Display the selected point $c create oval [expr $x-3] [expr $y-3] [expr $x+3] [expr $y+3] \ -outline tan -fill tan -tags oldlt # MF contrib: using $PlotFont $c create text $x_text $y_text -text $comment -anchor "w" \ -justify "left" -fill "red" -tags {oldlt txt} -font $PlotFont # BS: end # MF ccontrib: clear old information near the legend foreach it $its { set ts [$c gettags $it] if { [lsearch $ts oldlt] != -1 } { $c delete $it } } } return } # MF contribution proc HgraphClose {w} { # close elevation graph window and delete information on it global HGinfo array unset HGinfo $w.*,* destroy $w return } # MF contribution proc HgraphVertGrid {w} { # expand to window top or restore the ticks in horizontal axis if { ! [winfo exists [set c $w.gf.c]] || \ [set its [$c find withtag vgline]] == "" } { return } if { [lindex [$c coords [lindex $its 0]] 3] == 0 } { # resizing the canvas will change this value set ny [lindex [$c coords hvgline] 1] } else { set ny 0 } foreach it $its { set ncs [lreplace [$c coords $it] 3 3 $ny] eval $c coords $it $ncs } return } # MF contribution proc ClimbRateData {salts} { # produce climb rate data from list of triples with seconds, altitude # and start segment flag # a filter kindly provided by Paul Scorer (P.Scorer _AT_ leedsmet.ac.uk) # is applied to the altitude values if there is enough data # (at least 10 altitude values, so that 2 filtered values can be # computed) # return empty list if not enough data # return list with: list of pairs with seconds from first valid rate # and climb rate, length of this list, seconds for the first valid # rate, maximum value of seconds from first valid rate, minimum and # maximum values of climb rate # compute unfiltered climb rates set secs0 "" ; set where 1 set rates "" ; set secs "" foreach p $salts { foreach "s a newsegm" $p { break } # start segment flag not used if { [regexp \ {^ *-?[0-9]+(\.[0-9]+)?([eE]-?[1-9][0-9]*)? *$} $a] && \ [regexp {^ *[0-9]+ *$} $s] } { if { $where == 1 } { set sa $s set aa $a set where 2 } else { if { $where == 2 } { set dt [expr $s-$sa] set secs0 [expr 0.5*($s+$sa)] set secs [set sa 0] set where 3 } else { set s [expr $s-$secs0] set dt [expr $s-$sa] lappend secs [expr round(0.5*($s+$sa))] set sa $s } lappend rates [expr ($a-$aa)/$dt] set aa $a } } } if { $secs0 == "" } { # no time data return "" } set secs0 [expr round($secs0)] # is there enough data to filter? set scrs "" if { [lindex $rates 4] == "" } { set rmin 1e40 ; set rmax -1e40 foreach r $rates s $secs { lappend scrs [list $s $r] if { $r > $rmax } { set rmax $r } if { $r < $rmin } { set rmin $r } } return [list $scrs [llength $scrs] $secs0 $sa $rmin $rmax] } # compute filter coefficients set coeffs "" foreach i "1 3 5 7 9 11 13 15" { lappend coeffs [expr 0.125*(1-cos(0.3926990816987241548*$i))] } lappend rates 0 0 0 0 set rates [linsert $rates 0 0 0 0 0] set vals [lrange $rates 0 6] set n 0 ; set rmin 1e40 ; set rmax -1e40 foreach val [lreplace $rates 0 6] t [lrange $secs 3 end-4] { lappend vals $val set sum 0 foreach c $coeffs v $vals { set sum [expr $sum+$c*$v] } lappend scrs [list $t $sum] if { $sum > $rmax } { set rmax $sum } if { $sum < $rmin } { set rmin $sum } set vals [lreplace $vals 0 0] incr n } return [list $scrs $n $secs0 $sa $rmin $rmax] } #---- ############ #### 3D #### ############ #Local Globals : an array array set HG3Dglob { c1 "" alt "" raw "" shear_hd "" shear_vd "" altok "" nptdiv "" npt "" zmin "" alt2 "" c1 "" xaxe {{-100 0} {100 0}} yaxe {{0 -100} {0 100}} HEIGHT 400 WIDTH 400 ELEV 100.0 HEIGHT_ 410 WIDTH_ 410 X0 {[expr $HG3Dglob(WIDTH)/2]} Y0 {[expr $HG3Dglob(HEIGHT)/2]} Xcross {[expr $HG3Dglob(WIDTH)/2]} Ycross {[expr $HG3Dglob(HEIGHT)/2]} marks "" div 10 scale_lock 0 text_on 1 ztilt 1.0 xyscale 1.0 zscale 1.0 anim_stop 100 anim_en 0 pow 0 abort 0 compsem 0 displ,pow -1 displ,ztilt -1 displ,zscale -1 displ,xyscale -1 } proc HG3D {pts alt datum} { global ProjTMPoint global ASKPROJPARAMS global HG3Dglob set nptdiv $HG3Dglob(nptdiv) set npt $HG3Dglob(npt) set zmin $HG3Dglob(zmin) set raw $HG3Dglob(raw) set c1 $HG3Dglob(c1) set HEIGHT $HG3Dglob(HEIGHT) set HEIGHT_ $HG3Dglob(HEIGHT_) set WIDTH_ $HG3Dglob(WIDTH_) set WIDTH $HG3Dglob(WIDTH) set div $HG3Dglob(div) catch {unset P3DData} #Initialize Projection set oldask $ASKPROJPARAMS set ASKPROJPARAMS 0 # MF contribution: changed to call of general init proc ProjInit TM P3DData $datum $pts set ASKPROJPARAMS $oldask #extract x,y,z # find min z (plateau) # ---> TBD what if z invalid? set raw "" set zmin 9000.0 set zmax 0.0 set npt 0 foreach i $pts j $alt { lappend raw [ProjTMPoint P3DData \ [lindex $i 0] [lindex $i 1] [lindex $i 2] ] # IF no altitude, use the last one ... # OK, this is a dirty trick. if { ! [CheckSignedFloat Ignore $j] } { set j $zmin;continue} # if { $j < $zmin } { set zmin $j } if { $j > $zmax } { set zmax $j } incr npt } set nptdiv [expr $npt/$div] set HG3Dglob(zmin) $zmin set HG3Dglob(nptdiv) $nptdiv set HG3Dglob(npt) $npt # we have $npt points and we will mark every $nptdiv of them # HERE we must divide $alt to fit ELEV set HG3Dglob(zscale) [expr $HG3Dglob(ELEV) / ($zmax - $zmin) ] # Note we do not touch values! we will use them after for: # get the elevation data to plot set HG3Dglob(altok) "" ;#if we want to check elevation after... set lastgoodz $zmin foreach j $alt { # trace goodness in altok if { ! [CheckSignedFloat Ignore $j] } { set j $lastgoodz lappend HG3Dglob(altok) 0 } else { lappend HG3Dglob(altok) 1 set lastgoodz $j } } # now we relocate all data to fit in a square # large HEIGHT 400 and wide WIDTH # centered in X0,Y0 # # first of all we must find max and min set Mxtmp 0 set Mytmp 0 set mxtmp 0 set mytmp 0 set Mtmp 0 set mtmp 0 foreach i $raw { set x [lindex $i 0] set y [lindex $i 1] if { $x > $Mtmp} { set Mtmp $x } if { $y > $Mtmp} { set Mtmp $y } if { $x < $mtmp} { set mtmp $x } if { $y < $mtmp} { set mtmp $y } } # # then we scale data to fit # and we translate to X0,Y0 # set HEIGHT [expr $HG3Dglob(HEIGHT) *1.0] set WIDTH [expr $HG3Dglob(WIDTH) *1.0] set tmp [expr ($HEIGHT > $WIDTH) ? $HEIGHT : $WIDTH] set scale_factor [expr ($tmp/($Mtmp - $mtmp)/2)] set raw1 "" foreach i $raw { set x [lindex $i 0] set y [lindex $i 1] set x1 [expr ($x * $scale_factor)] set y1 [expr ($y * $scale_factor)] lappend raw1 [list $x1 $y1] } set HG3Dglob(raw) $raw1 # FIRST PLOT # MF change: HG3D_canvas returns list with window and canvas path foreach {w c1} [HG3D_canvas $alt] { break } #EXPORT set HG3Dglob(c1) $c1 set HG3Dglob(alt2) $alt # MF change: return list with window created return [list $w] } proc rotate {before w} { # before: list of x,y to rotate # w: rotation in degrees set rotated "" set w [expr $w*3.14/180.0] ;# radians (roughly) set cosw [expr cos($w)] set sinw [expr sin($w)] foreach i $before { set x [lindex $i 0] set y [lindex $i 1] lappend rotated [list [expr $x * $cosw + $y * $sinw] \ [expr -$x * $sinw + $y * $cosw] ] } return $rotated } ### the following procs have been changed and then replaced by HG3D_do_calc # proc HG3D_calc_ {} { # global HG3Dglob # # if { $HG3Dglob(pow) != $HG3Dglob(displpow) } { # HG3D_calc $HG3Dglob(ztilt) $HG3Dglob(pow) # } # return # } # # proc HG3D_calc_z {ztilt} { # global HG3Dglob # # HG3D_calc $ztilt $HG3Dglob(pow) # return # } # # proc HG3D_calc_p {pow} { # global HG3Dglob # # if { $pow != $HG3Dglob(displpow) } { # HG3D_calc $HG3Dglob(ztilt) $pow # } # return # } proc HG3D_do_calc {param args} { # compute after change in parameter # $param in {pow ztilt zscale xyscale} # $args can contain the parameter value (when used in widget call-back) global HG3Dglob if { $HG3Dglob(displ,$param) != $HG3Dglob($param) } { HG3D_calc } return } proc HG3Dabort {} { global HG3Dglob set HG3Dglob(abort) 1 return } # MF contribution proc HG3Dabortb {} { # enable "abort" button global HG3Dglob $HG3Dglob(abbutton) configure -state normal return } proc HG3Dabortw {args} { # restore state and interface after abort global HG3Dglob after cancel HG3D_calc_wait set HG3Dglob(abort) 0 set HG3Dglob(compsem) 0 # restore parameters foreach param "pow ztilt zscale xyscale" { set HG3Dglob($param) $HG3Dglob(displ,$param) } $HG3Dglob(abbutton) configure -state disabled ResetCursor . update idletasks return } proc HG3D_calc_wait {} { # wait for computation to finish and launch a new one after it global HG3Dglob if { $HG3Dglob(abort) } { set HG3Dglob(compsem) 0 return } if { $HG3Dglob(compsem) == 0 } { HG3D_calc return } after 200 HG3D_calc_wait return } #-- # no parameters needed: using global variables proc HG3D_calc {} { global HG3Dglob # MF contrib # check if there is a computation going on if { $HG3Dglob(compsem) > 1 } { return } if { $HG3Dglob(compsem) == 1 } { if { $HG3Dglob(abort) } { return } incr HG3Dglob(compsem) after 200 HG3D_calc_wait return } set HG3Dglob(compsem) 1 # save locally the current parameters that may be changed by the user # during the computation foreach param "pow ztilt zscale xyscale" { set $param $HG3Dglob($param) } SetCursor . watch HG3Dabortb #--- set nptdiv $HG3Dglob(nptdiv) set npt $HG3Dglob(npt) set zmin $HG3Dglob(zmin) set raw $HG3Dglob(raw) set c1 $HG3Dglob(c1) set HEIGHT $HG3Dglob(HEIGHT) set HEIGHT_ $HG3Dglob(HEIGHT_) set WIDTH_ $HG3Dglob(WIDTH_) set WIDTH $HG3Dglob(WIDTH) set alt2 $HG3Dglob(alt2) set X0 $HG3Dglob(X0) set Y0 $HG3Dglob(Y0) set div $HG3Dglob(div) set xaxe $HG3Dglob(xaxe) set yaxe $HG3Dglob(yaxe) set scale_lock $HG3Dglob(scale_lock) # ROTATE # find max and min to choose the dimension of the nsew cross #### set tmp 0 ; set n 0 foreach i $raw { set x [expr abs([lindex $i 0])] set y [expr abs([lindex $i 1])] if { $x > $tmp} { set tmp $x } if { $y > $tmp} { set tmp $y } #test if abort if { [incr n]%10 == 0 } { if { $HG3Dglob(abort) } { HG3Dabortw return 1 } update } } #set tmp [expr $tmp/4.0] set tmp 100.0 set xaxe "" set yaxe "" lappend xaxe [list [expr -$tmp] 0 ] [list $tmp 0 ] lappend yaxe [list 0 [expr -$tmp] ] [list 0 $tmp ] #puts "$xaxe $yaxe" # ROTATE set rawrot [rotate $raw $pow] set xaxe1 [rotate $xaxe $pow] set yaxe1 [rotate $yaxe $pow] # SHEARING set zt [expr $ztilt * $zscale] set shear_h "" ;# no elevation set shear_v "" ;# with elevation set lastgoodz $zmin set n 0 foreach i $rawrot j $alt2 k $HG3Dglob(altok) { set x [lindex $i 0] set y [lindex $i 1] set xp [expr ($x + $y/2) * $xyscale] set yp [expr $y/2 * $xyscale] lappend shear_h [list $xp $yp] if { $k } { set lastgoodz $j } else { set j $lastgoodz } set z [expr $j - $zmin] set yp2 [expr ($y/2+$z*$zt) * $xyscale] lappend shear_v [list $xp $yp2] #test if abort if { [incr n]%10 == 0 } { if { $HG3Dglob(abort) } { HG3Dabortw return 1 } update } } #shear the axes set xaxe2 "" set yaxe2 "" set n 0 foreach i $xaxe1 j $yaxe1 { set x [lindex $i 0] set y [lindex $i 1] set xp [expr $x + $y/2] set yp [expr $y/2] lappend xaxe2 [list $xp $yp] set x [lindex $j 0] set y [lindex $j 1] set xp [expr $x + $y/2] set yp [expr $y/2] lappend yaxe2 [list $xp $yp] #test if abort if { [incr n]%10 == 0 } { if { $HG3Dglob(abort) } { HG3Dabortw return 1 } update } } # translate set tmp "" foreach i $shear_h { set x [expr [lindex $i 0] + $HG3Dglob(X0)] set y [expr [lindex $i 1] + $HG3Dglob(Y0)] lappend tmp [list $x $y] } set shear_h $tmp set tmp "" foreach i $shear_v { set x [expr [lindex $i 0] + $HG3Dglob(X0)] set y [expr [lindex $i 1] + $HG3Dglob(Y0)] lappend tmp [list $x $y] } set shear_v $tmp set tmp "" #axes set xaxe3 "" set yaxe3 "" set n 0 foreach i $xaxe2 j $yaxe2 { set x [expr [lindex $i 0] + $HG3Dglob(X0)] set y [expr [lindex $i 1] + $HG3Dglob(Y0)] lappend xaxe3 [list $x $y] set x [expr [lindex $j 0] + $HG3Dglob(X0)] set y [expr [lindex $j 1] + $HG3Dglob(Y0)] lappend yaxe3 [list $x $y] #test if abort if { [incr n]%10 == 0 } { if { $HG3Dglob(abort) } { HG3Dabortw return 1 } update } } set shear_hd "" set shear_vd "" set marks "" ;# { {x y count} ...} set count 1 ;# GPSMan uses 1 as first wp set k $nptdiv ;# dirty trick set n 0 foreach i $shear_h j $shear_v z $alt2 { set tmp "" set x [lindex $i 0] set y [lindex $i 1] set y [expr $HEIGHT - $y] ;#invert y lappend shear_hd $x $y # a little more... some marks here and then lappend tmp $x $y ;# to use or not, I save it set x [lindex $j 0] set y [lindex $j 1] set y [expr $HEIGHT - $y] ;#invert y lappend shear_vd $x $y lappend tmp $x $y $count $z;# to use or not, I save it if { $k == $nptdiv } { # a little more... we save a mark lappend marks $tmp set k 0 } incr k incr count #test if abort if { [incr n]%10 == 0 } { if { $HG3Dglob(abort) } { HG3Dabortw return 1 } update } } #And now, last mark always on! (some times twice... oh well!) lappend marks $tmp set HG3Dglob(marks) $marks #puts "debug 3 $marks" #axes set xaxe4 "" set yaxe4 "" set n 0 foreach i $xaxe3 j $yaxe3 { set x [lindex $i 0] set y [lindex $i 1] set y [expr $HEIGHT - $y] ;#invert y lappend xaxe4 [list $x $y] set x [lindex $j 0] set y [lindex $j 1] set y [expr $HEIGHT - $y] ;#invert y lappend yaxe4 [list $x $y] #test if abort if { [incr n]%10 == 0 } { if { $HG3Dglob(abort) } { HG3Dabortw return 1 } update } } # PLEASE NOTE: shear_v was { {x y} {x y} ... } # shear_vd is { x y x y ... } # the same for shear_h and hd if { [incr n]%10 == 0 } { if { $HG3Dglob(abort) } { HG3Dabortw return 1 } update } #PLOT HG3D_plot $c1 $shear_hd $shear_vd $alt2 $marks $nptdiv $xaxe4 $yaxe4 # save display state foreach param "pow ztilt zscale xyscale" { set HG3Dglob(displ,$param) [set $param] } # we were fast, no need for abort window set HG3Dglob(abort) 0 set HG3Dglob(compsem) 0 foreach b "abbutton shbutton" { $HG3Dglob($b) configure -state disabled } ResetCursor . update idletasks return } proc HG3D_animtog {w s2} { global HG3Dglob TXT set HG3Dglob(anim_en) [expr ! $HG3Dglob(anim_en)] if { $HG3Dglob(anim_en) == 0 } { $s2 configure -state disabled \ -label "$TXT(azimuth) ($TXT(noanabbr))" } else { $s2 configure -state normal \ -label "$TXT(azimuth) ($TXT(animabbrev))" } return } proc HG3Dchpow {i} { global HG3Dglob set HG3Dglob(pow) [expr $HG3Dglob(pow) + $i] $HG3Dglob(shbutton) configure -state normal return } proc HG3D_canvas {alt} { global HG3Dglob TXT # MF contribution global NoImgLib ImgOutFormats COLOUR DPOSX DPOSY #--- set c1 $HG3Dglob(c1) set npt $HG3Dglob(npt) set HEIGHT_ $HG3Dglob(HEIGHT_) set WIDTH_ $HG3Dglob(WIDTH_) set scale_lock $HG3Dglob(scale_lock) set ztilt $HG3Dglob(ztilt) set anim_stop $HG3Dglob(anim_stop) # destroy .elev3D # MF change: using general proc as for other GPSMan toplevels set w [GMToplevel .elev3D elevation +$DPOSX+$DPOSY . \ {WM_DELETE_WINDOW {destroy .elev3D}} {}] #----- set f0 [frame $w.f0] set c1 [canvas $f0.c1 -width $WIDTH_ -height $HEIGHT_] set f0a [frame $w.f0a] set f0b [frame $w.f0b] set s2 [scale $f0a.s2 -orient horizontal -from 0 -to 360 \ -variable HG3Dglob(pow) \ -label "$TXT(azimuth) ($TXT(animabbrev))" -length 120 \ -command {HG3D_do_calc pow}] set HG3Dglob(s2) $s2 if {($npt >= $HG3Dglob(anim_stop)) || $HG3Dglob(anim_en)== 0 } { $s2 configure -state disabled \ -label "$TXT(azimuth) ($TXT(noanabbr))" set HG3Dglob(anim_en) 0 } else { $s2 configure -state normal \ -label "$TXT(azimuth) ($TXT(animabbrev))" set HG3Dglob(anim_en) 1 } set s2p [button $f0b.srp -text "+15" -command "HG3Dchpow 15"] set s2m [button $f0b.srm -text "-15" -command "HG3Dchpow -15"] set s2k [button $f0b.srk -text $TXT(show) \ -command { HG3D_do_calc pow } -state disabled] set HG3Dglob(shbutton) $s2k # MF contribution: using variable so that status is correctly displayed set HG3Dglob(anim_en_b) $HG3Dglob(anim_en) set s2r [checkbutton $f0a.sr2 -text $TXT(animate) \ -variable HG3Dglob(anim_en_b) \ -command "HG3D_animtog $w $s2" -selectcolor $COLOUR(check)] #-- # MF contribution button $f0b.abort -text $TXT(abort) -command HG3Dabort -state disabled set HG3Dglob(abbutton) $f0b.abort #-- pack $f0 pack $c1 pack $f0a -side left pack $s2 $s2r pack $f0b -side left # MF contribution: pack abort button pack $s2m $s2k $s2p $HG3Dglob(abbutton) -side left #Radiobuttons set f1 [frame $w.f1] set f2 [frame $w.f2] set f3 [frame $w.f3] set f4 [frame $w.f4] set f5 [frame $w.f5] pack $f1 $f2 $f3 pack $f4 $f5 ## four radiobuttons for North, South, etc. # BUT you can use the azimuth slide, too pack [radiobutton $f1.n -text "N" -variable HG3Dglob(pow) \ -value 180 -command {HG3D_do_calc pow} \ -selectcolor $COLOUR(check)] pack [radiobutton $f2.w -text "W" -variable HG3Dglob(pow) \ -value 270 -command {HG3D_do_calc pow} \ -selectcolor $COLOUR(check)] -side left pack [radiobutton $f2.e -text "E" -variable HG3Dglob(pow) \ -value 90 -command {HG3D_do_calc pow} \ -selectcolor $COLOUR(check)] -side right pack [radiobutton $f3.s -text "S" -variable HG3Dglob(pow) \ -value 0 -command {HG3D_do_calc pow} \ -selectcolor $COLOUR(check)] # show view from South $f3.s select #menubuttons frame $w.f6 set mn $w.f6.view.m menubutton $w.f6.view -text $TXT(view) -relief raised \ -direction below -menu $mn menu $mn -tearoff 0 $mn add cascade -label $TXT(zelev) -menu $mn.z menu $mn.z -tearoff 0 foreach i "0.1 0.25 0.5 0.75 1.0 2.0 5.0" { $mn.z add radiobutton -label $i -variable HG3Dglob(ztilt) \ -value $i -command {HG3D_do_calc ztilt} \ -selectcolor $COLOUR(check) } $mn add cascade -label $TXT(xyelev) -menu $mn.xy menu $mn.xy -tearoff 0 foreach i "0.5 0.75 1.0 1.5 2.0" { $mn.xy add radiobutton -label $i -variable HG3Dglob(xyscale) \ -value $i -command {HG3D_do_calc xyscale} \ -selectcolor $COLOUR(check) } # $mn add checkbutton -label $TXT(notext) -variable HG3Dglob(text_on) \ -command HG3D_text -selectcolor $COLOUR(check) button $w.f6.ok -text $TXT(ok) -command "destroy $w; " pack $w.f6 $w.f6.view -side left -fill x if { $NoImgLib } { set p [button $w.f6.p -text "$TXT(saveto) PS" \ -command "SaveCanvas $c1 {} PS file"] } else { set m $w.f6.p.m set p [menubutton $w.f6.p -text "$TXT(saveto)..." -menu $m] menu $m $m add command -label PS -command "SaveCanvas $c1 {} PS file" foreach f $ImgOutFormats { $m add command -label $f -command "SaveCanvas $c1 {} $f file" } } button $w.f6.pp -text $TXT(print) \ -command "SaveCanvas $c1 {} PS printer" pack $p $w.f6.pp $w.f6.ok -side left -fill x #---- #BIND $c1 bind point <1> "HG3Dsel1 $c1 %x %y" $c1 bind point <2> "HG3Dsel2 $c1 %x %y" $c1 bind plot <2> "HG3Dsel2 $c1 %x %y" # #bind $c1 "HG3Dmove $c1 %x %y" #bind $c1 "HG3Dnewcenter $c1 %x %y" $c1 bind selected "HG3Dmove $c1 %x %y" $c1 bind selected "HG3Dnewcenter $c1 %x %y" # # MF change: return list with window created and canvas path return [list $w $c1] } proc HG3Dsel2 {c1 x y} { # Select both the plot (tag:plot) and the cross (tag:point) global HG3Dglob $c1 dtag selected set tmp [$c1 gettags current] if {[string match "*point*" $tmp] || [string match "*plot*" $tmp]} { $c1 addtag selected withtag point $c1 addtag selected withtag plot } } proc HG3Dnewcenter {c1 x y} { # move both the plot (tag:plot) and the cross (tag:point) global HG3Dglob #$c1 move selected [expr $x-$HG3Dglob(X0)] [expr $y-$HG3Dglob(HEIGHT)+$HG3Dglob(Y0)] set tmpdeltax [expr $x-$HG3Dglob(X0)] set tmpdeltay [expr $y-$HG3Dglob(HEIGHT)+$HG3Dglob(Y0)] $c1 move selected $tmpdeltax $tmpdeltay set HG3Dglob(X0) $x set HG3Dglob(Y0) [expr $HG3Dglob(HEIGHT) - $y] set HG3Dglob(Xcross) [expr $HG3Dglob(Xcross) + $tmpdeltax] set HG3Dglob(Ycross) [expr $HG3Dglob(Ycross) + $tmpdeltay] } proc HG3Dsel1 {c1 x y} { # The cardinal cross only (point tag) global HG3Dglob $c1 dtag selected set tmp [$c1 gettags current] if {[string match "*point*" $tmp]} {$c1 addtag selected withtag point} return } proc HG3Dmove {c1 x y} { # Move only he cardinal cross only (point tag) global HG3Dglob $c1 move selected [expr $x-$HG3Dglob(Xcross)] [expr $y-$HG3Dglob(Ycross)] set HG3Dglob(Xcross) $x set HG3Dglob(Ycross) $y return } proc HG3D_plot { c1 shear_hd shear_vd alt marks nptdiv xaxe yaxe } { global HG3Dglob # $c1 delete all $c1 create line $shear_hd -tags "plot" # solution 1: fast #$c1 create line $shear_vd -fill blue #solution 2 set l [llength $HG3Dglob(altok)] for { set i 0; set j 0} {$j < [expr $l - 1]} {incr i 2; incr j} { set a "" set x [lindex $shear_vd $i ] set y [lindex $shear_vd [expr $i+1]] lappend a $x $y set x [lindex $shear_vd [expr $i+2]] set y [lindex $shear_vd [expr $i+3]] lappend a $x $y set g [lindex $HG3Dglob(altok) $j ] set h [lindex $HG3Dglob(altok) [expr $j+1] ] set g [expr $g * $h] if { $g } { $c1 create line $a -fill blue -tags "plot" } else { $c1 create line $a -fill cyan -tags "plot" } } #end of solution 2 #### # the cross set x1 [lindex [lindex $xaxe 0] 0] set y1 [lindex [lindex $xaxe 0] 1] set x2 [lindex [lindex $xaxe 1] 0] set y2 [lindex [lindex $xaxe 1] 1] $c1 create line $x1 $y1 $x2 $y2 -fill green -tags "point" $c1 create text $x2 $y2 -text "E" -tags "c point" $c1 create text $x1 $y1 -text "W" -tags "c point" set x1 [lindex [lindex $yaxe 0] 0] set y1 [lindex [lindex $yaxe 0] 1] set x2 [lindex [lindex $yaxe 1] 0] set y2 [lindex [lindex $yaxe 1] 1] $c1 create line $x1 $y1 $x2 $y2 -fill red -arrow last -tags "point" $c1 create text $x2 $y2 -text "N" -tags "c point" $c1 create text $x1 $y1 -text "S" -tags "c point" HG3D_text return } proc HG3D_text {} { global HG3Dglob set c1 $HG3Dglob(c1) set marks $HG3Dglob(marks) foreach i $marks { set x1 [lindex $i 0] set y1 [lindex $i 1] set k [lindex $i 4] set x2 [lindex $i 2] set y2 [lindex $i 3] set hz [lindex $i 5] if { ! [CheckSignedFloat Ignore $hz] } { set hz "?" } else { set hz [expr round($hz)] } $c1 create line $x1 $y1 $x2 $y2 -fill red -tags "plot" if {$HG3Dglob(text_on)} { $c1 create text $x1 $y1 -text "$k" -tags "plot b" $c1 create text $x2 $y2 -text "$hz" -tags "plot b" } else { $c1 delete "b" } } return } gpsman-6.4.4.2/gmsrc/langdeutsch.tcl0000644000175000017500000013442612224351120015406 0ustar migmig# # This file is part of: # # gpsman --- GPS Manager: a manager for GPS receiver data # # Copyright (c) 1998-2013 Miguel Filgueiras migfilg@t-online.de # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. # # File: langdeutsch.tcl # Last change: 6 October 2013 # German language file by Andreas Lange (Andreas.C.Lange _AT_ GMX.de) # last input from him inserted: 31 January 2002 # # Support by Sabine Broda (sbb _AT_ dcc.fc.up.pt) since 2002 # last input from her inserted: 22 December 2009 # file langengl.tcl is consulted first; no need for duplicating entries here # only 3 chars long names; check also ALLMONTH in file i18n-utf8.tcl set MONTHNAMES "Jan Feb Mr Apr Mai Jun Jul Aug Sep Okt Nov Dez" set DLUNIT(KM,dist) km set DLUNIT(KM,subdist) m set DLUNIT(KM,speed) km/h set DLUNIT(KM,area) qkm set DLUNIT(NAUTMILE,dist) sm set DLUNIT(NAUTMILE,subdist) ft set DLUNIT(NAUTMILE,speed) knt set DLUNIT(NAUTMILE,area) qsm set DLUNIT(STATMILE,dist) "us ml" set DLUNIT(STATMILE,subdist) ft set DLUNIT(STATMILE,speed) mph set DLUNIT(STATMILE,area) qusml set DLUNIT(M,dist) $DLUNIT(KM,subdist) set DLUNIT(FT,dist) $DLUNIT(STATMILE,subdist) set DTUNIT $DLUNIT($DISTUNIT,dist) set SPUNIT $DLUNIT($DISTUNIT,speed) set ARUNIT $DLUNIT($DISTUNIT,area) set ALUNIT $DLUNIT($ALTUNIT,dist) set MESS(RTcomp) "#\tWP\t\t$DTUNIT\tGrad\t$ALUNIT" set MESS(TRcomp) "#\t\t\t\t$ALUNIT\t$DTUNIT\t$DTUNIT\th:m:s\t$SPUNIT\tdeg" set MESS(WPNearest) "WP\t\t$DTUNIT\tGrad" ## comments to Mess # namevoid # "Name darf nicht ausgelassen werden" # activeRT # "Route 0 ist bereits aktiv; fortsetzen?" # noACKNAK # "Got packet when expecting ACK/NAK; check GPS connection" # badplatform # "No I/O with serial port in this platform" # notUTMproj # "Saved info for UTM; proceed with projection set to" array set MESS { badscale "Ungltiger Wert fr Karten-Mastab" oktoexit "Ok zum Beenden (nichtgespeicherte Daten gehen verloren)" okclrmap "Ok zum Lschen der Karte" namelgth "Der Name darf %d Zeichen nicht berschreiten" cmmtlgth "Der Kommentar darf %d Zeichen nicht berschreiten" namevoid "Der Name darf nicht leer sein" baddate "Ungltiges Datum; Zeile" badhdg "Ungltige Richtungsangabe %s: mu entweder %s oder +/- sein" badcoord "Ungltige Koordinaten oder falsches Format: \"%s\" mu sein %s" outofrng "Zahl auerhalb des zulssigen Bereiches" UTMZN "Mu ein Buchstabe von A..H, J..N, oder P..Z sein" badstrg "Falsche(r) Buchstabe(n)" strgvoid "Zeichenkette darf nicht leer sein" nan "\"%s\" ist keine Zahl" written "Geschrieben von" undefWP "Route %s besitzt undefinierte WPe; nicht gespeichert/exportiert" bigRT "Route %s > max. Anzahl; nicht exportiert" unkndatum "Unbekanntes Datum" badcommdWP "Ungltiger Befehl beim Laden der WPe; Zeile" notabsWP "Ungltige WP Definition; keine Tabulatoren, Zeile" undefinedWP "Referenz zu umbekanntem WP: %s" nofieldsWP "Ungltiger WP, nicht gengend Felder; Zeile" excfieldsWP "Ungltiger WP, zu viele Felder; Zeile" badWPsRT "RT mit ungltiger Wegpunkte-Liste; Zeile" toomuchWPs "Warnung: mehr als %d WP in der RT" badcommdTP "Ungltiger Befehl beim Laden der TPe; Zeile" badTP "Ungltiger Punkt in TR; Zeile" badTPsTR "TR mit ungltiger Punkte-Liste; Zeile" noheader "Datei beginnt nicht mit Dateikopf" loaderr "Fehler beim Laden der Datei; Zeile" unkncommd "Unbekanntes Kommando beim Laden der Datei; Zeile" noformat "Datei beginnt nicht mit Format-Zeile" badformat "Ungltige Format-Zeile" badRT "Ungltige RT Definition; Zeile" badRTargs "Ungltige RT Argumente; Zeile" badTR "Ungltige TR Definition; Zeile" fileact "%s %s Datei?" filexists "Datei existiert!" GPSok "Verbindung ok" toomany "Zu viele %se (> %d)" cantfgt "Kann %s nicht lschen: gehrt zur Kartendarstellung" cantfgted "Kann %s nicht lschen: ist in Bearbeitung" cantmapRTunkn "Route nicht dargestellt; keine Informationen fr WP" cantmapRTed "Route nicht dargestellt; WP ist in Bearbeitung" cantrun "Nicht ausfhrbar" inprogr "Operation wird bereits ausgefhrt" cantread "Kann Hilfsdatei nicht lesen" cantwrtopt "Kann Prferenz-Datei nicht schreiben" voidRT "Route enthlt keine Wegpunkte" activeRT "Route 0 ist aktiv; fortsetzen?" voidTR "Track enthlt keine Punkte" idinuse "Bezeichner bereits vorhanden" cantunmap "Kann %s nicht lschen: gehrt zu dargestelltem Inhalt" askrevert "Auf ursprngliches Datum zurckstellen?" askforget "%s lschen?" notimpl "Nicht implementiert" forgetall "Alle Punkte in Liste %s lschen?" counted "Es sind %d %s(s/e) definiert" notlisted "Punkt nicht aufgelistet" wrgval "Falscher Wert fr" voidGR "Gruppe hat keine Elemente" initselfGR "Gruppe ist in sich selbst enthalten ber" GRelout "Kommando fr das Element ist auerhalb der GR Definition; Zeile" badGRels "Gruppe mit ungltiger Elemente-Liste; Zeile" badcommdGRel "Ungltiges Kommando beim Laden der GR Elemente, Zeile" notypeforGRel "Element ohne Typ-Angabe; Zeile" badGRel "Ungltige Element-Definition; Zeile" check "berprfe Verbindung" toomanyerr "Zu viele Fehler, breche ab..." getWP "Empfangen der Wegpunkte" getRT "Empfangen der Routen" getTR "Empfangen der Tracks" putWP "Senden der Wegpunkte" putRT "Senden der Routen" putTR "Senden der Tracks" fillbuffWP "Laden des WP Puffers" fillbuffRT "Laden des RT Puffers" noACKNAK "Paket erhalten, ACK/NAK erwartet; GPS Verbindung berprfen!" badplatform "Keine Ein-/Ausgabe auf der seriellen Schnittstelle auf dieser Platform" badserial "Kann Gert %s nicht ffnen" nodata "Kein %se im Empfnger" badimage "Ungltige Bild-Datei" mapadjust "Bitte plazieren Sie die WPe auf der Karte; Ok zum Beenden" duplicate "%s bereits ausgewhlt" clrcurrmap "Aktuelle Karte lschen?" mbkbaddatum "Kein oder unbekanntes Datum" mbkbadscale "Die Skala mu nicht-negativ sein" mbkbadat "Ungltige Argumente" edityourrisk "Bearbeiten auf eigene Gefahr!" okclrbkmap "Ok zum Lschen des Karten-Hintergrundes" okclrbkim "Ok zum Lschen des Bildes bei" badSYMBOLcode "Ungltiger Symbol-Code" badDISPOPTcode "Ungltiger Code der Anzeige-Optionen" goingdown "Prferenzen wurden gespeichert; bitte neu starten" putwhat "Welche Punkt-Typen speichern?" readwhat "Welche Punkt-Typen lesen?" noWPinx "Zu viele WPe fr diesen Empfnger" noICinx "Zu viele ICs fr diesen Empfnger" getIC "Lade Symbole / Zeichen" serial1 "Inkorrekter Vorspann" serial2 "Inkorrekter Befehl zurckgegeben" checksum1 "Inkorrekte Kopf-Prfsumme" checksum2 "Prfsummen-Fehler" receiver "Keine Verbindung zum Gert!" importonly1 "Kann nur einen Typ Daten importieren" exportonly1 "Kann nur einen Typ Daten exportieren" outdatedprefs "Prferenz-Datei berholt, bitte jetzt berprfen" mustchoose1type "Mindestens ein Punkt-Typ mu ausgewhlt werden." nosuchitems "Kein Punkt entspricht der Beschreibung" resultsin "Suchergebnisse in der Gruppe" badWP "WP nicht angegeben oder undefiniert" badangle "Winkel mu zwischen 0 und 360 Grad betragen" georefhow "Methode der Geo-Referenzierung" cantsolve "Kann Gleichungen nicht lsen" transfcantscale "Keine Skalierung mit dieser Transformation mglich" oldfilefmt "Altes Datei-Format; bitte unter neuem Format abspeichern!" unknProj "Unbekannte Kartenprojektion" unknTransf "Unbekannte Kartentransformation" badProjargs "Falsche Argumente fr die Projektion" badTransfargs "Falsche Argumente fr die Transformation" badfield "Ungltiges Attribut/Wert Paar" badattr "Ungltiger Attribut-Name" missattrs "Fehlende(s) Attribut(e)" mbkbadproj "Ungltige Kartenprojektion" mbkbadtransf "Ungltige Kartentransformation" notUTMproj "Info fr UTM gespeichert; Fortsetzen mit Projektion gesetzt auf" projchg "Bitte besttigen Sie die Projektions-Parameter" badprojprm "Ungltiger Wert fr %s" connectedto "Verbunden mit %s" recnotsuppd "Empfnger-Modell nicht untersttzt" gotprots "Protokoll-Definition geladen" badprots "Ungltige Protokoll-Definition" defprots "Verwende die Protokoll-Tabelle" nohidden "Verborgene Daten verwerfen?" badRS "Etappe der Route auerhalb der Definition der RT; Zeile" badWPsRSs "RT Etappe vor dem ersten oder nach dem letzten WP; Zeile" windowdestr "Das Fenster wurde geschlossen!" badhidden "Ungltiges Format fr versteckten Wert" replname "Ersetzen Sie \"%s\" durch einen Namen mit hchstens %d der folgenden Buchstaben: %s" badalt "Ungltiger Wert fr Hhe" baddistunit "Ungltige Maeinheit fr Karten-Mastab in Prferenz-Datei" badgridzone "Ungltige Gitternetz-Zone" outofgrid "Position ausserhalb der Definition des Gitternetzes" cantchkprot "Kann mit diesem Protokoll nicht festgestellt werden" mustconn1st "Zuerst die Verbindung zum Empfnger berprfen" rltmnotsupp "Echtzeit-Aufzeichnung wird vom Protokoll dieses Empfngers nicht untersttzt" timeoffnotint "Zeitdifferenz muss eine Ganzzahl sein oder mit .5 enden" abbrevinuse "Abkrzung bereits vergeben" nameinuse "Name ist bereits vergeben" badgriddatum "Das Datum fr das Gitternetz %s ist %s" badparam "Falscher Wert fr %s" cantchggriddatum "Dieses Gitternetz bentigt das Datum %s" cantwrtprgr "Kann die nutzerdefinierte Projektionsdatei nicht schreiben" createdir "Bitte zuerst das Verzeichnis %s erzeugen und neu starten" cantwrtdtel "Kann die nutzerdefinierte Datum Datei nicht schreiben" gridinuse "Das Gitternetz, von %s genutzt, kann nicht gelscht werden, trotzdem Fortsetzen?" gridinusenochg "Das Gitternetz wird von %s benutzt; keine nderungen eingetragen" gridneedsdatum "Falsche Definition fr das Gitternetz %s; kein Datum angegeben" oktomkdir "Soll das Verzeichnis %s angelegt werden?" projinuse "Die Projektion wird genutzt; die nderungen werden verworfen" projnameabbr "Bitte einen Namen und eine Abkrzung fr die neue Projektion eingeben" missingdata "Unzureichende Daten!" movingWP "Plazieren von %s mit linker Maustaste\nAbbrechen mit rechter Maustaste" needs1wp "Eine Route muss mindestens aus einem Wegpunkt bestehen" emptypos "Position mit leerem Feld/leeren Feldern" cantwrtsstate "Kann gespeicherte Status-Datei nicht schreiben" cantrdsstate "Kann gespeicherte Status-Datei nicht lesen" corruptsstate "Ungltige gespeicherte Status-Datei: %s" editrisk "nderungen auf eigene Gefahr!" savestate "Aktuellen Status speichern?" delsstate "Gespeicherte Status-Dateien lschen?" badmapinfo "Ungltige Kartenparameterdatei" badMHloc "Falsches Maidenhead Gitter" areais "Die Flche des (nicht selbst-berschneidenen) Polygons betrgt %.3f%s" areatoosmall "Die Flche ist zu klein (<0.001 qkm)" projarea "Berechne die projizierte Flche" selfintsct "Wiederholte WPe: RT kann sich nicht selbst schneiden!" badinvmdist "Fehler in der Nherung bei der Umkehrung des Meridional-Abstandes" badinvproj "Nherungsfehler bei der Umkehrung der %s Projektion" negdlatlong "Lnge/Breite Werte drfen nicht negativ sein!" allundef "In der Gruppe sind keine Definitionen fr die WPe enthalten" badfloats "Fliesskomma-Konvertierung funktioniert nicht korrekt; sind Sie sicher, dass Sie die Verbindung herstellen wollen?" frgetGRcs "Gruppe mit allen Elementen lschen?!" clrtrvlog "Reiseaufzeichnung lschen?" badattr "Unbekannter %s optionaler Feldname: %s" badattrval "Falscher %s optionaler Feldwert: %s" couldntcd "Konnte nicht zu directory %s wechseln" shpext "Falsche Endung %s; kann .shp, .shx, .dbf benutzt werden?" shpcntopen "Shapefile-Dateien konnten nicht erzeugt/geffnet werden" shpcntcrtfs "Shapefile .dbf Felder konnten nicht erzeugt werden" shpcntwrtfs "Shapefile .dbf Felder konnten nicht gespeichert werden" shpoutmem "Speicher ist voll!" shpemptyfile "Leere Datei" shpwrongfile "Ungltiger Dateientyp" shplessdim "Dimension in Datei kleiner als erforderlich; weiter?" shpbadWPinRT "%d. WP mit ungltigen Koordinaten ignoriert in RT %s" badGTMvers "GTrackMaker Dateienversion ungltig" badGTMfile "Falscher Anfang in GTrackMaker Datei" badGTMcounts "Negative(r) Zhler in GTrackMaker Datei" badGTMlat "Ungltige Breitenwerte in GTrackMaker Datei" badGTMlong "Ungltige Lngenwerte in GTrackMaker Datei" badGTMdatum "Ungltiges Datum in GTrackMaker Datei" unobscmap "Fehler erfolgte warscheinlich wegen Fenster/Icon auf der Karte; nach Verzgerung wiederversuchen?" cantwrtimg "Fehler whrend Bildspeicherung in Datei in %s Format" TRsimplres "Vereinfachter TR mit Namen %s erzeugt" cantsaveRTid "%d RT(n) nicht gespeichert: non-numerisches Id" cantsaveTRid "%d TR(n) nicht gespeichert: non-numerisches Id" badtrvconf "Ungltige Konfiguration; Neustart ohne Elemente" drvsimoff "Fahrsimulator: noch nicht gestartet!" needWP "Fahrsimulater: bitte erst einige WPe laden/definieren" chgrecprot "Bitte Empfnger-Protokoll ndern" noprintcmd "Kein Druckkommando; bitte eins in den Optionen angeben" cantexecasroot "GPSMan kann nicht von root ausgefhrt werden" badargtofunc "%s Funktion mit ungltigem Argument" redefproj "Benutzers %s Projektion lscht vordefinierte Projektion mit gleicher Abkrzung; bitte Definition ndern!" nmeainuse "Echtzeitdaten werden empfangen oder eine andere NMEA Datei wird gelesen" badfile "Fehler beim Datei-lesen" RTnoWPname "WP in RT darf nicht mehr nur mit Namen identifiziert werden" distlarge "Zu grosse Entfernung" timeconsmg "Zeitaufwendige Aufgabe/Ttigkeit: fortfahren?" badtimeval "Falscher Zeitwert" badLAP "Ungltige Runde; Zeile" lapncnsdrd "RND ignoriert" undefinedTR "Unbekannter TR" emptymenu "Men hat keine Eintragung; fortsetzen?" cantwrtsymenu "Kann die nutzerdefinierte Symbolmen Datei nicht schreiben" abbrevhasspaces "Abkrzungen drfen keine Leerzeichen haben" getAL "Empfangen des Almanachs" needNpoints "Mindestens %s Punkten mu ausgewhlt werden!" twotimeoffsets "Verschiedene Zeitdifferenzen in Datei" notimeoffset "Keine Zeitdifferenz in Datei; Defaultwert ist 0" baddateas "Ungltiges Datum: %s" unknownenc "Unbekannte Zeichenkodierung %s" chgbaudto "Baudrate wird bis %s gendert; bitte warten..." baudchgfailed "Baudratennderung ohne Erfolg" busytrylater "Andere Vorgnge in Bearbeitung; bitte spter versuchen!" obssplit "Teilungsergebnis von %s in der Gruppe mit Name \"%s\"" loginto "Login %s" samelgth "Beide Zeichenketten mssen gleich lang sein" rschkargs "Abrufen von regsub gibt Fehler; Argumente berprfen" emptyrmeth "Umbenennungsmethode darf nicht leer sein" cantwrtdefs "Kann Datei mit Benutzerdefinitionen nicht schreiben" xcantbey "%s darf nicht %s sein" mustselftfam "Eine Schriftart muss ausgewhlt sein" badpluginwhere "Falsches plug-in \"wo\"-Argument; muss Liste von Tripeln sein" badpluginparam "Falsche plug-in Parameter: Liste von NAME EXPR, NAME beginnt mit _" badpluginparamexec "Wenn plug-in %s luft, falscher Parameter: %s" pluginfailed "Plug-in %s missglckt mit Nachright: %s" canwrtaux "Kann Hilfsdatei nicht schreiben" } set TXT(RTcompflds) "# WP {$DTUNIT} Grad {$ALUNIT} Etappe Bezeichnung" set TXT(TRcompflds) \ "TP {} {} {} {$ALUNIT} {$DTUNIT} {$DTUNIT} h:m:s {$SPUNIT} Grad" set TXT(starttoend) "Start: bis Ende %s $DTUNIT;" set TXT(startmax) "max. %s $DTUNIT;" set TXT(WPnearflds) "WP {$DTUNIT} Grad" set TXT(within) "Innerhalb (${DTUNIT})" set TXT(between) "Zwischen (${DTUNIT})" ## comments to TXT elements # optISOLATIN # "Compose chars" # optDPOSRTMAP # "RT/map dialog offset" # TRRTnpoints # "No. points to keep" # commrec # "Communication with receiver" # Marker (after SYzoo) # azimuth # "Azimuth" "Kompakurs" "Bearing" # opening # "Opening" # started # "starting on" # dontaskagain # "Stop asking" array set TXT { exit Ende map Karte load Laden loadfrm "Laden aus" save Speichern saveels "Speichern Elemente" saveto "Speichern in" clear Lschen clearall "Alles Lschen" newWP "Neuer WP" newRT "Neue RT" newTR "Neuer TR" newGR "Neue GR" import Importieren importfrm "Importieren aus" export Exportieren exportels "Export Elemente" exportto "Exportieren nach" count Zhlen trueN "Geographisch Nord" automagn "Autom. Nadelabweichung" usrdef "Benutzerdefiniert" nameWP Wegpunkt nameRT Route nameTR Track nameGR Gruppe namePlot Zeichnung nameMap Karte nameRTComp "Berechnung der Route" nameTRComp "Berechnung des Track" GPSrec "GPS Empfnger" turnoff "Ausschalten" get Empfangen put Senden all Alle select Auswhlen selection Auswahl options Optionen message Nachricht cancel Abbrechen file Datei ovwrt berschreiben app Anfgen online online offline offline check Prfen create Erstellen revert Zurcksetzen colour Farbe grey Grau mono Monochrom portr hochformat landsc querformat legend Legende incscale "Mastab einfgen" more Mehr waypoint Wegpunkt name Name created Erstellt cmmt Kommentar withWP "Mit diesem WP:" displ "in der Karte zeigen" startRT "Starte RT" route Route number Nummer insb "Einfgen vor" insa "Einfgen nach" del Lschen repl "Ersetzen mit" invRT "RT umkehren" comp Berechne RTcomp "Route Berechnung" savecomp "Speichern der Berechnung" totdst "Gesamte Entfernung" tottime "Gesamte Zeit" track Track chophd "Anfang abschneiden" choptl "Ende abschneiden" incb "Einfgen vor" date Datum newdate "Neues Datum fr nchsten Punkt" endprTR "Ende des vorhergehenden Tracks" begnxt "Beginn des nchsten" date1st "Datum fr den ersten Punkt der nchsten" TRcomp "Track-Berechnung" avgsp "Durchschn. Geschwindigkeit" maxsp "Max. Geschwindigkeit" minsp "Min. Geschwindigkeit" lat Breite long Lnge ze ZE zn ZN eastng Rechtswert nrthng Hochwert zone Zone change ndern forget Lschen others Andere optLANG Sprache optISOLATIN1 "Buchstaben zusammensetzen" optDELETE "DEL lscht letzten Buchstaben" optMWINDOWSCONF "Hauptfenster" optGPSREC "GPS-Modell" opt_GPSRecConf "Empfnger-Parameter" optNAMELENGTH "Max. Lnge des Namens" optINTERVAL "Stichproben-Intervall" optCOMMENTLENGTH "Max. Lnge des Kommentars" optMAXWPOINTS "Max. # WPunkte" optMAXROUTES "Max. # Routen" optMAXWPINROUTE "Max. # WPe in der Route" optMAXTPOINTS "Max. # Trackpunkte" optCREATIONDATE "Satz hat Erstellungs-Datum" optNOLOWERCASE "Satz ist nicht in Kleinbuchstaben" optDEFAULTSYMBOL "Standard WP Symbol" optDEFAULTDISPOPT "Standard WP Anzeige Option" opt_Data "Daten" optEQNAMEDATA "Daten mit identischem Namen" optKEEPHIDDEN "Verborgene Daten halten" optDatum Datum optTimeOffset "Zeitdifferenz" optACCFORMULAE "Genaue Formel" optASKPROJPARAMS "Projektionsparameter besttigen" optBalloonHelp "Balloon help" opt_Formats "Einheiten und Formate" optDISTUNIT "Entfernung" KM km NAUTMILE "Nautische Meile" STATMILE "US Meile" optPositionFormat "Positions-Format" optDateFormat "Datums-Format" opt_Geom "Fenster-Einstellungen" optMAPWIDTH "Kartenbreite" optMAPHEIGHT "Kartenhhe" optMAPSCLENGTH "Lnge der Kartenskala" optMAPSCALE "Kartenskala" optMAXMENUITEMS "Max. # Men-Eintrge" optLPOSX "Listen-Fenster X-Pos." optLPOSY "Listen-Fenster Y-Pos." optMPOSX "Karten-Fenster X-Pos." optMPOSY "Karten-Fenster Y-Pos." optRPOSX "Empfnger-Fenster X-Pos." optRPOSY "Empfnger-Fenster Y-Pos." optEPOSX "Fehler-Meldung X-Pos." optEPOSY "Fehler-Meldung Y-Pos." optDPOSX "Dialog-Fenster X-Pos." optDPOSY "Dialog-Fenster Y-Pos." optDPOSRTMAP "Abstand RT/Karten Dialog" optLISTWIDTH "Breite Listen" optLISTHEIGHT "Hhe Listen" optCOLOUR Farben optCOLOUR,fg Vordergrund optCOLOUR,bg Hintergrund optCOLOUR,messbg "Hintergrund Fehlermeldung" optCOLOUR,confbg "Hintergrund Besttigung" optCOLOUR,selbg "Hintergrund Auswahl" optCOLOUR,dialbg "Hintergrund Eingabe" optCOLOUR,offline "Empfnger offline" optCOLOUR,online "Empfnger online" optCOLOUR,check "Auswahlknopf" optCOLOUR,ballbg "Hintergrundfarbe Ballon-Hilfe" optCOLOUR,ballfg "Vordergrundfarbe Ballon-Hilfe" optMAPCOLOUR "Farben in der Karte" optMAPCOLOUR,mapsel "Ausgewhltes Element auf der Karte" optMAPCOLOUR,WP "Wegpunkte auf der Karte" optMAPCOLOUR,RT "Routen auf der Karte" optMAPCOLOUR,mkRT "Route auf der Karte definiert" optMAPCOLOUR,TR "Tracks auf der Karte" optMAPCOLOUR,TP "Track Punkte auf der Karte" optMAPCOLOUR,mapleg "Karten-Legenden" optMAPCOLOUR,anim "Karten-Animation" optMAPCOLOUR,emptygrid "Leeres Bild" optMAPCOLOUR,fullgrid "Bestehendes Bild" opt_Files "Gert & Dateien" optDEFSPORT "Gert" optPERMS "Dateirechte" optPAPERSIZE "Papiergre" red Rot green Grn blue Blau owner Eigentmer permgroup Gruppe others Andere fread Lesen fwrite Schreiben fexec Ausfhren mainwd "Haupt-Fenster" distazim "Entf. u. Richtung" nearestWPs "Nchste WPe" fromto "Von %s nach %s" degrees Grad nameWPDistBear "Entf. und Richtung" nameWPNearest "nchste WPe" inrect "innerh. Rechteck" forthisWP "fr diesen WP" formappedWPs "fr dargest. WPe" group Gruppe element Element insert Einfgen joinGR "Gruppe zusammenfgen" TRtoRT "Umwandlung von TR nach RT" TRRTnpoints "Anzahl der Punkte" TRTRdispl "TR jetzt anzeigen" WP WP RT RT TR TR GR GR commrec "Kommunikation mit Empfnger" abort Abbrechen ACKs ACKs NAKs NAKs packets Pakete unnamed "(unbekannt)" fromTR "Von TR: %s" mapload "Bild Geo-Referenzieren" loadmback Laden savemback "Geo-Ref. Info speichern" chgmback ndern clearmback Lschen backgrnd Hintergr nameMapBkInfo "Hintergrund-Info" mpbkchg "Hintergrund ndern" mpbkgrcs "Gitter-Position" nameImage Bild symbol Symbol SYCATgeneral "Allgemein" SYCATland Land SYCATwater Schiffahrt SYCATaviation Luftfahrt SY1st_aid "Erste Hilfe" SYWP_buoy_white "Boje, wei" SYWP_dot "Punkt" SYairport "Verkehrsflughafen" SYamusement_park "Freizeitpark" SYanchor "Anker" SYavn_danger "Gefahr (Luftfahrt)" SYavn_ndb "ND Funkfeuer" SYball "Ball" SYbeach "Strand" SYbell "Glocke" SYboat "Boot" SYboat_ramp "Slipanlage" SYborder "Grenzbergang" SYbridge "Brcke" SYbuilding "Gebude" SYbuoy_amber "Boje, amber" SYbuoy_black "Boje, schwarz" SYbuoy_blue "Boje, blau" SYbuoy_green "Boje, grn" SYbuoy_green_red "Boje, grn-rot" SYbuoy_green_white "Boje, grn-wei" SYbuoy_orange "Boje, orange" SYbuoy_red "Boje, rot" SYbuoy_red_green "Boje, rot-grn" SYbuoy_red_white "Boje, rot-wei" SYbuoy_violet "Boje, violett" SYbuoy_white "Boje, wei" SYbuoy_white_green "Boje, wei-grn" SYbuoy_white_red "Boje, wei-rot" SYcamping "Campingplatz" SYcapitol_city "Hauptstadt" SYcar "Auto" SYcar_rental "Auto-Verleih" SYcar_repair "Auto-Werkstatt" SYcastle "Burg, Schlo" SYcemetery "Friedhof" SYchapel "Kapelle" SYchurch "Kirche" SYcircle_x "Gekreuztes X" SYcivil "ffentliche Einrichtung" SYcontrolled "Betreten verboten" SYcrossing "Bahnbergang" SYdam "Damm" SYdanger "Gefahr" SYdeer "Jagdgrund" SYdiamond_green "Diamant, grn" SYdiamond_red "Diamant, rot" SYdiver_down_1 "Taucher 1" SYdiver_down_2 "Taucher 2" SYdot "Punkt" SYdrinking_water "Trinkwasser" SYduck "Wassergeflgel" SYelevation "Anhhe" SYexit_no_serv "Anschlustelle" SYexit "Ausfahrt" SYfactory "Fabrik" SYfastfood "Schnellrestaurant" SYfish "Angelplatz" SYfitness "Trimm-Dich-Pfad" SYflag "Flagge" SYfreeway "Hauptstrae" SYfuel "Tankstelle" SYfuel_store "Rasthof" SYgeo_name_land "Landschaft" SYgeo_name_man "Kultur" SYgeo_name_water "Gewsser" SYglider "Segelfluggelnde" SYgolf "Golfplatz" SYheliport "Hubschrauber-Landeplatz" SYhorn "Hupe" SYhouse "Haus" SYice_skating "Eisstadion" SYinfo "Information" SYintersection "Kreuzung" SYis_highway "Bundesstrae" SYknife_fork "Restauration" SYladder "Leiter" SYlanding "Landeplatz" SYlarge_city "Grostadt" SYlarge_exit_ns "Autobahnausfahrt" SYlarge_ramp_int "Autobahnkreuz" SYlevee "Deich" SYlight "Leuchtturm" SYlodging "Unterkunft" SYmany_fish "Fischgrund" SYmany_tracks "Viele Wanderwege" SYmark_x "Markierung, x" SYmedium_city "Stadt" SYmile_marker "Kilometermarkierung" SYmilitary "Militrsttzpunkt" SYmine "Bergwerk" SYMOB "Mann ber Board" SYmonument "Monument" SYmountains "Gebirge" SYmovie "Kino" SYmug "Kaffee & Kuchen" SYntl_highway "Autobahn" SYnull "(transparent)" SYnull_2 "(leer)" SYoil_field "lfeld" SYparachute "Fallschirm" SYparking "Parkplatz" SYpharmacy "Apotheke" SYphone "Telefon" SYpicnic "Liegewiese" SYpizza "Pizzeria" SYpolice "Polizei" SYpost_office "Post" SYprivate "Privatgrund" SYradio_beacon "Funkfeuer" SYramp_int "Anschlustelle" SYrestricted "Sperrgebiet" SYrestrooms "WC" SYRV_park "Freizeit-Fahrgelnde" SYscenic "Aussichtspunkt" SYschool "Schule" SYseaplane "Wasserungs-Stelle" SYshopping_cart "Einkaufen" SYshort_tower "Turm, niedrig" SYshowers "Dusche" SYskiing "Wasserski" SYskull "Totenkopf" SYsmall_city "Kleinstadt" SYsnow_skiing "Ski" SYsoft_field "Grasplatz" SYsquare_green "Rechteck, grn" SYsquare_red "Rechteck, rot" SYst_highway "Landstrae" SYstadium "Stadion" SYstore "Kaufhaus" SYstreet_int "Straenkreuzung" SYsummit "Gipfel" SYswimming "Schwimmbad" SYtake_off "Startplatz" SYtall_tower "Turm, hoch" SYtheater Theater SYtoll Mautstation SYtow_truck "Abschleppwagen" SYtraceback "Rckweg" SYtracks Wanderwege SYtrail_head "Wander-Parkplatz, Ausgangspunkt" SYtree "Baum" SYtruck_stop "Rastplatz" SYtunnel "Tunnel" SYultralight "Ultraleicht-Landeplatz" SYus_highway "Europastrae" SYweight_station "Waage" SYwreck "Wrack" psvisible "Nur sichtbarer Teil" DISPsymbol "nur Symbol" DISPs_name "Symbol & Name" DISPs_comment "Symbol & Kommentar" DISPname "nur Name" DISPcomment "nur Kommentar" dispopt Anzeige mapitems "Zeige Elemente in der Karte" nameIC Icon prod Produkt WPCapac "Wegpunkt-Kapazitt" ICCapac "Icon Kapazitt" RTCapac "Routen-Kapazitt" TRCapac "Track-Kapazitt" protcl "Protokoll" ICGraph "Icon Grafik" WPperRT "Wegpunkte pro Route" notinGR "nicht in (Unter-)Gruppe enthalten" onlyinGR "nur in (unter-)Gruppe enthalten" loadgrels "Lade Elemente" importgrels "Importiere Elemente" about "ber GPSMan..." contrib "Mit Beitrgen von" errorsto "Fehlerberichte an:" obsTRToRT "WPe erzeugt mit TR nach RT Konvertierung" nameLists "Listen" nameData "Daten" MWCmap "Karte" MWClists "Listen" MWCsingle "Einzelnes Fenster" search "Suchen" rmrk "NB" closeto "Benachbart zu" with "Mit" srchres "GEFUNDEN" database "Datenbank" where "Wo" what "Was" list "Liste" distance "Entfernung" fromWP "von Wegpunkt" fromPos "von Position" azimuth "Komparichtung" any "jedes" opening "ffnen" suggested "Vorschlag" another "Anderes" srchdd1 "Suchen nach" srchdd2Data "Alle Elemente" srchdd2GR "Gruppe(n)" from "von" started "beginnend von" transf "Koord. Transf." TRNSFAffine "Affin" TRNSFAffineConf "Affin Konform" TRNSFNoRot "Konform ohne Rotation" projection "Projektion" lat0 "zentrale Breite" long0 "zentrale Lnge" k0 "Skalenfaktor des Zentralmeridians" PRJUTM "UTM/UPS" PRJTM "Transv. Mercatorproj." PRJCMP "Port. Militr-Karte" PRJBNG "Nat. Britisches Gitter" PRJBWI "Britisch West Indies" PRJITM "Irische Transv. Merkator-Proj." PRJGKK "Gau-Krger-Koordinaten" dontaskagain "Ohne Rckfrage" rename "Verwende neuen Namen" oname "Ursprnglicher Name" never "Niemals" ask "Fragen" always "Immer" stage "Etappe" label "Beschriftung" alt "Hhe" optALTUNIT "Hhe" locate "Lokalisieren" animation Animation fast Schnell slow Langsam start Start pause Pause speed Geschwindigkeit centred "zentriert" state Status animinit "zu Beginn/am Ende" animon "laufend" animpause "pausiert" animabort "abgebrochen" dolog Aufzeichnen getlog "Aufzeichnung laden" stop Stopp hide Verdecken show Zeigen posfixerror Fehler restart "Neu starten" mkTR "TR erzeugen" posfixsimul Simul namePVTData "Aufzeichnungsdaten" realtimelog "Echtzeitdaten" simul "Simulator" mkavgWP "Mittel-WP erzeugen" abbrev "Abkrzung" actual "Aktuell" baseproj "Basisprojektion" atprevwp "Vorhergehender WP" here "Hier" chglstrs "Vorhergehenden Zustand bearbeiten" chgnxtrs "Nchsten Zustand bearbeiten" contnend "Zum Ende anfgen" edmap "In der Karte bearbeiten" prevwp "Vorheriger WP" firstwp "Erster WP" fixeddatum "Festes Datum" grid "Gitternetz" lat1 "erster Breitenkreis" lat2 "zweiter Breitenkreis" latF "Ursprung der Breite" longF "Ursprung der Lnge" chgpfrmt "Positions-Format ndern" changegroupsymbol "Symbol ndern" closemenu "Men schliessen" datum "Datum" easting "Rechtswert" northing "Hochwert" feasting "Ordinate des Rechtswertes" fnorthing "Ordinate des Hochwertes" elevation "Hhe" ellpsd "Ellipsoid" inca "Einfgen nach" invert "umkehren" move "Verschieben" open "ffnen" opt_MapGeom "Geometrie der Karte" PRJKKJP "Finisches Basis Gitter" PRJKKJY "Einheitliches Finnisches Gitter" PRJSEG "Schwedisches Gitter" recwindow "Empfnger-Fenster" restart "Neu starten" rtimelogintv "Aufzeichnungs-Intervall" unit "Einheit" use "benutze" userdefs "Nutzerspezifische Definitionen" usewps "Benutze WPe" optSAVESTATE "Bei Beenden Status speichern" optDELSTATE "Nach Wiederherstellen des Status, Dateien lschen" nameMapInfo "Kartenparameter" volume "Volumen" no Nein latS "sdl. Breite" latN "nrdl. Breite" longW "westl. Lnge" longE "stl. Lnge" PRJAPOLY "Amerikanische Polykonische" computations Berechnungen comparea "Berechne Flche" centre Mittelpunkt mkclusters "Erzeuge Cluster" dlat "Wertebereich der Breite" dlong "Wertebereich der Lnge" collcntr "Erzeuge Mittelpunkte..." compclstr "Erzeuge Cluster..." crtgclstrgrs "Erstelle Gruppen..." PRJStereogr "Stereographische Proj." PRJTWG "Taiwan Gitter" chgdatum "Datum ndern" forgetGRcs "GR&Els lschen" renres "Neubenannt" zelev "Z-Mastab" xyelev "XY-Mastab" chggoal "Zum nchsten Ziel wechseln" Ghidden_class Klasse Ghidden_subclass Subklasse Ghidden_lnk_ident "Etappen Id" Ghidden_colour Farbe Ghidden_attrs Attribute Ghidden_depth Tiefe Ghidden_state Staat Ghidden_country Land Ghidden_facility Facility Ghidden_city Stadt Ghidden_addr Adresse Ghidden_int_road "Straenkreuzung" Ghidden_dtyp "Anzeige Option+Typ" Ghidden_ete "ETE" Ghidden_display "Display?" Ghidden_yes ja Ghidden_no nein Ghidden_user Benutzer Ghidden_user_symbol "Benutzer (nur Symbol)" Ghidden_non_user "Nichtbenutzer" Ghidden_avn_airport Flughafen Ghidden_avn_inters "Avn intersection" Ghidden_avn_NDB "NDB" Ghidden_avn_VOR "VOR" Ghidden_avn_airp_rway "Airport runway threshold" Ghidden_avn_airp_int "Airport intersection" Ghidden_avn_airp_NDB "Airport NDB" Ghidden_map_pt "Kartenpunkt" Ghidden_map_area "Karten-Flche" Ghidden_map_int "Karten-Kreuzung" Ghidden_map_addr "Karten-Adresse" Ghidden_map_line "Karten-Linie" Ghidden_locked blockiert Ghidden_default "Vorgabe" Ghidden_black Schwarz Ghidden_white Weiss Ghidden_red Rot Ghidden_dark_red "Dunkelrot" Ghidden_green Grn Ghidden_dark_green "Dunkelgrn" Ghidden_blue Blau Ghidden_dark_blue "Dunkelblau" Ghidden_yellow Gelb Ghidden_dark_yellow "Dark Gelb" Ghidden_magenta Magenta Ghidden_dark_magenta "Dunkles Magenta" Ghidden_cyan Cyan Ghidden_dark_cyan "Dunkles Cyan" Ghidden_light_gray "Hellgrau" Ghidden_dark_gray "Dunkelgrau" Ghidden_line Linie Ghidden_link Etappe Ghidden_net Netz Ghidden_direct Direkt Ghidden_snap Snap numberid "Nummer/Id" hiddendata "Verborgene Daten" cwpsdef "Wieviele Kontroll WPe definieren" nextTP "Nchster TP" generate Erzeugen optSERIALBAUD "Baud Rate" optDEFTRTWIDTH "RT Liniendicke" optDEFTTRWIDTH "TR Liniendicke" width Dicke TRtoTR "TR Vereinfachung" TRlinedispl "Ergebnis jetzt zeigen" obsTRsimpl "TR nach Vereinfachung" simplTRto "Vereinfachen zu" exstglog "Existigerender log" contnsly "fortgesetzt" animate "animieren" animabbrev "anim." noanabbr "nicht anim." notext "kein Text" view "ansehen" sideview "Seitenansicht" persptv "Perspektive" SYgeocache "Geocache" SYgeocache_fnd "Geocache entdeckt" optMAPCOLOUR,trvtrk "TRK Zeiger" optMAPCOLOUR,trvtrn "TRN Zeiger" optMAPCOLOUR,trvcts "CTS Zeiger" optMAPCOLOUR,trvcts2 "2. CTS Zeiger" optMAPCOLOUR,trvvel_z "Hoch/Runter Zeiger" optMAPCOLOUR,trvwrnimportant "Wichtige Warnung (nav)" optMAPCOLOUR,trvwrnnormal "Warnung (nav)" optMAPCOLOUR,trvwrninfo "Information (nav)" travel Reise notravel "Reise unterbrechen" travdisplay "Anzeige konfigurieren" travchgdisplay "Zu Anzeige %s wechseln" travdsetup "Reisenanzeige konfigurieren" navMOB "MOB: Mann ber Bord!" startnav "Navigate" navWP "Zu WP gehen" goback "Zurckgehen" follow "%s folgen" exactly "exakt" fromnrst "vom nhesten Punkt" inrvrs "umgekehrt" forgetgoal "Ziel lschen" suspend "unterbrechen" resume "weiter" TRVfix "Fix" TRVhour "Uhrzeit" TRVspeed "Geschw." TRVpos "Pos" TRValt "Hhe" TRVtrk "TRK" TRVnxtWP "Zu" TRVprvWP "Von" TRVete "ETE" TRVeta "ETA" TRVvmg "VMG" TRVxtk "XTK" TRVcts "CTS" TRVtrn "TRN" TRVvel_z "V Geschw." TRVtrkcts "TRK, CTS" TRVdist "Dist" TRVc_trkcts "TRK/CTS Zeiger" TRVc_trn "TRN Zeiger" TRVc_vel_z "Hoch/runter Zeiger" add "Hinzufgen" addlabelled "Mit Beschriftung hinzufuegen" remove "Lschen" mindist "Ankunftsnhe" chginggoal "Wechsel zum nchsten Ziel" chggoalhlp "Wann von diesem zum\nnchsten Ziel wechseln\nbeim Folgen von RT/TR" soon frh late spt warnings "Warnungen" dowarn "Warnungen ausstellen" warnconf "Warnungen konfigurieren" priority Vorrang high hoch medium mittel low niedrig warnprox "Entfernung zu WP <" warnanchor "Entfernung zu WP >" warnspeed "Geschwindigkeit >" warntrn "TRN (abs)>" warnvspeed "Vertikale Geschwindigkeit" warnxtk "XTK (abs)>" trvhlpbox "Rechte Taste zur Wiederordnung von\nfolgenden Elementen benutzen" trvhlpbxs "Rechte Taste zur Wiederordnung von\nElementen der Liste benutzen" trvwarrv "Ankunft in %s!" trvwleave "Abfahrt von %s!" trvwspeed "Geschwindigkeit > %s!" trvwtrn "TRN > %s!" trvwvspeed "Vert. Geschwindigkeit nicht in [%s,%s]!" trvwxtk "XTK > %s!" trvwnolog "Echtzeitdatenaufnahme ausgeschaltet!" trvwnopos "Keine vorherigen Positionen" trvwuwps "RT hat undefinierte WP(e)" trvwchg "Jetzt nach %s gehend" TP TP drivesim "Fahrsimulator" startfrom "Startpunkt..." outofctrl "Ausser Kontrolle!" right Rechts left Links straight Geradeaus rthlpdsim "Zeigertasten: steuern, Geschwindigkeit ndern\nLeertaste: geradeaus" printopt "Druckoptionen" optPRINTCMD "Druckkommandos" print Drucken prevctr "Vorheriger Mittelpunkt" PRJSOM "Swiss Oblique Mercator" PRJLV03 "Swiss LV03 Grid" PRJIcG "Iceland Grid" PRJRDG "The Netherlands Grid" PRJBMN "sterreichischer Bundesmeldenetz" PRJCTR "Ital. techn. Regionalskarte" optDEFMAPPROJ "Kartenprojektion" optDEFMAPPFRMT "Kartenkoordinaten" optMapGuideVersion "MapGuide-version" UTMzone Zone tfwfile "TFW Datei" newWPatdb "Neuer WP bei..." PRJLamb93 "Lambert 93" PRJLambNTFe "NTF IIet" PRJLambNTF "NTF" NTFzone Zone opinprogr "Ttigkeit im Ablauf" working "In Betrieb" aborted Abgebrochen errwarn "Fehler/Warnung!" SYbiker "Radfahrer" SYbox_blue "Kiste, blau" SYbox_green "Kiste, grn" SYbox_red "Kiste, rot" SYflag_pin_blue "Flagge, blau" SYflag_pin_green "Flagge, grn" SYflag_pin_red "Flagge, rot" SYhouse_2 "Haus 2" SYpin_blue "Nadel, blau" SYpin_green "Nadel, grn" SYpin_red "Nadel, rot" ozimapfile "Ozi Map Datei" info "Information" syhlpbx "Rechte Taste zur Wiederordnung\nvon Elementen der Liste benutzen" optDEFMAPPFDATUM "Kartenkoordinaten Datum" mkgrp "Gruppe erzeugen" dispitems "Aufgezeichnete Elemente" hiditems "Nicht aufgezeichnete Elemente" Ghidden_transparent Transparent Ghidden_temp Temperatur Ghidden_time "Zeit" Ghidden_cat Categorie SYopen_24hr "Geffnet von 0 bis 24" SYbot_cond "Meeresgrund Konditionen" SYbeacon "Leuchtfeuer" SYreef "Riff" SYweedbed "Seegrser" SYdock "Dock" SYmarina "Anlegestelle" SYbait_tackle "Fischkder und Angelzeug" SYstump "Stumpf" SYcntct_ball_cap "Baseballmtze" SYcntct_big_ears "Grosse Ohren" SYcntct_spike "Spike" SYcntct_goatee "Spitzbart" SYcntct_dreads "Zpfe" SYcntct_female1 "Frau 1" SYcntct_female2 "Frau 2" SYcntct_female3 "Frau 3" SYcntct_pirate "Pirat" SYcntct_biker "Radfahrer" SYcntct_alien "Alien" SYcntct_bug "Insekt" SYcntct_cat "Katze" SYcntct_dog "Hund" SYcntct_pig "Schwein" SYhydrant "Hydrant" SYcircle_blue "Kreis, blau" SYcircle_green "Kreis, grn" SYcircle_red "Kreis, rot" SYdiamond_blue "Diamant, blau" SYoval_blue "Oval, blau" SYoval_green "Oval, grn" SYoval_red "Oval, rot" SYrect_blue "Block, blau" SYrect_green "Block, grn" SYrect_red "Block, rot" SYsquare_blue "Rechteck, blau" SYtriangle_blue "Dreieck, blau" SYtriangle_green "Dreieck, grn" SYtriangle_red "Dreieck, rot" SYletter_a_blue "A, blau" SYletter_a_green "A, grn" SYletter_a_red "A, rot" SYletter_b_blue "B, blau" SYletter_b_green "B, grn" SYletter_b_red "B, rot" SYletter_c_blue "C, blau" SYletter_c_green "C, grn" SYletter_c_red "C, rot" SYletter_d_blue "D, blau" SYletter_d_green "D, grn" SYletter_d_red "D, rot" SYnumber_0_blue "0, blau" SYnumber_0_green "0, grn" SYnumber_0_red "0, rot" SYnumber_1_blue "1, blau" SYnumber_1_green "1, grn" SYnumber_1_red "1, rot" SYnumber_2_blue "2, blau" SYnumber_2_green "2, grn" SYnumber_2_red "2, rot" SYnumber_3_blue "3, blau" SYnumber_3_green "3, grn" SYnumber_3_red "3, rot" SYnumber_4_blue "4, blau" SYnumber_4_green "4, grn" SYnumber_4_red "4, rot" SYnumber_5_blue "5, blau" SYnumber_5_green "5, grn" SYnumber_5_red "5, rot" SYnumber_6_blue "6, blau" SYnumber_6_green "6, grn" SYnumber_6_red "6, rot" SYnumber_7_blue "7, blau" SYnumber_7_green "7, grn" SYnumber_7_red "7, rot" SYnumber_8_blue "8, blau" SYnumber_8_green "8, grn" SYnumber_8_red "8, rot" SYnumber_9_blue "9, blau" SYnumber_9_green "9, grn" SYnumber_9_red "9, rot" items "Elemente" syusrmenu "Nutzerdefiniertes Symbolmen" cfgsymenu "Konfigurieren des nutzerdefinierten Symbolmens" insmnb "Untermen vorher einfgen" insmna "Untermen hinterher einfgen" opensbmn "Untermen ffnen" clssbmn "Untermen schliessen" optSUPPORTLAPS "Rundenuntersttzung" LAP RND nameLAP "Runde" duration "Zeitdauer" calrs "Kalorien" getLAP "Empfangen der Runden" optAutoNumRts "Autom. Num. der RTs beim Senden" SYfhs_facility "FHS facility" SYtide_pred_stn "Gezeiten-Strmungsstation" SYanchor_prohib "Ankern verboten" SYcoast_guard "Kstenpolizei" SYdropoff "Dropoff" SYcntct_afro "Afro" SYcntct_ranger "Ranger" numberfrom0 "Zhler auf 1 stellen" fromfile "aus einer Datei" fromdef "von einer Definition" mbaktoload "Zugehriger Hintergrund" none "nichts" opt_Fonts "Schrift" optICONSIZE "Symbolgre" optTRNUMBERINTVL "Zeige TP Info auf der Karte alle" optTRINFO "zu zeigende TP Info" nameAL "Almanach" alm_svid "Satellitnummer" alm_week "Woche" alm_datatime "Datenreferenzzeit" alm_clockc1 "Taktkorrekturkoeffizient s" alm_clockc2 "Taktkorrekturkoeffizient s/s" alm_ecc "Exzentrizitt" alm_sqrta "Quadratwurzel a" alm_mnanom "Mittlere Anomalie" alm_argprgee "Perigumsargument" alm_rightasc "Rektaszension" alm_rtrightasc "Rektaszensionsgeschwindigkeit" alm_inclin "Inklination" alm_health "Gesundheit" lstsqs "Kleinsten Quadrate" lstsqsfile "Kl. Quadrate Datei" totdstng "Gesamte Entfernung, ohne Lcken" tottimeng "Gesamte Zeit, ohne Lcken" SYcross "Fadenkreuz" SYcross_3p "Fadenkreuz 3p" mapfitWPs "WPe-Anpassung in der Karte zeigen" showfitinfo "Anpassungsinformation zeigen" xtcoord "xt" ytcoord "yt" delta "d" residual "rt" rmsxydev "rms(x,y-Abweichungen)" resstderr "Standardfehler der Abweichung" chgdev "Gert wechseln" maxalt "Maximalhhe" minalt "Mindesthhe" alt_cumula "Anstiegssumme" alt_cumuld "Abstiegssumme" optSHOWFILEITEMS "Normalerweise werden gelesene Elemente in der Karte gezeigt" vertgridlines "Gittervertikale" convert "Konvertieren" split "Zerteilen" bysel "an ausgewhlten Punkten" byseg "an Segmenten" openits "%s ffnen" uname "Benutzername" pword "Passwort" remember "Merken" wptotwitter "WP zu Twitter" wptotwitternb "Position, Datum, Hhe, Name und Kommentar von WP zu Twitter mit Etikett #GPSMan #waypoint senden" exportTFW "TFW-Datei exportieren" nametfwfile "TFW-Datei" PRJEOV EOV chgname "Name ndern" clicktoedit "Zum Bearbeiten hier klicken" renamethod "Umbenennungsmethode" operators "Operatoren" keep1st "Erstes Zeichen fixieren" keep1st_hlp "Erstes Zeichen fixieren\nweitere Operatoren arbeiten mit den verbleibenden Zeichen" reset "Reset" reset_hlp "Mit Anfangsnamen neustarten, nderungen werden rckgngig gemacht" case "Gro/Kleinschreibung" case_hlp "Alle Buchstaben in Gro/Kleinschreibung" maxlgth "Max Lnge" maxlgth_hlp "Aktuelle Zeichen werden bis zur angegebenen Lnge gekrzt" inslt "Links einfgen" inslt_hlp "String wird vor dem aktuellen, linken Zeichen eingefgt" insrt "Rechts einfgen" insrt_hlp "String wird am Ende eingefgt" replc "Austausch" replc_hlp "Die Zeichen der ersten String werden durch die\njeweiligen Zeichen der zweiten ausgetauscht" delany "Alle lschen" delany_hlp "Alle Zeichen in der String werden im Namen gelscht" rsub "RegExp Substitution" rsub_hlp "Regulren Ausdruck und Substitutionsspezifikation angeben\nweitere Hinweise in der Anweisungsanleitung" accifnew "Annehmen falls neu" accifnew_hlp "Ergebnis wird angenommen, falls es ein neuer Name ist" guntilnew "Zahl anhngen bis neu" guntilnew_hlp "Alle mglichen Zahlen ausprobieren, bis ein neuer Name gefunden ist" ndigits "Anzahl von Stellen" gennames "Namenerstellung..." rentest_hlp "Aktuelle Methode an gegebenem Namen testen" renmove_hlp "Rechten Knopf zum Zeilenordnung benutzen" tolower "Kleinschreibung" toupper "Groschreibung" applyto "Anwenden auf" forall "alle folgenden" failed "missglckt" selfont "Schrift whlen" default "Vorgegeben" size "Gre" units "Einheiten" points "Punkte" pixels "Pixel" weight "Strke" normal "normal" bold "bold" slant "Neigung" roman "roman" italic "italic" underline "Unterstrichen" overstrike "Durchgestrichen" optDEFAULTFONT "Vorgegebene Schrift" optFIXEDFONT "Monoschrift" optMAPFONT "Kartenschrift" optTRAVELFONT "Schrift der Reisenanzeige" optPLOTFONT "Zeichnungsschrift" plugin "Plug-in" unavailif "Nicht verfgbar, falls" tclcode "Tcl Code" } # the following definitions must be coherent with $TXT array set INVTXT { DMS DMS DMM DMM DDD DDD UTM/UPS UTM/UPS WP WP RT RT TR TR RND LAP GR GR } # changes by Miguel Filgueiras to RM contribution set TXT(srChainage) $TXT(totdst) set TXT(srShowRest) $TXT(gpSRests) set TXT(gpSym) $TXT(symbol) set TXT(srRest) $TXT(gpRest) gpsman-6.4.4.2/gmsrc/projections.tcl0000644000175000017500000015752112224351120015445 0ustar migmig# # This file is part of: # # gpsman --- GPS Manager: a manager for GPS receiver data # # Copyright (c) 1998-2013 Miguel Filgueiras migfilg@t-online.de # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. # # File: projections.tcl # Last change: 6 October 2013 # # Includes contributions by # - Sandor Laky (laky.sandor_AT_freemail.hu) marked "SL contribution" ## some information and algorithms used here adopted from # - libproj 4.6.1, PROJ4.4 and PROJ4.3.3 - cartographic projection software # by Gerald I. Evenden (gie_at_kai.er.usgs.gov) # - Guidance Note Number 7, European Petroleum Survey Group # Revised November 1999 # - Formulas and constants for the calculation of the Swiss conformal # cylindrical projection and for the transformation between coordinate # systems (http://www.swisstopo.ch/pub/data/geo/refsyse.pdf), # September 2001 # - Het stelsel van de Rijksdriehoeksmeting en het European Terrestrial # Reference System 1989 (containing formulas and constants for the # Schreiber projection and the RD grid, used in The Netherlands; # partial English translation kindly provided by Rob Buitenhuis, # geo_AT_btnhs.nl), http://www.rdnap.nl # - "Le carte topografiche CTR ed il loro uso GPS" # (http://www.gpscomefare.com/guide/tutorialgps/mapdatum.htm) # May 2003 (information kindly sent by Alessandro Palmas) # - IGN site (http://www.ign.fr), August 2003: French projections and # grids # - The California Spatial Library (http://www.gis.ca.gov/albers.epl), # October 2003: Teale-Albers projection and grid ## ## some algorithms and formulae adopted from: # - GKK grid conversion by Andreas Lange (Andreas.C.Lange_at_GMX.de) # in GPStrans 0.36 # - Swedish grid conversion by Anders Lennartsson # (anders.lennartsson_at_sto.foa.se) in GPStrans 0.36 ## ## information kindly provided by # - Dan Jacobson (jidanni_at_yahoo.com.tw) on the Taiwan Grid projection # - Alessandro Palmas (alpalmas_at_tin.it) on the French and Austrian grids ## ## "projection" here means the conversion from geodetic position to # planar Cartesian coordinates im meters in the terrain # these coordinates can then be converted to map coordinates by the # transformations defined in maptransf.tcl # # projection procs (direct and inverse) must work with longitude values in # the -179,180 range although they should use internally the equivalent # value in the -359,360 range that is closer to the central or false # longitude (if there is one): # # no changes in the map datum ($Datum) will occur after initialization ## ## when adding new projection procedures these variables must be updated # as well as PRJ$name and parameters (except reserved ones) in files lang*.tcl # see also the comments preceding each procedure for the UTM projection ## set MAPKNOWNPROJS {UTM TM BMN BNG BWI CMP CTR GKK ITM KKJY KKJP SEG TWG LCC1 LCC2 IcG Merc1 Merc2 SphMerc EPSG:3857 CS APOLY Stereogr Schreiber RDG SOM LV03 Lamb93 LambNTFe LambNTF EqCyl EPSG:32663 AEA LEAC TAlbers EOV} # indices of parameters array used for each main projection # index "datum" is also used, but is dealt with in a different way # indices starting with "_" are used for other values whose meanings # are defined in the corresponding proc Proj${proj}ComputeAux array set MAPPROJDATA { UTM {UTMzone m_0} TM {lat0 long0 k0} BMN {bmnlong0 m_0} CTR {ctrlong0 m_0} GKK {gkklong0 m_0} KKJP {kkjplong0 m_0} TWG {twglong0 m_0} LCC1 {lat0 long0 k0 m_e m_a lcc_n lcc_rho0F lcc_sn} LCC2 {lat1 lat2 latF longF m_e m_a lcc_n lcc_rho0F lcc_sn} LambNTF {NTFzone m_e m_a lcc_n lcc_rho0F lcc_sn} AEA {lat1 lat2 lat0 long0 m_e m_a m_0 m_1 m_2 m_3 m_4 m_5} LEAC {lat1 polasp lat0 long0 m_e m_a m_0 m_1 m_2 m_3 m_4 m_5} Merc1 {long0 k0 m_e m_a m_1 m_2 m_3 m_4} Merc2 {lat1 long0 m_e m_a m_1 m_2 m_3 m_4} SphMerc {lat0 long0 m_a} CS {lat0 long0 m_e m_a m_0 m_1 m_2 m_3 m_4 m_5 m_6 m_7 m_8} APOLY {lat0 m_a m_0 m_1 m_2 m_3 m_4 m_5 m_6} Stereogr {lat0 long0 k0 m_a m_e m_0 m_1 m_2 m_3} Schreiber {m_0 m_1 m_2 m_3 m_4 m_5} SOM {lat0 long0 k0 m_e m_0 m_1 m_2 m_3 m_4 m_5 m_6} EOV {} EqCyl {lat0 m_a m_0} } # new types here imply changing proc BadParam in check.tcl # not in use, but defined: lat=MIN,MAX long=MIN,MAX array set MAPPROJDTYPE { lat0 lat lat1 lat lat2 lat latF lat long0 long longF long k0 float>0 bmnlong0 list=10.333333333,13.333333333,16.333333333 ctrlong0 list=9,15 gkklong0 list=0,3,6,9,12,15 kkjplong0 list=21,24,27,30 twglong0 list=115,117,119,121,123,125 UTMzone zone=UTM NTFzone zone=LambNTF polasp list:north,south lcc_n reserved lcc_rho0F reserved lcc_sn reserved m_e reserved m_a reserved m_0 reserved m_1 reserved m_2 reserved m_3 reserved m_4 reserved m_5 reserved m_6 reserved m_7 reserved m_8 reserved } # projections needing auxiliary parameters computed from the main ones # a specific proc is needed to compute the auxiliary parameters # (see, e.g., proc ProjLCC1ComputeAux) set MAPPROJAUX {UTM LCC1 LCC2 Merc1 Merc2 SphMerc CS APOLY Stereogr Schreiber SOM AEA LEAC EqCyl} # auxiliary parameters depend on datum? array set MAPPROJDEPDATUM { UTM 0 LCC1 1 LCC2 1 Merc1 1 Merc2 1 SphMerc 1 CS 1 APOLY 1 Stereogr 1 SOM 1 Schreiber 0 LambNTF 1 AEA 1 LEAC 1 EqCyl 1 } # main projections admitting particular cases set MAINPROJS {TM LCC1 LCC2 Merc1 Merc2 SphMerc CS APOLY Stereogr SOM AEA LEAC EqCyl} # parameters for special cases of Transverse Mercator: # prefix of long0 parameter name, minimum and maximum values for # central longitude, longitude range in each zone, scale factor array set TMPARAM { BMN {bmn 10.333333333 16.333333333 3 1} CTR {ctr 9 15 6 0.9996} GKK {gkk 0 15 3 1} KKJP {kkjp 21 30 3 1} TWG {twg 115 125 2 0.9999} } # parameters for the zones of Lambert NTF projection (LCC2) # longitude of false origin, list of zones aligned with pairs # of extreme zone latitudes and longitudes, for each zone # false easting and false northing array set LNTFPARAMS { longF 2.33720833333333333333 zones {I II III IV} extrlats {48.15 51.3 45.45 48.15 42.3 45.45 41 42.5} extrlongs {-6 10 -6 10 -6 10 8 10} fen,I {600000 200000} fen,II {600000 200000} fen,III {600000 200000} fen,IV {234.358 185861.369} } # pre-computed parameters for each zone of Lambert NTF projection (LCC2) array set LNTFzI { NTFzone I lat1 50.3959116667 lat2 48.5985227778 longF 2.33720833333 latF 49.5 datum {NTF (Nouvelle Triangulation de France)} lcc_rho0F 5457616.6655 lcc_sn 1 m_a 11603796.7976 m_e 0.0824834000442 lcc_n 0.760405965438 } array set LNTFzII { NTFzone II lat1 45.8989188889 lat2 47.6960144444 longF 2.33720833333 latF 46.8 datum {NTF (Nouvelle Triangulation de France)} lcc_rho0F 5999695.76018 lcc_sn 1 m_a 11745793.2222 m_e 0.0824834000442 lcc_n 0.72896862668 } array set LNTFzIII { NTFzone III lat1 43.1992913889 lat2 44.9960938889 longF 2.33720833333 latF 44.1 datum {NTF (Nouvelle Triangulation de France)} lcc_rho0F 6591905.05462 lcc_sn 1 m_a 11947992.3451 m_e 0.0824834000442 lcc_n 0.695912797771 } array set LNTFzIV { NTFzone IV lat1 41.5603877778 lat2 42.0000593542 longF 2.33720833333 latF 42.165 datum {NTF (Nouvelle Triangulation de France)} lcc_rho0F 7106637.87866 lcc_sn 1 m_a 12178813.9766 m_e 0.0824834000442 lcc_n 0.666276778805 } # particular cases of main projections: # BNG - used for the British National Grid # BWI - used for the British West Indies Grid # CMP - used in Portuguese Military Maps # EOV - used for the Hungarian National Grid # EPSG:3857 - used by OpenStreetMap, Nasa landsat, Yahoo, Google Maps... # also known as EPSG:900913, EPSG:102113 # EPSG:32663 - Plate Carree with WGS 84 datum # IcG - used for the Iceland Grid # ITM - used for the Irish TM Grid # KKJY - used for the Uniform Finnish Grid # Lamb93 - used in the new French geodetic system RGF93 # LambNTFe - used for the French grid NTF II etendue # LV03 - used for the Swiss grid in the LV03 frame # RDG - used for the Netherlands Grid # SEG - used for the Swedish Grid # TAlbers - used for the Teale Albers grid (California, USA) array set MAPPARTPROJ { CMP TM BNG TM BWI TM EOV EOV EPSG:3857 SphMerc EPSG:32663 EqCyl IcG LCC2 ITM TM KKJY TM Lamb93 LCC2 LambNTFe LCC2 LV03 SOM RDG Schreiber SEG TM TAlbers AEA } # parameters aligned with MAPPROJDATA above array set MAPPARTPDATA { BNG {49.0 -2.0 0.9996012717} BWI {0 -62.0 0.9995} CMP {39.66666666666667 -8.13190611111111 1} EOV {} EPSG:3857 {0 0} EPSG:32663 {0} IcG {64.75 64.25 65 -19} ITM {53.5 -8.0 1.000035} KKJY {0 27.0 1} Lamb93 {44.0 49.0 46.5 3.0} LambNTFe {45.8989188888888888889 47.69601444444444444444 46.8 2.33720833333333333333} LV03 {46.9524055556 7.43958333333 1} RDG {} SEG {0 15.808277777778 1} TAlbers {34.0 40.5 0 -120.0} } # projections and known grids array set GRIDFOR { AEA UTM/UPS APOLY UTM/UPS BMN BMN BNG BNG BWI BWI CMP CMP CS UTM/UPS CTR CTR EOV EOV EPSG:3857 UTM/UPS EPSG:32663 UTM/UPS EqCyl UTM/UPS GKK GKK IcG IcG ITM ITM KKJY KKJY KKJP KKJP Lamb93 Lamb93 LambNTF LambNTF LambNTFe LambNTFe LCC1 UTM/UPS LCC2 UTM/UPS LEAC UTM/UPS LV03 LV03 Merc1 UTM/UPS Merc2 UTM/UPS RDG RDG SEG SEG Schreiber RDG SOM UTM/UPS SphMerc UTM/UPS Stereogr UTM/UPS TAlbers TAlbers TM UTM/UPS TWG TWG UTM UTM/UPS } # grids with no zones array set GRIDDEF { BWI {BWI 400000 0 KM {0 1e6 0 1e6} {0 10 -66 -55}} CMP {CMP 200000 300000 KM {64e3 368e3 0 580e3} {36.95 42.17 -9.66 -6.08} Lisboa} EOV {EOV 650000 200000 KM {400e3 950e3 0 400e3} {45 49 16 23} {Hungarian Datum 1972}} IcG {IcG 500000 500000 KM {0 1e6 0 1e6} {63.5 65 -30 -10} {WGS 84}} Lamb93 {Lamb93 700000 6600000 KM {0 1e10 0 1e10} {41 52 -6 11} {WGS 84}} LambNTFe {LambNTFe 600000 2200000 KM {0 1e10 0 1e10} {41 52 -6 11} {NTF (Nouvelle Triangulation de France)}} LV03 {LV03 600000 200000 KM {0 1e6 0 1e6} {45 48 6 11} CH-1903} RDG {RDG 155000 463000 KM {0 29e4 29e4 63e4} {50.3 53.45 3 7.45} {Rijks Driehoeksmeting}} SEG {SEG 1500000 0 KM {12e5 19e5 61e5 77e5} {54 70 10 26}} TAlbers {TAlbers 0 -4000000 KM {-1.5e6 1.5e6 -1.5e6 1.5e6} {25 45 -130 -110} {NAD27 CONUS}} } # zones of grids (regular expressions to recognize valid zones) # UTM is added below after use of this array in colecting the grid # names array set GRIDZN { BMN {^M((28)|(31)|(34))$} BNG {^([A-H]|[J-Z])([A-H]|[J-Z])$} CTR {^[1-2]$} GKK {^[0-5]$} ITM {^[A-H]|[J-Z]$} KKJY {^27E$} KKJP {^[1-4]$} LambNTF {^I(I|II|V)?$} TWG {^[1-6]$} } # position formats; $GRIDS may change dynamically # type for grids set below and in proc SetUpNZGrid # x,y indices set only for numeric formats array set POSTYPE { DDD latlong DDD,xyixs {1 0} DMS latlong DMM latlong GRA latlong GRA,xyixs {3 2} UTM/UPS utm UTM/UPS,xyixs {4 5} MH mh } # non-numeric position formats set NNUMPFORMATS {DMM DMS MH} set PFORMATS "" foreach f [set NONGRIDFMTS {DMS DMM DDD GRA UTM/UPS MH}] { lappend PFORMATS $TXT($f) # but UTM/UPS is set to 1 below set ZGRID($f) 0 } set GRIDS [lsort [concat [array names GRIDZN] [array names GRIDDEF]]] set PFORMATS [concat $PFORMATS $GRIDS] # must be here, after computing $GRIDS # there is a redundancy here: UTM for the projection and UTM/UPS for # the position format... array set GRIDZN { UTM {^([0-5]?[0-9]|60)[A-HJ-NP-Z]$} UTM/UPS {^([0-5]?[0-9]|60)[A-HJ-NP-Z]$} } # initialize projection and grid information set ZGRID(UTM/UPS) 1 set TXT(PRJUTM/UPS) $TXT(UTM/UPS) foreach g [array names TMPARAM] { # central longitude parameter set TXT([lindex $TMPARAM($g) 0]long0) $TXT(long0) } ## grids foreach g $GRIDS { # all grids named as they should appear in TXT set TXT($g) $g ; set INVTXT($g) $g # grid has more than 1 zone (see SetUpNZGrid for those that do not) set ZGRID($g) 1 set POSTYPE($g) grid ; set POSTYPE($g,xyixs) {3 4} # at present, all grids with >1 zone with fixed datum must be given # after this foreach set GRD${g}(datum) "" } # all grids with >1 zone with fixed datum must be given here! foreach g {BMN BNG ITM LambNTF} \ d {"Austrian (MGI)" "Ord Srvy Grt Britn" "Ireland 1965" "NTF (Nouvelle Triangulation de France)"} { set GRD${g}(datum) $d } proc SetUpNZGrids {} { # initialize grids with no zones defined in array GRIDDEF global GRIDDEF foreach g [array names GRIDDEF] { SetUPNZGrid $g $GRIDDEF($g) } return } proc SetUPNZGrid {gr params} { # initialize grid with no zones # $params is list of values as in array GRIDDEF global ZGRID GRIDZN MAPPROJAUX MAPPROJDEPDATUM MAPPARTPROJ MESS \ DSCALEFOR GRD$gr POSTYPE set ZGRID($gr) 0 ; set GRIDZN($gr) {} set POSTYPE($gr) nzgrid ; set POSTYPE($gr,xyixs) {2 3} if { [llength $params] < 6 } { BUG bad params for SetUPNZGrid } foreach "proj fe fn unit xybounds llbounds datum" $params {} if { $datum == "" } { set fixdatum 0 if { [lsearch -exact $MAPPROJAUX $proj] != -1 && \ $MAPPROJDEPDATUM($proj) } { GMMessage [format $MESS(gridneedsdatum) $TXT($proj)] set datum "WGS 84" ; set fixdatum 1 } } else { set fixdatum 1 } ProjInitPart $proj GRD$gr $datum set GRD${gr}(_proj) $MAPPARTPROJ($proj) foreach f "fe fn" { set GRD${gr}(_$f) [set $f] } set GRD${gr}(_unit) $unit # scale factor to get metre from user unit set GRD${gr}(_uscale) \ [expr 1000.0*$DSCALEFOR(sub,$unit)/$DSCALEFOR($unit)] foreach f "xmin xmax ymin ymax" b $xybounds { set GRD${gr}(_$f) $b } foreach f "lamin lamax lomin lomax" b $llbounds { set GRD${gr}(_$f) $b } if { $fixdatum } { set GRD${gr}(datum) $datum } return } proc DegreesToNZGrid {grid latd longd datum} { # convert lat/long in signed degrees to coordinates in no-zone grid # return "-- 0" on error global GRD$grid if { $latd < [set GRD${grid}(_lamin)] || \ $latd > [set GRD${grid}(_lamax)] || \ $longd < [set GRD${grid}(_lomin)] || \ $longd > [set GRD${grid}(_lomax)] } { return "-- 0" } set proj [set GRD${grid}(_proj)] if { [set GRD${grid}(datum)] == "" } { set GRD${grid}(datum) $datum set nodatum 1 } else { set nodatum 0 } set p [Proj${proj}Point GRD$grid $latd $longd $datum] if { $nodatum } { set GRD${grid}(datum) "" } set s [set GRD${grid}(_uscale)] set x [expr int(round(1.0*[lindex $p 0]/$s+[set GRD${grid}(_fe)]))] set y [expr int(round(1.0*[lindex $p 1]/$s+[set GRD${grid}(_fn)]))] if { $x < [set GRD${grid}(_xmin)] || \ $x > [set GRD${grid}(_xmax)] || \ $y < [set GRD${grid}(_ymin)] || \ $y > [set GRD${grid}(_ymax)] } { return "-- 0" } return [list $x $y] } proc GridToDegrees {grid zone x y datum} { # convert grid coords to lat/long in signed degrees # return 0 on error, -1 if $datum is not that of $grid, # otherwise list with lat and long global ZGRID GRD$grid if { $ZGRID($grid) } { return [${grid}ToDegrees $zone $x $y $datum] } # no-zone grid if { $x < [set GRD${grid}(_xmin)] || \ $x > [set GRD${grid}(_xmax)] || \ $y < [set GRD${grid}(_ymin)] || \ $y > [set GRD${grid}(_ymax)] } { return 0 } set s [set GRD${grid}(_uscale)] set x [expr $s*($x-[set GRD${grid}(_fe)])] set y [expr $s*($y-[set GRD${grid}(_fn)])] if { [set gdatum [set GRD${grid}(datum)]] == "" } { set GRD${grid}(datum) $datum set nodatum 1 } elseif { $gdatum != $datum } { return -1 } else { set nodatum 0 } set proj [set GRD${grid}(_proj)] set p [Proj${proj}Invert GRD$grid $x $y] if { $nodatum } { set GRD${grid}(datum) "" } set latd [lindex $p 0] ; set longd [lindex $p 1] if { $latd < [set GRD${grid}(_lamin)] || \ $latd > [set GRD${grid}(_lamax)] || \ $longd < [set GRD${grid}(_lomin)] || \ $longd > [set GRD${grid}(_lomax)] } { return 0 } return $p } proc GridDatum {grid args} { # return datum needed by grid, or first element of $args if none global GRD$grid if { [set d [set GRD${grid}(datum)]] == "" } { return [lindex $args 0] } return $d } ## grids having zones # UTM grid (see also posncomp.tcl) proc CompUTMOnZone {lat long longz} { # UTM/UPS position representation of position with lat/long signed degrees # on zone containing meridian with longitude $longz (signed degrees) global UTMlat0 UTMk0 Datum if { $lat>=-80 && $lat<=84 } { set long0 [expr 6*int(floor($longz/6.0))+3] set cs [ConvToTM $lat $long $UTMlat0 $long0 $UTMk0 $Datum] set x [expr int(5e5+[lindex $cs 0])] ; set y [lindex $cs 1] if { $lat < 0 } { set y [expr int(1e7+$y)] } return [list $x $y] } return [ConvToUPS $lat $long $Datum] } # BMN, CTR, GKK, basic KKJ, and Taiwan grid coordinates proc DegreesToBMN {lat long datum} { # convert from lat/long in signed degrees to Austrian BMN grid coords # zone codes: M28, M31, M34 if { $long < 8.833333333 || $long > 17.833333333 || $lat < 0 } { return "-- 0 0" } set z [expr int(($long-8.833333333)/3)] set fe [expr 150000+300000*$z] set long0 [expr 10.833333333+3*$z] set cs [ConvToTM $lat $long 0 $long0 1 $datum] if { [set x [expr round([lindex $cs 0]+$fe)]] < 0 || \ [set y [expr round([lindex $cs 1])]] < 0 } { return "-- 0 0" } return [list M[expr $z*3+28] $x $y] } proc BMNToDegrees {zone x y datum} { # convert from Austrian BMN grid coords to lat/long in signed degrees global GRIDZN if { $x < 0 || $y < 0 || $x > 6e6 || $y > 1e7 || \ ! [regexp $GRIDZN(BMN) $zone] } { return 0 } set z [expr ([string range $zone 1 2]-28)/3] set fe [expr 150000+300000*$z] set long0 [expr 10.833333333+3*$z] return [ConvFromTM [expr $x-$fe] $y 0 $long0 1 $datum] } proc DegreesToCTR {lat long datum} { # convert from lat/long in signed degrees to Italian CTR grid coords # zone codes: 1-2 if { $long < 6 || $long > 18 || $lat < 0 } { return "-- 0 0" } if { [set z [expr int(($long-6)/6)+1]] == 1 } { set fe 150e4 } else { set fe 252e4 } set long0 [expr 3+6*$z] set cs [ConvToTM $lat $long 0 $long0 0.9996 $datum] if { [set x [expr round([lindex $cs 0]+$fe)]] < 0 || \ [set y [expr round([lindex $cs 1])]] < 0 } { return "-- 0 0" } return [list $z $x $y] } proc CTRToDegrees {zone x y datum} { # convert from Italian CTR grid coords to lat/long in signed degrees global GRIDZN if { $x < 0 || $y < 0 || $x > 6e6 || $y > 1e7 || \ ! [regexp $GRIDZN(CTR) $zone] } { return 0 } if { $z == 1 } { set fe 150e4 } else { set fe 252e4 } set long0 [expr 3+6*$z] return [ConvFromTM [expr $x-$fe] $y 0 $long0 0.9996 $datum] } proc DegreesToGKK {lat long datum} { # convert from lat/long in signed degrees to German Krueger grid coords # zone codes: 0-5 if { $long < -1.5 || $long > 16.5 || $lat < 0 } { return "-- 0 0" } set z [expr int(($long+1.5)/3)] set long0 [expr 3.0*$z] set cs [ConvToTM $lat $long 0 $long0 1.0 $datum] if { [set x [expr round([lindex $cs 0]+5e5+1e6*$z)]] < 0 || \ [set y [expr round([lindex $cs 1])]] < 0 } { return "-- 0 0" } return [list $z $x $y] } proc GKKToDegrees {zone x y datum} { # convert from German Krueger grid coords to lat/long in signed degrees global GRIDZN if { $x < 0 || $y < 0 || $x > 6e6 || $y > 1e7 || \ ! [regexp $GRIDZN(GKK) $zone] } { return 0 } set long0 [expr 3.0*$zone] set x [expr $x-5e5-1e6*$zone] return [ConvFromTM $x $y 0 $long0 1.0 $datum] } proc DegreesToKKJP {lat long datum} { # convert from lat/long in signed degrees to basic Finnish grid coords # zone codes: 1-4 if { $long < 19.5 || $long > 31.5 || $lat < 0 } { return "-- 0 0" } set z [expr int(($long-16.5)/3)] set long0 [expr 3.0*$z+18] set cs [ConvToTM $lat $long 0 $long0 1.0 $datum] if { [set x [expr round([lindex $cs 0]+5e5+1e6*$z)]] < 0 || \ [set y [expr round([lindex $cs 1])]] < 0 } { return "-- 0 0" } return [list $z $x $y] } proc KKJPToDegrees {zone x y datum} { # convert from basic Finnish grid coords to lat/long in signed degrees global GRIDZN if { $x < 0 || $y < 0 || $x > 5e6 || $y > 1e7 || \ ! [regexp $GRIDZN(KKJP) $zone] } { return 0 } set long0 [expr 3.0*$zone+18] set x [expr $x-5e5-1e6*$zone] return [ConvFromTM $x $y 0 $long0 1.0 $datum] } proc DegreesToTWG {lat long datum} { # convert from lat/long in signed degrees to Taiwan grid coords # zone codes: 1-6 if { $long < 114 || $long > 126 || $lat < 0 } { return "-- 0 0" } set z [expr int(($long-114)/2)+1] set long0 [expr 2.0*$z+113] set cs [ConvToTM $lat $long 0 $long0 0.9999 $datum] if { [set x [expr round([lindex $cs 0]+25e4)]] < 0 || \ [set y [expr round([lindex $cs 1])]] < 0 } { return "-- 0 0" } return [list $z $x $y] } proc TWGToDegrees {zone x y datum} { # convert from Taiwan grid coords to lat/long in signed degrees global GRIDZN if { $x < 0 || $y < 0 || $x > 5e6 || $y > 1e7 || \ ! [regexp $GRIDZN(TWG) $zone] } { return 0 } set long0 [expr 2.0*$zone+113] set x [expr $x-25e4] return [ConvFromTM $x $y 0 $long0 0.9999 $datum] } # Lambert NTF grid coordinates proc DegreesToLambNTF {lat long datum} { # convert from lat/long in signed degrees to French Lambert NTF grid coords # zone codes: I, II, III, IV global LNTFPARAMS set projdatum "NTF (Nouvelle Triangulation de France)" if { $datum != $projdatum } { foreach "lat long" \ [ToDatum $lat $long $datum $projdatum] { break } } set zone "--" foreach z $LNTFPARAMS(zones) "lamin lamax" $LNTFPARAMS(extrlats) \ "lomin lomax" $LNTFPARAMS(extrlongs) { if { $lamin <= $lat && $lat <= $lamax && $lomin <= $long && \ $long <= $lomax } { set zone $z ; break } } if { $zone == "--" } { return "-- 0 0" } foreach "x y" [ProjLCC2Point LNTFz$zone $lat $long $projdatum] {} foreach "fe fn" $LNTFPARAMS(fen,$zone) {} return [list $zone [expr round($x+$fe)] [expr round($y+$fn)]] } proc LambNTFToDegrees {zone x y datum} { # convert from French NTF grid coords to lat/long in signed degrees global GRIDZN LNTFPARAMS if { $x < 0 || $y < 0 || $x > 1e6 || $y > 1e6 || \ ! [regexp $GRIDZN(LambNTF) $zone] } { return 0 } foreach "fe fn" $LNTFPARAMS(fen,$zone) {} set p [ProjLCC2Invert LNTFz$zone [expr $x-$fe] [expr $y-$fn]] set projdatum "NTF (Nouvelle Triangulation de France)" if { $datum != $projdatum } { set p [ToDatum [lindex $p 0] [lindex $p 1] $projdatum $datum] } return $p } ## Maidenhead locators set MHCHARS ABCDEFGHIJKLMNOPQRSTUVWX proc DegreesToMHLoc {latd longd} { # convert from lat/long in signed degrees to Maidenhead locator # (6 characters) global MHCHARS set longd [expr $longd+180] ; set latd [expr $latd+90] set k [expr int(floor($longd/20))] ; set c1 [string index $MHCHARS $k] set longd [expr $longd-$k*20] set k [expr int(floor($latd/10))] set c2 [string index $MHCHARS $k] set latd [expr $latd-$k*10] set c3 [expr int(floor($longd/2))] set longd [expr $longd-$c3*2] set c4 [expr int(floor($latd))] set latd [expr $latd-$c4] set c5 [string index $MHCHARS [expr int(floor(($longd*60)/5))]] set c6 [string index $MHCHARS [expr int(floor(($latd*60)/2.5))]] return ${c1}${c2}${c3}${c4}${c5}${c6} } proc MHLocToDegrees {mhl} { # convert from Maidenhead locator (6 characters) to degrees global MHCHARS foreach i "0 1 2 3 4 5" { set c$i [string index $mhl $i] } set longd [expr 20*[string first $c0 $MHCHARS]+2*$c2+ \ 5*[string first $c4 $MHCHARS]/60.0-180] set latd [expr 10*[string first $c1 $MHCHARS]+$c3+ \ 2.5*[string first $c5 $MHCHARS]/60.0-90] return [list $latd $longd] } ## user-defined projections and grids proc DefineProjection {} { # set-up a user-defined case of a main projection global MAINPROJS MAPKNOWNPROJS MAPPROJDATA MAPPROJDTYPE MAPPARTPDATA \ MAPPARTPROJ GRIDFOR UPName UPAbbrev UPData UProjs TXT MESS catch {unset UPData} ; catch {unset UPName} ; catch {unset UPAbbrev} set nps "" foreach mp $MAINPROJS { lappend nps $TXT(PRJ$mp) } while 1 { set mp [GMChooseFrom single $TXT(baseproj) 20 $nps $MAINPROJS \ "UPName UPAbbrev" [list "=$TXT(name)" "=$TXT(abbrev)"]] if { $mp == "" } { return } if { [ProjNamesOk] } { break } } foreach e $MAPPROJDATA($mp) { if { $MAPPROJDTYPE($e) != "reserved" } { set UPData($e) "" } } set UPData(_grid) $GRIDFOR($mp) set UPData(_abbr) $UPAbbrev set UPData(datum) "" if { ! [ProjParams define $mp UPData] } { return } lappend UProjs $UPAbbrev ; lappend MAPKNOWNPROJS $UPAbbrev set MAPPARTPROJ($UPAbbrev) $mp set TXT(PRJ$UPAbbrev) $UPName set vals "" foreach e $MAPPROJDATA($mp) { if { $MAPPROJDTYPE($e) != "reserved" } { lappend vals $UPData($e) } } set MAPPARTPDATA($UPAbbrev) $vals if { [set GRIDFOR($UPAbbrev) $UPData(_grid)] == $UPAbbrev } { SetUPNZGrid $UPAbbrev $UPData(_gparams) AddUserGrid $UPAbbrev } SaveUserProjsGrids return } proc ProjNamesOk {} { # check that projection name and abbreviation in $UPName and $UPAbbrev # are acceptable global UPName UPAbbrev MAPKNOWNPROJS TXT MESS if { $UPName == "" || $UPAbbrev == "" } { GMMessage $MESS(projnameabbr) ; return 0 } elseif { [regexp {[ ]} $UPAbbrev] } { GMMessage $MESS(abbrevhasspaces) ; return 0 } elseif { [lsearch -exact $MAPKNOWNPROJS $UPAbbrev] != -1 } { GMMessage $MESS(abbrevinuse) ; return 0 } else { foreach p $MAPKNOWNPROJS { if { $TXT(PRJ$p) == $UPName } { GMMessage $MESS(nameinuse) ; return 0 } } } return 1 } proc OpenUserProjection {proj} { # edit user-defined projection global MAPKNOWNPROJS MAPPROJDATA MAPPROJDTYPE MAPPARTPROJ MAPPARTPDATA \ GRIDFOR ZGRID MapProjection UPData UProjs TXT MESS MapPFormat \ UPName UPAbbrev catch {unset UPData} set mp $MAPPARTPROJ($proj) foreach e $MAPPROJDATA($mp) v $MAPPARTPDATA($proj) { if { $MAPPROJDTYPE($e) != "reserved" } { set UPData($e) $v } } set gr $GRIDFOR($proj) if { $ZGRID($gr) } { set UPData(datum) "" } else { global GRD$gr set UPData(datum) [set GRD${gr}(datum)] } set UPData(_grid) $gr set UPData(_abbr) $proj if { $MapProjection == $proj } { GMMessage $MESS(projinuse) ProjParams edit $mp UPData return } set grinuse 0 if { $gr == $proj } { set selfgrid 1 ; set lp "" foreach p [array names GRIDFOR] { if { $GRIDFOR($p) == $proj && $p != $proj } { lappend lp $p ; set grinuse 1 } } if { $MapPFormat == $gr } { lappend lp $TXT(nameMap) ; set grinuse 1 } if { $grinuse && ! \ [GMConfirm [format $MESS(gridinuse) $lp]] } { return } } else { set selfgrid 0 } if { [set op [ProjParams edit $mp UPData]] == 0 } { return } if { $op == 2 } { # create new projection set proj $UPAbbrev set projname $UPName set grinuse 0 } set nogrid [string compare $UPData(_grid) $proj] if { $grinuse && ($op == -1 || $nogrid) } { GMMessage [format $MESS(gridinusenochg) $lp] return } switch -- $op { 1 { # save new parameters set vals "" foreach e $MAPPROJDATA($mp) { if { $MAPPROJDTYPE($e) != "reserved" } { lappend vals $UPData($e) } } set MAPPARTPDATA($proj) $vals set GRIDFOR($proj) $UPData(_grid) if { ! $nogrid } { SetUPNZGrid $proj $UPData(_gparams) if { ! $selfgrid } { AddUserGrid $proj } } elseif { $selfgrid } { ForgetUserGrid $proj } } 2 { # create new lappend UProjs $UPAbbrev ; lappend MAPKNOWNPROJS $UPAbbrev set MAPPARTPROJ($UPAbbrev) $mp set TXT(PRJ$UPAbbrev) $UPName set vals "" foreach e $MAPPROJDATA($mp) { if { $MAPPROJDTYPE($e) != "reserved" } { lappend vals $UPData($e) } } set MAPPARTPDATA($UPAbbrev) $vals if { [set GRIDFOR($UPAbbrev) $UPData(_grid)] == $UPAbbrev } { SetUPNZGrid $UPAbbrev $UPData(_gparams) AddUserGrid $UPAbbrev } SaveUserProjsGrids } -1 { # forget projection set UProjs [Delete $UProjs $proj] set MAPKNOWNPROJS [Delete $MAPKNOWNPROJS $proj] if { $selfgrid } { ForgetUserGrid $proj } unset MAPPARTPROJ($proj) unset TXT(PRJ$proj) unset MAPPARTPDATA($proj) unset GRIDFOR($proj) } } SaveUserProjsGrids return } proc AddUserGrid {grid} { # add user grid to list of known grids global GRIDS PFORMATS TXT INVTXT POSTYPE set TXT($grid) $grid ; set INVTXT($grid) $grid set GRIDS [lsort [linsert $GRIDS 0 $grid]] set PFORMATS [concat [list $TXT(DMS) $TXT(DMM) $TXT(DDD) $TXT(UTM/UPS)] \ $GRIDS] set POSTYPE($grid) nzgrid ; set POSTYPE($grid,xyixs) {2 3} return } proc ForgetUserGrid {grid} { # delet user grid from list of known grids global GRIDS PFORMATS TXT INVTXT GRD$grid unset TXT($grid) ; unset INVTXT($grid) set GRIDS [Delete $GRIDS $grid] set PFORMATS [Delete $PFORMATS $grid] unset GRD$grid return } proc SaveUserProjsGrids {} { # save user-defined projections and grids global UFile UProjs MAPPARTPROJ MAPPARTPDATA GRIDFOR ZGRID TXT INVTXT \ MESS if { [catch {set f [open $UFile(proj,grid) w]}] } { GMMessage $MESS(cantwrtprgr) return } puts $f "" puts $f "# $MESS(written) GPSMan [NowTZ]" puts $f "# $MESS(editrisk)" puts $f "" puts $f "set UProjs \{$UProjs\}" puts $f "" foreach p $UProjs { puts $f "set MAPPARTPROJ($p) $MAPPARTPROJ($p)" puts $f "set MAPPARTPDATA($p) \{$MAPPARTPDATA($p)\}" puts $f "set GRIDFOR($p) $GRIDFOR($p)" puts $f "set TXT(PRJ$p) \"$TXT(PRJ$p)\"" if { $GRIDFOR($p) == $p } { global GRD$p puts $f "global GRD$p" puts $f "array set GRD$p \{" foreach a [array names GRD$p] { puts $f " $a \"[set GRD${p}($a)]\"" } puts $f "\}" puts $f "AddUserGrid $p" puts $f "set ZGRID($p) 0" } puts $f "" } if { $UProjs != "" } { puts $f "set MAPKNOWNPROJS \[concat \$MAPKNOWNPROJS \$UProjs\]" puts $f "" } close $f return } proc SetupUserProjs {} { # process information on user-defined projections and grids global UFile UProjs MAPKNOWNPROJS MAPPARTPROJ MAPPARTPDATA GRIDFOR \ ZGRID TXT INVTXT MESS # assumed to be in system encoding source $UFile(proj,grid) # check for multiple entries in $MAPKNOWNPROJS set l $MAPKNOWNPROJS ; set MAPKNOWNPROJS "" while { $l != "" } { set p [lindex $l 0] ; set l [lreplace $l 0 0] if { [set i [lsearch -exact $l $p]] != -1 } { GMMessage [format $MESS(redefproj) $TXT(PRJ$p)] set l [lreplace $l $i $i] while { [set i [lsearch -exact $l $p]] != -1 } { set l [lreplace $l $i $i] } } lappend MAPKNOWNPROJS $p } return } ## changing, defining and editing parameters proc ProjParams {how proj data} { # open dialog for defining or confirming the projection parameters # $how in {set, change, define, edit} # $proj in $MAPKNOWNPROJS is # set, change: projection whose parameters must be set or may be changed # define, edit: main projection, a particular case of which is # being defined or edited # $data is name of global array with projection parameters # if $how==change may turn ASKPROJPARAMS to false in current session # return 1 if there were changes or the parameters were defined; # 0 if there were no changes or the operation was cancelled; # -1 if the projection is to be forgotten, when editing; # 2 if a new projection is to be created, when editing, with # name and abbreviation given by $UPName and $UPAbbrev global $data MAPPROJDATA MAPPROJDTYPE GRIDS TXT MESS COLOUR ASKPROJPARAMS \ EPOSX EPOSY ProjRes Param DLUNIT DISTUNIT Datum MAPPROJAUX \ MAPPROJDEPDATUM MAPPARTPROJ UPName UPAbbrev catch {unset Param} GMToplevel .proj projection +$EPOSX+$EPOSY {} \ {WM_DELETE_WINDOW {set ProjRes ok}} \ { {set ProjRes ok}} frame .proj.fr -relief flat -borderwidth 5 -bg $COLOUR(selbg) label .proj.fr.title -text "???" -relief sunken label .proj.fr.text -text $MESS(projchg) set frs .proj.fr.frsel frame $frs -relief flat -borderwidth 0 set n 0 foreach p $MAPPROJDATA($proj) { set rs 1 switch -glob $MAPPROJDTYPE($p) { lat - long - lat=* - long=* { regsub {=.+} $MAPPROJDTYPE($p) "" cw set Param($p) DDD set fr $frs.f$p frame $fr -relief flat -borderwidth 0 menubutton $fr.pfmt -text $TXT(DDD) -relief raised \ -width 6 -direction below -menu $fr.pfmt.m menu $fr.pfmt.m -tearoff 0 foreach f "DMS DMM DDD" { $fr.pfmt.m add command -label $TXT($f) \ -command "ParamPFormt $fr $cw $f $p" } entry $fr.val -width 12 $fr.val insert 0 [set ${data}($p)] grid configure $fr.pfmt -column 0 -row 0 -sticky nesw grid configure $fr.val -column 1 -row 0 -sticky nesw grid configure $fr -column 1 -row $n -sticky nesw } list=* - list:* { set val [set ${data}($p)] set fr $frs.f$p frame $fr -relief flat -borderwidth 0 set type $MAPPROJDTYPE($p) set l [split [string range $type 5 end] ,] if { [string index $type 4] == ":" } { set lt "" foreach v $l { lappend lt $TXT($v) } } else { set lt $l } set r 0 ; set c 0 ; set vc 0 ; set bi "" foreach v $l tv $lt { radiobutton $fr.r$r_$c -text $tv -variable Param($p) \ -value $v -anchor w -selectcolor $COLOUR(check) grid configure $fr.r$r_$c -column $c -row $r -sticky nesw if { $val == $v } { set bi $r_$c } if { [incr c] > 2 } { set c 0 ; incr r ; incr rs } incr vc } if { $bi != "" } { $fr.r$bi invoke } grid configure $fr -column 1 -row $n -sticky nesw } reserved { continue } default { entry $frs.e$p -width 12 $frs.e$p insert 0 [set ${data}($p)] grid configure $frs.e$p -column 1 -row $n \ -sticky nesw } } label $frs.l$p -text $TXT($p) grid configure $frs.l$p -column 0 -row $n -rowspan $rs \ -sticky w incr n } if { $n == 0 } { destroy .proj return 0 } if { $how == "define" || $how == "edit" } { set grid 1 set oldgr [set ${data}(_grid)] set abbr [set ${data}(_abbr)] if { $how == "edit" && $oldgr == $abbr } { set selfgrid 1 ; set t UTM/UPS } else { set selfgrid 0 ; set t $oldgr } label $frs.lgr -text "$TXT(grid):" menubutton $frs.m_guse -text $TXT($t) -relief raised \ -direction below -menu $frs.m_guse.m radiobutton $frs.r_guse -text $TXT(use) -variable Param(_guse) \ -value 1 -anchor w -selectcolor $COLOUR(check) \ -command "ParamGrid $abbr $data" menu $frs.m_guse.m -tearoff 0 foreach g [linsert $GRIDS 0 UTM/UPS] { if { $g != $abbr } { $frs.m_guse.m add command -label $TXT($g) \ -command "set ${data}(_grid) {$g} ;\ $frs.m_guse configure -text {$TXT($g)}" } } radiobutton $frs.r_gdef -text $TXT(create) -variable Param(_guse) \ -value 0 -anchor w -selectcolor $COLOUR(check) \ -command "ParamGrid $abbr $data" label $frs.l_gdef -text [set ${data}(_abbr)] -width 8 frame $frs.zg -relief flat -borderwidth 0 label $frs.zg.lu -text $TXT(unit) set Param(_gunit) $DISTUNIT menubutton $frs.zg.mu -text $DLUNIT($DISTUNIT,subdist) -relief raised \ -direction below -menu $frs.zg.mu.m menu $frs.zg.mu.m -tearoff 0 foreach u "KM NAUTMILE STATMILE" { set nm $DLUNIT($u,subdist) $frs.zg.mu.m add command -label $nm \ -command "$frs.zg.mu configure -text {$nm} ; \ set Param(_gunit) $u" } foreach k "fe fn" t "easting northing" { label $frs.zg.l$k -text $TXT(f$t) entry $frs.zg.e$k -width 12 } frame $frs.zg.zb -relief flat -borderwidth 0 label $frs.zg.zb.lbd -text "$TXT(bounds):" label $frs.zg.zb.lbdn -text $TXT(min) label $frs.zg.zb.lbdx -text $TXT(max) set zbn 0 grid configure $frs.zg.zb.lbd -column 0 -row $zbn -sticky w grid configure $frs.zg.zb.lbdn -column 1 -row $zbn -sticky snew grid configure $frs.zg.zb.lbdx -column 2 -row $zbn -sticky snew incr zbn foreach k "x y la lo" t "easting northing lat long" { label $frs.zg.zb.l$k -text $TXT($t) entry $frs.zg.zb.e${k}n -width 12 entry $frs.zg.zb.e${k}x -width 12 grid configure $frs.zg.zb.l$k -column 0 -row $zbn -sticky w grid configure $frs.zg.zb.e${k}n -column 1 -row $zbn -sticky snew grid configure $frs.zg.zb.e${k}x -column 2 -row $zbn -sticky snew incr zbn } if { [set datum [set ${data}(datum)]] == "" } { set datum $Datum ; set nodatum 1 } else { set nodatum 0 } menubutton $frs.zg.datum -text $datum -relief raised \ -direction below -menu $frs.zg.datum.m menu $frs.zg.datum.m -tearoff 0 FillDatumMenu $frs.zg.datum.m ParamGNewDatum if { [lsearch -exact $MAPPROJAUX $proj] != -1 && \ $MAPPROJDEPDATUM($proj) } { label $frs.zg.cfd -text $TXT(fixeddatum) set Param(_gfdatum) 1 } else { checkbutton $frs.zg.cfd -text $TXT(fixeddatum) \ -variable Param(_gfdatum) -onvalue 1 -offvalue 0 \ -selectcolor $COLOUR(check) -command ParamGDatum if { $nodatum } { $frs.zg.cfd deselect } else { $frs.zg.cfd invoke } } if { $selfgrid } { ParamGridSet $oldgr } else { # defaults: use pre-defined grid $frs.r_guse invoke } set zgn 0 grid configure $frs.zg.lu -column 0 -row $zgn -sticky w grid configure $frs.zg.mu -column 1 -row $zgn -sticky snew incr zgn grid configure $frs.zg.lfe -column 0 -row $zgn -sticky w grid configure $frs.zg.efe -column 1 -row $zgn -sticky snew incr zgn grid configure $frs.zg.lfn -column 0 -row $zgn -sticky w grid configure $frs.zg.efn -column 1 -row $zgn -sticky snew incr zgn grid configure $frs.zg.zb -column 0 -row $zgn -columnspan 2 -sticky e \ -ipadx 10 incr zgn grid configure $frs.zg.cfd -column 0 -row $zgn -sticky w grid configure $frs.zg.datum -column 1 -row $zgn -sticky snew grid configure $frs.lgr -column 0 -row $n -columnspan 2 \ -sticky w -ipady 4 incr n grid configure $frs.r_guse -column 0 -row $n -sticky w grid configure $frs.m_guse -column 1 -row $n -sticky snew incr n grid configure $frs.r_gdef -column 0 -row $n -sticky w grid configure $frs.l_gdef -column 1 -row $n -sticky w incr n grid configure $frs.zg -column 0 -row $n -columnspan 2 -sticky e \ -ipadx 10 } else { # $how in {change, set} set grid 0 ; set oldgr "" ; set selfgrid 0 } frame .proj.fr.frbs -relief flat -borderwidth 0 # text of next button is reconfigured below button .proj.fr.frbs.ok -text $TXT(ok) \ -command { .proj.fr.frbs.ok configure -state normal set ProjRes ok } button .proj.fr.frbs.rv -text $TXT(revert) \ -command ".proj.fr.frbs.rv configure -state normal ; \ ProjParamsRevert $proj $data $grid \"$oldgr\" $selfgrid" button .proj.fr.frbs.cnc -text $TXT(cancel) -command {set ProjRes cancel} switch $how { set { pack .proj.fr.frbs.ok .proj.fr.frbs.rv .proj.fr.frbs.cnc \ -side left -padx 5 pack .proj.fr.title .proj.fr.text $frs .proj.fr.frbs \ -side top -pady 5 } change { checkbutton .proj.fr.stop -text $TXT(dontaskagain) \ -variable ASKPROJPARAMS -onvalue 0 -offvalue 1 \ -selectcolor $COLOUR(check) pack .proj.fr.frbs.ok .proj.fr.frbs.rv -side left -padx 5 pack .proj.fr.title .proj.fr.text $frs .proj.fr.stop \ .proj.fr.frbs -side top -pady 5 } define { .proj.fr.frbs.ok configure -text $TXT(create) pack .proj.fr.frbs.ok .proj.fr.frbs.cnc -side left -padx 5 pack .proj.fr.title .proj.fr.text $frs .proj.fr.frbs \ -side top -pady 5 } edit { .proj.fr.frbs.ok configure -text $TXT(change) button .proj.fr.frbs.fgt -text $TXT(forget) \ -command ".proj.fr.frbs.fgt configure -state normal ; \ set ProjRes forget" button .proj.fr.frbs.crt -text $TXT(create) \ -command ".proj.fr.frbs.crt configure -state normal ; \ set ProjRes new" pack .proj.fr.frbs.ok .proj.fr.frbs.rv .proj.fr.frbs.crt \ .proj.fr.frbs.fgt .proj.fr.frbs.cnc -side left -padx 2 pack .proj.fr.title .proj.fr.text $frs .proj.fr.frbs \ -side top -pady 5 } } pack .proj.fr -side top update idletasks # cannot use RaiseWindow because of menus set gs [grab current] grab .proj while 1 { tkwait variable ProjRes switch $ProjRes { cancel { set r 0 ; break } forget { if { ! [GMConfirm \ [format $MESS(askforget) $TXT(projection)]] } { set ProjRes 1 continue } set r -1 ; break } } set l "" ; set newdata same foreach p $MAPPROJDATA($proj) { switch -glob [set type $MAPPROJDTYPE($p)] { lat - long - lat=* - long=* { regsub {=.+} $type "" cw set nv [ParamGetCoord $p $cw [$frs.f$p.val get]] if { $nv == "nil" } { set newdata error ; break } set nv [lindex $nv 0] set pw $frs.f$p.val } list=* - list:* { # there can be no wrong values in list; no need for $pw set nv $Param($p) } reserved { continue } default { set nv [$frs.e$p get] set pw $frs.e$p } } if { $nv != [set ${data}($p)] } { if { [BadParam $TXT($p) $type $nv] } { focus $pw set newdata error break } lappend l $p $nv set newdata diff } } if { $newdata != "error" } { if { $ProjRes == "new" } { while 1 { if { [GMChooseParams $TXT(projection) "UPName UPAbbrev" \ [list "=$TXT(name)" "=$TXT(abbrev)"]] } { if { [ProjNamesOk] } { set canc 0 ; break } } else { set canc 1 ; break } } if { $canc } { continue } set abbr $UPAbbrev } if { $newdata == "diff" } { array set $data $l } if { $grid } { set newgrid same if { $Param(_guse) } { if { $oldgr != [set ${data}(_grid)] } { set newgrid diff set newdata diff } } else { global GRD$oldgr # check parameters for new/self grid set unit $Param(_gunit) set ${data}(_grid) $abbr if { $selfgrid && \ $unit != [set GRD${oldgr}(_unit)] } { set sameunit 0 } else { set sameunit 1 } set diff 0 foreach e "efe efn zb.exn zb.exx zb.eyn zb.eyx \ zb.elan zb.elax zb.elon zb.elox" \ t "float float float float float float \ lat lat long long" \ v "fe fn xmin xmax ymin ymax lamin lamax \ lomin lomax" \ n "feasting fnorthing bounds bounds bounds bounds \ bounds bounds bounds bounds" { set $v [$frs.zg.$e get] if { $selfgrid && $sameunit && \ [set $v] == [set GRD${oldgr}(_$v)] } { continue } if { [BadParam $TXT($n) $t [set $v]] } { focus $frs.zg.$e set newgrid error break } set diff 1 } if { $newgrid == "error" } { continue } if { $diff } { if { $xmin >= $xmax || $ymin >= $ymax || \ $lamin >= $lamax || $lomin >= $lomax } { GMMessage [format $MESS(badparam) $TXT(bounds)] continue } set newgrid diff } if { $Param(_gfdatum) } { set datum [$frs.zg.datum cget -text] set newgrid diff } elseif { ! $nodatum } { set datum "" set newgrid diff } else { set datum "" } if { $newgrid == "diff" } { set newdata diff } else { # make sure grid parameters are set foreach v "fe fn unit xmin xmax ymin ymax \ lamin lamax lomin lomax" { set $v [set GRD${oldgr}(_$v)] } } set ${data}(_gparams) \ [list $abbr $fe $fn $unit \ [list $xmin $xmax $ymin $ymax] \ [list $lamin $lamax $lomin $lomax] \ $datum] } } if { $ProjRes == "new" } { set r 2 } elseif { $newdata == "diff" } { set r 1 } else { set r 0 } break } } DestroyRGrabs .proj $gs update idletasks return $r } proc ParamGridSet {gr} { # show parameters for grid $gr global GRD$gr Param DLUNIT set frs .proj.fr.frsel $frs.r_gdef invoke set Param(_gunit) [set GRD${gr}(_unit)] $frs.zg.mu configure -text $DLUNIT($Param(_gunit),subdist) foreach k "fe fn" { $frs.zg.e$k delete 0 end $frs.zg.e$k insert 0 [set GRD${gr}(_$k)] } foreach k "x y la lo" { foreach kk "n x" p "min max" { $frs.zg.zb.e${k}$kk delete 0 end $frs.zg.zb.e${k}$kk insert 0 [set GRD${gr}(_${k}$p)] } } return } proc ParamGDatum {} { # fixed datum for grid has been de-/selected global Param if { $Param(_gfdatum) } { .proj.fr.frsel.zg.datum configure -state normal } else { .proj.fr.frsel.zg.datum configure -state disabled } return } proc ParamGNewDatum {datum args} { # new datum has been chosen for grid .proj.fr.frsel.zg.datum configure -text $datum return } proc ParamGrid {gr data} { # choice of grid type has changed global Param $data INVTXT if { $Param(_guse) } { .proj.fr.frsel.m_guse configure -state normal set ${data}(_grid) $INVTXT([.proj.fr.frsel.m_guse cget -text]) foreach w [winfo children .proj.fr.frsel.zg] { catch {$w configure -state disabled} } foreach w [winfo children .proj.fr.frsel.zg.zb] { catch {$w configure -state disabled} } } else { .proj.fr.frsel.m_guse configure -state disabled set ${data}(_grid) $gr foreach w [winfo children .proj.fr.frsel.zg] { catch {$w configure -state normal} } foreach w [winfo children .proj.fr.frsel.zg.zb] { catch {$w configure -state normal} } if { [winfo class .proj.fr.frsel.zg.cfd] != "Label" && \ ! $Param(_gfdatum) } { .proj.fr.frsel.zg.datum configure -state disabled } } return } proc ParamGetCoord {param whc val} { # convert coordinate $val to signed degrees and check it # $whc in {lat, long} # $param is parameter name # return "empty" if empty, "nil" on error, otherwise # list with value in signed degrees, heading (as letter) and # absolute value in degrees global Param if { $val == "" } { return empty } if { $whc == "lat" } { set negh S ; set posh N ; set wC Lat } else { set negh W ; set posh E ; set wC Long } if { ! [Check$wC GMMessage $val $Param($param)] } { return nil } set val [Coord $Param($param) $val $negh] if { $val < 0 } { return [list $val $negh [expr -$val]] } return [list $val $posh $val] } proc ParamPFormt {fr whc pfmt param} { # change format of lat/long in dialog on the projection parameters # $whc in {lat, long} # $param is parameter name global TXT Param if { $pfmt == $Param($param) } { return } set val [ParamGetCoord $param $whc [$fr.val get]] if { $val == "nil" } { return } if { $val != "empty" } { $fr.val delete 0 end $fr.val insert 0 [lindex $val 1][ExtDegrees $pfmt [lindex $val 2]] } $fr.pfmt configure -text $TXT($pfmt) set Param($param) $pfmt return } proc ProjParamsRevert {proj data grid oldgr selfgrid} { # revert to initial values in dialog on the projection parameters # $selfgrid is set if editing a projection defining a grid global $data MAPPROJDATA MAPPROJDTYPE TXT Param DLUNIT DISTUNIT Datum foreach p $MAPPROJDATA($proj) { switch -glob $MAPPROJDTYPE($p) { lat - long - lat=* - long=* { set fr .proj.fr.frsel.f$p $fr.pfmt configure -text $TXT(DDD) $fr.val delete 0 end $fr.val insert 0 [set ${data}($p)] } list=* - list:* { .proj.fr.frsel.f$p.r[set ${data}($p)] invoke } reserved { } default { .proj.fr.frsel.e$p delete 0 end .proj.fr.frsel.e$p insert 0 [set ${data}($p)] } } } if { $grid } { set ${data}(_grid) $oldgr if { [set datum [set ${data}(datum)]] == "" } { set datum $Datum catch {.proj.fr.frsel.zg.cfd deselect} } else { catch {.proj.fr.frsel.zg.cfd select} } .proj.fr.frsel.zg.datum configure -text $datum foreach e "efe efn zb.exn zb.exx zb.eyn zb.eyx \ zb.elan zb.elax zb.elon zb.elox" { .proj.fr.frsel.zg.$e delete 0 end } if { $selfgrid } { ParamGridSet $oldgr } else { .proj.fr.frsel.m_guse configure -text $TXT($oldgr) .proj.fr.frsel.r_guse invoke set Param(_gunit) $DISTUNIT .proj.fr.frsel.zg.mu configure -text $DLUNIT($DISTUNIT,subdist) } } update idletasks return } ## dialog for selecting datum and projection proc ChooseDatumProjection {args} { # dialog for selection of datum and projection # $args is "" or contains a list of latd,longd,datum to be projected # return 0 on failure, or projection internal name on success, in which # case datum and projection parameters are stored in global array CDPData global Datum MapProjection CDPDatum CDPProj CDPProjT CDPData ProjRes \ MAPPROJDATA MAPPARTPROJ MAPPARTPDATA MAPPROJAUX EPOSX EPOSY \ TXT COLOUR DATUMWIDTH set CDPDatum $Datum ; set CDPProj $MapProjection set CDPProjT $TXT(PRJ$MapProjection) GMToplevel .cdp projection +$EPOSX+$EPOSY {} \ {WM_DELETE_WINDOW {set ProjRes ok}} \ { {set ProjRes ok}} frame .cdp.fr -relief flat -borderwidth 5 -bg $COLOUR(selbg) label .cdp.fr.title -text "???" -relief sunken set frs .cdp.fr.fbs1 frame $frs -relief flat -borderwidth 0 menubutton $frs.datum -textvariable CDPDatum -menu $frs.datum.m \ -width $DATUMWIDTH menu $frs.datum.m \ -postcommand "FillDatumMenu $frs.datum.m CDPChangeDatum" menubutton $frs.cdp -textvariable CDPProjT -width 20 -menu $frs.cdp.m menu $frs.cdp.m -postcommand "FillProjsMenu $frs.cdp.m \ MAPKNOWNPROJS CDPChangeProjection" set frb .cdp.fr.fbs2 frame $frb -relief flat -borderwidth 0 button $frb.ok -text $TXT(ok) -command { set ProjRes ok } button $frb.cnc -text $TXT(cancel) -command { set ProjRes cancel } pack $frs.datum $frs.cdp -side left -padx 2 pack $frb.ok $frb.cnc -side left -padx 2 pack .cdp.fr.title $frs $frb -side top -pady 5 pack .cdp.fr update idletasks # cannot use RaiseWindow because of menus # RaiseWindow .cdp Raise .cdp set gs [grab current] grab .cdp tkwait variable ProjRes DestroyRGrabs .cdp $gs if { $ProjRes == "cancel" } { return 0 } # initialize projection parameters catch {unset CDPData} set CDPData(datum) $CDPDatum if { [catch {set mp $MAPPARTPROJ($CDPProj)}] } { set ps [lindex $args 0] if { $ps == "" } { # main projection: ask parameters foreach p $MAPPROJDATA($CDPProj) { set CDPData($p) "" } if { [ProjParams set $CDPProj CDPData] == 0 } { return 0 } } else { ProjInit $CDPProj CDPData $CDPDatum $ps } set mp $CDPProj } else { foreach e $MAPPROJDATA($mp) v $MAPPARTPDATA($CDPProj) { set CDPData($e) $v } } if { [lsearch -exact $MAPPROJAUX $mp] != -1 } { Proj${mp}ComputeAux CDPData $CDPDatum } set CDPData(main_proj) $mp return $CDPProj } proc CDPChangeDatum {datum args} { # record selected datum # $args not used but is needed as this is called-back from a menu global CDPDatum set CDPDatum $datum return } proc CDPChangeProjection {proj} { # record selected projection global CDPProj CDPProjT TXT set CDPProj $proj ; set CDPProjT $TXT(PRJ$proj) return } ## menus with projections and grids proc FillProjsMenu {menu listname comm} { # create menu entries from projections in list given by $listname for # calling command whose argument is each projection global $listname MAXMENUITEMS TXT if { [winfo exists $menu] } { $menu delete 0 end } set n 0 ; set m 0 foreach pr [set $listname] { if { $n > $MAXMENUITEMS } { $menu add cascade -label "$TXT(more) ..." -menu $menu.m$m set menu $menu.m$m ; destroy $menu menu $menu -tearoff 0 set n 0 ; incr m } $menu add command -label $TXT(PRJ$pr) -command "$comm $pr" incr n } return } ## initialization of particular cases of main projections proc MapInitPartProj {proj data datum ps} { # initialize particular projection for the map # $data is name of global array for parameters # return projection of first position set mp [ProjInitPart $proj $data $datum] set p [lindex $ps 0] set latd [lindex $p 0] ; set longd [lindex $p 1] ; set pdatum [lindex $p 2] return [Proj${mp}Point $data $latd $longd $pdatum] } proc ProjInitPart {proj data datum} { # set fixed parameters for a particular case of a main projection # $data is name of global array for parameters # return name of main projection global $data MAPPARTPROJ MAPPARTPDATA MAPPROJDATA MAPPROJAUX set mp $MAPPARTPROJ($proj) foreach e $MAPPROJDATA($mp) v $MAPPARTPDATA($proj) { set ${data}($e) $v } if { [lsearch -exact $MAPPROJAUX $mp] != -1 } { Proj${mp}ComputeAux $data $datum } set ${data}(datum) $datum return $mp } ## setting up the map coordinates format and datum proc ChangeMapPFormat {pfmt} { # change position format to use with map cursor coordinates # if it is a grid with a fixed datum, change $MapPFDatum global GRIDS ZGRID Datum MapPFormat MapPFDatum MapPFNeedsDatum MapEmpty set MapPFormat $pfmt set MapPFNeedsDatum 0 if { [lsearch -exact $GRIDS $pfmt] != -1 && ! $ZGRID($pfmt) } { global GRD$pfmt if { [set datum [set GRD${pfmt}(datum)]] != "" } { set MapPFDatum $datum set MapPFNeedsDatum 1 } } return } proc ChangeMPFDatum {datum args} { # change datum of map cursor coordinates # $args is not used but is needed as this is called-back from # menus built by proc FillDatumMenu (geod.tcl) # do nothing if datum is not appropriate to current cursor position format global MapPFDatum MapPFNeedsDatum MapEmpty if { $MapPFDatum != $datum } { if { $MapPFNeedsDatum } { return } set MapPFDatum $datum } return } ## setting up of a projection for the map proc MapProjectionIs {proj} { # set global variables so that map projection is $proj # $proj in $MAPKNOWNPROJS global MapProjection MapProjTitle MapProjInitProc GRIDFOR MAPPARTPROJ TXT \ CMDLINE MapPFNeedsDatum MapPFDatum set MapProjection $proj ; set MapProjTitle $TXT(PRJ$proj) if { ! $CMDLINE } { ChangeMapPFormat $GRIDFOR($proj) if { $MapPFNeedsDatum } { ChangeMapDatum $MapPFDatum } } # names of projection procs if { [catch {set mp $MAPPARTPROJ($proj)}] } { # main projection set MapProjInitProc ProjInit } else { # particular case of a main projection set MapProjInitProc MapInitPartProj set proj $mp } foreach a "Point Invert" { global MapProj${a}Proc set MapProj${a}Proc Proj${proj}$a } return } proc ChangeMapDatum {datum args} { # change map datum # $args is not used but is needed as this is called-back from # menus built by proc FillDatumMenu (geod.tcl) # to be called only when map is empty global Datum set Datum $datum return } ### the code that used to be after this line is now in file projs_main.tcl gpsman-6.4.4.2/gmsrc/options.tcl0000644000175000017500000007474612224351120014610 0ustar migmig# # This file is part of: # # gpsman --- GPS Manager: a manager for GPS receiver data # # Copyright (c) 1998-2013 Miguel Filgueiras migfilg@t-online.de # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. # # File: options.tcl # Last change: 6 October 2013 # # when inserting new data here, define TXT(opt*) # in lang*.tcl files # the OPTSTRUCT list contains identifiers # for each identifier $i one must define $OPTTYPE($i) as one of: # boolean will be shown as a checkbutton # nat natural number (=nonnegative integer); as an entry # float any number; as an entry # any any non-empty string; as an entry # any_empty any string or empty; as an entry # colour a special dialog is used for selection # perms file permissions; a special dialog is used for selection # oneof as a radiobutton; one must define $OPTVALS($i) as a # a list with the possible values # fixedmenu as a menubutton; one must define $OPTMENUCONTS($i) as a # a list with the possible values # fixedtextmenu as "fixedmenu", but an external name is shown instead # of selected value; $OPTMENUCONTS($i) must be defined as # above; one must also define $OPTMENUNAMES($i) to be an # array of external names and $OPTMENUPREFIX($i) that is # prefixed to the selected value to index the array of # external names # menu as a menubutton; one must define $OPTMENUPROC($i) as the name # of the proc that should be called to fill in the menu; the # arguments to the call are: # - the menu window # - the command to be associated with final entries, whose # arguments are the selected value and the menu window # textmenu as "menu", but an external name is shown instead of selected # value; $OPTMENUPROC($i) must be defined as above; one must # also define $OPTMENUNAMES($i) to be an array of external # names and $OPTMENUPREFIX($i) that is prefixed to the # selected value to index the array of external names # font a font description # array for a set of options all of the same type; one must # set $OPTELTYPE($i) to it, and $OPTELS($i) to the list # of options in the set; type cannot be "perms" # group as button that opens a sub-window; the options given # as a list to $OPTGRPL($i) will appear in it # sep not an option; used to visually separate window elements # # the following conventions must be adhered to: # - identifiers of all types but group and sep are the names # of global variables that will be set to selected value or # whose elements will be set to selected values (in case of array) # - arrays and groups can only appear at top level # maximum number of widgets per column set OPTMAXHEIGHT 10 set OPTSTRUCT { GPSREC _GPSRecConf _Formats _sep _Data _sep _Interf _Geom COLOUR _MapGeom MAPCOLOUR _Fonts _sep _Files } set OPTTYPE(_Interf) group set OPTGRPL(_Interf) {MWINDOWSCONF LANG ISOLATIN1 DELETE USESLOWOPWINDOW BalloonHelp SHOWFILEITEMS TRNUMBERINTVL TRINFO LNSREACT} set OPTTYPE(MWINDOWSCONF) fixedtextmenu set OPTMENUCONTS(MWINDOWSCONF) {map lists} set OPTMENUNAMES(MWINDOWSCONF) TXT set OPTMENUPREFIX(MWINDOWSCONF) MWC set OPTTYPE(LANG) fixedtextmenu set OPTMENUCONTS(LANG) $KNOWNLANGS set OPTMENUNAMES(LANG) TXT set OPTMENUPREFIX(LANG) LANG set OPTTYPE(ISOLATIN1) boolean set OPTTYPE(DELETE) boolean set OPTTYPE(USESLOWOPWINDOW) boolean set OPTTYPE(BalloonHelp) boolean set OPTTYPE(SHOWFILEITEMS) boolean set OPTTYPE(TRNUMBERINTVL) nat set OPTTYPE(TRINFO) fixedtextmenu set OPTMENUCONTS(TRINFO) {number date} set OPTMENUNAMES(TRINFO) TXT set OPTMENUPREFIX(TRINFO) "" set OPTTYPE(LNSREACT) boolean set OPTTYPE(GPSREC) menu set OPTMENUPROC(GPSREC) FillRecModelsMenu # the _GPSRecConf description is defined by proc RecModelChange # in file recmodels.tcl on start up and when $GPSREC changes # set OPTTYPE(_GPSRecConf) group set OPTTYPE(_Data) group set OPTGRPL(_Data) {EQNAMEDATA KEEPHIDDEN} set OPTTYPE(EQNAMEDATA) oneof set OPTVALS(EQNAMEDATA) {ovwrt rename} set OPTTYPE(KEEPHIDDEN) oneof set OPTVALS(KEEPHIDDEN) {never ask always} set OPTTYPE(_Formats) group set OPTGRPL(_Formats) {Datum TimeOffset DISTUNIT ALTUNIT ALTHRESHOLD PositionFormat DateFormat DEFMAPPROJ DEFMAPPFRMT DEFMAPPFDATUM ACCFORMULAE ASKPROJPARAMS} set OPTTYPE(Datum) menu set OPTMENUPROC(Datum) FillDatumMenu set OPTTYPE(TimeOffset) float set OPTTYPE(DISTUNIT) oneof set OPTVALS(DISTUNIT) {KM NAUTMILE STATMILE} set OPTTYPE(ALTUNIT) oneof set OPTVALS(ALTUNIT) {M FT} set OPTTYPE(ALTHRESHOLD) float set OPTTYPE(PositionFormat) fixedmenu set OPTMENUCONTS(PositionFormat) $PFORMATS set OPTTYPE(DateFormat) fixedtextmenu set OPTMENUCONTS(DateFormat) [lsort -dictionary [array names DATEW]] set OPTMENUNAMES(DateFormat) TXT set OPTMENUPREFIX(DateFormat) {} set OPTTYPE(DEFMAPPROJ) fixedtextmenu set OPTMENUCONTS(DEFMAPPROJ) $MAPKNOWNPROJS set OPTMENUNAMES(DEFMAPPROJ) TXT set OPTMENUPREFIX(DEFMAPPROJ) PRJ set OPTTYPE(DEFMAPPFRMT) fixedmenu set OPTMENUCONTS(DEFMAPPFRMT) $PFORMATS set OPTTYPE(DEFMAPPFDATUM) menu set OPTMENUPROC(DEFMAPPFDATUM) FillDatumMenu set OPTTYPE(ACCFORMULAE) boolean set OPTTYPE(ASKPROJPARAMS) boolean set OPTTYPE(_MapGeom) group set OPTGRPL(_MapGeom) {MAPWIDTH MAPHEIGHT ICONSIZE _sep MAPSCLENGTH MAPSCALE _sep DPOSRTMAP _sep DEFTRTWIDTH DEFTTRWIDTH DEFTLNWIDTH} set OPTTYPE(MAPWIDTH) nat set OPTTYPE(MAPHEIGHT) nat set OPTTYPE(ICONSIZE) fixedmenu set OPTMENUCONTS(ICONSIZE) {15x15 30x30} set OPTTYPE(MAPSCLENGTH) nat set OPTTYPE(MAPSCALE) fixedmenu set OPTMENUCONTS(MAPSCALE) $MAPDISTS set OPTTYPE(DPOSRTMAP) float set OPTTYPE(DEFTRTWIDTH) fixedmenu set OPTMENUCONTS(DEFTRTWIDTH) {1 2 3 4 5 6 7 8} set OPTTYPE(DEFTTRWIDTH) fixedmenu set OPTMENUCONTS(DEFTTRWIDTH) {1 2 3 4 5 6 7 8} set OPTTYPE(DEFTLNWIDTH) fixedmenu set OPTMENUCONTS(DEFTLNWIDTH) {1 2 3 4 5 6 7 8} set OPTTYPE(_Fonts) group set OPTGRPL(_Fonts) {DEFAULTFONT FIXEDFONT MAPFONT TRAVELFONT PLOTFONT} set OPTTYPE(DEFAULTFONT) font set OPTTYPE(FIXEDFONT) font set OPTTYPE(MAPFONT) font set OPTTYPE(TRAVELFONT) font set OPTTYPE(PLOTFONT) font set OPTTYPE(_Geom) group set OPTGRPL(_Geom) {MAXMENUITEMS LISTWIDTH LISTHEIGHT _sep LPOSX LPOSY MPOSX MPOSY RPOSX RPOSY _sep EPOSX EPOSY DPOSX DPOSY} set OPTTYPE(MAXMENUITEMS) nat set OPTTYPE(LISTWIDTH) nat set OPTTYPE(LISTHEIGHT) nat set OPTTYPE(LPOSX) nat set OPTTYPE(LPOSY) nat set OPTTYPE(MPOSX) nat set OPTTYPE(MPOSY) nat set OPTTYPE(RPOSX) nat set OPTTYPE(RPOSY) nat set OPTTYPE(EPOSX) nat set OPTTYPE(EPOSY) nat set OPTTYPE(DPOSX) nat set OPTTYPE(DPOSY) nat set OPTTYPE(COLOUR) array set OPTELTYPE(COLOUR) colour set OPTELS(COLOUR) {fg bg messbg confbg selbg dialbg offline online check ballbg ballfg} set OPTTYPE(MAPCOLOUR) array set OPTELTYPE(MAPCOLOUR) colour set OPTELS(MAPCOLOUR) {mapsel WP RT mkRT TR TP LN mapleg anim emptygrid fullgrid trvtrk trvtrn trvcts trvcts2 trvvel_z trvwrnimportant trvwrnnormal trvwrninfo} set OPTTYPE(_Files) group if { $UNIX } { set OPTGRPL(_Files) {DEFSPORT _sep} set OPTTYPE(DEFSPORT) any } else { set OPTGRPL(_Files) "" } lappend OPTGRPL(_Files) SAVESTATE DELSTATE _sep PERMS PRINTCMD PAPERSIZE \ DISPLAYCMD TERMCMD _sep MapGuideVersion ## MANHTTPADDR not yet in this group set OPTTYPE(SAVESTATE) oneof set OPTVALS(SAVESTATE) {never ask always} set OPTTYPE(DELSTATE) oneof set OPTVALS(DELSTATE) {never ask always} set OPTTYPE(PERMS) perms set OPTTYPE(PRINTCMD) any_empty set OPTTYPE(PAPERSIZE) fixedmenu set OPTMENUCONTS(PAPERSIZE) [array names PAGEWIDTH] set OPTTYPE(DISPLAYCMD) any_empty set OPTTYPE(TERMCMD) any_empty set OPTTYPE(MANHTTPADDR) any_empty set OPTTYPE(MapGuideVersion) fixedmenu set OPTMENUCONTS(MapGuideVersion) {2002 03/04} set OPTTYPE(_sep) sep proc OutDatedOptions {} { # check if options read from preferences file are outdated global OPTFILEVERSION VERSION MESS GPSREC MWINDOWSCONF FONTSIZE # check that this is not a pre-4.0 preferences file if { ! [catch {set OPTFILEVERSION}] } { set r [string compare $OPTFILEVERSION $VERSION] # correct outdated values if { [llength $GPSREC]>1 && [lindex $GPSREC 0] == "Garmin" } { # no need for Garmin receiver model after version 4.0.1 set GPSREC Garmin ; set r 1 } if { $MWINDOWSCONF == "single" } { # no longer supported after 5.2 set MWINDOWSCONF map ; set r 1 } if { ! [catch {set FONTSIZE}] } { # no longer supported after 6.4 set r 1 } if { $r == 0 || "${VERSION}-patched" == $OPTFILEVERSION } { return 0 } } AboutInfo "" GMMessage $MESS(outdatedprefs) return 1 } proc SetOptions {} { # create modal dialog for setting user options # return 1 on success, 0 on failure global USEROPTIONS OPTSTRUCT OPTTYPE MESS TXT DPOSX DPOSY COLOUR VERSION \ TempOpts OptOldMain OptOldSub OPTMAXHEIGHT # window name used elsewhere set w .opts if { [winfo exists $w] } { Raise $w ; bell ; return 0 } GMToplevel $w options +$DPOSX+$DPOSY . \ {WM_DELETE_WINDOW {set TempOpts cnc ; set waitopts 0}} \ { {set TempOpts ok ; set waitopts 0}} frame $w.fr -borderwidth 5 -bg $COLOUR(messbg) set i 0 ; set es "" ; set col 0 if { [set n [llength $OPTSTRUCT]] < $OPTMAXHEIGHT } { set row -1 ; set drow 0 ; set maxrow 1000 } else { set row 0 ; set drow 1 if { [set z [expr int($n/$OPTMAXHEIGHT)]] != 1.0*$n/$OPTMAXHEIGHT } { incr z } if { [set maxrow [expr int($n/$z)]] != $n/$z } { incr maxrow } } foreach v $OPTSTRUCT { set es [ShowOption $v $v $v $OPTTYPE($v) $w.fr.f$i $es Main $row $col] incr i if { [incr row $drow] > $maxrow } { set row 0 ; incr col } } frame $w.fr.bs button $w.fr.bs.ok -text $TXT(ok) \ -command { set TempOpts ok ; set waitopts 0 } button $w.fr.bs.cnc -text $TXT(cancel) \ -command { set TempOpts cnc ; set waitopts 0 } pack $w.fr.bs.ok $w.fr.bs.cnc -side left -pady 5 if { $row == -1 } { pack $w.fr.bs $w.fr -side top } else { grid $w.fr.bs -row [incr maxrow] -column 0 -columnspan [incr col] \ -pady 5 pack $w.fr -side top } update idletasks set gs [grab current] grab $w # cannot use RaiseWindow because of the menus while 1 { tkwait variable waitopts switch $TempOpts { "" { } cnc { foreach ref [array names OptOldMain] { ChangeOption $ref $OptOldMain($ref) } catch { foreach ref [array names OptOldSub] { ChangeOption $ref $OptOldSub($ref) unset OptOldSub($ref) } } set res 0 break } ok { set ok 1 foreach e $es { # these entries cannot be for array elements set v [lindex $e 1] global $v switch $OPTTYPE($v) { nat - float - any - any_empty { set val [[lindex $e 0] get] if { [WrongValue $OPTTYPE($v) $val] } { GMMessage "$MESS(wrgval) $TXT(opt$v)" set ok 0 ; break } set $v $val } } } if { $ok } { if { [catch {set f [open $USEROPTIONS w]}] } { GMMessage $MESS(cantwrtopt) wait set res 0 break } regsub -- {-patched$} $VERSION "" version puts $f "" puts $f "# $MESS(written) GPSMan [NowTZ]" puts $f "# $MESS(editrisk)" puts $f "" puts $f "set OPTFILEVERSION $version" puts $f "" foreach v $OPTSTRUCT { GenOption $f $v } close $f set res 1 GMMessage $MESS(goingdown) break } } } } DestroyRGrabs $w $gs update idletasks return $res } proc ShowOption {v ref val type vf es lv row col} { # create widgets for an identifier in options list # $v is identifier (normally a variable) # $ref is a reference used to keep the initial value of the option # $val is a reference to the option storage to be set # $tipe in {boolean, nat, float, any, colour, perms, oneof, menu, # textmenu, fixedmenu, fixedtextmenu, font, array, group, sep} unless # $lv!="Main" in which case it cannot be in {array, group} # $vf is the parent window (frame) of the widgets to create # $es is list with a pair for each created entry; the pair has the # path for the entry and $ref # $lv recursion level in {Main Sub New} # $row is -1 if frame $vf is to be packed; otherwise frame should be # grided at row $row and column $col global OPTVALS OPTMENUPROC OPTMENUCONTS OPTMENUNAMES OPTMENUPREFIX \ COLOUR TXT MAXMENUITEMS OptOld$lv OptSubMany OptMenuVar \ OptMenuText OptPerms frame $vf -relief flat -borderwidth 0 switch $type { boolean { global $v set OptOld[set lv]($ref) [set $val] checkbutton $vf.f -text $TXT(opt$ref) -variable $val \ -anchor w -onvalue 1 -offvalue 0 \ -selectcolor $COLOUR(check) if { [set $val] } { $vf.f select } pack $vf.f -anchor w } nat - float - any - any_empty { global $v set OptOld[set lv]($ref) [set $val] label $vf.l -text $TXT(opt$ref) entry $vf.e -width 10 TextBindings $vf.e $vf.e insert 0 [set $val] pack $vf.l -side left -anchor w pack $vf.e -side left -anchor e lappend es "$vf.e $ref" } oneof { global $v set OptOld[set lv]($ref) [set $val] label $vf.l -text $TXT(opt$ref) pack $vf.l -anchor w set i 0 foreach vl $OPTVALS($v) { radiobutton $vf.r$i -text $TXT($vl) -variable $val \ -value $vl -anchor w -selectcolor $COLOUR(check) if { [set $val] == $vl } { $vf.r$i invoke } pack $vf.r$i -side left -padx 2 incr i } } menu { global $v set OptOld[set lv]($ref) [set $val] menubutton $vf.mb -text $TXT(opt$ref) -relief raised \ -direction below -menu $vf.mb.m$ref menu $vf.mb.m$ref set OptMenuVar($vf.mb.m$ref) $ref $OPTMENUPROC($v) $vf.mb.m$ref ChangeMenuOption label $vf.l -text [set $val] -textvariable $val pack $vf.mb $vf.l -side left -padx 2 -anchor w } textmenu { global $v $OPTMENUNAMES($v) set OptOld[set lv]($ref) [set $val] menubutton $vf.mb -text $TXT(opt$ref) -relief raised \ -direction below -menu $vf.mb.m$ref set mw $vf.mb.m$ref menu $mw set OptMenuVar($mw) $ref $OPTMENUPROC($v) $mw ChangeTextMenuOption set OptMenuText($mw,label) $vf.l set OptMenuText($mw,names) $OPTMENUNAMES($v) set OptMenuText($mw,prefix) $OPTMENUPREFIX($v) label $vf.l -text \ [set $OPTMENUNAMES($v)($OPTMENUPREFIX($v)[set $val])] pack $vf.mb $vf.l -side left -padx 2 -anchor w } fixedmenu { global $v set OptOld[set lv]($ref) [set $val] menubutton $vf.mb -text $TXT(opt$ref) -relief raised \ -direction below -menu $vf.mb.m$ref menu $vf.mb.m$ref set OptMenuVar($vf.mb.m$ref) $ref set mw $vf.mb.m$ref ; set n 0 ; set m 0 foreach item $OPTMENUCONTS($v) { if { $n > $MAXMENUITEMS } { $mw add cascade -label "$TXT(more) ..." -menu $mw.m$m set mw $mw.m$m ; menu $mw -tearoff 0 set n 0 ; incr m } $mw add command -label $item \ -command "ChangeOption $ref [list $item]" incr n } label $vf.l -text [set $val] -textvariable $val pack $vf.mb $vf.l -side left -padx 2 -anchor w } fixedtextmenu { global $v $OPTMENUNAMES($v) set OptOld[set lv]($ref) [set $val] menubutton $vf.mb -text $TXT(opt$ref) -relief raised \ -direction below -menu $vf.mb.m$ref set mw $vf.mb.m$ref menu $mw set OptMenuVar($mw) $ref set OptMenuText($mw,label) $vf.l set OptMenuText($mw,names) $OPTMENUNAMES($v) set OptMenuText($mw,prefix) $OPTMENUPREFIX($v) set n 0 ; set m 0 ; set mws $mw foreach item $OPTMENUCONTS($v) { if { $n > $MAXMENUITEMS } { $mws add cascade -label "$TXT(more) ..." -menu $mws.m$m set mws $mws.m$m ; menu $mws -tearoff 0 set n 0 ; incr m } $mws add command -label \ [set $OPTMENUNAMES($v)($OPTMENUPREFIX($v)$item)] \ -command "ChangeTextMenuOption [list $item] $mw" incr n } label $vf.l -text \ [set $OPTMENUNAMES($v)($OPTMENUPREFIX($v)[set $val])] pack $vf.mb $vf.l -side left -padx 2 -anchor w } perms { global $v set OptOld[set lv]($ref) [set $val] label $vf.l -text $TXT(opt$ref) pack $vf.l -anchor w set m [Measure $TXT(others)] foreach z "owner permgroup others" pz [PermsToList [set $val]] { frame $vf.$z -relief flat label $vf.$z.t -text "$TXT($z):" -width $m pack $vf.$z.t -side left -anchor w foreach o "fread fwrite fexec" p $pz { checkbutton $vf.$z.c$o -text $TXT($o) -anchor w \ -variable OptPerms($z,$o,$ref) -onvalue 1 \ -offvalue 0 -selectcolor $COLOUR(check) if { $p } { $vf.$z.c$o select } pack $vf.$z.c$o -anchor w -side left -padx 1 } pack $vf.$z -side top -anchor w } } colour { global $v set OptOld[set lv]($ref) [set $val] button $vf.b -text $TXT(opt$ref) -relief raised \ -command "ChooseColour $v $val $vf .opts" label $vf.bc -relief groove -background [set $val] -width 2 pack $vf.b $vf.bc -side left } font { global $v set f [set $val] set OptOld[set lv]($ref) $f button $vf.b -text $TXT(opt$ref) -relief raised \ -command "ChooseFont $v $val $vf .opts" if { $f == "default" } { set f $TXT(default) } label $vf.l -text $f -width 40 pack $vf.b $vf.l -side left } group { if { $lv != "Main" } { GMMessage "Bad option type for $v: groups only at top level" } else { set OptSubMany($v) 0 button $vf.b -text $TXT(opt$v) -relief raised \ -command "ShowMoreOptions $v ; \ $vf.b configure -state normal" pack $vf.b } } array { if { $lv != "Main" } { GMMessage "Bad option type for $v: arrays only at top level" } else { set OptSubMany($v) 0 button $vf.b -text $TXT(opt$v) -relief raised \ -command "ShowOptionsArray $v ; \ $vf.b configure -state normal" pack $vf.b } } sep { frame $vf.sep -height 6 -bg $COLOUR(dialbg) \ -relief flat -borderwidth 0 pack $vf.sep } } if { $row == -1 } { pack $vf -side top -pady 3 -anchor w -fill x } else { grid $vf -row $row -column $col -pady 3 -padx 3 -sticky we } return $es } proc ShowMoreOptions {g} { # create sub-window for setting options in the group $g global OPTGRPL OPTTYPE MESS TXT DPOSX DPOSY COLOUR TempMOpts OptOldSub \ OptOldNew OptOldMain OptSubMany OPTMAXHEIGHT set w .mopts if { [winfo exists $w] } { Raise $w ; bell ; return } GMToplevel $w options +$DPOSX+$DPOSY .opts \ {WM_DELETE_WINDOW {set TempOpts cnc}} \ { {set TempOpts ok}} frame $w.fr -relief flat -borderwidth 5 -bg $COLOUR(dialbg) if { $OptSubMany($g) } { set lv New } else { set lv Sub foreach v $OPTGRPL($g) { if { $OPTTYPE($v) != "sep" } { global $v set OptOldMain($v) [set $v] } } } incr OptSubMany($g) set i 0 ; set es "" ; set col 0 if { [set n [llength $OPTGRPL($g)]] < $OPTMAXHEIGHT } { set row -1 ; set drow 0 ; set maxrow 1000 } else { set row 0 ; set drow 1 if { [set z [expr int($n/$OPTMAXHEIGHT)]] != 1.0*$n/$OPTMAXHEIGHT } { incr z } if { [set maxrow [expr int($n/$z)]] != $n/$z } { incr maxrow } } foreach v $OPTGRPL($g) { set es [ShowOption $v $v $v $OPTTYPE($v) $w.fr.f$i $es $lv $row $col] incr i if { [incr row $drow] > $maxrow } { set row 0 ; incr col } } frame $w.fr.bs button $w.fr.bs.ok -text $TXT(ok) -command { set TempMOpts ok } button $w.fr.bs.cnc -text $TXT(cancel) -command { set TempMOpts cnc } pack $w.fr.bs.ok $w.fr.bs.cnc -side left -pady 5 if { $row == -1 } { pack $w.fr.bs $w.fr -side top } else { grid $w.fr.bs -row [incr maxrow] -column 0 -columnspan [incr col] \ -pady 5 pack $w.fr -side top } update idletasks set gs [grab current] grab $w # cannot use RaiseWindow while 1 { tkwait variable TempMOpts switch $TempMOpts { "" { } cnc { foreach v [array names OptOld$lv] { # these cannot be arrays global $v set $v [set OptOld[set lv]($v)] ; unset OptOld[set lv]($v) } break } ok { set ok 1 foreach e $es { # these entries cannot be for array elements set v [lindex $e 1] global $v switch $OPTTYPE($v) { nat - float - any - any_empty { set val [[lindex $e 0] get] if { [WrongValue $OPTTYPE($v) $val] } { GMMessage "$TXT(wrgval) $TXT(opt$v)" set ok 0 ; break } set $v $val } } } if { $ok } { break } } } } DestroyRGrabs $w $gs update idletasks return } proc ShowOptionsArray {a} { # create sub-window for setting options in options array $a global OPTELTYPE OPTELS MESS TXT DPOSX DPOSY COLOUR TempAOpts OptOldSub \ OptOldNew OptOldMain OptSubMany $a OPTMAXHEIGHT set w .aopts if { [winfo exists $w] } { Raise $w ; bell ; return } GMToplevel $w options +$DPOSX+$DPOSY .opts \ {WM_DELETE_WINDOW {set TempOpts cnc}} \ { {set TempOpts ok}} frame $w.fr -borderwidth 5 -bg $COLOUR(dialbg) if { $OptSubMany($a) } { set lv New } else { set lv Sub foreach ix $OPTELS($a) { set OptOldMain($a,$ix) [set [set a]($ix)] } } incr OptSubMany($a) set i 0 ; set es "" ; set col 0 if { [set n [llength $OPTELS($a)]] < $OPTMAXHEIGHT } { set row -1 ; set drow 0 ; set maxrow 1000 } else { set row 0 ; set drow 1 if { [set z [expr int($n/$OPTMAXHEIGHT)]] != 1.0*$n/$OPTMAXHEIGHT } { incr z } if { [set maxrow [expr int($n/$z)]] != $n/$z } { incr maxrow } } foreach ix $OPTELS($a) { set es [ShowOption $a $a,$ix [set a]($ix) $OPTELTYPE($a) \ $w.fr.f$i $es $lv $row $col] incr i if { [incr row $drow] > $maxrow } { set row 0 ; incr col } } frame $w.fr.bs button $w.fr.bs.ok -text $TXT(ok) -command { set TempAOpts ok } button $w.fr.bs.cnc -text $TXT(cancel) -command { set TempAOpts cnc } pack $w.fr.bs.ok $w.fr.bs.cnc -side left -pady 5 if { $row == -1 } { pack $w.fr.bs $w.fr -side top } else { grid $w.fr.bs -row [incr maxrow] -column 0 -columnspan [incr col] \ -pady 5 pack $w.fr -side top } update idletasks set gs [grab current] grab $w # cannot use RaiseWindow while 1 { tkwait variable TempAOpts switch $TempAOpts { cnc { foreach ref [array names OptOld$lv] { # saved values of array elements ChangeOption $ref [set OptOld[set lv]($ref)] unset OptOld[set lv]($ref) } break } ok { set ok 1 foreach e $es { # these are entries for array elements set ref [lindex $e 1] set i [expr 1+[string first , $ref]] set ix [string range $ref $i end] switch $OPTELTYPE($a) { nat - float - any - any_empty { set val [[lindex $e 0] get] if { [WrongValue $OPTELTYPE($a) $val] } { GMMessage "$TXT(wrgval) $TXT(opt$ref)" set ok 0 ; break } set [set a]($ix) $val } } } if { $ok } { break } } } } DestroyRGrabs $w $gs update idletasks return } proc ChangeMenuOption {val w} { # change option to value $val presented as a menu, window $w global OptMenuVar ChangeOption $OptMenuVar($w) $val return } proc ChangeTextMenuOption {val w} { # change option to value $val presented as a menu, window $w # $w may be a submenu global OptMenuVar OptMenuText while { [catch {set OptMenuText($w,names)}] && $w != "" } { set w [winfo parent $w] } if { $w == "" } { BUG bad menu } global $OptMenuText($w,names) $OptMenuText($w,label) configure -text \ [set $OptMenuText($w,names)($OptMenuText($w,prefix)$val)] ChangeOption $OptMenuVar($w) $val return } proc ChangeOption {ref val} { # change option with reference $ref to value $val if { [set i [string first , $ref]] != -1 } { set v [string range $ref 0 [expr $i-1]] ; incr i global $v set [set v]([string range $ref $i end]) $val } else { global $ref set $ref $val } return } proc WrongValue {type val} { # check if $val is of given type switch $type { nat { if { [catch {set neq [expr $val!=round($val)]}] || \ $neq || $val<0 } { return 1 } } float { if { [catch {set val [expr $val]}] } { return 1 } } any { if { $val == "" } { return 1 } } any_empty { return 0 } } return 0 } proc GenOption {f v} { # save option $v to file $f global OPTTYPE OPTGRPL OptPerms switch $OPTTYPE($v) { array { global $v foreach e [array names $v] { puts $f "set [set v]($e) \"[set [set v]($e)]\"" } } group { foreach s $OPTGRPL($v) { GenOption $f $s } } sep { puts $f "" } perms { global $v if { [catch {set OptPerms(owner,fread,$v)}] } { puts $f "set $v [set $v]" } else { puts -nonewline $f "set $v 0" foreach g "owner permgroup others" { set d 0 foreach w "fread fwrite fexec" { set d [expr $d+$d+$OptPerms($g,$w,$v)] } puts -nonewline $f $d } puts $f "" } } default { global $v puts $f "set $v \"[set $v]\"" } } return } proc ChooseColour {v val bw mw} { # create modal dialog for choosing a colour # $v is a global variable for the option storage (it may be an array) # $val is a reference to the option storage to be set (it may be # the array name and index) # $bw is window with button .b and label .bc to configure # $mw is toplevel window using this proc global $v TXT TempCol ChColour ColComp DPOSX DPOSY COLOUR $bw.b configure -state normal set w .copts if { [winfo exists $w] } { Raise $w ; bell ; return } GMToplevel $w options +[expr $DPOSX+100]+[expr $DPOSY+100] $mw \ {WM_DELETE_WINDOW {set TempOpts cnc}} \ { {set TempOpts ok}} frame $w.fr -borderwidth 5 -bg $COLOUR(dialbg) frame $w.fr.fr1 frame $w.fr.fr1.rgb set x [ColourToDec [set ChColour [set $val]]] set ColComp(red) [lindex $x 0] ; set ColComp(green) [lindex $x 1] set ColComp(blue) [lindex $x 2] foreach c "red green blue" { set box [frame $w.fr.fr1.rgb.$c] label $box.label -text "$TXT($c):" -width 6 -anchor ne entry $box.entry -textvariable ColComp($c) -width 4 TextBindings $box.entry bind $box.entry "RGBChange $w ; break" scale $box.scl -orient horizontal -from 0 -to 255 -width 8 \ -variable ColComp($c) -showvalue 0 -command "RGBChange $w" pack $box.label -side left -fill y -padx 2 -pady 3 pack $box.entry $box.scl -side left -anchor n -pady 0 pack $box -side top -fill x -padx 0 -pady 2 } set self [frame $w.fr.fr1.sel] label $self.lab -text "$TXT(selection):" -anchor sw entry $self.ent -width 16 TextBindings $self.ent bind $self.ent "ColSelChange $w ; break" bind $self.ent "ColSelChange $w ; break" $self.ent insert 0 $ChColour frame $self.f1 -relief sunken -bd 2 canvas $self.f1.demo -bd 0 -width 100 -height 15 -bg $ChColour frame $w.fr.bs button $w.fr.bs.ok -text $TXT(ok) -command { set TempCol ok } button $w.fr.bs.cnc -text $TXT(cancel) \ -command { set TempCol cnc } pack $self.lab $self.ent -side top -fill x -padx 4 -pady 2 pack $self.f1 -expand yes -anchor nw -fill both -padx 6 -pady 10 pack $self.f1.demo -expand yes -fill both pack $w.fr.fr1.rgb $w.fr.fr1.sel -side left -fill none -anchor nw pack $w.fr.bs.ok $w.fr.bs.cnc -side left -pady 5 pack $w.fr.fr1 $w.fr.bs $w.fr -side top update idletasks set gs [grab current] grab $w RaiseWindow $w while 1 { tkwait variable TempCol switch $TempCol { cnc { break } ok { set $val $ChColour $bw.bc configure -background $ChColour break } } } DestroyRGrabs $w $gs update idletasks return } proc RGBChange {w args} { # change colour after user change in RGB scales # sets ChColour to result global ChColour ColComp set ChColour [DecToColour $ColComp(red) $ColComp(green) $ColComp(blue)] $w.fr.fr1.sel.f1.demo configure -bg $ChColour $w.fr.fr1.sel.ent delete 0 end $w.fr.fr1.sel.ent insert 0 $ChColour return } proc ColSelChange {w} { # change colour after user selection of name # sets ChColour to result global ChColour ColComp if { [set x [ColourToDec [$w.fr.fr1.sel.ent get]]] == -1 } { $w.fr.fr1.sel.ent delete 0 end $w.fr.fr1.sel.ent insert 0 $ChColour $w.fr.fr1.sel.f1.demo configure -bg $ChColour update idletasks bell return } set ChColour [eval DecToColour $x] $w.fr.fr1.sel.ent icursor end $w.fr.fr1.sel.f1.demo configure -bg $ChColour set ColComp(red) [lindex $x 0] ; set ColComp(green) [lindex $x 1] set ColComp(blue) [lindex $x 2] return } proc PermsToList {p} { # convert octal permission to list of lists of bits # first digit (out of 4) of $p assumed to be always zero scan $p "%c%c%c%c" s a b c return [list [PermDigToList $a] [PermDigToList $b] [PermDigToList $c]] } proc PermDigToList {c} { # convert octal digit to binary list set x [expr $c-48] return "[expr ($x&4)!=0] [expr ($x&2)!=0] [expr $x&1]" } proc ChooseFont {v val bw mw} { # choose a font using proc GMSelectFont and configure options windows # $v is a global variable for the option storage (it may be an array) # $val is a reference to the option storage to be set (it may be # an array name and index) # $bw is window with button .b and label .l to configure # $mw is toplevel window using this proc global $v TXT $bw.b configure -state normal if { [set f [GMSelectFont]] == "" } { return } set $val $f if { $f == "default" } { set f $TXT(default) } $bw.l configure -text $f update idletasks return } gpsman-6.4.4.2/gmsrc/rgb.tcl0000644000175000017500000005626012224351120013656 0ustar migmig# # This file is part of: # # gpsman --- GPS Manager: a manager for GPS receiver data # # Copyright (c) 1998-2013 Miguel Filgueiras migfilg@t-online.de # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. # # File: rgb.tcl # Last change: 6 October 2013 # # most of this information taken from the X-Window file rgb.txt: # ! $XConsortium: rgb.txt,v 10.41 94/02/20 18:39:36 rws Exp $ array set RGBNamed { "snow" {255 250 250} "ghost white" {248 248 255} "GhostWhite" {248 248 255} "white smoke" {245 245 245} "whitesmoke" {245 245 245} "WhiteSmoke" {245 245 245} "gainsboro" {220 220 220} "floral white" {255 250 240} "floralwhite" {255 250 240} "FloralWhite" {255 250 240} "old lace" {253 245 230} "oldlace" {253 245 230} "OldLace" {253 245 230} "linen" {250 240 230} "antique white" {250 235 215} "AntiqueWhite" {250 235 215} "papaya whip" {255 239 213} "papayawhip" {255 239 213} "PapayaWhip" {255 239 213} "blanched almond" {255 235 205} "blanchedalmond" {255 235 205} "BlanchedAlmond" {255 235 205} "bisque" {255 228 196} "peach puff" {255 218 185} "peachpuff" {255 218 185} "PeachPuff" {255 218 185} "navajo white" {255 222 173} "navajowhite" {255 222 173} "NavajoWhite" {255 222 173} "moccasin" {255 228 181} "cornsilk" {255 248 220} "ivory" {255 255 240} "lemon chiffon" {255 250 205} "lemonchiffon" {255 250 205} "LemonChiffon" {255 250 205} "seashell" {255 245 238} "honeydew" {240 255 240} "mint cream" {245 255 250} "MintCream" {245 255 250} "azure" {240 255 255} "alice blue" {240 248 255} "aliceblue" {240 248 255} "AliceBlue" {240 248 255} "lavender" {230 230 250} "lavender blush" {255 240 245} "lavenderblush" {255 240 245} "LavenderBlush" {255 240 245} "misty rose" {255 228 225} "mistyrose" {255 228 225} "MistyRose" {255 228 225} "white" {255 255 255} "black" { 0 0 0} "dark slate gray" { 47 79 79} "darkslategray" { 47 79 79} "DarkSlateGray" { 47 79 79} "dark slate grey" { 47 79 79} "darkslategrey" { 47 79 79} "DarkSlateGrey" { 47 79 79} "dim gray" {105 105 105} "dimgray" {105 105 105} "DimGray" {105 105 105} "dim grey" {105 105 105} "dimgrey" {105 105 105} "DimGrey" {105 105 105} "slate gray" {112 128 144} "slategray" {112 128 144} "SlateGray" {112 128 144} "slate grey" {112 128 144} "slategrey" {112 128 144} "SlateGrey" {112 128 144} "light slate gray" {119 136 153} "lightslategray" {119 136 153} "LightSlateGray" {119 136 153} "light slate grey" {119 136 153} "lightslategrey" {119 136 153} "LightSlateGrey" {119 136 153} "gray" {190 190 190} "grey" {190 190 190} "light grey" {211 211 211} "lightgrey" {211 211 211} "LightGrey" {211 211 211} "light gray" {211 211 211} "lightgray" {211 211 211} "LightGray" {211 211 211} "midnight blue" { 25 25 112} "midnightblue" { 25 25 112} "MidnightBlue" { 25 25 112} "navy" { 0 0 128} "navy blue" { 0 0 128} "navyblue" { 0 0 128} "NavyBlue" { 0 0 128} "cornflower blue" {100 149 237} "cornflowerblue" {100 149 237} "CornflowerBlue" {100 149 237} "dark slate blue" { 72 61 139} "darkslateblue" { 72 61 139} "DarkSlateBlue" { 72 61 139} "slate blue" {106 90 205} "slateblue" {106 90 205} "SlateBlue" {106 90 205} "medium slate blue" {123 104 238} "mediumslateblue" {123 104 238} "MediumSlateBlue" {123 104 238} "light slate blue" {132 112 255} "lightslateblue" {132 112 255} "LightSlateBlue" {132 112 255} "medium blue" { 0 0 205} "mediumblue" { 0 0 205} "MediumBlue" { 0 0 205} "royal blue" { 65 105 225} "royalblue" { 65 105 225} "RoyalBlue" { 65 105 225} "blue" { 0 0 255} "dodger blue" { 30 144 255} "dodgerblue" { 30 144 255} "DodgerBlue" { 30 144 255} "deep sky blue" { 0 191 255} "deepskyblue" { 0 191 255} "DeepSkyBlue" { 0 191 255} "sky blue" {135 206 235} "skyblue" {135 206 235} "SkyBlue" {135 206 235} "light sky blue" {135 206 250} "lightskyblue" {135 206 250} "LightSkyBlue" {135 206 250} "steel blue" { 70 130 180} "steelblue" { 70 130 180} "SteelBlue" { 70 130 180} "light steel blue" {176 196 222} "lightsteelblue" {176 196 222} "LightSteelBlue" {176 196 222} "light blue" {173 216 230} "lightblue" {173 216 230} "LightBlue" {173 216 230} "powder blue" {176 224 230} "powderblue" {176 224 230} "PowderBlue" {176 224 230} "pale turquoise" {175 238 238} "paleturquoise" {175 238 238} "PaleTurquoise" {175 238 238} "dark turquoise" { 0 206 209} "darkturquoise" { 0 206 209} "DarkTurquoise" { 0 206 209} "medium turquoise" { 72 209 204} "mediumturquoise" { 72 209 204} "MediumTurquoise" { 72 209 204} "turquoise" { 64 224 208} "cyan" { 0 255 255} "light cyan" {224 255 255} "lightcyan" {224 255 255} "LightCyan" {224 255 255} "cadet blue" { 95 158 160} "cadetblue" { 95 158 160} "CadetBlue" { 95 158 160} "medium aquamarine" {102 205 170} "mediumaquamarine" {102 205 170} "MediumAquamarine" {102 205 170} "aquamarine" {127 255 212} "dark green" { 0 100 0} "darkgreen" { 0 100 0} "DarkGreen" { 0 100 0} "dark olive green" { 85 107 47} "darkolivegreen" { 85 107 47} "DarkOliveGreen" { 85 107 47} "dark sea green" {143 188 143} "darkseagreen" {143 188 143} "DarkSeaGreen" {143 188 143} "sea green" { 46 139 87} "seagreen" { 46 139 87} "SeaGreen" { 46 139 87} "medium sea green" { 60 179 113} "mediumseagreen" { 60 179 113} "MediumSeaGreen" { 60 179 113} "light sea green" { 32 178 170} "lightseagreen" { 32 178 170} "LightSeaGreen" { 32 178 170} "pale green" {152 251 152} "palegreen" {152 251 152} "PaleGreen" {152 251 152} "spring green" { 0 255 127} "springgreen" { 0 255 127} "SpringGreen" { 0 255 127} "lawn green" {124 252 0} "lawngreen" {124 252 0} "LawnGreen" {124 252 0} "green" { 0 255 0} "chartreuse" {127 255 0} "medium spring green" { 0 250 154} "mediumspringgreen" { 0 250 154} "MediumSpringGreen" { 0 250 154} "green yellow" {173 255 47} "greenyellow" {173 255 47} "GreenYellow" {173 255 47} "lime green" { 50 205 50} "limegreen" { 50 205 50} "LimeGreen" { 50 205 50} "yellow green" {154 205 50} "yellowgreen" {154 205 50} "YellowGreen" {154 205 50} "forest green" { 34 139 34} "forestgreen" { 34 139 34} "ForestGreen" { 34 139 34} "olive drab" {107 142 35} "olivedrab" {107 142 35} "OliveDrab" {107 142 35} "dark khaki" {189 183 107} "darkkhaki" {189 183 107} "DarkKhaki" {189 183 107} "khaki" {240 230 140} "pale goldenrod" {238 232 170} "palegoldenrod" {238 232 170} "PaleGoldenrod" {238 232 170} "light goldenrod yellow" {250 250 210} "lightgoldenrodyellow" {250 250 210} "LightGoldenrodYellow" {250 250 210} "light yellow" {255 255 224} "lightyellow" {255 255 224} "LightYellow" {255 255 224} "yellow" {255 255 0} "gold" {255 215 0} "light goldenrod" {238 221 130} "lightgoldenrod" {238 221 130} "LightGoldenrod" {238 221 130} "goldenrod" {218 165 32} "dark goldenrod" {184 134 11} "darkgoldenrod" {184 134 11} "DarkGoldenrod" {184 134 11} "rosy brown" {188 143 143} "rosybrown" {188 143 143} "RosyBrown" {188 143 143} "indian red" {205 92 92} "indianred" {205 92 92} "IndianRed" {205 92 92} "saddle brown" {139 69 19} "saddlebrown" {139 69 19} "SaddleBrown" {139 69 19} "sienna" {160 82 45} "peru" {205 133 63} "burlywood" {222 184 135} "beige" {245 245 220} "wheat" {245 222 179} "sandy brown" {244 164 96} "sandybrown" {244 164 96} "SandyBrown" {244 164 96} "tan" {210 180 140} "chocolate" {210 105 30} "firebrick" {178 34 34} "brown" {165 42 42} "dark salmon" {233 150 122} "darksalmon" {233 150 122} "DarkSalmon" {233 150 122} "salmon" {250 128 114} "light salmon" {255 160 122} "lightsalmon" {255 160 122} "LightSalmon" {255 160 122} "orange" {255 165 0} "dark orange" {255 140 0} "darkorange" {255 140 0} "DarkOrange" {255 140 0} "coral" {255 127 80} "light coral" {240 128 128} "lightcoral" {240 128 128} "LightCoral" {240 128 128} "tomato" {255 99 71} "orange red" {255 69 0} "orangered" {255 69 0} "OrangeRed" {255 69 0} "red" {255 0 0} "hot pink" {255 105 180} "hotpink" {255 105 180} "HotPink" {255 105 180} "deep pink" {255 20 147} "deeppink" {255 20 147} "DeepPink" {255 20 147} "pink" {255 192 203} "light pink" {255 182 193} "lightpink" {255 182 193} "LightPink" {255 182 193} "pale violet red" {219 112 147} "palevioletred" {219 112 147} "PaleVioletRed" {219 112 147} "maroon" {176 48 96} "medium violet red" {199 21 133} "mediumvioletred" {199 21 133} "MediumVioletRed" {199 21 133} "violet red" {208 32 144} "violetred" {208 32 144} "VioletRed" {208 32 144} "magenta" {255 0 255} "violet" {238 130 238} "plum" {221 160 221} "orchid" {218 112 214} "medium orchid" {186 85 211} "mediumorchid" {186 85 211} "MediumOrchid" {186 85 211} "dark orchid" {153 50 204} "darkorchid" {153 50 204} "DarkOrchid" {153 50 204} "dark violet" {148 0 211} "darkviolet" {148 0 211} "DarkViolet" {148 0 211} "blue violet" {138 43 226} "blueviolet" {138 43 226} "BlueViolet" {138 43 226} "purple" {160 32 240} "medium purple" {147 112 219} "mediumpurple" {147 112 219} "MediumPurple" {147 112 219} "thistle" {216 191 216} "snow1" {255 250 250} "snow2" {238 233 233} "snow3" {205 201 201} "snow4" {139 137 137} "seashell1" {255 245 238} "seashell2" {238 229 222} "seashell3" {205 197 191} "seashell4" {139 134 130} "AntiqueWhite1" {255 239 219} "AntiqueWhite2" {238 223 204} "AntiqueWhite3" {205 192 176} "AntiqueWhite4" {139 131 120} "bisque1" {255 228 196} "bisque2" {238 213 183} "bisque3" {205 183 158} "bisque4" {139 125 107} "PeachPuff1" {255 218 185} "PeachPuff2" {238 203 173} "PeachPuff3" {205 175 149} "PeachPuff4" {139 119 101} "NavajoWhite1" {255 222 173} "NavajoWhite2" {238 207 161} "NavajoWhite3" {205 179 139} "NavajoWhite4" {139 121 94} "LemonChiffon1" {255 250 205} "LemonChiffon2" {238 233 191} "LemonChiffon3" {205 201 165} "LemonChiffon4" {139 137 112} "cornsilk1" {255 248 220} "cornsilk2" {238 232 205} "cornsilk3" {205 200 177} "cornsilk4" {139 136 120} "ivory1" {255 255 240} "ivory2" {238 238 224} "ivory3" {205 205 193} "ivory4" {139 139 131} "honeydew1" {240 255 240} "honeydew2" {224 238 224} "honeydew3" {193 205 193} "honeydew4" {131 139 131} "LavenderBlush1" {255 240 245} "LavenderBlush2" {238 224 229} "LavenderBlush3" {205 193 197} "LavenderBlush4" {139 131 134} "MistyRose1" {255 228 225} "MistyRose2" {238 213 210} "MistyRose3" {205 183 181} "MistyRose4" {139 125 123} "azure1" {240 255 255} "azure2" {224 238 238} "azure3" {193 205 205} "azure4" {131 139 139} "SlateBlue1" {131 111 255} "SlateBlue2" {122 103 238} "SlateBlue3" {105 89 205} "SlateBlue4" { 71 60 139} "RoyalBlue1" { 72 118 255} "RoyalBlue2" { 67 110 238} "RoyalBlue3" { 58 95 205} "RoyalBlue4" { 39 64 139} "blue1" { 0 0 255} "blue2" { 0 0 238} "blue3" { 0 0 205} "blue4" { 0 0 139} "DodgerBlue1" { 30 144 255} "DodgerBlue2" { 28 134 238} "DodgerBlue3" { 24 116 205} "DodgerBlue4" { 16 78 139} "SteelBlue1" { 99 184 255} "SteelBlue2" { 92 172 238} "SteelBlue3" { 79 148 205} "SteelBlue4" { 54 100 139} "DeepSkyBlue1" { 0 191 255} "DeepSkyBlue2" { 0 178 238} "DeepSkyBlue3" { 0 154 205} "DeepSkyBlue4" { 0 104 139} "SkyBlue1" {135 206 255} "SkyBlue2" {126 192 238} "SkyBlue3" {108 166 205} "SkyBlue4" { 74 112 139} "LightSkyBlue1" {176 226 255} "LightSkyBlue2" {164 211 238} "LightSkyBlue3" {141 182 205} "LightSkyBlue4" { 96 123 139} "SlateGray1" {198 226 255} "SlateGray2" {185 211 238} "SlateGray3" {159 182 205} "SlateGray4" {108 123 139} "LightSteelBlue1" {202 225 255} "LightSteelBlue2" {188 210 238} "LightSteelBlue3" {162 181 205} "LightSteelBlue4" {110 123 139} "LightBlue1" {191 239 255} "LightBlue2" {178 223 238} "LightBlue3" {154 192 205} "LightBlue4" {104 131 139} "LightCyan1" {224 255 255} "LightCyan2" {209 238 238} "LightCyan3" {180 205 205} "LightCyan4" {122 139 139} "PaleTurquoise1" {187 255 255} "PaleTurquoise2" {174 238 238} "PaleTurquoise3" {150 205 205} "PaleTurquoise4" {102 139 139} "CadetBlue1" {152 245 255} "CadetBlue2" {142 229 238} "CadetBlue3" {122 197 205} "CadetBlue4" { 83 134 139} "turquoise1" { 0 245 255} "turquoise2" { 0 229 238} "turquoise3" { 0 197 205} "turquoise4" { 0 134 139} "cyan1" { 0 255 255} "cyan2" { 0 238 238} "cyan3" { 0 205 205} "cyan4" { 0 139 139} "DarkSlateGray1" {151 255 255} "DarkSlateGray2" {141 238 238} "DarkSlateGray3" {121 205 205} "DarkSlateGray4" { 82 139 139} "aquamarine1" {127 255 212} "aquamarine2" {118 238 198} "aquamarine3" {102 205 170} "aquamarine4" { 69 139 116} "DarkSeaGreen1" {193 255 193} "DarkSeaGreen2" {180 238 180} "DarkSeaGreen3" {155 205 155} "DarkSeaGreen4" {105 139 105} "SeaGreen1" { 84 255 159} "SeaGreen2" { 78 238 148} "SeaGreen3" { 67 205 128} "SeaGreen4" { 46 139 87} "PaleGreen1" {154 255 154} "PaleGreen2" {144 238 144} "PaleGreen3" {124 205 124} "PaleGreen4" { 84 139 84} "SpringGreen1" { 0 255 127} "SpringGreen2" { 0 238 118} "SpringGreen3" { 0 205 102} "SpringGreen4" { 0 139 69} "green1" { 0 255 0} "green2" { 0 238 0} "green3" { 0 205 0} "green4" { 0 139 0} "chartreuse1" {127 255 0} "chartreuse2" {118 238 0} "chartreuse3" {102 205 0} "chartreuse4" { 69 139 0} "OliveDrab1" {192 255 62} "OliveDrab2" {179 238 58} "OliveDrab3" {154 205 50} "OliveDrab4" {105 139 34} "DarkOliveGreen1" {202 255 112} "DarkOliveGreen2" {188 238 104} "DarkOliveGreen3" {162 205 90} "DarkOliveGreen4" {110 139 61} "khaki1" {255 246 143} "khaki2" {238 230 133} "khaki3" {205 198 115} "khaki4" {139 134 78} "LightGoldenrod1" {255 236 139} "LightGoldenrod2" {238 220 130} "LightGoldenrod3" {205 190 112} "LightGoldenrod4" {139 129 76} "LightYellow1" {255 255 224} "LightYellow2" {238 238 209} "LightYellow3" {205 205 180} "LightYellow4" {139 139 122} "yellow1" {255 255 0} "yellow2" {238 238 0} "yellow3" {205 205 0} "yellow4" {139 139 0} "gold1" {255 215 0} "gold2" {238 201 0} "gold3" {205 173 0} "gold4" {139 117 0} "goldenrod1" {255 193 37} "goldenrod2" {238 180 34} "goldenrod3" {205 155 29} "goldenrod4" {139 105 20} "DarkGoldenrod1" {255 185 15} "DarkGoldenrod2" {238 173 14} "DarkGoldenrod3" {205 149 12} "DarkGoldenrod4" {139 101 8} "RosyBrown1" {255 193 193} "RosyBrown2" {238 180 180} "RosyBrown3" {205 155 155} "RosyBrown4" {139 105 105} "IndianRed1" {255 106 106} "IndianRed2" {238 99 99} "IndianRed3" {205 85 85} "IndianRed4" {139 58 58} "sienna1" {255 130 71} "sienna2" {238 121 66} "sienna3" {205 104 57} "sienna4" {139 71 38} "burlywood1" {255 211 155} "burlywood2" {238 197 145} "burlywood3" {205 170 125} "burlywood4" {139 115 85} "wheat1" {255 231 186} "wheat2" {238 216 174} "wheat3" {205 186 150} "wheat4" {139 126 102} "tan1" {255 165 79} "tan2" {238 154 73} "tan3" {205 133 63} "tan4" {139 90 43} "chocolate1" {255 127 36} "chocolate2" {238 118 33} "chocolate3" {205 102 29} "chocolate4" {139 69 19} "firebrick1" {255 48 48} "firebrick2" {238 44 44} "firebrick3" {205 38 38} "firebrick4" {139 26 26} "brown1" {255 64 64} "brown2" {238 59 59} "brown3" {205 51 51} "brown4" {139 35 35} "salmon1" {255 140 105} "salmon2" {238 130 98} "salmon3" {205 112 84} "salmon4" {139 76 57} "LightSalmon1" {255 160 122} "LightSalmon2" {238 149 114} "LightSalmon3" {205 129 98} "LightSalmon4" {139 87 66} "orange1" {255 165 0} "orange2" {238 154 0} "orange3" {205 133 0} "orange4" {139 90 0} "DarkOrange1" {255 127 0} "DarkOrange2" {238 118 0} "DarkOrange3" {205 102 0} "DarkOrange4" {139 69 0} "coral1" {255 114 86} "coral2" {238 106 80} "coral3" {205 91 69} "coral4" {139 62 47} "tomato1" {255 99 71} "tomato2" {238 92 66} "tomato3" {205 79 57} "tomato4" {139 54 38} "OrangeRed1" {255 69 0} "OrangeRed2" {238 64 0} "OrangeRed3" {205 55 0} "OrangeRed4" {139 37 0} "red1" {255 0 0} "red2" {238 0 0} "red3" {205 0 0} "red4" {139 0 0} "DeepPink1" {255 20 147} "DeepPink2" {238 18 137} "DeepPink3" {205 16 118} "DeepPink4" {139 10 80} "HotPink1" {255 110 180} "HotPink2" {238 106 167} "HotPink3" {205 96 144} "HotPink4" {139 58 98} "pink1" {255 181 197} "pink2" {238 169 184} "pink3" {205 145 158} "pink4" {139 99 108} "LightPink1" {255 174 185} "LightPink2" {238 162 173} "LightPink3" {205 140 149} "LightPink4" {139 95 101} "PaleVioletRed1" {255 130 171} "PaleVioletRed2" {238 121 159} "PaleVioletRed3" {205 104 137} "PaleVioletRed4" {139 71 93} "maroon1" {255 52 179} "maroon2" {238 48 167} "maroon3" {205 41 144} "maroon4" {139 28 98} "VioletRed1" {255 62 150} "VioletRed2" {238 58 140} "VioletRed3" {205 50 120} "VioletRed4" {139 34 82} "magenta1" {255 0 255} "magenta2" {238 0 238} "magenta3" {205 0 205} "magenta4" {139 0 139} "orchid1" {255 131 250} "orchid2" {238 122 233} "orchid3" {205 105 201} "orchid4" {139 71 137} "plum1" {255 187 255} "plum2" {238 174 238} "plum3" {205 150 205} "plum4" {139 102 139} "MediumOrchid1" {224 102 255} "MediumOrchid2" {209 95 238} "MediumOrchid3" {180 82 205} "MediumOrchid4" {122 55 139} "DarkOrchid1" {191 62 255} "DarkOrchid2" {178 58 238} "DarkOrchid3" {154 50 205} "DarkOrchid4" {104 34 139} "purple1" {155 48 255} "purple2" {145 44 238} "purple3" {125 38 205} "purple4" { 85 26 139} "MediumPurple1" {171 130 255} "MediumPurple2" {159 121 238} "MediumPurple3" {137 104 205} "MediumPurple4" { 93 71 139} "thistle1" {255 225 255} "thistle2" {238 210 238} "thistle3" {205 181 205} "thistle4" {139 123 139} "gray0" { 0 0 0} "grey0" { 0 0 0} "gray1" { 3 3 3} "grey1" { 3 3 3} "gray2" { 5 5 5} "grey2" { 5 5 5} "gray3" { 8 8 8} "grey3" { 8 8 8} "gray4" { 10 10 10} "grey4" { 10 10 10} "gray5" { 13 13 13} "grey5" { 13 13 13} "gray6" { 15 15 15} "grey6" { 15 15 15} "gray7" { 18 18 18} "grey7" { 18 18 18} "gray8" { 20 20 20} "grey8" { 20 20 20} "gray9" { 23 23 23} "grey9" { 23 23 23} "gray10" { 26 26 26} "grey10" { 26 26 26} "gray11" { 28 28 28} "grey11" { 28 28 28} "gray12" { 31 31 31} "grey12" { 31 31 31} "gray13" { 33 33 33} "grey13" { 33 33 33} "gray14" { 36 36 36} "grey14" { 36 36 36} "gray15" { 38 38 38} "grey15" { 38 38 38} "gray16" { 41 41 41} "grey16" { 41 41 41} "gray17" { 43 43 43} "grey17" { 43 43 43} "gray18" { 46 46 46} "grey18" { 46 46 46} "gray19" { 48 48 48} "grey19" { 48 48 48} "gray20" { 51 51 51} "grey20" { 51 51 51} "gray21" { 54 54 54} "grey21" { 54 54 54} "gray22" { 56 56 56} "grey22" { 56 56 56} "gray23" { 59 59 59} "grey23" { 59 59 59} "gray24" { 61 61 61} "grey24" { 61 61 61} "gray25" { 64 64 64} "grey25" { 64 64 64} "gray26" { 66 66 66} "grey26" { 66 66 66} "gray27" { 69 69 69} "grey27" { 69 69 69} "gray28" { 71 71 71} "grey28" { 71 71 71} "gray29" { 74 74 74} "grey29" { 74 74 74} "gray30" { 77 77 77} "grey30" { 77 77 77} "gray31" { 79 79 79} "grey31" { 79 79 79} "gray32" { 82 82 82} "grey32" { 82 82 82} "gray33" { 84 84 84} "grey33" { 84 84 84} "gray34" { 87 87 87} "grey34" { 87 87 87} "gray35" { 89 89 89} "grey35" { 89 89 89} "gray36" { 92 92 92} "grey36" { 92 92 92} "gray37" { 94 94 94} "grey37" { 94 94 94} "gray38" { 97 97 97} "grey38" { 97 97 97} "gray39" { 99 99 99} "grey39" { 99 99 99} "gray40" {102 102 102} "grey40" {102 102 102} "gray41" {105 105 105} "grey41" {105 105 105} "gray42" {107 107 107} "grey42" {107 107 107} "gray43" {110 110 110} "grey43" {110 110 110} "gray44" {112 112 112} "grey44" {112 112 112} "gray45" {115 115 115} "grey45" {115 115 115} "gray46" {117 117 117} "grey46" {117 117 117} "gray47" {120 120 120} "grey47" {120 120 120} "gray48" {122 122 122} "grey48" {122 122 122} "gray49" {125 125 125} "grey49" {125 125 125} "gray50" {127 127 127} "grey50" {127 127 127} "gray51" {130 130 130} "grey51" {130 130 130} "gray52" {133 133 133} "grey52" {133 133 133} "gray53" {135 135 135} "grey53" {135 135 135} "gray54" {138 138 138} "grey54" {138 138 138} "gray55" {140 140 140} "grey55" {140 140 140} "gray56" {143 143 143} "grey56" {143 143 143} "gray57" {145 145 145} "grey57" {145 145 145} "gray58" {148 148 148} "grey58" {148 148 148} "gray59" {150 150 150} "grey59" {150 150 150} "gray60" {153 153 153} "grey60" {153 153 153} "gray61" {156 156 156} "grey61" {156 156 156} "gray62" {158 158 158} "grey62" {158 158 158} "gray63" {161 161 161} "grey63" {161 161 161} "gray64" {163 163 163} "grey64" {163 163 163} "gray65" {166 166 166} "grey65" {166 166 166} "gray66" {168 168 168} "grey66" {168 168 168} "gray67" {171 171 171} "grey67" {171 171 171} "gray68" {173 173 173} "grey68" {173 173 173} "gray69" {176 176 176} "grey69" {176 176 176} "gray70" {179 179 179} "grey70" {179 179 179} "gray71" {181 181 181} "grey71" {181 181 181} "gray72" {184 184 184} "grey72" {184 184 184} "gray73" {186 186 186} "grey73" {186 186 186} "gray74" {189 189 189} "grey74" {189 189 189} "gray75" {191 191 191} "grey75" {191 191 191} "gray76" {194 194 194} "grey76" {194 194 194} "gray77" {196 196 196} "grey77" {196 196 196} "gray78" {199 199 199} "grey78" {199 199 199} "gray79" {201 201 201} "grey79" {201 201 201} "gray80" {204 204 204} "grey80" {204 204 204} "gray81" {207 207 207} "grey81" {207 207 207} "gray82" {209 209 209} "grey82" {209 209 209} "gray83" {212 212 212} "grey83" {212 212 212} "gray84" {214 214 214} "grey84" {214 214 214} "gray85" {217 217 217} "grey85" {217 217 217} "gray86" {219 219 219} "grey86" {219 219 219} "gray87" {222 222 222} "grey87" {222 222 222} "gray88" {224 224 224} "grey88" {224 224 224} "gray89" {227 227 227} "grey89" {227 227 227} "gray90" {229 229 229} "grey90" {229 229 229} "gray91" {232 232 232} "grey91" {232 232 232} "gray92" {235 235 235} "grey92" {235 235 235} "gray93" {237 237 237} "grey93" {237 237 237} "gray94" {240 240 240} "grey94" {240 240 240} "gray95" {242 242 242} "grey95" {242 242 242} "gray96" {245 245 245} "grey96" {245 245 245} "gray97" {247 247 247} "grey97" {247 247 247} "gray98" {250 250 250} "grey98" {250 250 250} "gray99" {252 252 252} "grey99" {252 252 252} "gray100" {255 255 255} "grey100" {255 255 255} "dark grey" {169 169 169} "darkgrey" {169 169 169} "DarkGrey" {169 169 169} "dark gray" {169 169 169} "darkgray" {169 169 169} "DarkGray" {169 169 169} "dark blue" {0 0 139} "darkblue" {0 0 139} "DarkBlue" {0 0 139} "dark cyan" {0 139 139} "darkcyan" {0 139 139} "DarkCyan" {0 139 139} "dark magenta" {139 0 139} "darkmagenta" {139 0 139} "DarkMagenta" {139 0 139} "dark red" {139 0 0} "darkred" {139 0 0} "DarkRed" {139 0 0} "dark yellow" {206 196 0} "darkyellow" {206 196 0} "DarkYellow" {206 196 0} "light green" {144 238 144} "lightgreen" {144 238 144} "LightGreen" {144 238 144} } gpsman-6.4.4.2/gmsrc/check.tcl0000644000175000017500000002317212224351117014163 0ustar migmig# # This file is part of: # # gpsman --- GPS Manager: a manager for GPS receiver data # # Copyright (c) 1998-2013 Miguel Filgueiras migfilg@t-online.de # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. # # File: check.tcl # Last change: 6 October 2013 # # Includes contributions by # - Valere Robin (valere.robin _AT_ wanadoo.fr) marked "VR contribution" # proc CheckName {errproc name} { # check length and characters of name; call $errproc on error global ACCEPTALLCHARS NAMELENGTH NOLOWERCASE MYGPS RECNAMECHARS MESS set n [string length $name] if { $n > $NAMELENGTH } { $errproc [format $MESS(namelgth) $NAMELENGTH] return 0 } if { $n == 0 } { $errproc $MESS(namevoid) return 0 } if { $ACCEPTALLCHARS } { return 1 } if { ! $NOLOWERCASE } { set name [string toupper $name] } if { [regexp $RECNAMECHARS($MYGPS) $name] } { return 1 } $errproc $MESS(badstrg) return 0 } proc CheckDateEls {y m d h mn s} { # check year, month, day, hour, minutes, seconds global YEAR0 DAYSOF if { $y<$YEAR0 || $m<1 || $m>12 || $d<1 || \ $h<0 || $h>23 || $mn<0 || $mn>59 || $s<0 || $s>59 || \ ( $d>$DAYSOF($m) && ($m != 2 || $d != 29 || \ $y%4 != 0 || ($y%100 == 0 && $y%400 != 0)) ) } { return 0 } return 1 } proc CheckDate {errproc date} { global CREATIONDATE MESS if { $CREATIONDATE && [ScanDate $date] == "" } { $errproc [format $MESS(baddateas) $date] return 0 } return 1 } proc CheckConvDate {string} { # convert string to date global DateFormat MESS if { [set l [ScanDate $string]] != "" } { return [list [eval FormatDate $DateFormat $l] [eval DateToSecs $l]] } GMMessage "$MESS(baddate): $string" return "" } proc CheckTime {errproc time} { # check hours, minutes and seconds separated by ":", where hours # and minutes may be absent, seconds may be a float # accept "" as undefined value global MESS if { $time == "" } { return 1 } if { [set n [llength [set fs [split $time ":"]]]] <= 3 && \ [CheckFloat Ignore [set s [lindex $fs end]]] && $s < 60 } { if { $n == 1 } { return 1 } if { [CheckNumber Ignore [set m [lindex $fs end-1]]] && $m < 60 } { if { $n == 2 } { return 1 } if { [CheckNumber Ignore [lindex $fs 0]] } { return 1 } } } $errproc $MESS(badtimeval) return 0 } proc CheckLat {errproc lat pformt} { # positive latitudes to North return [CheckCoord $errproc $pformt $lat N 90] } proc CheckLong {errproc long pformt} { # positive longitudes to East return [CheckCoord $errproc $pformt $long E 180] } proc CheckCoord {errproc pformt coord posh max} { # check coordinate $coord under format $pformt, with positive heading $posh # and maximum value $max in degrees; call $errproc on error global MESS TXT set coord [string trim $coord] set h [string index $coord 0] if { ! [regexp {[0-9]} $h] } { if { ! [regexp {[+-]} $h] && $h != $posh && \ $h != [ChangeCoordSign $posh] } { $errproc [format $MESS(badhdg) $h $posh/[ChangeCoordSign $posh]] return 0 } set coord [string range $coord 1 end] } switch $pformt { DMS { if { [scan $coord "%d %d %f%s" d m s err] == 3 } { if { ($d<$max && $m<60 & $s<60) || \ ($d==$max && $m==0 && $s==0) } { return 1 } } } DMM { if { [scan $coord "%d %f%s" d m err] == 2 } { if { ($d<$max && $m<60) || ($d==$max && $m==0) } { return 1 } } } DDD { if { [scan $coord "%f%s" d err] == 1 } { if { $d <= $max } { return 1 } } } GRA { if { [scan $coord "%f%s" d err] == 1 } { if { $d <= $max/0.9 } { return 1 } } } } $errproc [format $MESS(badcoord) $coord $TXT($pformt)] return 0 } proc CheckZE {errproc ze} { # check zone east of UTM coordinate; call $errproc on error global MESS if { [CheckNumber $errproc $ze] } { if { $ze<0 || $ze>99 } { $errproc "$MESS(outofrng) \[0..99\]" } else { return 1 } } return 0 } proc CheckZN {errproc zn} { # check zone north of UTM coordinate; call $errproc on error global MESS if { [regexp {^[A-Z]$} $zn] && $zn != "I" && $zn != "O" } { return 1 } $errproc $MESS(UTMZN) return 0 } proc CheckZone {errproc zone pformt} { # check zone for the grid $pformt; call $errproc on error global MESS GRIDZN if { [regexp $GRIDZN($pformt) $zone] } { return 1 } $errproc $MESS(badgridzone) return 0 } proc CheckMHLocator {errproc mh} { global MESS if { [regexp {^[A-R][A-R][0-9][0-9][A-X][A-X]$} $mh] } { return 1 } $errproc $MESS(badMHloc) return 0 } proc CheckComment {errproc comm} { # check length and characters of comment; call $errproc on error global COMMENTLENGTH MESS if { [string length $comm] > $COMMENTLENGTH } { $errproc [format $MESS(cmmtlgth) $COMMENTLENGTH] return 0 } return [CheckChars $errproc $comm] } proc CheckChars {errproc string} { # check characters in comment string; call $errproc on error global ACCEPTALLCHARS NOLOWERCASE MESS if { $ACCEPTALLCHARS } { return 1 } if { ! $NOLOWERCASE || [regexp {^[-A-Z0-9 -]*$} $string] } { return 1 } $errproc $MESS(badstrg) return 0 } proc CheckString {errproc string} { # check that string is not void; call $errproc on error global MESS if { [string length $string] == 0 } { $errproc $MESS(strgvoid) return 0 } return 1 } proc CheckNumber {errproc n} { # check that $n is a natural number; may be preceded/followed by spaces; # call $errproc on error global MESS if { [regexp {^ *[0-9]+ *$} $n] } { return 1 } $errproc [format $MESS(nan) $n] return 0 } proc CheckFloat {errproc n} { # check that $n is floating-point number that may be preceded/followed # by spaces; scientific notation accepted # call $errproc on error global MESS if { [regexp {^ *-?[0-9]+(\.[0-9]+)?([eE]-?[1-9][0-9]*)? *$} $n] } { return 1 } $errproc [format $MESS(nan) $n] return 0 } proc CheckSignedFloat {errproc n} { # check that $n is a floating-point number, that may have a minus sign # and be preceded/followed by spaces; scientific notation accepted # call $errproc on error global MESS if { [regexp {^ *-?[0-9]+(\.[0-9]+)?([eE]-?[1-9][0-9]*)? *$} $n] } { return 1 } $errproc [format $MESS(nan) $n] return 0 } proc CheckNB {text} { # delete empty lines and leading blanks from text while { [regsub -all "\n\n+" $text "\n" text] } {} return [string trim $text " \t\n"] } proc Ignore {args} { # to be used as error/checking procedure when ignoring errors return 0 } proc CheckArrayElement {array val} { # check that $val is an element of $array # return 1 on success, 0 on error global $array foreach an [array names $array] { if { [set [set array]($an)] == $val } { return 1 } } return 0 } proc BadAltitude {altlst} { # check internal representation of altitude as list # also used for depth global AltUnit ALSCALE DLUNIT if { $altlst == "" || [CheckSignedFloat Ignore $altlst] } { return 0 } if { [llength $altlst] != 3 || \ [catch {expr [lindex $altlst 0]+[lindex $altlst 1]}] || \ [catch {set DLUNIT([lindex $altlst 2],dist)}] } { return 1 } return 0 } proc BadWidth {w} { # check value for line width if { [regexp {^[1-9][0-9]?$} $w] } { return 0 } return 1 } proc BadColour {c} { # check that string describing a colour, either in "#A0B0C0" form or # as an acceptable name if { [ColourToDec $c] != -1 } { return 0 } return 1 } proc BadDatumFor {pformt datum errproc} { # check whether datum is suitable for use with position format # if not call $errproc with appropriate message # return 0 if it is, otherwise the required datum global POSTYPE TXT MESS if { ( [set t $POSTYPE($pformt)] == "nzgrid" || $t == "grid" ) && \ [set gd [GridDatum $pformt $datum]] != $datum } { $errproc [format $MESS(badgriddatum) $TXT($pformt) $gd] return $gd } return 0 } proc BadParam {name type value} { # check $value for numeric parameter of definition $name # $type as used in MAPPROJDTYPE array (projections.tcl) # $name is used only in the error message global MESS GRIDZN set e 1 if { [regexp {zone=(.*)} $type x grname] } { if { [regexp $GRIDZN($grname) $value] } { return 0 } } elseif { \ [regexp {^ *-?[0-9]+(\.[0-9]+)?([eE]-?[1-9][0-9]*)? *$} $value] } { switch -glob $type { lat=*,* { regexp {lat=([^,]+),(.*)} $type z mn mx set e [expr $value<$mn || $value>$mx] } long=*,* { regexp {long=([^,]+),(.*)} $type z mn mx set e [expr $value<$mn || $value>$mx] } lat { set e [expr $value<-90 || $value>90] } long { set e [expr $value<-180 || $value>180] } float>* { regsub float> $type "" mn set e [expr $value<$mn] } list=* - list:* { set l [string range $type 5 end] foreach v [split $l ,] { if { $value == $v } { return 0 } } } float { return 0 } } } if { $e } { GMMessage [format $MESS(badparam) $name] return 1 } return 0 } gpsman-6.4.4.2/gmsrc/langru.tcl0000644000175000017500000021173012224351120014367 0ustar migmig# # Russian support for gpsman # # Copyright (c) 2007 Nikolai Kosyakov () # # This file is part of: # # gpsman --- GPS Manager: a manager for GPS receiver data # # Copyright (c) 1998-2013 Miguel Filgueiras migfilg@t-online.de # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. # # File: langru.tcl # Last change: 6 October 2013 # Russian language file by Nikolai Kosyakov, 21 October 2007 # # Support by Alexander B. Preobrazhenskiy (modul_AT_ihome.ru) since October 2009 # last input from him inserted: 27 December 2009 # # file langengl.tcl is consulted first; no need for duplicating entries here # only 3 chars long names; check also ALLMONTH in file i18n-utf8.tcl set MONTHNAMES "Янв Фев Мар Апр Май Июл Июн Авг Сен Окт Ноя Дек" set DLUNIT(KM,dist) км set DLUNIT(KM,subdist) м set DLUNIT(KM,speed) "км/ч" set DLUNIT(KM,area) "кв.км" set DLUNIT(NAUTMILE,dist) "м.миля" set DLUNIT(NAUTMILE,subdist) фут set DLUNIT(NAUTMILE,speed) узел set DLUNIT(NAUTMILE,area) "кв м.миля" set DLUNIT(STATMILE,dist) миля set DLUNIT(STATMILE,subdist) фут set DLUNIT(STATMILE,speed) миль/ч set DLUNIT(M,dist) $DLUNIT(KM,subdist) set DLUNIT(FT,dist) $DLUNIT(STATMILE,subdist) set DTUNIT $DLUNIT($DISTUNIT,dist) set SPUNIT $DLUNIT($DISTUNIT,speed) set ARUNIT $DLUNIT($DISTUNIT,area) set ALUNIT $DLUNIT($ALTUNIT,dist) set MESS(RTcomp) "#\tПТ\t\t$DTUNIT\tгр\t$ALUNIT" set MESS(TRcomp) "#\t\t\t\t$ALUNIT\t$DTUNIT\t$DTUNIT\tч:м:с\t$SPUNIT\tгр" set MESS(WPNearest) "ПТ\t\t$DTUNIT\tгр" array set MESS { badscale "Неверное значение масштаба карты" oktoexit "Да, выйти (не сохранённые данные будут утрачены)" okclrmap "Да, очистить карту" namelgth "Имя не должно быть больше %d символов" namelgth "Комментарий не должен быть больше %d символов" namevoid "Имя не может быть пустым" baddate "Недопустимая дата; строка" badhdg "Недопустимое начало %s: должно быть %s или +/-" badcoord "Недопустимые границы координат или формат: \"%s\" должен быть %s" outofrng "Число выходит за допустимые границы" UTMZN "Должна быть буква из интервалов A..H, J..N, или P..Z" badstrg "Недопустимый символ или символы" strgvoid "Строка не может быть пустой" nan "\"%s\" не число" written "Записано" undefWP "Маршрут %s содержит не определённые WP точки; не сохранён/не экспортирован" bigRT "Маршрут %s > максимального номера; не экспортирован" unkndatum "Неизвестный датум" badcommdWP "Недопустимая команда при загрузке ПТ; строка" notabsWP "Недопустимое определение ПТ точки; нет табуляций, строка" undefinedWP "Ссылка на неизвестную ПТ-точку: %s" undefinedTR "Неизвестный ТР" nofieldsWP "Недопустимая ПТ, недостаточно полей; строка" excfieldsWP "Недопустимая ПТ, слишком много полей; строка" badWPsRT "МШ с недопустимым списком путевых точек; строка" toomuchWPs "Внимание: в МШ ПТ больше %d " badcommdTP "Недопустимая команда при загрузке ТТ; строка" badcommdLP "Недопустимая команда при загрузке ЛТ; строка" badTP "Недопустимая точка в ТР; строка" badTPsTR "ТР с неверным списком точек трека; строка" badLP "Недопустимая точка в ЛН; строка" badLPsLN "ЛН с неверным списком точек трека; строка" noheader "Отсутствует стандартный заголовок файла" loaderr "Ошибка загрузки из файла; строка" unkncommd "Недопустимая команда при загрузке из файла; строка" noformat "В начале файла отсутствует Форматная строка" badformat "Недопустимый формат строки" badRT "Некорректное определение МШ; строка" badRTargs "Недопустимые аргументы МШ; строка" badTR "Некорректное определение ТР; строка" fileact "%s %s файла?" filexists "Файл существует!" GPSok "Успешное соединение" toomany "Слишком много %s (> %d)" cantfgt "Не могу удалить %s: принадрежит картированному элементу" cantfgted "Не могу удалить %s: редактируется" cantmapRTunkn "Маршрут не картирован; отсутствует информация по ПТ" cantmapRTed "Маршрут не картирован; ПТ редактируется" cantrun "Не могу выполнить" inprogr "Операция уже выполняется" cantread "Не могу прочитать дополнительный файл" cantwrtopt "Не могу записать файл настроек" voidRT "Маршрут не содержит путевых точек" activeRT "Активен маршрут 0; продолжить?" voidTR "Трек не содержит точек" voidLN "Полилиния не содержит точек" idinuse "Идентификатор уже используется" cantunmap "Не могу убрать с карты %s: принадлежит картированному элементу" askrevert "Вернуться к исходным значениям?" askforget "Удалить %s?" notimpl "Незавершено" forgetall "Удалить все элементы в списке %s ?" counted "Определено %d %s" notlisted "Элемент отсутствует в списке" wrgval "Недопустимое значение для" voidGR "В группе нет элементов" initselfGR "Группа содержит себя саму" GRelout "Команда для элемента вне определения ГР; строка" badGRels "Группа с недопустимыми элементами списка; строка" badcommdGRel "Недопустимая команда при загрузке элементов ГР; строка" notypeforGRel "Элемент без типа; строка" badGRel "Недопустимое определение элемента; строка" check "Проверка соединения" toomanyerr "Слишком много ошибок; операция прервана..." getWP "Чтение ПТочек" getRT "Чтение Маршрутов" getTR "Чтение Треков" getLAP "Чтение Кругов" getAL "Чтение альманаха" putWP "Запись ПТочек" putRT "Запись Маршрутов" putTR "Запись Треков" fillbuffWP "Загрузка буфера ПТ" fillbuffRT "Загрузка буфера МТ" noACKNAK "При ожидании ACK/NAK получен пакет данных; проверьте соединение с GPS-приёмником" badplatform "На данной платформе невозможен ввод/вывод через последовательный порт" badserial "Не могу соединиться с %s" nodata "Нет %s в приёмнике" badimage "Не корректный графический файл" mapadjust "Пожалуйста разместите на карте ПТ; щёлкните на Ok, когда закончите" duplicate "Объект %s уже выбран" clrcurrmap "Очистить текущую карту?" mbkbaddatum "Датум отсутствует или неизвестен" mbkbadscale "Масштаб не может быть отрицательным" mbkbadat "Недопустимые аргументы" edityourrisk "Редактируйте на свою ответственность!" okclrbkmap "Ok для очистки фона карты" okclrbkim "Ok для очистки изображения" badattrval "У дополнительного поля %s неверное значение: %s" badattr "У дополнительного поля %s неизвестное имя: %s" badSYMBOLcode "Недопустимый код символа" badDISPOPTcode "Недопустимый код настройки дисплея" goingdown "Предварительные настройки сохранены; пожалуйста перезапустите программу" putwhat "Какие типы элементов сохранить?" readwhat "Какие типы элементов прочитать?" noWPinx "Слишком много ПТ для приёмника" noICinx "Слишком много IC (иконок) для приёмника" getIC "Чтение Иконок" serial1 "Некорректная Преамбула Заголовка" serial2 "Возвращена некорректная Команда" checksum1 "Некорректная Контрольная сумма Заголовка" checksum2 "Ошибка Контрольной суммы данных" receiver "Не соединен с прибором!" importonly1 "Могу проимпортировать только 1 вид данных" exportonly1 "Могу проэкспортировать только 1 вид данных" outdatedprefs "Файл предварительных настроек устарел; пожалуйста проверьте его сейчас" mustchoose1type "Должен быть выбран хотя бы 1 вид элементов" nosuchitems "Нет элементов, удовлетворяющих описанию" resultsin "Поиск результатов в Группе" badWP "ПТ не получена или не определена" badangle "Угол должен быть в пределах от 0 до 360 градусов" georefhow "Метод геодезической привязки" cantsolve "Не могу решить уравнения" transfcantscale "При текущем преобразовании масштабирование невозможно" oldfilefmt "Старый формат файла; пожалуйста сохраните его в новом формате!" unknProj "Неизвестная проекция карты" unknTransf "Неизвестное преобразование карты" badProjargs "Неверные аргументы для проекции" badTransfargs "Неверные аргументы для преобразования" badfield "Не корректная пара атрибут=значение" badattr "Неверное имя атрибута" missattrs "Отсутствуют атрибут/атрибуты" mbkbadproj "Некорректная проекция карты" mbkbadtransf "Некорректное преобразование карты" notUTMproj "Информация по UTM сохранена; переходим к использованию новых параметров проекции" projchg "Пожалуйста подтвердите параметры проекции" badparam "Недопустимое значение для Bad value for %s" connectedto "Подсоединён к %s" recnotsuppd "Данная модель приёмника не поддерживается" gotprots "Описание протокола получено" badprots "Некорректное описание протокола" defprots "Использование таблицы протоколов" nohidden "Отказаться от скрытых данных?" badRS "Часть маршрута за границами из описания МШ; строка" badWPsRSs "Часть маршрута до 1-й или после последней ПТ; строка" windowdestr "Окно уничтожено!" badhidden "Недопустимый формат скрытого значения" replname "Замените \"%s\" на имя, содержащее не более чем %d, из следующих символов: %s" badalt "Недопустимое значение высоты" baddistunit "Недопустимая единица длины в файле настроек для масштаба карты" badgridzone "Недопустимая зона для системы координат" outofgrid "Положение вне допустимых значений для системы координат" timeoffnotint "Временное смещение должен быть целочисленным значением, либо оканчиваться на .5" cantchkprot "Невозможно проверить при текущем протоколе" mustconn1st "Проверьте сначала соединение с проёмником" rltmnotsupp "Этот приёмник не поддерживает запись журнала в реальном времени" createdir "Пожалуйста создайте каталог %s и перезапустите программу" oktomkdir "Создаём каталог %s?" projnameabbr "Пожалуйста дайте новой проекции имя и сокращённое имя" abbrevinuse "Сокращённое имя уже определено" nameinuse "Имя уже определено" projinuse "Проекция используется; изменения будут отменены" gridneedsdatum "Некорректное определение системы координат %s; не введён датум" badgriddatum "Датум для системы координат %s должен быть %s" cantchggriddatum "Для этой системы координат необходим датум %s" gridinuse "Нельзя удалить систему координат. Она используется %s; продолжить?" gridinusenochg "Эта система координат используется %s; нельзя произвести изменения" cantwrtprgr "Невозможно записать файл проекций пользователя" cantwrtdtel "Невозможно записать файл данных пользователя" movingWP "Разместите %s нажатием левой кнопки мыши\nОтказ правой кнопкой" missingdata "Недостаточно данных!" needs1wp "Маршрут должен содержать хотя бы одну путевую точку" emptypos "Настройка отображения положения на карте с незаполнеными полями" cantwrtsstate "Не могу записать файл сохранения состояния системы: %s" cantrdsstate "Не могу прочитать файл сохранения состояния системы: %s" corruptsstate "Нарушенный файл сохранения состояния системы: %s" editrisk "Редактируйте под свою ответственность!" savestate "Сохранить текущее состояние системы?" delsstate "Удалить файл сохраненного состояния системы?" badmapinfo "Недопустимый файл параметров карты" badMHloc "Неверный Maidenhead locator (сист.коорд. для радиолюбителей)" areais "Площадь полигона (без самопересечений) равнв %.3f%s" areatoosmall "Площадь слишком мала (<%s кв.км)" projarea "Расчёт площади в проекции" selfintsct "Повторяющиеся путевые точки: МШ не может самопересекаться!" badinvmdist "Апроксимационная ошибка при инвертировании меридионального расстояния" badinvproj "Апроксимационная ошибка при инвертировании проекции %s" negdlatlong "Широта/долгота не может быть отрицительной!" allundef "Отсутствуют описания для ПТ в ГР" badfloats "Преобразования с правающей точкой работают не корректно; Вы уверены, что хотите подключиться?" noprintcmd "Отсутствует команда печати; включите её в настройки" cantexecasroot "Нельзя запускать GPSMan от root-а" badargtofunc "Недопустимый аргумент для функции %s" redefproj "Определённая пользователем проекция %s замещает ранее определённую с тем же коротким именем; пожалуйста измените Ваше описание!" couldntcd "Неудачная попытка изменить каталог на %s" shpext "Недопустимое расширение %s; разрешены - .shp, .shx, .dbf?" shpcntopen "Не могу создать/открыть файлы формата Shape" shpcntwrtfs "Не могу создать .dbf поля для Shape файла" shpoutmem "Недостаточно памяти!" shpemptyfile "Пустой файл" shpwrongfile "Формат файла не Shape " shplessdim "Размерность в Shape файле меньше требуемой; продолжаем?" shpbadWPinRT "%d-ая ПТ с некорректными координатами в МШ %s проигнорирована" errorGTMread "Ошибка во время чтения GTrackMaker файла" badGTMvers "Неподдерживаемая версия GTrackMaker файла" badGTMfile "Некорректная начальная строка в GTrackMaker файле" badGTMcounts "Отрицательный счётчик/счётчики в GTrackMaker файле" badGTMlat "Широта вне допустимых значений в GTrackMaker файле" badGTMlong "Долгота вне допустимых значений в GTrackMaker файле" badGTMdatum "Некорректный датум в GTrackMaker файле" unobscmap "Возможно окно или иконка за границей карты; попытайтесь снова после её удаления?" cantwrtimg "Ошибка записи изображения в файл формата %s" cantsaveRTid "%d МШ не сохранён: не числовой идентификатор" cantsaveTRid "%d ТР не сохранён: не числовой идентификатор" badtrvconf "Испорченная конфигурация; перезапуск с пустой конфигурацией" drvsimoff "Симулятор вождения: ещё не запущен!" needWP "Симулятор вождения: пожалуйста сначала загрузите или определите путевые точки" chgrecprot "Пожалуйста измените протокол приёмника" clrtrvlog "Очистить журнал путешествия?" frgetGRcs "удалить группу со всеми элементами?!" nmeainuse "Текущие данные принимаются в реальном времени или идёт чтение NMEA файла" badfile "Ошибка чтения из файла" RTnoWPname "В маршрутах МШ более не поддерживаются ПТ, определяемые только по имени" distlarge "Расстояние слишком большое!" convres "Результат конвертирования %s сохранён под именем %s" outrngproj "Точка за допустимыми пределами для проекции!" badconv "Не могу преобразовать значение для параметра %s: %s" badprmval "Некорректное преобразованное значение для параметра %s: %s" timeconsmg "Слишком длительная операция: продолжаем?" badtimeval "Некорректное значение времени" badLAP "Некорректный КРУГ; строка" lapncnsdrd "Этот КРУГ не учитывается" emptymenu "Пустое меню; продолжить?" cantwrtsymenu "Не могу записать файл меню знаков" cantwrtmbaks "Не могу записать фоновый файл для карты пользователя" abbrevhasspaces "Короткое имя не может быть пустым" needNpoints "Вы должны указать не менее %s точек!" samelgth "Обе строки должны иметь одинаковое кол-во символов" rschkargs "Функция regsub завершилась с ошибкой, проверьте аргументы" emptyrmeth "Метод переименования не может быть пустым" cantwrtdefs "Невозможно записать файл пользовательских настроек" xcantbey "%s не может быть %s" mustselftfam "Выберите группу шрифтов" badpluginwhere "Неверный агрумент плугина \"where\"; должен быть списком" badpluginparam "Неверные параметры плугина: список NAME EXPR, где NAME должно начинаться с _" badpluginparamexec "При запуске плугина %s: неверный параметр %s" pluginfailed "Плугин %s завершился ошибкой: %s" canwrtaux "Невозможно записать вспомогательный файл" twotimeoffsets "Различные временные зоны в файле" notimeoffset "Не указана часовой пояс, принимается 0" baddateas "Плохая дата: %s" unknownenc "Неизвестная кодировка символа %s" chgbaudto "Смена скорости обмена с прибором на %s; подождите..." baudchgfailed "Невозможно сменить скорость порта" busytrylater "Выполняются другие операции, попробуйте позже" obssplit "Результат разбиения %s, названного \"%s\"" } set TXT(RTcompflds) "# ПТ {$DTUNIT} гр {$ALUNIT} метка этапа" set TXT(TRcompflds) \ "TP {} {} {} {$ALUNIT} {$DTUNIT} {$DTUNIT} ч:м:с {$SPUNIT} deg" set TXT(starttoend) "Начало: до конца %s $DTUNIT;" set TXT(startmax) "макс. %s $DTUNIT;" set TXT(WPnearflds) "Путевая точка {$DTUNIT} гр" set TXT(within) "Без (${DTUNIT}s)" set TXT(between) "Между (${DTUNIT})" array set TXT { GMtit "GPS Manager - версия" exit Выход map Карта load Загрузить loadfrm "Загрузка из " save Сохранить saveels "Сохранить элементы" saveto "Сохранить в " clear Очистить clearall "Очистить Всё" newWP "Новая ПТ" newRT "Новый МР" newTR "Новый ТР" newLN "Новая ЛН" newGR "Новая ГР" import Импорт importfrm "Импорт из " export Экспорт exportels "Экспорт Элементов" exportto "Экспорт в " count Количество trueN "Действительный север" automagn "Auto Magnetic" usrdef "Определённое пользователем" nameWP ПТ nameRT МР nameTR ТР nameLN ЛН nameLP ТЛ nameGR ГР namePlot Чертёж nameMap Карта nameRTComp "Обсчёт Маршрута" nameTRComp "Обсчёт Трека" nameInfo Информация GPSrec "GPS приёмн" turnoff "Выкл" get Получить put Передать all Все select Выбрать selection Выбор options Настройки DMS DMS DMM DMM DDD DDD GRA Град UTM/UPS UTM/UPS MH MH message Сообщение cancel Отменить file Файл ovwrt Перезаписать app Добавить online online offline автоном. check проверка create Создать revert Обратить colour цвет Colour Цвет grey серый mono монохр portr портрет landsc ландшафт legend Легенда incscale "Добавить шкалу" more далее waypoint "Путевая точка" name Имя created Создано cmmt Комментарий withWP "С данной WP:" displ "Показать на карте" startRT "Начать маршрут МШ" route Маршрут number Номер numberid "Номер/Идентификатор" insb "Вставить перед" insa "Вставить после" del Удалить repl "Заменить на" comp Вычислить RTcomp "Обсчёт маршрута" savecomp "Сохранить расчёты" totdst "Общее расстояние" tottime "Суммарное время" track Трек chophd "Укоротить начало" choptl "Укоротить окончание" incb "Добавить перед" date Дата newdate "Новая дата для следующей точки" endprTR "Окончание предыдущего трека" begnxt "Начало для следующего" date1st "Дата для первой следующей точки" TRcomp "Обсчёт трека" avgsp "Средн скорость" maxsp "Мин скорость" minsp "Макс скорость" lat Шир long Долг ze ZE zn ZN eastng Восточнее nrthng Севернее zone Зона change Изменить forget Забыть others Другие opt_Interf "Пользовательский интерфейс" optLANG Язык optISOLATIN1 "Используемые символы" optDELETE "DEL удалить последний символ" optMWINDOWSCONF "Главное окно" optSERIALBAUD "Скорость последовательного порта" optGPSREC "GPS Модель" opt_GPSRecConf "Параметры приёмника" optACCEPTALLCHARS "Разрешить все символы" optNAMELENGTH "Максимальная длина имени" optINTERVAL "Интервал для образца" optCOMMENTLENGTH "Максимальная длина комментария" optMAXWPOINTS "Максимальное кол-во путевых точек" optMAXROUTES "Максимальное кол-во маршрутов" optMAXWPINROUTE "Максимальное кол-во точек в маршруте" optMAXTPOINTS "Максимальное кол-во точек в треке" optCREATIONDATE "Запить содержит дату создания" optNOLOWERCASE "В записи нет прописных букв" optDEFAULTSYMBOL "Символ по умолчанию для точки пути" optDEFAULTDISPOPT "Настройки по умолчанию для показа точек пути WP" opt_Data "Данные" optEQNAMEDATA "Данные с совпадающим именем" optKEEPHIDDEN "Сохранить скрытые данные" optDatum Данные optTimeOffset "Сдвиг по времени" optACCFORMULAE "Формула точности" optASKPROJPARAMS "Подтверждение правильности параметров проекции" optBalloonHelp "Облоко помощи" optTRNUMBERINTVL "Показать на карте информацию о каждой точке трека" optTRINFO "Отображаемая информация о точке трека TP" opt_Formats "Единицы и форматы" optDISTUNIT "Расстояние" optALTUNIT "Высота" optUSESLOWOPWINDOW "Окно контроля за медленными операциями" optDEFTRECPROTOCOL "Протокол по умолчанию" optLNSREACT "Линии на карте реагируют на мышь" M м KM км NAUTMILE "морская миля" STATMILE "миля" FT фут optPositionFormat "Формат положения" optDateFormat "Формат даты" opt_Geom "Геометрия окна" opt_MapGeom "Геометрия карты" optMAPWIDTH "Ширина карты" optMAPHEIGHT "Высота карты" optMAPSCLENGTH "Длина масштаба карты" optMAPSCALE "Масштаб карты" optMAXMENUITEMS "Максимальное кол-во элементов меню" optLPOSX "Списки X-положений окна" optLPOSY "Списки Y-положений окна" optMPOSX "X-положение окна карты" optMPOSY "Y-положение окна карты" optRPOSX "X-положение окна Записей" optRPOSY "Y-положение окна Записей" optEPOSX "X-положение окна Ошибок" optEPOSY "Y-положение окна Ошибок" optDPOSX "X-положение Диалога" optDPOSY "Y-положение Диалога" optDPOSRTMAP "Смещение диалога Маршрут/карта" optLISTWIDTH "Ширина списка" optLISTHEIGHT "Высота списка" optCOLOUR Цвета optCOLOUR,fg "Передний план" optCOLOUR,bg Фон optCOLOUR,messbg "Фон сообщ об ошибке" optCOLOUR,confbg "Фон подтверждения" optCOLOUR,selbg "Фон выбора" optCOLOUR,dialbg "Фон поля ввода" optCOLOUR,offline "Приёмник неподключен" optCOLOUR,online "Приёмник подключен" optCOLOUR,check "Установленная кнопка-флажёк" optCOLOUR,ballbg "Фон облака помощи" optCOLOUR,ballfg "Текст облака помощи" optMAPCOLOUR "Цвета карты" optMAPCOLOUR,mapsel "Выбранный элемент карты" optMAPCOLOUR,WP "Путевые точки на карте" optMAPCOLOUR,RT "Маршруты на карте" optMAPCOLOUR,mkRT "Маршрут, определённый на карте" optMAPCOLOUR,TR "Треки на карте" optMAPCOLOUR,TP "Точки треков на карте" optMAPCOLOUR,LN "Линии на карте" optMAPCOLOUR,mapleg "Легенда" optMAPCOLOUR,anim "Анимация на карте" optMAPCOLOUR,emptygrid "Пустое изображение" optMAPCOLOUR,fullgrid "Существующее изображение" opt_Fonts "Шрифты" optDEFTRTWIDTH "Ширина линии для МР" optDEFTTRWIDTH "Ширина линии для ТР" optDEFTLNWIDTH "Щирина линии ЛН" opt_Files "Прибор и файлы" optDEFSPORT "Прибор" optSAVESTATE "Сохранить при выходе состояние" optDELSTATE "Удалить файлы после восстановления состояния" optPERMS "Права на файл" optPRINTCMD "Комманда на печать" optPAPERSIZE "Размер бумаги" optMapGuideVersion "Версия MapGuide" optICONSIZE "Размер иконки" red Красный green Зелёный blue Голубой owner Владелец permgroup Группа others Остальные fread Чтение fwrite Запись fexec Исп YYYYMMDD YYYYMMDD MMDDYYYY MMDDYYYY DDMMMYYYY DDMMMYYYY YYYY-MM-DD YYYY-MM-DD YYYY/MM/DD YYYY/MM/DD ISO8601 "ISO8601" mainwd "Главное окно" distazim "Расст. и азимут" nearestWPs "Ближайшие ПТ" fromto "От %s до %s" degrees градусы nameWPDistBear "расст. и азимут" nameWPNearest "ближайшие ПТ" inrect "В прямоугольник" forthisWP "для этой ПТ" formappedWPs "для картированной ПТ" group Группа element Элемент insert Вставка joinGR "Объединить группы" TRtoRT "Преобразование из ТР в МШ" TRtoLN "Преобразование из ТР в ЛН" TRtoTR "Упрощение ТР" TRRTnpoints "Кол-во сохраняемых точек" TRlinedispl "Показать результат сейчас же" TRTRdispl "Показать ТР сейчас же" WP ПТ RT РТ TR ТР TP ТТ LN ЛН LP ЛП GR ГР LAP КРУГ commrec "Связь с приёмником" abort Прервать ACKs ACKs NAKs NAKs packets пакеты unnamed "(неизвестн.)" fromTR "От ТР: %s" mapload "Географически привязанное изображение" loadmback Загрузить savemback "Сохранить гео-привязку" chgmback Изменить clearmback Очистить backgrnd Фон nameMapBkInfo "Описание фона" nameMapInfo "Настройки карты" mpbkchg "Изменить фон" mpbkgrcs "Положение сетки" nameImage Изображение symbol Символ SY1st_aid "Первая помощь" SYCATaviation Авиация SYCATgeneral "Общего использования" SYCATland Суша SYCATwater Вода SYMOB "Человек за бортом" SYRV_park "Парк отдыха" SYWP_buoy_white "Буй, белый" SYWP_dot "ПТ" SYairport "Аэропорт" SYamusement_park "Парк аттракционов" SYanchor "Якорная стоянка" SYanchor_prohib "Якорная стоянка запрещена" SYavn_danger "Опасность (авиа)" SYavn_faf "Точка нач. захода на посадку" SYavn_lom "Дальний маркерный маяк" SYavn_map "Высота принятия решения" SYavn_ndb "Всенаправленный радиомаяк" SYavn_tacan "TACAN" SYavn_vor "VHF omni-range" SYavn_vordme "VOR-DME" SYavn_vortac "VOR/TACAN" SYbait_tackle "Рыбалка и охота" SYball "Шар" SYbeach "Берег" SYbeacon "Маяк" SYbell "Колокол" SYbiker "Байкер" SYboat "Лодка" SYboat_ramp "Лодочный причал" SYborder "Пересечение границы" SYbowling "Боулинг" SYbox_blue "Ящик, голубой" SYbox_green "Ящик, зелёный" SYbox_red "Ящик, красный" SYbridge "Мост" SYbuilding "Здание" SYbuoy_amber "Буй, янтарный" SYbuoy_black "Буй, чёрный" SYbuoy_blue "Буй, голубой" SYbuoy_green "Буй, зелёный" SYbuoy_green_red "Буй, зелёно-красный" SYbuoy_green_white "Буй, зелёно-белый" SYbuoy_orange "Буй, оранжевый" SYbuoy_red "Буй, красный" SYbuoy_red_green "Буй, красно-зелёный" SYbuoy_red_white "Буй, красно-белый" SYbuoy_violet "Буй, фиолетовый" SYbuoy_white "Буй, белый" SYbuoy_white_green "Буй, бело-зелёный" SYbuoy_white_red "Буй, бело-красный" SYcamping "Место для привала" SYcapitol_city "Город, звезда" SYcar "Машина" SYcar_rental "Прокат машин" SYcar_repair "Автосервис" SYcasino "Казино" SYcastle "Замок" SYcemetery "Кладбище" SYchapel "Часовня" SYchurch "Церковь" SYcircle_blue "Круг, голубой" SYcircle_green "Круг, зелёный" SYcircle_red "Круг, красный" SYcircle_x "Закруглённая Х" SYcivil "Почтовый адрес" SYcntct_afro "Афро" SYcntct_alien "Инопланетяне" SYcntct_ball_cap "Бейсболка" SYcntct_big_ears "Большое ухо" SYcntct_biker "Байкер" SYcntct_bug "Жук" SYcntct_cat "Кошка" SYcntct_dog "Собака" SYcntct_dreads "Пугающее" SYcntct_female1 "Женщина 1" SYcntct_female2 "Женщина 2" SYcntct_female3 "Женщина 3" SYcntct_goatee "Эспаньолка" SYcntct_kung_fu "Кунг фу" SYcntct_pig "Свинья" SYcntct_pirate "Пираты" SYcntct_ranger "Лесничий" SYcntct_smiley "Улыбка" SYcntct_spike "Шип" SYcntct_sumo "Сумо" SYcoast_guard "Береговая охрана" SYcontrolled "Контролируемая зона" SYcrossing "Переход" SYdam "Дамба" SYdanger "Опасность" SYdeer "Олень" SYdiamond_blue "Алмаз, голубой" SYdiamond_green "Алмаз, зелёный" SYdiamond_red "Алмаз, красный" SYdiver_down_1 "Место дайвинга 1" SYdiver_down_2 "Место дайвинга 2" SYdock "Док" SYdollar "Доллар" SYdot "Точка" SYdrinking_water "Питьевая вода" SYdropoff "Трамплин для байка" SYduck "Утка" SYelevation "Превышение" SYexit "Выход" SYexit_no_serv "Выход, нет обслуживания" SYfactory "Фабрика" SYfastfood "Закусочная" SYfish "Рыба" SYfitness "Фитнесс" SYflag "Флаг" SYflag_pin_blue "Флажок, голубой" SYflag_pin_green "Флажок, зелёный" SYflag_pin_red "Флажок, красный" SYfuel "АЗС" SYfuel_store "АЗС с магазином" SYgeo_name_land "Топоним" SYgeo_name_water "Гидроним" SYglider "Планёр" SYgolf "Гольф" SYheliport "Вертолётная площадка" SYhorn "Горн" SYhouse "Дом" SYhouse_2 "Дом 2" SYhydrant "Гидрант" SYice_skating "Каток" SYinfo "Информ" SYintersection "Пересечение" SYis_highway "Скоростное шоссе" SYknife_fork "Трактир" SYladder "Лестница" SYlanding "Место приземления" SYlarge_city "Город, большой" SYlarge_exit_ns "Выход,нет обслуж, Большой" SYletter_a_blue "A, голубой" SYletter_a_green "A, зелёный" SYletter_a_red "A, красный" SYletter_b_blue "B, голубой" SYletter_b_green "B, зелёный" SYletter_b_red "B, красный" SYletter_c_blue "C, голубой" SYletter_c_green "C, зелёный" SYletter_c_red "C, красный" SYletter_d_blue "D, голубой" SYletter_d_green "D, зелёный" SYletter_d_red "D, красный" SYlevee "Набережная" SYlight "Освещение" SYlodging "Жилище" SYmany_fish "Рыбное место" SYmany_tracks "Скопление грузовиков" SYmarina "Гавань для катеров" SYmark_x "Метка, х" SYmedium_city "Город, средний" SYmile_marker "Километровый столб (миля)" SYmilitary "Расположение военных" SYmine "Мина" SYmonument "Монумент" SYmountains "Горы" SYmovie "Кино" SYmug "Грязь" SYmuseum "Музей" SYntl_highway "Федеральная трасса" SYnull "(прозрачный)" SYnull_2 "(пустой)" SYnumber_0_blue "0, голубой" SYnumber_0_green "0, зелёный" SYnumber_0_red "0, красный" SYnumber_1_blue "1, голубой" SYnumber_1_green "1, зелёный" SYnumber_1_red "1, красный" SYnumber_2_blue "2, голубой" SYnumber_2_green "2, зелёный" SYnumber_2_red "2, красный" SYnumber_3_blue "3, голубой" SYnumber_3_green "3, зелёный" SYnumber_3_red "3, красный" SYnumber_4_blue "4, голубой" SYnumber_4_green "4, зелёный" SYnumber_4_red "4, красный" SYnumber_5_blue "5, голубой" SYnumber_5_green "5, зелёный" SYnumber_5_red "5, красный" SYnumber_6_blue "6, голубой" SYnumber_6_green "6, зелёный" SYnumber_6_red "6, красный" SYnumber_7_blue "7, голубой" SYnumber_7_green "7, зелёный" SYnumber_7_red "7, красный" SYnumber_8_blue "8, голубой" SYnumber_8_green "8, зелёный" SYnumber_8_red "8, красный" SYnumber_9_blue "9, голубой" SYnumber_9_green "9, зелёный" SYnumber_9_red "9, красный" SYoil_field "Нефтянное поле" SYopen_24hr "Открыто круглосуточно" SYoval_blue "Овал, голубой" SYoval_green "Овал, зелёный" SYoval_red "Овал, красный" SYparachute "Парашют" SYpark "Парк" SYparking "Парковка" SYpharmacy "Аптека" SYphone "Телефон" SYpicnic "Место для пикника" SYpin_blue "Булавка, голубой" SYpin_green "Булавка, зелёный" SYpin_red "Булавка, красный" SYpizza "Пицца" SYpolice "Полиция" SYpost_office "Почта" SYprivate "Частный аэродром" SYradio_beacon "Радиомаяк" SYramp_int "Разноуровневая развязка" SYrect_blue "Блок, голубой" SYrect_green "Блок, зелёный" SYrect_red "Блок, красный" SYreef "Риф" SYrestricted "Запретная зона" SYrestrooms "Туалет" SYscenic "Живописное место" SYschool "Школа" SYseaplane "База гидропланов" SYshopping_cart "Рынок" SYshort_tower "Башня, короткая" SYshowers "Душ" SYskiing "Водные лыжы" SYskull "Череп" SYsmall_city "Город, маленький" SYsnow_skiing "Катание на лыжах" SYsoft_field "Мягкое поле (пашня)" SYsquare_blue "Квадрат, голубой" SYsquare_green "Квадрат, зелёный" SYsquare_red "Квадрат, красный" SYst_highway "Областная трасса" SYstadium "Стадион" SYstore "Магазин" SYstreet_int "Перекрёсток" SYstump "Пень" SYsummit "Вершина" SYswimming "Место для плавания" SYtake_off "Точка взлёта" SYtall_tower "Башня, высокая" SYtheater Театр SYtide_pred_stn "Гидрологическая станция" SYtoll Таможня SYtow_truck "Эвакуатор" SYtraceback "Обратный путь" SYtracks "Просёлочная дорога" SYtrail_head "Начало пешеходной тропы" SYtree "Дерево" SYtriangle_blue "Треугольник, голубой" SYtriangle_green "Треугольник, зелёный" SYtriangle_red "Треугольник, красный" SYtruck_stop "Стоянка грузовиков" SYtunnel "Тунель" SYultralight "Сверхлёгкий" SYweight_station "Весовая" SYwreck "Место аварии" SYzoo "Зоопарк" psvisible "Только видимая часть" DISPsymbol "Только символ" DISPs_name "Символ и имя" DISPs_comment "Символ и комментарий" DISPname "Только имя" DISPcomment "Только комментарий" dispopt Показ mapitems "Показ на карте" nameIC Иконка prod Продукт WPCapac "Waypoint Capacity" ICCapac "Icon Capacity" RTCapac "Route Capacity" TRCapac "Track Capacity" protcl "Протокол" ICGraph "Icon Graphics" WPperRT "Кол-во точек пути на маршрут" notinGR "не в (под-)группе" onlyinGR "только в (под-)группе" loadgrels "Загрузка элементов" importgrels "Импорт элементов" about "О GPSMan..." contrib "При участии" errorsto "Отчёты об ошибках в:" obsTRToRT "ПТ-и, созданные при преобразовании" obsTRsimpl "Результирующий ТР после упрощения" nameLists "Списки" nameData "Данные" MWCmap "Карта" MWClists "Списки" MWCsingle "Отдельное окно" search "Поиск" rmrk "Прим" closeto "Близко к" with "С" srchres "НАЙДЕНО" database "База Данных" where "Где" what "Что" list "список" distance "Расстояние" fromWP "от Точки пути" fromPos "от места" azimuth "Азимут" any "любой" opening "Открывание" suggested "предложенный" another "Другое" srchdd1 "Искать с" srchdd2Data "все элементы" srchdd2GR "Группа(ы)" from "от" started "начать с" transf "Преобразование коорд" TRNSFAffine "Аффинное" TRNSFAffineConf "Конф Аффин" TRNSFNoRot "Конф без повор" projection "Проекция" lat0 "Шир центра" long0 "Долг центра" lat1 "Шир 1ой станд параллели" lat2 "Шир 2ой станд параллели" latF "Lat false origin" latF "Шир условного нач координат" longF "Long false origin" longF "Долг условного нач координат" k0 "Коэф масштабирования" PRJUTM "UTM/UPS" PRJTM "Transverse Mercator" PRJBMN "Austrian BMN Grid" PRJBNG "British National Grid" PRJBWI "British West Indies" PRJCMP "Portuguese Mil Map" PRJCTR "Carta Tecnica Reg (I)" PRJITM "Irish Transv Mercator" PRJGKK "German Grid" PRJLCC1 "Lambert Conic Conf 1" PRJLCC2 "Lambert Conic Conf 2" PRJKKJP "Basic Finnish Grid" PRJKKJY "Uniform Finnish Grid" PRJSEG "Swedish Grid" PRJMerc1 "Mercator 1" PRJMerc2 "Mercator 2" PRJCS "Cassini-Soldner" PRJAPOLY "American Polyconic" PRJStereogr Stereographic PRJTWG "Taiwan Grid" PRJSOM "Swiss Oblique Mercator" PRJLV03 "Swiss LV03 Grid" PRJIcG "Iceland Grid" PRJRDG "The Netherlands Grid" PRJSchreiber Schreiber dontaskagain "Остановить опрос" rename "Используйте новое имя" oname "Исходное имя" never "Никогда" ask "Запрос" always "Всегда" stage "Этап" label "Подпись" alt "Высота" locate "Местоположение" animation Анимация fast Быстро slow Медленно start Начало pause Пауза speed Скорость centred "Удерживать в центре" state Штат animinit "в нач/кон" animon "запуск" animpause "пауза" animabort "отмена" realtimelog "Показ в реальном времени" garmin Garmin garmin_usb "Garmin USB" nmea "NMEA 0183" stext "Просной Текст" simul "симулятор" lowrance Lowrance magellan Magellan getlog "Получить журнал" stop Стоп dolog Запись show Показать hide Спрятать posfixerror error posfix_ ? posfix2D 2D posfix3D 3D posfix2D-diff "2D d" posfix3D-diff "3D d" posfixGPS GPS posfixDGPS DGPS posfixAuto ok posfixsimul simul restart Перезапуск mkTR "Создать ТР" PVTflds "# t lat long alt fix EPE EPH EPV vel_x vel_y vel_z TRK" namePVTData "Журнальные данные" mkavgWP "Создать средн ПТ" move Переместить define Определить open Открыть defs "Определения" baseproj "Базовая проекция" abbrev "Сокращённое имя" grid "Координатная сетка" use Использовать unit "Ед.изм." feasting "Смещение на восток" fnorthing "Смещение на север" bounds Границы max Макс min Мин easting Восточнее northing Севернее fixeddatum "Уточнённый датум" elevation Высота usewps "Использовать ПТи" chgpfrmt "Изменить формат местоположения" here Здесь atprevwp "К предыдущей ПТ" prevwp "Предыдущая ПТ" firstwp "Первая ПТ" chglstrs "Редактировать предыдущее ребро" chgnxtrs "Редактировать следующее ребро" contnend "Добавить в конец" closemenu "Закрыть меню" ellpsd Эллипсоид datum Датум userdefs "Пользовательские настройки" edmap "Редактировать карту" actual действующие rtimelogintv "Интервал журналирования" inca "Добавить после" invert "Инвертировать" recwindow "Окно приёмника" volume "Объём" latS "Шир Юг" latN "Шир Св" longW "Долг Зп" longE "Долг Вс" no Нет computations Вычисления comparea "Вычислить площадь" cluster Кластер centre Центр mkclusters "Создать кластеры" quadr Трапеция dlat "Разность широт" dlong "Разность долгот" collcntr "Сбор центров..." compclstr "Расчёт кластеров..." crtgclstrgrs "Создание групп..." chgdatum "Изменение датума..." print Печать prevctr "Предыдущий центр" printopt "Печать настроек" cwpsdef "Непосредственное определение ПТк" nextTP "Следующая ТТ" generate Сгенерировать generateall "Сгенерировать все" width Ширина simplTRto "Упростить до" exstglog "Существующий журнал" contnsly "Непрерывно" animate "анимация" animabbrev "аним." noanabbr "не аним." zelev "Z-шкала" xyelev "XY-шкала" notext "без текста" view "Просмотр" sideview "Вид с боку" persptv "Перспектива" optMAPCOLOUR,trvtrk "TRK стрелка" optMAPCOLOUR,trvtrn "TRN стрелки" optMAPCOLOUR,trvcts "CTS стрелка" optMAPCOLOUR,trvcts2 "2ая CTS стрелка" optMAPCOLOUR,trvvel_z "Стрелка верх/низ" optMAPCOLOUR,trvwrnimportant "Важное предупреждение (нав)" optMAPCOLOUR,trvwrnnormal "Предупреждение (нав)" optMAPCOLOUR,trvwrninfo "Информация (нав)" travel Путешествие notravel "Остановить путешествие" travdisplay "Настроить экран" travchgdisplay "Изменить на экран" travdsetup "Настройна экрана путешествия" navMOB "MOB: Человек за бортом!" startnav "Навигация" navWP "Перейти к ПТ" goback "Вернуться назад" follow "Следовать за %s" exactly "точно" fromnrst "от ближайшей" inrvrs "в обратном напр." forgetgoal "Забыть цель" suspend "Приостановиться" resume "Продолжить" TRVfix "Исправить" TRVhour "Время" TRVspeed "Скорость" TRVpos "Pos" TRValt "Alt" TRVtrk "TRK" TRVnxtWP "К" TRVprvWP "От" TRVete "ETE" TRVeta "ETA" TRVvmg "VMG" TRVxtk "XTK" TRVcts "CTS" TRVtrn "TRN" TRVvel_z "V скорость" TRVtrkcts "TRK, CTS" TRVdist "Расст" TRVc_trkcts "TRK/CTS стрелки" TRVc_trn "TRN стрелки arrows" TRVc_vel_z "Стрелка верх/низ" add "Добавить" addlabelled "Добавить с меткой" remove "Удалить" mindist "Расстояние прибытия" chggoal "Изменить на следующую цель" chginggoal "Изменеие на след. цель" chggoalhlp "Когда переходить с текущей\nна следующую цель при\nследовании по МР/ТР" soon ранний late поздний warnings "Предупреждения" dowarn "Печатать предупреждения" warnconf "Сконфигурировать предупреждения" priority Приоритет high высокий medium средний low низкий warnprox "Расстояние до ПТ <" warnanchor "Расстояние до ПТ>" warnspeed "Скорость >" warntrn "TRN (abs)>" warnvspeed "Вертикальная скорость" warnxtk "XTK (abs)>" trvhlpbox "Используйте прав.кнопку для переупорядочивания элементов снизу" trvhlpbxs "Используйте прав.кнопку для переупорядочивания элементов списка" trvwarrv "Прибытие в %s!" trvwleave "Убытие из %s!" trvwspeed "Скорость > %s!" trvwtrn "TRN > %s!" trvwvspeed "Верт скорость на между [%s,%s]!" trvwxtk "XTK > %s!" trvwnolog "Журнал реального времени отключен!" trvwnopos "Предыдущее положение нериемлемо" trvwuwps "МТ содержит неопределённые точки" trvwchg "Перейти немедленно к %s" drivesim "симулятор водителя" startfrom "Начать с..." outofctrl "Вне контроля!" right Право left Лево straight Прямо rthlpdsim "Клавиши Стрелок: управление, изменение скорости \nПробел: прямо" hiddendata "Скрытые данные" Ghidden_class Класс Ghidden_subclass Подкласс Ghidden_lnk_ident "Ид этапа" Ghidden_colour Цвет Ghidden_attrs Аттрибуты Ghidden_depth Глубина Ghidden_state Штат Ghidden_country Страна Ghidden_facility Предприятие Ghidden_city Город Ghidden_addr Адрес Ghidden_int_road "Пересечение дорог" Ghidden_dtyp "Показать опц+тип" Ghidden_ete "ETE" Ghidden_display "Показать?" Ghidden_yes Да Ghidden_no Нет Ghidden_user "Пользователь" Ghidden_user_symbol "Пользователь (только символ)" Ghidden_non_user "Не пользователь" Ghidden_avn_airport "Аэропорт" Ghidden_avn_inters "Авиа пересечение" Ghidden_avn_NDB "Ненапр.радиомаяк" Ghidden_avn_VOR "VOR" Ghidden_avn_airp_rway "Начало взл-посад полосы" Ghidden_avn_airp_int "Пересечение взлётн. полос" Ghidden_avn_airp_NDB "Ненапр.радиомаяк в аэропорте" Ghidden_map_pt "Точка на карте" Ghidden_map_area "Область на карте" Ghidden_map_int "Пересечение на карте" Ghidden_map_addr "Адрес на карте" Ghidden_map_line "Линия на карте" Ghidden_locked Блокировано Ghidden_default "Исходное" Ghidden_black Чёрный Ghidden_white Белый Ghidden_red Красный Ghidden_dark_red "Тёмнокрасный" Ghidden_green Зелёный Ghidden_dark_green "Тёмнозелёный" Ghidden_blue Голубой Ghidden_dark_blue "Синий" Ghidden_yellow Жёлтый Ghidden_dark_yellow "Тёмножёлтый" Ghidden_magenta Маджента Ghidden_dark_magenta "Тёмн.маджента" Ghidden_cyan Циан Ghidden_dark_cyan "Тёмн.циан" Ghidden_light_gray "Светлозелёный" Ghidden_dark_gray "Тёмнозелёный" Ghidden_transparent Прозрачный Ghidden_line Линия Ghidden_link Этап Ghidden_net Сеть Ghidden_direct Прямой Ghidden_snap Снимок Ghidden_temp Температура Ghidden_time "Временная метка" Ghidden_cat Категория renres "ПЕРЕИМЕНОВАНО" forgetGRcs "Удалить ГР и Элементы" optDEFMAPPROJ "Проекция карты" optDEFMAPPFRMT "Система координат" optDEFMAPPFDATUM "Датум системы координат" undo Отменить UTMzone зона tfwfile "TFW файл" ok Ok newWPatdb "Новая ПТ возле..." PRJLamb93 "Lambert 93" PRJLambNTFe "Lambert NTF IIet" PRJLambNTF "Lambert NTF" NTFzone зона loop Петля crtLN "Создать ЛН" PRJAEA "Albers Equal Area" PRJLEAC "Lambert Eq Area Conic" PRJTAlbers "Teale Albers" polasp "Polar aspect" north Север south Юг distunit "Ед.изм. расстояния" altunit "Ед.изм. высоты" params "Параметры" dimens "Размеры" version "Версия" opinprogr "Операция выполняется" working "Работаю" aborted "Прервано!" errwarn "Ошибки/предупреждения!" changegroupsymbol "Изменить символ" ozimapfile "Ozi Map файл" info "Информация" climbrate "Скорость подъёма" BGAfeature "Признак" BGAfindblty "Возможность поиска" BGAairact "Активность в воздухе" dispitems "Отображаемые элементы" hiditems "Скрытые элементы" mkgrp "Создать Группу" optAutoNumRts "Авто-нумерация МРов при поступлении" numberfrom0 "Установить счётчик на 1" items "Элементы" optSUPPORTLAPS "Поддержка для КРУГОВ" nameLAP "КРУГ" duration "Продолжительность" calrs "Калории" syusrmenu "Настраиваемое меню символов" cfgsymenu "Настройка меню символов" insmnb "Вставить под-меню перед" insmna "Вставить под-меню после" opensbmn "Открыть под-меню" clssbmn "Закрыть под-меню" syhlpbx "Используйте прав-кнопку для\nпереупорядочивания списка элементов" lapsrun Запуск fromfile "из файла" fromdef "из предустановок" mbaktoload "Фон для загрузки" none "пусто" nameAL "Альманах" alm_svid "ид спутника" alm_week "неделя" alm_datatime "временная метка данных" alm_clockc1 "кэфф поправки часов сек" alm_clockc2 "кэфф поправки часов сек/сек" alm_ecc "эксцентриситет" alm_sqrta "квадратный корень" alm_mnanom "средняя аномалия" alm_argprgee "аргумент перигея" alm_rightasc "прямое восхождение" alm_rtrightasc "скорость пр. восхождения" alm_inclin "склонение" alm_health "здоровье" lstsqs "Наименьшие Квадраты" lstsqsfile "Файл Наименьших Квадратов" PRJEOV "Аварийная машина (EOV)" chgname "Изменить имя" clicktoedit "Нажмите для редактирования" renamethod "Метод переименования" operators "Операторы" keep1st "сохранить 1й символ" keep1st_hlp "Сохранить первый символ\nдальнейшие операции производятся над оставшимися символами" reset "сброс" reset_hlp "Перезапустить с начальным именем, отменить все преддущие изменения" case "сменить регистр" case_hlp "Все буквы в верхний/нижний регистр" maxlgth "макс. длина" maxlgth_hlp "Текущая строка обрезаются до указанной длины" inslt "вставить слева" inslt_hlp "Строка вставляется перед текущим левым символом" insrt "вставить справа" insrt_hlp "Строкаа вставляется в конец" replc "заменить" replc_hlp "Любой символ в 1п строке будет заменен соответствующим символом из 2й" delany "удалить любой" delany_hlp "Все символы в данной строке будут удалены из имени" rsub "подстановка" rsub_hlp "Указать регулярное выражение и спецификацию подстановки\nподробнее - см. руководство" accifnew "применить, если новое" accifnew_hlp "Применить результат, если имя не используется" guntilnew "добавлять, пока новое" guntilnew_hlp "Перебирать все возможные значения числа, пока новое имя не будет найдено" ndigits "Количество цифр" gennames "Генерация имен..." rentest_hlp "Проверить метод на указанном имени" renmove_hlp "Используйте правую кнопку для перераспределения строк" tolower "нижн.регистр" toupper "верх.регистр" applyto "Применить к" forall "для всех" failed "неудача" selfont "Выбранный шрифт" default "По умолчанию" size "Размер" units "Единицы" points "точки" pixels "пиксели" weight "Вес" normal "нормальный" bold "полужирный" slant "наклонный" roman "римский" italic "курсив" underline "Подчеркнутый" overstrike "Перечеркнутый" optDEFAULTFONT "Шрифт по умолчанию" optFIXEDFONT "Фиксированный шрифт" optMAPFONT "Шрифт карты" optTRAVELFONT "Шрифт экрана путешествия" optPLOTFONT "Шрифт графика" plugin "Плугин" unavailif "Недоступно, если" tclcode "Tcl код" totdstng "Общая дистанция, без разрывов" tottimeng "Общее время, без разрывов" SYcross "Курсор" SYcross_3p "Курсор 3 пикс" mapfitWPs "Отобразить ближайшие ПТ на карте" showfitinfo "Показать адаптированные данные" xtcoord "xt" ytcoord "yt" delta "d" residual "rt" rmsxydev "rms(x,y-отклонения)" resstderr "остатоная ошибка" chgdev "Сменить прибор" maxalt "Максимальная высота" minalt "Минимальная высота" alt_cumula "Нарастающая высота восхождения" alt_cumuld "Нарастающая величина спуска" optSHOWFILEITEMS "По умолчанию отображать на карте читаемые элементы" vertgridlines "Вертикальные линии сетки" convert "Конвертировать" split "Разделить" bysel "по выделенным точкам" byseg "по сегментам" openits "Открыть %s" uname "Имя пользователя" pword "Пароль" remember "Запомнить" wptotwitter "ПТ в Twitter" wptotwitternb "Послать позицию, дату, высоту, имя и комментарий путевой точки в Twitter с тегами #GPSMan #waypoint" exportTFW "Экспортировать в TFW файл" nametfwfile "TFW файл" } # the following definitions must be coherent with $TXT array set INVTXT { DMS DMS DMM DMM DDD DDD Град GRA UTM/UPS UTM/UPS MH MH ПТ WP МШ RT ТР TR ЛН LN ГР GR КРУГ LAP м M фут FT } # changes by Miguel Filgueiras to RM contribution set TXT(srChainage) $TXT(totdst) set TXT(srShowRest) $TXT(gpSRests) set TXT(gpSym) $TXT(symbol) set TXT(srRest) $TXT(gpRest) gpsman-6.4.4.2/gmsrc/mapanim.tcl0000644000175000017500000002700312224351120014517 0ustar migmig# # This file is part of: # # gpsman --- GPS Manager: a manager for GPS receiver data # # Copyright (c) 1998-2013 Miguel Filgueiras migfilg@t-online.de # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. # # File: mapanim.tcl # Last change: 6 October 2013 # proc InitAnimation {type title args} { # create dialog window to control animation # $type is in {TR, RealTimeLog} # $title to display in dialog window # $args will be passed to proc AnimStart # the Anim global array is used with the following indices: # number a unique number for each animation # the value -1 is used for RealTimeLog # for animation number $no # jobs,$no a list of background jobs # state,$no in {init, on, pause, abort} # state,$no,ext the corresponding external representation # speed,$no the speed factor -50..50 # for real time log, this sets RealTimeLogIntv in 1..101 seconds # look,$no 1 if last point should be kept centred on the map # elapsed,$no number of seconds elapsed, or -1 # elapsed,$no,ext corresponding external representation # data,$no a pair with list of TPs remaining to be shown # and the datum ($type==TR) # time,$no external representation of time stamp (no date) of # TP ($type==TR) # dist,$no total distance up to next TP in user units ($type==TR) # dist,$no,ext corresponding external representation but up to # current TP global Anim RealTimeLogIntv COLOUR EPOSX EPOSY TXT DTUNIT switch -- $type { TR { set no $Anim(number) ; incr Anim(number) set rtl 0 set Anim(speed,$no) 0 set Anim(time,$no) "" ; set Anim(dist,$no) 0 set Anim(dist,$no,ext) "[format "%8.2f" 0] $DTUNIT" } RealTimeLog { set no -1 ; set rtl 1 # this is to avoid the trace resetting RealTimeLogIntv to some # unkown value when the scale is declared set Anim(speed,$no) [expr $RealTimeLogIntv-51] } default { BUG calling proc InitAnimation with bad type } } # this name is used explicitly elsewhere set w .anim$no GMToplevel $w animation +$EPOSX+$EPOSY {} \ [list WM_DELETE_WINDOW \ "set Anim(state,$no) abort ; destroy $w ; AnimAbort $no"] {} trace variable Anim(state,$no) w AnimStateChange trace variable Anim(speed,$no) w AnimSpeedChange set Anim(jobs,$no) "" ; set Anim(data,$no) "" set Anim(state,$no) init ; set Anim(state,$no,ext) $TXT(animinit) set Anim(look,$no) 1 set Anim(elapsed,$no) 0 ; set Anim(elapsed,$no,ext) "" frame $w.fr -borderwidth 5 -bg $COLOUR(selbg) label $w.fr.tit -text $title frame $w.fr.frs label $w.fr.frs.sl -text $TXT(slow) -width 6 scale $w.fr.frs.sp -orient horizontal -from -50 -to 50 -showvalue 0 \ -width 8 -length 200 -variable Anim(speed,$no) -label xxx label $w.fr.frs.fst -text $TXT(fast) -width 6 # must be here! if { $rtl } { set Anim(speed,$no) [expr $RealTimeLogIntv-51] set cs 2 ; set cf 0 } else { set Anim(speed,$no) 0 set cs 0 ; set cf 2 } grid configure $w.fr.frs.sl -column $cs -row 0 -sticky news grid configure $w.fr.frs.sp -column 1 -row 0 -sticky news grid configure $w.fr.frs.fst -column $cf -row 0 -sticky news checkbutton $w.fr.look -text $TXT(centred) -variable Anim(look,$no) \ -onvalue 1 -offvalue 0 -selectcolor $COLOUR(check) frame $w.fr.frst label $w.fr.frst.tit -text $TXT(state): label $w.fr.frst.st -width 10 -textvariable Anim(state,$no,ext) label $w.fr.frst.tm -width 15 -textvariable Anim(elapsed,$no,ext) frame $w.fr.frb button $w.fr.frb.go -text $TXT(start) \ -command "AnimStart $no $type $args ; \ $w.fr.frb.go configure -state normal" if { ! $rtl } { button $w.fr.frb.skp -text $TXT(nextTP) \ -command "AnimSkipTR $no $args ; \ $w.fr.frb.skp configure -state normal" label $w.fr.frst.tstit -text $TXT(TRVhour) label $w.fr.frst.tsp -width 10 -textvariable Anim(time,$no) label $w.fr.frst.dstit -text $TXT(distance) label $w.fr.frst.dst -width 10 -textvariable Anim(dist,$no,ext) } button $w.fr.frb.hld -text $TXT(pause) \ -command "AnimPause $no ; $w.fr.frb.hld configure -state normal" button $w.fr.frb.abort -text $TXT(abort) \ -command "set Anim(state,$no) abort ; destroy $w ; AnimAbort $no" if { $rtl } { pack $w.fr.frst.tit $w.fr.frst.st $w.fr.frst.tm -side left pack $w.fr.frb.go $w.fr.frb.hld $w.fr.frb.abort -side left } else { grid $w.fr.frst.tit -row 0 -column 0 -sticky w grid $w.fr.frst.st -row 0 -column 1 -sticky ew grid $w.fr.frst.tm -row 0 -column 2 -sticky ew grid $w.fr.frst.tstit -row 1 -column 0 -sticky w -pady 3 grid $w.fr.frst.tsp -row 1 -column 1 -columnspan 2 -sticky ew -pady 3 grid $w.fr.frst.dstit -row 2 -column 0 -sticky w grid $w.fr.frst.dst -row 2 -column 1 -columnspan 2 -sticky ew pack $w.fr.frb.go $w.fr.frb.skp $w.fr.frb.hld $w.fr.frb.abort \ -side left } pack $w.fr.tit $w.fr.frs $w.fr.look $w.fr.frst $w.fr.frb -side top -pady 5 pack $w.fr update RaiseWindow $w return } proc AnimPause {no} { # pause animation number $no global Anim TXT RealTimeLogAnim switch $Anim(state,$no) { on { set Anim(state,$no) pause } pause { if { $no == -1 && ! $RealTimeLogAnim } { bell } else { set Anim(state,$no) on } } default { bell } } return } proc AnimAbort {no} { # abort animation $no global Anim RealTimeLogAnim Map if { $no == -1 } { set RealTimeLogAnim 0 } foreach j $Anim(jobs,$no) { after cancel $j } trace vdelete Anim(state,$no) w AnimStateChange trace vdelete Anim(speed,$no) w AnimSpeedChange foreach ix "jobs speed look state elapsed data time dist" { catch {unset Anim($ix,$no)} } foreach ix "state elapsed dist" { catch {unset Anim($ix,$no,ext)} } $Map delete an=$no SetMapBounds return } proc AnimStart {no type args} { # start animation number $no # $args is # $type==TR: list of TPs (under TRTPoints format), and datum # $type==RealTimeLog: date of first point in seconds global Anim Map RealTimeLogAnim DTUNIT switch $Anim(state,$no) { abort { return } pause { if { $type == "RealTimeLog" && ! $RealTimeLogAnim } { bell } else { set Anim(state,$no) on } return } on { bell ; return } } set Anim(elapsed,$no,ext) "" $Map delete an=$no SetMapBounds switch $type { TR { set Anim(elapsed,$no) 0 set Anim(data,$no) $args set Anim(jobs,$no) [after 0 [list AnimNextTR $no]] set Anim(time,$no) "" ; set Anim(dist,$no) 0 set Anim(dist,$no,ext) "[format "%8.2f" 0] $DTUNIT" } RealTimeLog { set Anim(elapsed,$no) $args } } set Anim(state,$no) on return } proc AnimNextRealTime {pos datum secs} { # show next point of real time track log # $pos is list with latd, longd for $datum, at time $secs # must start animation if none is going on global Anim RealTimeLogAnim TXT if { ([catch {set Anim(state,-1)}] || $Anim(state,-1) == "abort") && \ ! [winfo exists .anim-1] } { InitAnimation RealTimeLog $TXT(realtimelog) AnimStart -1 RealTimeLog $secs return } switch $Anim(state,-1) { abort { set RealTimeLogAnim 0 return } pause { return } } set p [MapFromPosn [lindex $pos 0] [lindex $pos 1] $datum] PutMapAnimPoint $p -1 $Anim(look,-1) if { $Anim(elapsed,-1) == -1 } { set Anim(elapsed,-1,ext) "" } else { set t [expr $secs-$Anim(elapsed,-1)] set Anim(elapsed,-1,ext) " [FormatTime $t]" } return } proc AnimStopRealTime {} { # real-time log has been stopped global Anim set Anim(state,-1) pause return } proc AnimNextTR {no} { # show next leg of track global Anim UNDEFDATESECS DTUNIT DSCALE switch $Anim(state,$no) { abort { return } pause { set Anim(jobs,$no) [after 500 [list AnimNextTR $no]] return } } set Anim(jobs,$no) "" set tps [lindex $Anim(data,$no) 0] ; set datum [lindex $Anim(data,$no) 1] set tp0 [lindex $tps 0] set p [MapFromPosn [lindex $tp0 0] [lindex $tp0 1] $datum] PutMapAnimPoint $p $no $Anim(look,$no) if { $Anim(elapsed,$no) == -1 } { set Anim(elapsed,$no,ext) "" } else { set Anim(elapsed,$no,ext) " [FormatTime $Anim(elapsed,$no)]" } set Anim(dist,$no,ext) "[format "%8.2f" $Anim(dist,$no)] $DTUNIT" if { [set tp1 [lindex $tps 1]] != "" } { set Anim(dist,$no) \ [expr $Anim(dist,$no)+[ComputeDist $tp0 $tp1 $datum]*$DSCALE] if { abs([set tm0 [lindex $tp0 5]] - $UNDEFDATESECS) > 1 } { set Anim(time,$no) [lindex [DateFromSecsFmt $tm0 YYYYMMDD] 1] } else { set Anim(time,$no) "" } if { $Anim(time,$no) == "" || \ abs([set tm1 [lindex $tp1 5]] - $UNDEFDATESECS) < 2 || \ $tm1 < $tm0 } { set tint 2 ; set Anim(elapsed,$no) -1 } else { set tint [expr $tm1-$tm0] if { $Anim(elapsed,$no) != -1 } { incr Anim(elapsed,$no) $tint } } set d [AnimDelay $no $tint] set Anim(data,$no) [list [lreplace $tps 0 0] $datum] set Anim(jobs,$no) [after $d [list AnimNextTR $no]] } elseif { $Anim(state,$no) != "abort" } { set Anim(state,$no) init } return } proc AnimSkipTR {no args} { # skip to next TP global Anim if { $Anim(state,$no) == "init" } { eval AnimStart $no TR $args } elseif { $Anim(state,$no) != "abort" } { foreach j $Anim(jobs,$no) { after cancel $j } set Anim(state,$no) on set Anim(jobs,$no) [after 0 [list AnimNextTR $no]] } return } proc AnimDelay {no secs} { # compute delay in msecs corresponding to $secs in real time global Anim set a 1.09211043408 ; set k 1.83131663025 if { $Anim(speed,$no) > 0 } { set d [expr int($secs*1000.0/(pow($a,$Anim(speed,$no))*$k))] } elseif { $Anim(speed,$no) == 0 } { set d [expr int($secs*1000)] } else { set d [expr int($secs*1000*pow($a,$Anim(speed,$no))*$k)] } return $d } proc AnimStateChange {n ix op} { # called by trace when $Anim(state,$no) has been changed global Anim TXT set Anim($ix,ext) $TXT(anim$Anim($ix)) return } proc AnimSpeedChange {n ix op} { # called by trace when $Anim(speed,$no) has been changed # must call another proc with after to avoid segmentation fault after 0 "AnimSpeedChanged $ix" return } proc AnimSpeedChanged {ix} { # $ix has the form speed,$no global Anim RealTimeLogIntv TXT regsub {speed,} $ix "" no if { $Anim(state,$no) == "abort" || ! [winfo exists .anim$no] } { return } set w .anim$no set nv $Anim(speed,$no) if { $no == -1 } { # real time log interval set t "$TXT(rtimelogintv): [set RealTimeLogIntv [expr $nv+51]] s" } else { # animation speed set a 1.09211043408 ; set k 1.83131663025 if { $nv > 0 } { set v "x [format %.1f [expr pow($a,$nv)*$k]]" } elseif { $nv == 0 } { set v $TXT(actual) } else { set v "/ [format %.1f [expr pow($a,-$nv)*$k]]" } set t "$TXT(speed): $v" } $w.fr.frs.sp configure -label $t return } gpsman-6.4.4.2/gmsrc/gpsinfo.tcl0000644000175000017500000001403512224351120014543 0ustar migmig# # This file is part of: # # gpsman --- GPS Manager: a manager for GPS receiver data # # Copyright (c) 1998-2013 Miguel Filgueiras migfilg@t-online.de # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. # # File: gpsinfo.tcl # Last change: 6 October 2013 # # Includes contributions by Brian Baulch (baulchb_AT_onthenet.com.au) # marked "BSB contribution" proc DisableGPS {} { # change interface appearance when detecting that the receiver went offline global RcW RcMenu GPSState GPSLabel COLOUR TXT SYMBOLIMAGE WConf # state set GPSState offline ; set GPSLabel $TXT(offline) $RcW.frgps.bs.state configure -fg $COLOUR(offline) $RcMenu entryconfigure 5 -image $SYMBOLIMAGE(diamond_red) # device name can be changed $RcMenu.dev entryconfigure 0 -state normal $RcW.frgps.dev.dev configure -state normal # baud rate cannot be changed if { [winfo exists $RcW.frgps.dev.baud] } { $RcMenu.dev entryconfigure 1 -state disabled $RcW.frgps.dev.baud configure -state disabled } # cannot turn off or get/put items foreach ix "6 7 8" { $RcMenu entryconfigure $ix -state disabled } $RcW.frgps.bs.off configure -state disabled foreach m "getbs putbs" { foreach b $WConf(rec,$m) { $b configure -state disabled } } return } proc EnableGPS {} { # change interface appearance when detecting that the receiver went on-line global RcW RcMenu GPSState GPSLabel COLOUR ListInds TXT RECTYPES RECINFO \ MYGPS SYMBOLIMAGE WConf RecCanChgBaud # state set GPSState online ; set GPSLabel $TXT(online) $RcW.frgps.bs.state configure -fg $COLOUR(online) $RcMenu entryconfigure 5 -image $SYMBOLIMAGE(diamond_green) # cannot change device name when in use $RcMenu.dev entryconfigure 0 -state disabled $RcW.frgps.dev.dev configure -state disabled # baud rate can be changed if receiver supports that if { [winfo exists $RcW.frgps.dev.baud] && $RecCanChgBaud } { $RcMenu.dev entryconfigure 1 -state normal $RcW.frgps.dev.baud configure -state normal } # can turn off and see get/put submenus foreach ix "6 7 8" { $RcMenu entryconfigure $ix -state normal } # disable all get/put buttons and submenu entries, then enable valid ones foreach m "$RcMenu.gm $RcMenu.ptm" { set l [$m index last] for { set i 0 } { $i <= $l } { incr i } { $m entryconfigure $i -state disabled } } $RcW.frgps.bs.off configure -state normal foreach m "getbs putbs" { foreach b $WConf(rec,$m) { $b configure -state disabled } } # enable valid entries in those menus and the corresponding buttons foreach i $RECTYPES { if { $i != "GR" || $ListInds(GR) != "" } { $RcW.frget.frget2.get$i configure -state normal $RcMenu.gm entryconfigure $WConf(rec,getmn,$i) -state normal } # based on BSB contribution: no IC put button if { $i != "IC" && $i != "LAP" && $ListInds($i) != "" } { $RcW.frput.put$i configure -state normal $RcMenu.ptm entryconfigure $WConf(rec,putmn,$i) -state normal } } foreach i $RECINFO { $RcW.frget.frget2.get$i configure -state normal $RcMenu.gm entryconfigure $WConf(rec,getmn,$i) -state normal } InitGPS return } proc CheckGPS {} { # check connectivity to receiver global GPSState GPSLabel COLOUR MESS TXT SetCursor . watch if { $GPSState == "offline" } { GPSConnection EnableGPS } else { GPSConnection [list GMMessage $MESS(GPSok)] DisableGPS } set GPSLabel $TXT($GPSState) ResetCursor . return } proc TurnOff {} { global GPSState COLOUR GPSOff DisableGPS return } proc PutOnGPS {how wh} { # put data into receiver # $how in {all, select}, $wh in $RECTYPES global ListInds RECTYPES MESS TXT if { $wh == "LAP" } { return } switch $how { all { set ixs $ListInds($wh) } select { if { [set ixs [ChooseItems $wh]] == "" } { return } } } switch $wh { GR { set gtypes [Delete $RECTYPES LAP] set ts "" foreach k $gtypes { lappend ts $TXT(name$k) } while 1 { set whs [GMChooseFrom many $MESS(putwhat) 6 $ts $gtypes] if { [set i [lsearch -exact $whs GR]] != -1 } { set whs [lreplace $whs $i $i] set r 1 } else { set r 0 } if { [llength $whs] > 1 } { GMMessage $MESS(exportonly1) } else { break } } # this only works for a single type if { [set l [GRsElements $ixs $r $whs]] != "" } { PutItemsOnGPS $whs $l } } default { PutItemsOnGPS $wh $ixs } } return } proc PutItemsOnGPS {wh ixs} { # put items of kind $wh (in $RECTYPES except GR and LAP) on receiver # $ixs is list of indices global MAX MESS TXT if { [llength $ixs] > $MAX($wh) } { GMMessage [format $MESS(toomany) $TXT(name$wh) $MAX($wh)] return } PutGPS $wh $ixs return } proc GetFromGPS {wh} { # get data from receiver # $wh in $RECTYPES # if $wh==GR, select a single item type (in $RECTYPES except TR) to get global RECTYPES # BSB contribution global MYGPS if { $wh == "GR" } { # based on BSB contribution: do not get ICs if { $MYGPS != "Lowrance" } { set not "TR" } else { set not "IC TR" } InputToGR $RECTYPES $not Ignore GetGPSIn Ignore receiver } else { GetGPS $wh } return } proc GPSChangeDevice {} { # get device name from user and set global SERIALPORT global SERIALPORT TXT set old $SERIALPORT if { [GMChooseParams $TXT(chgdev) SERIALPORT [list =$TXT(optDEFSPORT)]] \ == 0 } { set SERIALPORT $old } return } gpsman-6.4.4.2/gmsrc/lowrance_nmea.tcl0000644000175000017500000004752412224351120015721 0ustar migmig# # This file is part of: # # gpsman --- GPS Manager: a manager for GPS receiver data # # Copyright (c) 1998-2013 Miguel Filgueiras migfilg@t-online.de # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. # # File: lowrance_nmea.tcl - copyright (c) 2000,2002 Brian Baulch - baulchb@hotkey.net.au # Last change: 14 Apr 2002 # Procs WriteHeader1 & SaveTR1 are derived from procs WriteHeader and # SaveTR - both copyright (c) 2000 Miguel Filgueiras. set LOGMENU {1s 2s 3s 4s 5s 6s 10s 15s 20s 25s 30s 45s 60s} set LOGCMD {1 2 3 4 5 6 10 15 20 25 30 45 60} set CurrentPath "" set FirstFlag 1 set SecondsInDay 86400 set NMEATIMEOUT 10000 set NMEALastLogLength 60 set NMEALogInterval 10 set NMEATrackName "NMEA1" set TrackCountFile "track-count" # set NMEALogInterval 30 set NMEALastTick 0 array set TXT { NMEAauto "autoMapic plot" NMEApreload "Manual plot" GMNmea "GPS Manager - NMEA" Gman "GPS Manager" start START Interval Interval NMEAtitle "NMEA logging/plotting" Autoload "autoMapic image file" NMEASet "Real-time log settings" Newtrack "Manual plot filename" Nmealogpgr "NMEA logging in progress" stop STOP } set ListExists 1 set MapName "" set MESS(Noimg) "THERE IS NO MAP IMAGE\nAVAILABLE FOR THIS POSITION" set NMEANoImage 0 set NMEANoImageTrackFamily "Blank" set NMEADatum "WGS 84" set NMEAReadDone 1 # set NMEABaud 19200 set NMEABaud 4800 # Note - Lowrance always uses WGS 84 for NMEA data. # The receiver's internal setting is ignored. proc StartNMEALog {type} { # Type 0 = autoMapic loading # Type 1 = Manual loading global HaltNMEA NotLogging SERIALLOG NMEALogInterval \ NMEABulkData Rollover Type set Type $type set Rollover 0 set NMEABulkData "" if {! $Type} { raise . } if {$Type} {destroy .nmea} set HaltNMEA 0 OpenNMEAPort if {! $Type} {SetTrackCountChannel} NMEAInterface return } proc OpenNMEAPort {} { # Sets up serial port and fileevents. # Also re-opens serial port after map image loading. global SRLFILE NMEABaud NMEASecondLine NMEAFirstLine MessSent \ SERIALPORT set MessSent 0 set NMEAFirstLine 1 set NMEASecondLine 1 set SRLFILE [open $SERIALPORT r] fconfigure $SRLFILE -blocking 0 -mode $NMEABaud,n,8,1 fileevent $SRLFILE readable ReadNMEAInputLine return } proc NMEAErrorMess {mess} { global MessSent MESS NMEAReadState if { ! $MessSent} { set MessSent 1 GMMessage $MESS($mess) set NMEAReadState done NMEAOff } return } proc NMEATimeOut {} { global Id NMEAReadState MessSent MESS if { [string compare $NMEAReadState done] } { after cancel $Id NMEAErrorMess {receiver} } return } proc NMEAInterface {} { global Id NotLogging NMEAReadState NMEATIMEOUT set NMEAReadState "" set Id [after 0 ReadNMEAInputLine] after $NMEATIMEOUT NMEATimeOut while { [ string compare $NMEAReadState "done"] } { update } return } proc ReadNMEAInputLine {} { # The "fileevents" handler. global NMEAFirstLine NMEAInputLine NMEAReadState NMEAReadDone \ SRLFILE set ch [read $SRLFILE 1] if {$ch == ""} {return} if {$ch != "\n"} { append NMEAInputLine $ch } else { if { $NMEAInputLine != ""} { if {! $NMEAFirstLine} { set NMEAReadDone 0 set inputline $NMEAInputLine CheckNMEAInput $inputline } else { set NMEAFirstLine 0 } set NMEAInputLine "" } } update set NMEAReadState done return } proc CheckNMEAInput {inputline} { global NMEAInputList NMEAReadDone set NMEAInputList [split $inputline ","] set prefix [lindex $NMEAInputList 0] set prefix [string trimleft $prefix "$"] switch $prefix { GPGGA { if {! [CheckNMEASum $inputline]} { set NMEAReadDone 1 } else { ProcessNMEAInputList } } default { } } return } proc ProcessNMEAInputList {} { global SRLFILE NMEALogInterval NMEASecondLine \ NMEAReadDone NMEAInputList NMEALastTick NMEANextTick LogFile \ SecondsInDay Previous set linelist $NMEAInputList set data [CreateNMEALists $linelist] if {$data == ""} {return} if {$NMEASecondLine} { set NMEASecondLine 0 set lastick [NMEATimeSeconds $linelist] set Previous $lastick set NMEANextTick [expr $lastick + $NMEALogInterval] NMEAFormatInData $data } else { set lastick [NMEATimeSeconds $linelist] if {$lastick < $Previous} { set NMEANextTick [expr $NMEANextTick - $SecondsInDay] set Previous [expr $Previous - $SecondsInDay] } if {$lastick >= $NMEANextTick} { set NMEANextTick [expr $lastick + $NMEALogInterval] if { $NMEANextTick > $SecondsInDay } { set NMEANextTick [expr $NMEANextTick - $SecondsInDay] } NMEAFormatInData $data } } NMEAPoint $data set NMEAReadDone 1 return } proc CreateNMEALists {linelist} { set lat [lindex $linelist 2] if {$lat == ""} {return ""} set latsign [lindex $linelist 3] set long [lindex $linelist 4] set longsign [lindex $linelist 5] set quality [lindex $linelist 6] set satnum [lindex $linelist 7] set horizontal_dop [lindex $linelist 8] set alt [lindex $linelist 9] set alt_units [lindex $linelist 10] set height_geoid [lindex $linelist 12] set geo_units [lindex $linelist 13] set data [FormatNMEAPosn $lat $latsign $long $longsign] lappend data $alt $horizontal_dop return $data } proc NMEATimeSeconds {linelist} { set hms [lindex $linelist 1] set tick [split $hms ""] set hours [join [list [lindex $tick 0] [lindex $tick 1]] ""] set hours [string trimleft $hours "0"] if {$hours == ""} {set hours 0} set minutes [join [list [lindex $tick 2] [lindex $tick 3]] ""] set minutes [string trimleft $minutes "0"] if {$minutes == ""} {set minutes 0} set seconds [join [list [lindex $tick 4] [lindex $tick 5]] ""] set seconds [string trimleft $seconds "0"] if {$seconds == ""} {set seconds 0} set tick [expr $seconds + ($minutes * 60) + ($hours * 3600)] return $tick } proc FormatNMEAPosn {lat latsgn long longsgn} { set lat [ConvNMEAToDegrees $lat] if {$latsgn == "S"} { set lat [expr -$lat] } set long [ConvNMEAToDegrees $long] if {$longsgn == "W"} { set long [expr -$long] } return [list $lat $long] } proc ConvNMEAToDegrees {val} { set indx [string first "." $val] set d [expr $indx - 3] set degrees [string range $val 0 $d] set degrees [string trimleft $degrees "0"] if { "$degrees" == "" } { set degrees 0 } set minutes [string range $val [expr $d+1] end] set minutes [string trimleft $minutes "0"] if { [string first "." $minutes] == 0 } { set minutes "0$minutes" } set degrees [expr $degrees + $minutes/60.0] return $degrees } proc NMEAFormatInData {posn} { global NMEATrackName NMEABulkData set secs [clock seconds] set time [TimeStamp $secs] set data $NMEATrackName lappend data $time $secs set points [concat $data $posn] lappend NMEABulkData $points return } proc NMEAInDataTR {id bulkdata} { # add TRs data from NMEA receiver to database global DataDefault NMEADatum Index Number GetDispl set DataDefault(TR) [list "" "" $NMEADatum "" "" 0] set tps "" set ix [IndexNamed TR $id] if {$ix == -1} then { foreach d $bulkdata { set t [CreatePos [lindex $d 3] [lindex $d 4] \ DMS latlong $NMEADatum] lappend t [lindex $d 1] [lindex $d 2] lappend t [lindex $d 5] [lindex $d 6] lappend tps $t } set trdata [list [lindex $d 0] $tps] set all [list Name TPoints] set r [FormData TR $all $trdata] StoreTR $ix $id $r $GetDispl } return } proc NMEAPoint {data} { global NMEADatum LogFile Type if {! $Type } { MapControl [lindex $data 0] [lindex $data 1] } set p [MapFromPosn [lindex $data 0] [lindex $data 1] $NMEADatum] set no -1 PutMapAnimPoint $p $no 1 return } proc NMEAOff {} { global Datum DataDefault NMEATrackName NMEATrackFamily \ NMEABulkData SRLFILE HaltNMEA ListExists \ TrackCountChannel TrackCount Type set HaltNMEA 1 close $SRLFILE if {$ListExists} {ClearNMEAList} if {[llength $NMEABulkData] > 0} {NMEAInDataTR $NMEATrackName \ $NMEABulkData} if {$Type} { WriteLogFile $NMEATrackName } else { WriteLogFile $NMEATrackFamily puts $TrackCountChannel $TrackCount close $TrackCountChannel } set DataDefault(TR) [list "" "" $Datum "" "" 0] return } proc NMEANoImageMess {} { global NMEANoImage TXT MESS if { [winfo exists .noimg] } { Raise .noimg ; bell ; return 1 } toplevel .noimg wm protocol .noimg WM_DELETE_WINDOW { bell } wm title .noimg $TXT(GMNmea) wm transient .noimg wm geometry .noimg +300+100 label .noimg.lbl -font {helvetica 24 bold} \ -text $MESS(Noimg) pack .noimg.lbl -side top -pady 2 set NMEANoImage 1 return } proc NMEAMapNameWindow {} { global COLOUR EPOSX EPOSY TXT MapName if { [winfo exists .mapname] } { Raise .mapname ; bell ; return 1 } toplevel .mapname wm protocol .mapname WM_DELETE_WINDOW { bell } wm title .mapname "Map name" wm transient .mapname wm geometry .mapname -10+0 frame .mapname.fr -relief flat -borderwidth 0 -bg $COLOUR(messbg) label .mapname.fr.txt -text $MapName -font {charter 24 bold} pack .mapname.fr -side right -pady 0 pack .mapname.fr.txt -side left -pady 0 update idletasks RaiseWindow .mapname return 0 } proc NMEASetupWindow {} { global TXT LOGMENU LOGCMD NMEATrackName if { [winfo exists .nmea] } { Raise .nmea ; bell ; return 1 } toplevel .nmea wm protocol .nmea WM_DELETE_WINDOW { bell } wm title .nmea "GPS Manager - NMEA" wm geometry .nmea +200+200 pack [frame .nmea.fr0 -relief flat -width 175 -borderwidth 5] pack [label .nmea.fr0.title -text $TXT(NMEASet)] -pady 2 menubutton .nmea.fr0.interval -relief raised -width 10 \ -text $TXT(Interval) -direction left -textvariable LogInterval \ -borderwidth 5 -menu .nmea.fr0.interval.m pack .nmea.fr0.interval -pady 2 menu .nmea.fr0.interval.m -tearoff 0 wm transient .nmea.fr0.interval.m .nmea.fr0.interval foreach t $LOGMENU c $LOGCMD { .nmea.fr0.interval.m add command -label $t \ -command "set NMEALogInterval $c" } pack [frame .nmea.fr1 -relief flat -width 175 -borderwidth 5] pack [frame .nmea.fr1.fr0 -relief flat -width 175 -borderwidth 5] -side left pack [frame .nmea.fr1.fr1 -relief flat -width 175 -borderwidth 5] -side right pack [frame .nmea.fr1.fr0.fr0 -relief flat -width 175 -borderwidth 5] pack [frame .nmea.fr1.fr0.fr1 -relief flat -width 175 -borderwidth 5] pack [frame .nmea.fr1.fr1.fr0 -relief flat -width 175 -borderwidth 5] pack [frame .nmea.fr1.fr1.fr1 -relief flat -width 175 -borderwidth 5] pack [label .nmea.fr1.fr0.fr0.title -text $TXT(Autoload)] -pady 2 button .nmea.fr1.fr0.fr0.auto -text $TXT(load) -relief raised -default normal \ -command LoadAutoMapInfo pack .nmea.fr1.fr0.fr0.auto -pady 2 pack [label .nmea.fr1.fr0.fr1.title -text $TXT(NMEAauto)] -pady 2 button .nmea.fr1.fr0.fr1.logr -text $TXT(start) -relief raised -default normal \ -command "StartNMEALog 0" pack .nmea.fr1.fr0.fr1.logr -pady 2 pack [label .nmea.fr1.fr1.fr0.title -text $TXT(Newtrack)] -pady 4 entry .nmea.fr1.fr1.fr0.track -relief sunken -bd 5 -state normal -width 10 \ -textvariable NMEATrackName pack .nmea.fr1.fr1.fr0.track -pady 4 pack [label .nmea.fr1.fr1.fr1.title -text $TXT(NMEApreload)] -pady 4 button .nmea.fr1.fr1.fr1.logr -text $TXT(start) -relief raised -default normal \ -command "StartNMEALog 1" pack .nmea.fr1.fr1.fr1.logr -pady 4 return 0 } proc CheckNMEASum {inputline} { set line [split $inputline ","] set hex [lindex $line end] set hex [string trimleft $hex "*"] set checksum [Hexcon $hex] set str [string trimleft $inputline "$"] set str [string trimright $str 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ] set str [string trimright $str "*"] set strlist [split $str ""] set start [lindex $strlist 0] binary scan $start c first set strlist [lreplace $strlist 0 0] foreach ch $strlist { binary scan $ch c next set first [expr $first ^ $next] } if {$checksum != $first} {return 0} return 1 } proc Hexcon {hex} { set lookup {0 1 2 3 4 5 6 7 8 9 A B C D E F} set majmin [split $hex ""] set major [lindex $majmin 0] set minor [lindex $majmin 1] set decimal [expr $major * 16 ] set decimal [expr $decimal + [lsearch $lookup $minor] ] return $decimal } proc TimeStamp {time} { global Time DateFormat INTERVAL if { ! [string compare $DateFormat "DDMMMYYYY"] } { set postime [clock format $time -format "%d-%b-%Y %H:%M:%S"] } if { ! [string compare $DateFormat "MMDDYYYY"] } { set postime [clock format $time -format "%m:%d:%Y %H:%M:%S"] } if { ! [string compare $DateFormat "YYYYMMDD"] } { set postime [clock format $time -format "%Y.%m.%d %H:%M:%S"] } if { ! [string compare $DateFormat "YYYY-MM-DD"] } { set postime [clock format $time -format "%Y.%m.%d %H:%M:%S"] } return $postime } proc MapControl {lat long} { global LogFile SRLFILE NMEANoImage FirstFlag Top Bottom Right \ Left CurrentPath NMEABulkData NMEATrackName NMEATrackFamily \ NMEANoImageTrackFamily TRName set within 1 if {$FirstFlag} { set path [FindMapPath $lat $long] if {$path == ""} { if {! $NMEANoImage} { NMEANoImageMess set NMEATrackFamily $NMEANoImageTrackFamily set NMEATrackName [SetUpTrackName $NMEATrackFamily] } } else { close $SRLFILE set NMEATrackFamily [SetUpTrackFamily $path] set NMEATrackName [SetUpTrackName $NMEATrackFamily] LoadIndexedMap $path set NMEAFirstLine 1 OpenNMEAPort set FirstFlag 0 } } else { if {$lat > $Top} {set within 0} if {$lat < $Bottom} {set within 0} if {$long > $Right} {set within 0} if {$long < $Left} {set within 0} if {! $within} { set path [FindMapPath $lat $long] if {$path == ""} { if {! $NMEANoImage} { NMEALogSetup $NMEABulkData NMEANoImageMess } set NMEATrackFamily $NMEANoImageTrackFamily set NMEATrackName [SetUpTrackName $NMEATrackFamily] } else { close $SRLFILE NMEALogSetup $NMEABulkData set lastlog $NMEATrackName set NMEATrackFamily [SetUpTrackFamily $path] set NMEATrackName [SetUpTrackName $NMEATrackFamily] LoadIndexedMap $path set NMEANoImage 0 destroy .noimg OpenNMEAPort ToggleDisplayNamed TR $lastlog } } } return } proc NMEALogSetup {bulkdata} { global NMEABulkData ListExists NMEATrackName \ NMEATrackFamily NMEALastLogLength set tally [llength $bulkdata] if {[llength $bulkdata] > 0} { if {$ListExists} {ClearNMEAList} NMEAInDataTR $NMEATrackName $bulkdata set ListExists 1 } WriteLogFile $NMEATrackFamily if {$tally > $NMEALastLogLength} { set first [expr $tally - $NMEALastLogLength] set bulkdata [lreplace $bulkdata 0 $first] ClearNMEAList NMEAInDataTR $NMEATrackName $bulkdata set ListExists 1 } set NMEABulkData "" } proc SetUpTrackName {family} { global NMEANoImage TrackCount NMEANoImageTrackFamily append suffix $family "-" $TrackCount if {$family != $NMEANoImageTrackFamily} \ {set TrackCount [incr TrackCount]} if {$TrackCount > 999} {set TrackCount 0} return $suffix } proc SetUpTrackFamily {path} { set slash [string last / $path] set slash [expr $slash + 1] set indx [string length $path] set indx [expr $indx-5] return [string range $path $slash $indx] } proc WriteLogFile {track} { set ix [IndexNamed TR $track] append fname $track ".trk" set exists [file exists $fname] if {$exists} { set id [open $fname a ] } else { set id [open $fname w ] } SaveTrackFile $id $fname return } proc FindMapPath {lat long} { global ImageIndex Top Bottom Right Left MapName destroy .mapname set max [array size ImageIndex] for {set i 0} {$i < $max} {incr i} { set Top [lindex $ImageIndex($i) 2] set Bottom [lindex $ImageIndex($i) 1] set Right [lindex $ImageIndex($i) 4] set Left [lindex $ImageIndex($i) 3] if {$lat < $Top} { if {$lat > $Bottom} { if {$long < $Right} { if {$long > $Left} { set t [lindex $ImageIndex($i) 0] if { [llength $ImageIndex($i)] > 5 } { set MapName [lindex $ImageIndex($i) 5] NMEAMapNameWindow } return $t } } } } } return } proc ClearNMEAList {} { # forget all items in NMEA log global ListInds foreach i $ListInds(TR) { Forget TR $i } if { "$ListInds(TR)" == "" } {ChangeOnStateList TR disabled} return } proc SetTrackCountChannel {} { # Variable "TrackCount" used to avoid duplicate track names. global USERDIR TrackCountFile TrackCount TrackCountChannel append fname $USERDIR "/" $TrackCountFile if { [file exists $fname] } { set ch [open $fname r] gets $ch TrackCount if {$TrackCount == ""} {set TrackCount 0} close $ch } else {set TrackCount 0} set TrackCountChannel [open $fname w] } proc SaveTrackFile {f fname} { # Hacked from proc SaveFileTo. # save information to file $f in GPSMan format # if $f=="" ask user to select output file # see proc SaveFile for description of the arguments global SFilePFrmt SFilePFType SFileDatum SFileHeader Storage TXT TYPES \ Number set ids [lindex $Storage(TR) 0] global $ids set ixs [array names $ids] set lp [list [list TR $ixs]] set SFileHeader($f) 0 foreach p $lp { SaveTR1 $f [lindex $p 1] $fname } close $f return } proc SaveTR1 {file ixs fname} { # save data for TRs with indices in list $ixs to file in GPSMan format global FCOMMAND TRName TRObs TRDatum TRTPoints TRHidden DataIndex \ SFileDatum WriteHeader1 $file DMS $fname set ilt $DataIndex(TPlatDMS) ; set ilg $DataIndex(TPlongDMS) set idt $DataIndex(TPdate) set ial $DataIndex(TPalt) ; set idp $DataIndex(TPdepth) foreach i $ixs { if { "$TRDatum($i)" != "$SFileDatum($file)" } { WriteChgDatum $file $TRDatum($i) } puts -nonewline $file [format "%s\t%s" $FCOMMAND(TR) $TRName($i)] foreach h $TRHidden($i) { puts -nonewline $file "\t$h" } puts $file "" SaveNB $file $TRObs($i) foreach tp $TRTPoints($i) { set alt [lindex $tp $ial] ; set dep [lindex $tp $idp] if { "$dep" == "" } { if { "$alt" == "" } { puts $file [format "\t%s\t%s\t%s" [lindex $tp $idt] \ [lindex $tp $ilt] [lindex $tp $ilg]] } else { puts $file [format "\t%s\t%s\t%s\t%s" [lindex $tp $idt] \ [lindex $tp $ilt] [lindex $tp $ilg] $alt] } } else { puts $file [format "\t%s\t%s\t%s\t%s\t%s" [lindex $tp $idt] \ [lindex $tp $ilt] [lindex $tp $ilg] $alt $dep] } } puts $file "" } return } proc WriteHeader1 {file pformt fname} { # write header to file in GPSMan format, using $pformt for positions global TimeOffset Datum FCOMMAND CREATIONDATE \ SFilePFrmt SFilePFType SFileDatum SFileHeader MESS if {[file size $fname] ==0 } { puts $file "$FCOMMAND(comment) $MESS(written) GPSManager [NowTZ]" puts $file "$FCOMMAND(comment) $MESS(editrisk)" puts $file "" puts $file "$FCOMMAND(format) $pformt $TimeOffset $Datum" puts $file "$FCOMMAND(dates) $FCOMMAND($CREATIONDATE)" puts $file "" } set SFilePFrmt($file) $pformt set SFilePFType($file) [PosType $pformt] set SFileDatum($file) $Datum set SFileHeader($file) 1 } return } gpsman-6.4.4.2/gmsrc/command.tcl0000644000175000017500000005771412224351117014535 0ustar migmig# # This file is part of: # # gpsman --- GPS Manager: a manager for GPS receiver data # # Copyright (c) 1998-2013 Miguel Filgueiras migfilg@t-online.de # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. # # File: command.tcl # Last change: 6 October 2013 # # this file is only source-ed in command-line mode (even if the graphical # interface is launched to obey the command) ### change some initial values if needs be if { $COMMAND(rec) } { # use an "accept anything from receiver" setting RecCanSendAnything $MYGPS } if { $COMMAND(log) } { set NotLogging 0 } ##### executing command proc ExecCommand {} { # execute command from command line # return 0 on success, 1 on error, "wait" to loop, "-0" to quit fast global COMMAND CMDLINE NoImgLib GSHPVersion RealTimeLogAnim PVTState \ PVTDumping RealTimeGettingFix MESS GPSProtocol if { [set prot $COMMAND(prot)] != "" } { set GPSProtocol $prot } switch $COMMAND(name) { checkconn { # "is connected" command return [ExecGPSConnectFail] } show { CmdShow $COMMAND(what) return "-0" } haslib { switch $COMMAND(what) { gpsmanshp { if { $GSHPVersion == "" } { return 1 } } Img { if { $NoImgLib } { return 1 } } default { if { [lsearch -exact [package names] $COMMAND(what)] \ == -1 } { return 1 } } } } getwrite { if { [CmdGetFails $COMMAND(rectypes)] || \ [CmdWriteFails $COMMAND(format) $COMMAND(path) \ $COMMAND(out,params) $COMMAND(filetypes)] } { return 1 } } readput { if { [CmdReadFails $COMMAND(format) $COMMAND(path) \ $COMMAND(in,params) $COMMAND(filetypes)] || \ [CmdPutFails $COMMAND(rectypes)] } { return 1 } } translate { CmdSetTranslateParams $COMMAND(params) if { [CmdReadFails $COMMAND(infmt) $COMMAND(inpath) \ $COMMAND(in,params) $COMMAND(intypes)] || \ [CmdWriteFails $COMMAND(format) $COMMAND(path) \ $COMMAND(out,params) $COMMAND(filetypes)] } { return 1 } CmdRestoreTranslation } getrtimelog { if { [CmdCantStartRTimeLog Ignore Ignore] || \ [CmdRTimeDumpFails $COMMAND(path)] } { return 1 } # force calls to SavePVTData $PVTDFile set PVTDumping 1 set PVTState on return wait } getfix { # interval for real-time log set COMMAND(interv) 2 if { [CmdCantStartRTimeLog Ignore Ignore] || \ [CmdRTimeDumpFails $COMMAND(path)] } { return 1 } set RealTimeGettingFix 1 trace variable RealTimeGettingFix w CmdRTimeGotFix if { $COMMAND(timeout) != 0 } { after [expr $COMMAND(timeout)*1000] \ { set RealTimeGettingFix -1 } } # avoid calls to SavePVTData $PVTDFile set PVTDumping 0 set PVTState on return wait } getalmanac { if { [CmdGetAlmanacFails $COMMAND(path)] } { return 1 } } starttravel { # enter graphical mode set CMDLINE 0 GMInit if { ! [CmdCantStartRTimeLog EnableGPS \ [list GMMessage $MESS(receiver)]] } { set RealTimeLogAnim 1 ToTravel } return wait } project { if { [CmdBadProjArgs] || [CmdBadProjSetup] } { return 1 } set proj $COMMAND(proj) foreach "x y" [Proj${proj}Point MPData \ $COMMAND(latd) $COMMAND(longd) $COMMAND(ptsdatum)] {} puts "$x\t$y" return "-0" } georef { if { [CmdBadGeoRefArgs] || [CmdBadGeoRefSetup] } { return 1 } CmdGenerateGeoRef return "-0" } geopicts { global Number Datum SYMBOLS DEFAULTSYMBOL set type $COMMAND(intypes) if { [CmdReadFails $COMMAND(infmt) $COMMAND(inpath) \ $COMMAND(in,params) $type] || $Number($type) == 0 } { return 1 } set fmt $COMMAND(format) set ix [expr $Number($type)-1] set mdate pict ; set dhour 0 if { $fmt == "GPX" } { set datum "WGS 84" } else { set datum $Datum } set sy scenic set prefix P foreach "lhs rhs" $COMMAND(params) { switch $lhs { id { if { [set ix [IndexNamed $type $rhs]] == -1 } { GMMessage "$MESS(notlisted): $rhs" return 1 } } date { set mdate $rhs } dh { set dhour $rhs } datum { if { [EllipsdOf $rhs] == "" } { GMMessage "$MESS(unkndatum): $rhs" return 1 } if { $fmt != "GPX" } { set datum $rhs } } sy { if { [lsearch -exact $SYMBOLS $rhs] == -1 } { GMMessage "$MESS(badSYMBOLcode): $rhs" return 1 } set sy $rhs } prefix { set prefix $rhs } __picts { set pcs $rhs } } } if { [set lts [GetFilesDates $pcs $mdate $dhour]] == "" || \ [set lts [GeoAdapt $type $ix $datum $lts]] == "" } { GMMessage $MESS(missingdata) return 1 } if { [CmdProcParamsFails $fmt $COMMAND(out,params)] || \ [CmdGPictsOutputFails $fmt $COMMAND(path) \ $lts $datum $sy $prefix] } { return 1 } } source { # file is assumed to be in system encoding if { [catch {source $COMMAND(path)}] } { return 1 } return wait } read { if { ! $COMMAND(script) } { # enter graphical mode set CMDLINE 0 GMInit if { [CmdReadFails $COMMAND(format) $COMMAND(path) \ $COMMAND(in,params) $COMMAND(filetypes)] } { GMMessage "$MESS(badfile): $COMMAND(path)" } return wait } return [CmdReadFails $COMMAND(format) $COMMAND(path) \ $COMMAND(in,params) $COMMAND(filetypes)] } exec { if { [catch {set f [open $COMMAND(path) r]}] } { return 1 } set COMMAND(script) 1 return [CmdInterpret $f] } write { return [CmdWriteFails $COMMAND(format) $COMMAND(path) \ $COMMAND(out,params) $COMMAND(filetypes)] } get { return [CmdGetFails $COMMAND(rectypes)] } put { return [CmdPutFails $COMMAND(rectypes)] } } return 0 } proc CmdProcessLine {line} { # split $line into command name and arguments taking care of quotes # return list similar to argv or ERROR on error set line [string trim $line] regsub -all "\t" $line " " line while { [regsub -all " " $line " " line] } { continue } set l "" while { [string first "\"" $line] != -1 } { if { ! [regexp {^([^"]*)"([^"]*)"(.*)$} $line m pre in rest] } { return ERROR } if { $pre != "" } { set l [concat $l [split [string trim $pre] " "]] } lappend l $in set line [string trim $rest] } if { $line != "" } { set l [concat $l [split $line " "]] } return $l } proc CmdInterpret {file} { # interpret commands from $file # return 1 on error, 0 on success global argv set prev "" while { ! [eof $file] } { gets $file line set line [string trim $line " \t"] # discards comment lines whose first non-blank is "#" if { $line == "" || [regexp {^#} $line] } { continue } # check continuation line indicator (backslash as last char) # if there is a unmatched quote this will cause error! if { [string index $line end] == "\\" } { set prev "$prev$line " continue } set line [string trim "$prev$line" " \t"] set argv [CmdProcessLine $line] if { [BadCommandLine] } { puts stderr "bad command: $line" return 1 } if { [ExecCommand] == 1 } { puts stderr "command failed: $line" return 1 } set prev "" } # continuation line not found if { $prev != "" } { return 1 } return 0 } proc ExecGPSConnectFail {args} { # $args is list with 1st and 2nd argument to proc GPSConnection # return 1 on error, 0 on success global GPSOpResult if { $args == "" } { if { [GPSConnection Ignore Ignore] == 0 } { return 1 } } elseif { [GPSConnection [lindex $args 0] [lindex $args 1]] == 0 } { return 1 } vwait GPSOpResult return $GPSOpResult } proc CmdCantStartRTimeLog {connproc errorproc} { # return 0 on success, 1 on error global COMMAND GPSProtocol # this depends on the Garmin variant... if { [string first "garmin" $GPSProtocol] == 0 && \ [ExecGPSConnectFail $connproc $errorproc] } { return 1 } if { ! [StartRealTimeLog $COMMAND(interv)] } { return 1 } return 0 } proc CmdGetFails {types} { # get items of given $types # return 0 on success global GPSOpResult if { [ExecGPSConnectFail] } { return 1 } foreach t $types { GetGPS $t vwait GPSOpResult if { $GPSOpResult } { return 1 } } return 0 } proc CmdGetAlmanacFails {path} { # get almanac and print it to file # return 0 on success global ALDataTxt if { [CmdGetFails AL] || [set f [CmdOpenFile $path out]] == -1 } { return 1 } puts $f $ALDataTxt close $f return 0 } proc CmdPutFails {types} { # put items of given $types # return 0 on success global GPSOpResult Storage if { [ExecGPSConnectFail] } { return 1 } foreach wh $types { set ids [lindex $Storage($wh) 0] global $ids PutGPS $wh [array names $ids] vwait GPSOpResult if { $GPSOpResult } { return 1 } } return 0 } proc CmdOpenFile {path mode} { # open file # $mode in {in, out, app} # if $path in {stdin, stdout} for suitable $mode return $path # otherwise return file descriptor or -1 on error if { $mode == "in" } { if { $path == "stdin" } { return stdin } set mode r } elseif { $path == "stdout" } { set mode w return stdout } elseif { $mode == "out" } { set mode w } else { set mode a } if { [catch {set f [open $path $mode]}] } { return -1 } return $f } proc CmdReadFails {fmt path pars types} { # read file in format $fmt # if $path==stdin use standard input unless $fmt is Shapefile in which # case return failure # return 0 on success global FILEFORMAT File if { [CmdProcParamsFails $fmt $pars] } { return 1 } switch -glob $fmt { GPSMan { if { [set f [CmdOpenFile $path in]] == -1 || \ [catch {set r [LoadFileFrom $f Data]}] || \ $r == 0 } { return 1 } } Shapefile { if { $path == "stdin" } { return 1 } # a single type per file return [ImportShapefileFrom $path $types] } default { if { $FILEFORMAT($fmt,filetype) != "data" } { # a single type per file set wh $types } else { set wh Data } if { $fmt == "GPStrans" } { set cr 1 } else { set cr 0 } if { [set f [CmdOpenFile $path in]] == -1 } { return 1 } InitInputFileVars $f $wh $cr 0 set File($wh) $path if { [catch {set r [ImportFileFrom $f $wh $fmt]}] || $r == 1 } { return 1 } } } return 0 } proc CmdWriteFails {fmt path pars types} { # write data to file in format $fmt # if $path==stdout use standard output unless $fmt is Shapefile # in which case return failure # return 0 on success global FILEFORMAT if { [CmdProcParamsFails $fmt $pars] } { return 1 } switch -glob $fmt { GPSMan { if { [set f [CmdOpenFile $path out]] == -1 } { return 1 } if { [catch {set fts $FILEFORMAT(GPSMan,types)}] } { set fts [lindex $FILEFORMAT(GPSMan,io_types) 1] } if { [llength $fts] == [llength $types] } { if { [catch {SaveFileTo $f all Data}] } { return 1 } } else { foreach t $types { if { [catch {SaveFileTo $f all $t}] || \ [set f [CmdOpenFile $path app]] == -1 } { return 1 } } if { $path != "stdout" } { close $f } } } Shapefile { if { $path == "stdout" } { return 1 } # a single type per file return [ExportFileTo $path all $fmt $types] } default { if { [set f [CmdOpenFile $path out]] == -1 } { return 1 } if { $FILEFORMAT($fmt,filetype) != "data" } { # a single type per file if { [catch {set r [ExportFileTo $f all $fmt $types]}] || \ $r == 1 } { return 1 } } else { set lp [AllIndicesForType Data $types] if { [catch {Export_$fmt $f $lp}] } { return 1 } } } } return 0 } proc CmdProcParamsFails {fmt pars} { # process parameters: check the given/default values, convert them, and # use them in defining global variables global FILEFORMAT MESS if { $pars == "" } { return 0 } if { [llength $pars] & 1 == 1 } { BUG Bad parameters list } set gvcsvl "" foreach "p val" $pars { foreach "gvar conversion constraint" $FILEFORMAT($fmt,param,$p) { break } if { [catch {eval $conversion}] } { GMMessage [format $MESS(badconv) $p $val] return 1 } lappend gvcsvl $p $gvar $constraint $val } foreach "p gvar constraint val" $gvcsvl { if { [catch {set r [eval $constraint]}] || $r == 0 } { GMMessage [format $MESS(badprmval) $p $val] return 1 } global $gvar set $gvar $val } return 0 } proc CmdSetTranslateParams {pars} { # set globals for the translation global CmdSAVED foreach "p val" $pars { switch -- $p { itoffset { global FromTimeOffset set CmdSAVED(FromTimeOffset) $FromTimeOffset set FromTimeOffset $val } otoffset { global TimeOffset set CmdSAVED(TimeOffset) $TimeOffset set TimeOffset $val } } } return } proc CmdRestoreTranslation {} { # restore any globals changed for the translation global CmdSAVED if { [info exists CmdSAVED] } { foreach g [array names CmdSaved] { global $g set g $CmdSaved($g) } unset CmdSAVED } return } proc CmdRTimeDumpFails {path} { # start dumping real-time log continuously # return 0 on success global PVTDFile if { [set PVTDFile [CmdOpenFile $path out]] == -1 } { return 1 } return 0 } proc CmdRTimeGotFix {args} { # global RealTimeGettingFix has been changed to either -1 for a timeout # or a list with formatted real-time position data --- see procs # UseRealTimeData and RTimeDumpLine # exit with 1 on timeout # if the fix is valid write to $PVTDFile and exit with 0, otherwise # reset RealTimeGettingFix to 1 global RealTimeGettingFix PVTDFile TXT DSCALE SPUNIT if { $RealTimeGettingFix == -1 } { exit 1 } foreach "n date lat long alt fix epe eph epv velx vely velz trk" \ $RealTimeGettingFix { break } if { $fix != $TXT(posfixerror) && $fix != $TXT(posfix_) } { puts $PVTDFile "$lat $long" puts $PVTDFile "WGS 84" puts $PVTDFile $date puts $PVTDFile $trk # horizontal speed if { $velx != "" && $vely != "" } { puts $PVTDFile [format "%.2f $SPUNIT" \ [expr sqrt($velx*$velx+$vely*$vely)*$DSCALE]] } else { puts $PVTDFile "" } if { $velz != "" } { puts $PVTDFile [format "%.1f" $velz] } else { puts $PVTDFile "" } puts $PVTDFile $epe puts $PVTDFile $eph puts $PVTDFile $epv if { $fix == $TXT(posfix3D) || $fix == $TXT(posfix3D-diff) } { puts $PVTDFile $alt } else { puts $PVTDFile "" } close $PVTDFile exit 0 } set RealTimeGettingFix 1 return } proc CmdShow {what} { # print information to stdout global VERSION FILEFORMAT RECPROTS TXT MESS MAPKNOWNPROJS MAPPROJDATA \ MAPPROJDTYPE MAPPARTPDATA MAPKNOWNTRANSFS GDATUM COMMAND SYMBOLS switch $what { help { puts $COMMAND(USAGE) } version { puts $VERSION } formats { array set mode [list \ in $TXT(fread) \ out $TXT(fwrite) \ {in out} $TXT(fread)/$TXT(fwrite)] foreach f $FILEFORMAT(names) { if { ! [catch {set dep $FILEFORMAT($f,depends)}] && \ ! [eval $dep] } { puts "$f:\t$MESS(shpwrongfile)" continue } set m $mode($FILEFORMAT($f,mode)) if { [set t $FILEFORMAT($f,filetype)] == "data" } { set suff " $TXT(nameData)" } else { set suff "" } if { [catch {set ts $FILEFORMAT($f,types)}] } { foreach "its ots" $FILEFORMAT($f,io_types) { break } puts "$f:\t$mode(in)\t $its$suff" puts "\t$mode(out)\t $ots$suff" } else { puts "$f:\t$m\t $FILEFORMAT($f,types)$suff" } set t 1 foreach how "in out" { if { ! [catch {set params $FILEFORMAT($f,$how,params)}] } { if { $t } { puts " $TXT(params)" set t 0 } puts "\t$mode($how):" if { [catch {set pds $FILEFORMAT($f,$how,pdefts)}] } { set pds "" } foreach p $params dv $pds { if { [regexp {^global:(.+)$} $dv m dvv] } { global $dvv puts "\t\t$p\t[set $dvv]" } else { puts "\t\t$p\t$dv" } } } } } } projections { set pp [array names MAPPARTPDATA] foreach p [lsort -dictionary $MAPKNOWNPROJS] { if { $p == "Schreiber" } { puts "$p:\t$TXT(PRJ$p)" } else { puts "$p:\t$TXT(PRJ$p)\n $TXT(params)" puts "\t?datum" if { [lsearch -exact $pp $p] == -1 } { if { $p == "UTM" } { puts "\t?UTMzone" continue } foreach pm $MAPPROJDATA($p) { if { [set t $MAPPROJDTYPE($pm)] != "reserved" } { regsub {^(list=)|(list:)} $t "" t puts "\t$pm\t($t)\t$TXT($pm)" } } } } } } transfs { foreach t [lsort -dictionary $MAPKNOWNTRANSFS] { puts "$t:\t$TXT(TRNSF$t)" } } datums { foreach d [lsort -dictionary [array names GDATUM]] { if { [set cmt [lindex $GDATUM($d) 5]] != "" } { puts "$d\t:$cmt" } else { puts $d } } } protocols { foreach p [lsort -dictionary [array names RECPROTS *,*]] { regexp {^(.+),(.+)$} $p x rec prot puts "$prot ($rec)" } } symbols { foreach s [lsort -dictionary $SYMBOLS] { if { [string length $s] > 7 } { set sep "\t" } else { set sep "\t\t" } puts "$s$sep$TXT(SY$s)" } } } return } proc CmdBadProjArgs {} { # check all the arguments of the project command # return 0 on success, 1 on error global COMMAND MAPKNOWNPROJS MAPPROJDATA MAPPROJDTYPE MAPPARTPROJ \ MAPPARTPDATA MPData foreach a "latd longd ptsdatum proj params" { set $a $COMMAND($a) } if { ! [CheckCoord GMMessage DDD $latd N 90] || \ ! [CheckCoord GMMessage DDD $longd E 180] || \ [EllipsdOf $ptsdatum] == "" || \ [lsearch -exact $MAPKNOWNPROJS $proj] == -1 } { return 1 } set missdat 1 if { [set pars $COMMAND(params)] != "" } { if { [llength $pars] & 1 == 1 } { BUG Bad parameters list } foreach "p val" $pars { if { $p == "datum" } { if { [EllipsdOf $val] == "" } { return 1 } set MPData(datum) $val set missdat 0 } else { if { [catch {set type MAPPROJDTYPE($p)}] || \ $type == "reserved" } { return 1 } set CMD_$p $val } } } if { $missdat } { set MPData(datum) $ptsdatum } # UTM has an optional parameter if { $proj == "UTM" && [catch {set CMD_UTMzone}] } { return 0 } if { [catch {set mp $MAPPARTPROJ($proj)}] } { foreach p $MAPPROJDATA($proj) { if { [set type $MAPPROJDTYPE($p)] != "reserved" } { if { [catch {set val [set CMD_$p]}] || \ [BadParam "" $type $val] } { return 1 } set MPData($p) $val } } } else { foreach e $MAPPROJDATA($mp) v $MAPPARTPDATA($proj) { set MPData($e) $v } set COMMAND(proj) $mp } return 0 } proc CmdBadProjSetup {} { # initialize projection # return 0 on success, 1 on error global COMMAND foreach a "latd longd ptsdatum proj" { set $a $COMMAND($a) } if { [BadProjSetup MPData $proj $latd $longd $ptsdatum] } { return 1 } return 0 } proc CmdBadGeoRefArgs {} { # check the arguments of the georef command and prepare data # return 0 on success, 1 on error global COMMAND MapLoadPos foreach a "transf ptsdatum proj params" { set $a $COMMAND($a) } # used by proc CmdBadProjArgs set COMMAND(latd) $COMMAND(0,lat) set COMMAND(longd) $COMMAND(0,long) if { [CmdBadProjArgs] } { return 1 } set npts $COMMAND(npts) for { set p 0 } { $p < $npts } { incr p } { foreach pp "lat long x y" { set $pp $COMMAND($p,$pp) } if { ! [CheckCoord GMMessage DDD $lat N 90] || \ ! [CheckCoord GMMessage DDD $long E 180] || \ ! [CheckFloat GMMessage $x] || ! [CheckFloat GMMessage $y] } { return 1 } set MapLoadPos($p,x) $x ; set MapLoadPos($p,y) $y } return 0 } proc CmdProjCoords {npts} { # return list of projected coordinates for points given in command line # $npts is number of points # assumes that the following elements are defined in array COMMAND # ptsdatum # $n,lat for $n in 0..$npts-1 # $n,long # proj projection # assumes that the projection parameters were initialized in array MPData global COMMAND set ptsdatum $COMMAND(ptsdatum) ; set proj $COMMAND(proj) set tcs "" for { set p 0 } { $p < $npts } { incr p } { lappend tcs [Proj${proj}Point MPData \ $COMMAND($p,lat) $COMMAND($p,long) $ptsdatum] } return $tcs } proc CmdBadGeoRefSetup {} { # initialize projection and transformation # return 0 on success, 1 on error global COMMAND if { [CmdBadProjSetup] } { return 1 } MapProjectionIs $COMMAND(proj) if { [set transf $COMMAND(transf)] == "NoRot" } { set proc InitNoRotTransf } else { set proc MapInit${transf}Transf } if { ! [$proc] } { return 1 } return 0 } proc CmdGenerateGeoRef {} { # output geo-ref information file global COMMAND SaveMapBack $COMMAND(image) stdout return } proc CmdGPictsOutputFails {fmt path lts datum sy prefix} { # write a waypoint for each tuple in $lts to file in format $fmt # $fmt must be GPX (for the time being) # $lts is list of tuples with the latitude and longitude (decimal # degrees, for $datum) and altitude (metre), date in seconds from # $YEAR0, file path, and date in "%Y:%m:%d %H:%M:%S" format # $sy the symbol code to use for WPs # $prefix is the name prefix to be used when generating WP names # if $path==stdout use standard output # return 0 on success if { $fmt != "GPX" } { BUG CmdGPictsOutputFails: format must be GPX } if { $path != "stdout" } { if { [catch {set file [open $path w]}] } { return 1 } } else { set file stdout } # output GPX set xml_hdr { anonymous GPSMan user undefined undefined undefined } set xml_footer {} set xml_wptalt { %s %s %s %s %s } set xml_wpt { %s %s %s %s } set n 0 set dpre "Photo" puts $file $xml_hdr foreach tuple $lts { foreach "la lo alt secs fpath date" $tuple { break } set name "$prefix[format %05d $n]" incr n set fname [file tail $fpath] set dscr "$dpre $fname" if { $alt != "" } { puts $file [format $xml_wptalt $la $lo $name $alt $sy $dscr $fname] } else { puts $file [format $xml_wpt $la $lo $name $sy $dscr $fname] } } puts $file $xml_footer if { $path != "stdout" } { close $file } return 0 } ##### logo window proc ShowGPSMan {} { # create widgets for displaying information about GPSMan in root window global SmallLogo VERSION COLOUR EPOSX EPOSY TXT wm protocol . WM_DELETE_WINDOW { exit 1 } frame .fr -relief flat -borderwidth 5 -bg $COLOUR(messbg) if { $SmallLogo != "" } { label .fr.im -image $SmallLogo -relief sunken pack .fr.im } label .fr.title -text "$TXT(GMtit) $VERSION" -relief sunken bind . About pack .fr.title -side top -pady 5 pack .fr -side top update idletasks return } gpsman-6.4.4.2/gmsrc/geod.tcl0000644000175000017500000012500712224351120014016 0ustar migmig# # This file is part of: # # gpsman --- GPS Manager: a manager for GPS receiver data # # Copyright (c) 1998-2013 Miguel Filgueiras migfilg@t-online.de # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. # # File: geod.tcl # Last change: 6 October 2013 # ## Most of the geodetic information herein taken or adopted from # Kenneth Foote pages, Department of Geography, The University of # Colorado at Boulder # http://www.colorado.edu/geography/gcraft/notes/datum/edlist.html # geotrans - an open source coordinate transformation tool from the # USA National Imagery and Mapping Agency (NIMA) # http://www.remotesensing.org # gpstrans - a program to communicate with garmin gps # containing parts taken from John F. Waers (jfwaers _AT_ csn.net) # program MacGPS. # Copyright (c) 1995 by Carsten Tschach (tschach _AT_ zedat.fu-berlin.de) # International Institute for Aerospace Survey and Earth Sciences (ITC), # Enschede, http://kartoweb.itc.nl/geometrics # Land Information New Zealand (LINZ) # http://www.linz.govt.nz/rcs/linz/pub/web/root/core/SurveySystem/GeodeticInfo/geodeticdatums/index.jsp ## # ## Some geodetic information kindly provided by # Luisa Bastos, Universidade do Porto # Attila Berenyi (berenyi.attila _AT_ gmail.com) ## # ## Some more definitions taken from: # - the PROJ4.0 package by Gerald I. Evenden (gie _AT_ kai.er.usgs.gov) # - (Austrian Datum), http://homepage.ntlworld.com/anton.helm/bmn_mgi.html # - GPSTrackMaker by Odilon Ferreira (www.gpstm.com) # - Hungarian Datum 72: http://ftp/gps/honlap-jan2002.pdf, September 2008 ## # ## New way of representing datums with GDATUM and ELLPSDDEF arrays, and # proc EllipsdData based on contribution by Stefan Heinen # (stefan.heinen _AT_ djh-freeweb.de) ## proc EllipsdData {datum} { # based on contribution by Stefan Heinen # yield the ellipsoid data for datum as a list with # a - semi-major axis (as float) # f - flattening (as float) # dx, dy, dz - translation of center global GDATUM ELLPSDDEF set d [lrange $GDATUM($datum) 0 3] set def $ELLPSDDEF([lindex $d 0]) return [lreplace $d 0 0 \ [expr 1.0*[lindex $def 0]] [expr 1.0/[lindex $def 1]]] } proc EllipsdOf {datum} { # return ellipsoid name for $datum or "" on error global GDATUM if { [catch {set e [lindex $GDATUM($datum) 0]}] } { return "" } return $e } proc DatumRefId {datum} { # return reference id of $datum or -1 if unknown datum # if the reference id is a number it is the one used by GPStrans global GDATUM if { [lsearch -exact [array names GDATUM] $datum] == -1 } { return -1 } return [lindex $GDATUM($datum) 4] } proc DatumWithRefId {n} { # return name of datum whose reference id is $n or -1 if there is none # if the reference id is a number it is the one used by GPStrans global GDATUM foreach datum [array names GDATUM] { if { [lindex $GDATUM($datum) 4] == $n } { return $datum } } return -1 } # definitions of known datums and ellipsoids ###### known datums # when changing this list make sure you update the definitions below ## description of predefined datum menu set PREDEFDATUMDESCR \ [list "WGS 84" "WGS 72" \ --- \ @ [list Europe \ Austrian "Austrian (MGI)" "CH-1903" "Datum 73" \ "Deutsches Hauptdreiecksnetz" \ "Estonia Coord System 1937" "ED73" \ @ [list "European 1950" \ "European 1950" "European 1950; Belgium" \ "European 1950; Cyprus" \ "European 1950; Egypt" "European 1950; England Channel" \ "European 1950; England" "European 1950; Finland+Norway" \ "European 1950; Greece" "European 1950; Iran" \ "European 1950; Italy (Sardinia)" \ "European 1950; Italy (Sicily)" "European 1950; Malta" \ "European 1950; NW Europe" "European 1950; Middle East" \ "European 1950; Portugal+Spain" "European 1950; Tunisia"] \ "European 1979" \ "Finland Hayford" "Graciosa Base SW 1948" "Hermannskogel" \ "Hermannskogel; old Yugoslavia" "Hjorsey 1955" \ "Hungarian Datum 1972" "Ireland 1965" "Lisboa" "NGO 1948" \ Norsk "NTF (Nouvelle Triangulation de France)" \ "NTF (NTF ellipsoid)" \ "Observatorio 1966" \ @ [list "Ord Srvy Grt Britn" \ "Ord Srvy Grt Britn" "Ord Srvy Grt Britn; England" \ "Ord Srvy Grt Britn; England+Wales" \ "Ord Srvy Grt Britn; Scotland+Shetlands" \ "Ord Srvy Grt Britn; Wales"] \ "Pico De Las Nieves" \ "Porto Santo 1936" Potsdam "Pulkovo 1942" "Rome 1940" \ "Rome 1940; Luxembourg" "Rijks Driehoeksmeting" "RT 90" \ @ [list "S-42 (Pulkovo 1942)" \ "S-42 (Pulkovo 1942); Albania" \ "S-42 (Pulkovo 1942); Czechoslavakia" \ "S-42 (Pulkovo 1942); Hungary" \ "S-42 (Pulkovo 1942); Kazakhstan" \ "S-42 (Pulkovo 1942); Latvia" \ "S-42 (Pulkovo 1942); Romania" \ "S-42 (Pulkovo 1942); Poland"] \ "S-JTSK" "Sao Braz" \ "Southeast Base" "Southwest Base"] \ @ [list America \ "Bermuda 1957" "Bogota Observatory" "Campo Inchauspe" \ "Cape Canaveral" "Chua Astro" "Corrego Alegre" \ "Gan 1970" \ @ [list NAD27 \ "NAD27 Alaska" "NAD27 Alaska; Aleutian East" \ "NAD27 Alaska; Aleutian West" "NAD27 Bahamas" \ "NAD27 Canada" "NAD27 Canada West" "NAD27 Canada Middle" \ "NAD27 Canada East" "NAD27 Canada North" \ "NAD27 Canada Yukon" "NAD27 Canal Zone" "NAD27 Caribbean" \ "NAD27 Central" "NAD27 CONUS" "NAD27 CONUS East" \ "NAD27 CONUS West" "NAD27 Cuba" \ "NAD27 Greenland" "NAD27 Mexico" "NAD27 San Salvador"] \ @ [list NAD83 \ "NAD83" "NAD83; Aleutian Ids" "NAD83; Canada" \ "NAD83; CONUS" "NAD83; Hawaii" "NAD83; Mexico"] \ "Naparima BWI" \ @ [list "Old Hawaiian" \ "Old Hawaiian" "Old Hawaiian; Hawaii" \ "Old Hawaiian; Kauai" "Old Hawaiian; Maui" \ "Old Hawaiian; Oahu" "Old Hawaiian (Int)" \ "Old Hawaiian (Int); Hawaii" "Old Hawaiian (Int); Kauai" \ "Old Hawaiian (Int); Maui" "Old Hawaiian (Int); Oahu"] \ @ [list "Prov So Amrican `56" \ "Prov So Amrican `56" "Prov So Amrican 56; Bolivia" \ "Prov So Amrican 56; Chile North" \ "Prov So Amrican 56; Chile South" \ "Prov So Amrican 56; Colombia" \ "Prov So Amrican 56; Ecuador" "Prov So Amrican 56; Guyana" \ "Prov So Amrican 56; Peru" \ "Prov So Amrican 56; Venezuela"] \ "Prov So Chilean `63" "Puerto Rico" "Qornoq" \ "Reunion" "Sapper Hill 1943" \ @ [list "South American `69" \ "South American `69" "South American 69; Argentina" \ "South American 69; Baltra" \ "South American 69; Bolivia" "South American 69; Brazil" \ "South American 69; Brazil/IBGE" \ "South American 69; Chile" "South American 69; Colombia" \ "South American 69; Ecuador" \ "South American 69; Ecuador Galapagos" \ "South American 69; Guyana" "South American 69; Paraguay" \ "South American 69; Peru" \ "South American 69; Trinidad+Tobago" \ "South American 69; Venezuela"] \ "Yacare"] \ @ [list Africa \ @ [list Adindan \ "Adindan" "Adindan; B Faso" "Adindan; Cameroon" \ "Adindan; Ethiopia" "Adindan; Ethiopia+Sudan" \ "Adindan; Mali" "Adindan; Senegal" "Adindan; Sudan"] \ "Afgooye" \ @ [ list "Arc 1950" \ "Arc 1950" "Arc 1950; Botswana" "Arc 1950; Burundi" \ "Arc 1950; Lesotho" "Arc 1950; Malawi" \ "Arc 1950; Swaziland" "Arc 1950; Zaire" \ "Arc 1950; Zambia" "Arc 1950; Zimbabwe"] \ @ [list "Arc 1960" \ "Arc 1960" "Arc 1960; Kenya" "Arc 1960; Kenya+Tanzania" \ "Arc 1960; Tanzania"] \ "Astro DOS 71/4" "Ayabelle Lighthouse" \ "Bissau" "Cape" "Carthage" "Dabola" "Egypt" \ "European 1950; Tunisia" "Leigon" \ "Liberia 1964" "M'Poraloko" "Massawa" \ "Merchich" "Minna" "Minna; Cameroon" "North Sahara 1959" \ "Old Egyptian" "Point 58" "Pointe Noire 1948" "Schwarzeck" \ "Sierra Leone" "Tananarive Observatory 1925" \ "Tristan Astro 1968" "Voirol 1874" "Voirol 1960" "Zanderij"] \ @ [list "Middle East" \ @ [list "Ain el Abd 1970" \ "Ain el Abd 1970" "Ain el Abd 1970; Bahrain" \ "Ain el Abd 1970; Saudi Arabia"] \ @ [list "European 1950" \ "European 1950; Iran" "European 1950; Middle East"] \ "Herat North" "Nahrwn Masirah Ilnd" \ "Nahrwn Saudi Arbia" "Nahrwn United Arab" "Oman"] \ @ [list Asia \ "Bukit Rimpah" "Gunung Segara" "Hong Kong 1963" \ "Hu-Tzu-Shan" "Indian (Bangladesh)" "Indian (India, Nepal)" \ "Indian (Pakistan)" "Indian Thailand" "Indian 1954" \ "Indian 1960; Vietnam (Con Son)" "Indian 1960; Vietnam (N16)" \ "Indian 1975" "Indonesian 1974" "Kandawala" \ "Korean Geodetic System" "South Asia" \ @ [list "Tokyo" \ "Tokyo" "Tokyo; Japan" "Tokyo; Okinawa" \ "Tokyo; South Korea"] \ ] \ @ [list "Australia, NZ" \ "Australian Geod `66" "Australian Geod `84" \ "Geodetic Datum `49"] \ @ [list "$TXT(others) \[A-I\]" \ "American Samoa 1962" "Anna 1 Astro 1965" \ "Antigua Island Astro 1943" "Ascension Island `58" \ "Astro B4 Sorol Atoll" "Astro Beacon \"E\"" \ "Astronomic Stn `52" "Astro Tern Island (FRIG)" \ "Bellevue (IGN)" "Camp Area Astro" "Canton Astro 1966" \ "Chatham 1971" "Deception Island" "Dionisos" \ "Djakarta (Batavia)" \ "DOS 1968" "Easter Island 1967" "Fort Thomas 1955" \ "Gandajika Base" "Guam 1963" \ "GUX 1 Astro" Israeli "ISTS 061 Astro 1968" \ "ISTS 073 Astro `69"] \ @ [list "$TXT(others) \[J-Z\]" \ "Johnston Island" "Johnston Island 1961" "K12 Astro 1955" \ "Kerguelen Island" "Kertau 1948" "Kusaie Astro 1951" \ "L.C. 5 Astro" "Luzon Mindanao" "Luzon Philippines" \ "Mahe 1971" "Marco Astro" "Midway Astro 1961" \ "Montserrat Island Astro 1958" \ "Pitcairn Astro 1967" "Qatar National" "Santo (DOS)" \ "Selvagem Grande 1938" "Timbalai 1948" "Viti Levu 1916" \ "Wake Island Astro 1952" "Wake-Eniwetok `60"] ] proc FillDatumMenu {menu commdargs args} { # fill menu with known datum names # see proc FillMenu (utils.tcl) for the details on the arguments # $args not used global TXT DefSpecs PREDEFDATUMDESCR global $DefSpecs(datum,ulist) set descr $PREDEFDATUMDESCR set ulist [set $DefSpecs(datum,ulist)] if { $ulist != "" } { set ud [linsert $ulist 0 "$TXT(userdefs)..."] set descr [linsert $descr 0 @ $ud ---] } FillMenu $menu $commdargs $descr return } ## datum definitions # index of GDATUM is datum name # each list contains: # - ellipsoid name # - dx, dy, dz # - reference id; if a number, it is the number used by GPStrans # - comment # (the following elements are not being used and may be absent) # - expected error estimate in metres: ex, ey, ez (-1 for unknown) # - number of satellite measurement stations (0 for unknown) # - min, max lat and min, max long in signed degrees (empty or "_" if unknown) array set GDATUM { "Adindan" { "Clarke 1880" -162 -12 206 0 "Mean for Ethiopia, Mali, Senegal, Sudan" -1 -1 -1 0} "Adindan; B Faso" { "Clarke 1880" -118 -14 218 0a "Burkina Faso" 25 25 25 1 4 22 -5 8} "Adindan; Cameroon" { "Clarke 1880" -134 -2 210 0b "" 25 25 25 1 -4 19 3 23} "Adindan; Ethiopia" { "Clarke 1880" -165 -11 206 0c "" 3 3 3 8 -3 25 26 50} "Adindan; Ethiopia+Sudan" { "Clarke 1880" -166 -15 204 0c1 "" 5 5 3 22 -5 31 15 55} "Adindan; Mali" { "Clarke 1880" -123 -20 220 0d "" 25 25 25 1 3 31 -20 11} "Adindan; Senegal" { "Clarke 1880" -128 -18 224 0e "" 25 25 25 2 5 23 -24 -5} "Adindan; Sudan" { "Clarke 1880" -161 -14 205 0f "" 3 5 3 14 -3 31 15 45} "Afgooye" { "Krassovsky 1940" -43 -163 45 1 "Somalia" 25 25 25 1 -8 19 35 60} "Ain el Abd 1970" { "International 1924" -150 -251 -2 2 "Mean for Bahrain Island, Saudi Arabia" -1 -1 -1 0} "Ain el Abd 1970; Bahrain" { "International 1924" -150 -250 -1 2a "" 25 25 25 2 24 28 49 53} "Ain el Abd 1970; Saudi Arabia" { "International 1924" -143 -236 7 2b "" 10 10 10 9 8 38 28 62} "Anna 1 Astro 1965" { "Australian National" -491 -22 435 3 "Cocos Islands" 25 25 25 1 -14 -10 94 99} "Arc 1950" { "Clarke 1880" -143 -90 -294 4 "Mean for Botswana, Lesotho, Malawi, Swaziland, Zaire, Zambia, Zimbabwe" 20 33 20 41 -36 10 4 42} "Arc 1950; Botswana" { "Clarke 1880" -138 -105 -289 4a "" 3 5 3 9 -33 -13 13 36} "Arc 1950; Burundi" { "Clarke 1880" -153 -5 -292 4b "" 20 20 20 3 -11 4 21 37} "Arc 1950; Lesotho" { "Clarke 1880" -125 -108 -295 4c "" 3 3 8 5 -36 -23 21 35} "Arc 1950; Malawi" { "Clarke 1880" -161 -73 -317 4d "" 9 24 8 6 -21 -3 26 42} "Arc 1950; Swaziland" { "Clarke 1880" -134 -105 -295 4e "" 15 15 15 4 -33 -20 25 40} "Arc 1950; Zaire" { "Clarke 1880" -169 -19 -278 4f "" 25 25 25 2 -21 10 4 38} "Arc 1950; Zambia" { "Clarke 1880" -147 -74 -283 4g "" 21 21 27 5 -24 -1 15 40} "Arc 1950; Zimbabwe" { "Clarke 1880" -142 -96 -293 4h "" 5 8 11 10 -29 -9 19 39} "Arc 1960" { "Clarke 1880" -160 -8 -300 5 "Kenya, Tanzania" -1 -1 -1 0} "Arc 1960; Kenya+Tanzania" { "Clarke 1880" -160 -6 -302 5a "" 20 20 20 25 -18 8 23 47} "Arc 1960; Kenya" { "Clarke 1880" -157 -2 -299 5b "" 4 3 3 24 -11 8 28 47} "Arc 1960; Tanzania" { "Clarke 1880" -175 -23 -303 5c "" 6 9 10 12 -18 5 23 47} "Ascension Island `58" { "International 1924" -205 107 53 6 "GPStrans gives: -207 107 52" 25 25 25 2 -9 -6 -16 -13} "Astro B4 Sorol Atoll" { "International 1924" 114 -116 -333 7 "" -1 -1 -1 0} "Astro Beacon \"E\"" { "International 1924" 145 75 -272 8 "Iwo Jima" 25 25 25 1 22 26 140 144} "Astro DOS 71/4" { "International 1924" -320 550 -494 9 "St Helena Island" 25 25 25 1 -18 -14 -7 -4} "Astronomic Stn `52" { "International 1924" 124 -234 -25 10 "Marcus Island" 25 25 25 1 22 26 152 156} "Australian Geod `66" { "Australian National" -133 -48 148 11 "Australia; Tasmania" 3 3 3 105 -46 -4 109 161} "Australian Geod `84" { "Australian National" -134 -48 149 12 "Australia; Tasmania" 2 2 2 90 -46 -4 109 161} "Bellevue (IGN)" { "International 1924" -127 -769 472 13 "Efate and Erromango Islands" 20 20 20 3 -20 -16 167 171} "Bermuda 1957" { "Clarke 1866" -73 213 296 14 "" 20 20 20 3 31 34 -66 -63} "Bogota Observatory" { "International 1924" 307 304 -318 15 "Colombia" 6 5 6 7 -10 16 -85 -61} "Campo Inchauspe" { "International 1924" -148 136 90 16 "Argentina" 5 5 5 20 -58 -27 -72 -51} "Canton Astro 1966" { "International 1924" 298 -304 -375 17 "Phoenix Islands" 15 15 15 4 -13 3 -180 -165} "Cape" { "Clarke 1880" -136 -108 -292 18 "South Africa" 3 6 6 5 -43 -15 10 40} "Cape Canaveral" { "Clarke 1866" -2 151 181 19 "Bahamas, Florida" 3 3 3 19 15 38 -94 -12} "Carthage" { "Clarke 1880" -263 6 431 20 "Tunisia" 6 9 8 5 24 43 2 18} "CH-1903" { "Bessel 1841" 674 15 405 21 "Switzerland"} "Chatham 1971" { "International 1924" 175 -38 113 22 "New Zealand (Chatham Island)" 15 15 15 4 -46 -42 -180 -174} "Chua Astro" { "International 1924" -134 229 -29 23 "Paraguay" 6 9 5 6 -33 -14 -69 -49} "Corrego Alegre" { "International 1924" -206 172 -6 24 "Brazil" 5 3 5 17 -39 -2 -80 -29} "Djakarta (Batavia)" { "Bessel 1841" -377 681 -50 25 "Indonesia (Sumatra)" 3 3 3 5 -16 11 89 146} "DOS 1968" { "International 1924" 230 -199 -752 26 "New Georgia Islands (Gizo Island)" 25 25 25 1 -10 -7 155 158} "Easter Island 1967" { "International 1924" 211 147 111 27 "" 25 25 25 1 -29 -26 -111 -108} "European 1950" { "International 1924" -87 -98 -121 28 "Mean for Austria, Belgium, Denmark, Finland, France, W Germany, Gibraltar, Greece, Italy, Luxembourg, Netherlands, Norway, Portugal, Spain, Sweden, Switzerland" 3 8 5 85 30 80 5 33} "European 1950; Cyprus" { "International 1924" -104 -101 -140 28a "" 15 15 15 4 33 37 31 36} "European 1950; Egypt" { "International 1924" -130 -117 -151 28b "" 6 8 8 14 16 38 19 42} "European 1950; England Channel" { "International 1924" -86 -96 -120 28c "England, Channel Islands, Scotland, Shetland Islands" 3 3 3 40 48 62 -10 3} "European 1950; England" { "International 1924" -86 -96 -120 28d "England, Ireland, Scotland, Shetland Islands" 3 3 3 47 48 62 -12 3} "European 1950; Finland+Norway" { "International 1924" -87 -95 -120 28e "" 3 5 3 20 52 80 -2 38} "European 1950; Greece" { "International 1924" -84 -95 -130 28f "" 25 25 25 2 30 48 14 34} "European 1950; Iran" { "International 1924" -117 -132 -164 28g "" 9 12 11 27 19 47 37 69} "European 1950; Italy (Sardinia)" { "International 1924" -97 -103 -120 28h "" 25 25 25 2 37 43 6 12} "European 1950; Italy (Sicily)" { "International 1924" -97 -88 -135 28i "" 20 20 20 3 35 40 10 17} "European 1950; Malta" { "International 1924" -107 -88 -149 28j "" 25 25 25 1 34 38 12 16} "European 1950; NW Europe" { "International 1924" -87 -96 -120 28k "Mean for Austria, Denmark, France, W Germany, Netherlands, Switzerland" 3 3 3 52 30 78 -15 25} "European 1950; Middle East" { "International 1924" -103 -106 -141 28l "Mean for Iraq, Israel, Jordan, Lebanon, Kuwait, Saudi Arabia, Syria" -1 -1 -1 0 4 38 36 57} "European 1950; Portugal+Spain" { "International 1924" -84 -107 -120 28m "" 5 6 3 18 30 49 -15 10} "European 1950; Tunisia" { "International 1924" -112 -77 -145 28n "" 25 25 25 4 24 43 2 18} "European 1979" { "International 1924" -86 -98 -119 29 "Mean for Austria, Finland, Netherlands, Norway, Spain, Sweden, Switzerland" 3 3 3 22 30 80 -15 24} "Finland Hayford" { "International 1924" -78 -231 -97 30 ""} "Gandajika Base" { "International 1924" -133 -321 50 31 "Republic of Maldives"} "Geodetic Datum `49" { "International 1924" 84 -22 209 32 "NZGD49, New Zealand" 5 3 5 14 -48 -33 165 180} "Guam 1963" { "Clarke 1866" -100 -248 259 33 "" 3 3 3 5 12 15 143 146} "GUX 1 Astro" { "International 1924" 252 -209 -751 34 "Guadalcanal Island" 25 25 25 1 -12 -8 158 163} "Hjorsey 1955" { "International 1924" -73 46 -86 35 "Iceland" 3 3 6 6 61 69 -24 -11} "Hong Kong 1963" { "International 1924" -156 -271 -189 36 "" 25 25 25 2 21 24 112 116} "Indian (Bangladesh)" {"Everest (India 1830)" 282 726 254 37 "GPStrans gives: 289 734 257" 10 8 12 6 15 33 80 100} "Indian Thailand" { "Everest (India 1830)" 214 836 303 38 "Thailand, Vietnam"} "Ireland 1965" { "Modified Airy" 506 -122 611 39 "" 3 3 3 7 50 57 -12 -4} "ISTS 073 Astro `69" { "International 1924" 208 -435 -229 40 "Diego Garcia, South Georgia Islands" 25 25 25 2 -10 -4 69 75} "Johnston Island" { "International 1924" 189 -79 -202 41 "GPStrans gives: 191 -77 -204" 25 25 25 1 -46 -43 -76 -73} "Kandawala" { "Everest (India 1830)" -97 787 86 42 "Sri Lanka" 20 20 20 3 4 12 77 85} "Kerguelen Island" { "International 1924" 145 -187 103 43 "" 25 25 25 1 -81 -74 139 180} "Kertau 1948" { "Everest (1948)" -11 851 5 44 "West Malaysia and Singapore" 10 8 6 6 -5 12 94 112} "L.C. 5 Astro" { "Clarke 1866" 42 124 147 45 "Cayman Brac Island" 25 25 25 1 18 21 -81 -78} "Liberia 1964" { "Clarke 1880" -90 40 88 46 "" 15 15 15 4 -1 14 -17 -1} "Luzon Mindanao" { "Clarke 1866" -133 -79 -72 47 "Also known as: Luzon" 25 25 25 1 4 12 120 128} "Luzon Philippines" { "Clarke 1866" -133 -77 -51 48 "Excluding Mindanao" 8 11 9 6 3 23 115 128} "Mahe 1971" { "Clarke 1880" 41 -220 -134 49 "Mahe Island" 25 25 25 1 -6 -3 54 57} "Marco Astro" { "International 1924" -289 -124 60 50 "" -1 -1 -1 0} "Massawa" { "Bessel 1841" 639 405 60 51 "Ethiopia (Eritrea)" 25 25 25 1 7 25 37 53} "Merchich" { "Clarke 1880" 31 146 47 52 "Morocco" 5 3 3 9 22 42 -19 5} "Midway Astro 1961" { "International 1924" 912 -58 1227 53 "Midway Islands" 25 25 25 1 25 30 -180 -169} "Minna" { "Clarke 1880" -92 -93 122 54 "Nigeria" 3 6 5 6 -1 21 -4 20} "Minna; Cameroon" { "Clarke 1880" -81 -84 115 54a "" 25 25 25 2 -4 19 3 23} "NAD27 Alaska" { "Clarke 1866" -5 135 172 55 "Excluding Aleutian Ids" 5 9 5 47 47 78 -175 -157} "NAD27 Alaska; Aleutian East" { "Clarke 1866" -2 152 149 55a "Alaska (Aleutian Islands East of 180W)" 6 8 10 6 50 58 -180 -161} "NAD27 Alaska; Aleutian West" { "Clarke 1866" 2 204 105 55b "Alaska (Aleutian Islands West of 180W)" 10 10 10 5 50 58 169 180} "NAD27 Bahamas" { "Clarke 1866" -4 154 178 56 "Except San Salvador Id)" 5 3 5 11 19 29 -83 -71} "NAD27 Canada" { "Clarke 1866" -10 158 187 57 "Mean for Canada" 15 11 6 112 36 90 -150 -50} "NAD27 Canada West" { "Clarke 1866" -7 162 188 57a "Canada (Alberta, British Columbia)" 8 8 6 25 43 65 -145 -105} "NAD27 Canada Middle" { "Clarke 1866" -9 157 184 57b "Canada (Manitoba, Ontario)" 9 5 5 25 36 63 -108 -69} "NAD27 Canada East" { "Clarke 1866" -22 160 190 57c "Canada (New Brunswick, Newfoundland, Nova Scotia, Quebec)" 6 6 3 37 38 68 -85 -45} "NAD27 Canada North" { "Clarke 1866" 4 159 188 57d "Canada (Northwest Territories, Saskatchewan)" 5 5 3 17 43 90 -144 -55} "NAD27 Canada Yukon" { "Clarke 1866" -7 139 181 57e "" 5 8 3 8 53 75 -147 -117} "NAD27 Canal Zone" { "Clarke 1866" 0 125 201 58 "" 20 20 20 3 3 15 -86 -74} "NAD27 Caribbean" { "Clarke 1866" -3 142 183 59 "GPStrans gives -7 152 178\nMean for Antigua, Barbados, Barbuda, Caicos Islands, Cuba, Dominican Republic, Grand Cayman, Jamaica, Turks Islands" 3 9 12 15 8 29 -87 -58} "NAD27 Central" { "Clarke 1866" 0 125 194 60 "Mean for Belize, Costa Rica, El Salvador, Guatemala, Honduras, Nicaragua" 8 3 5 19 3 25 -98 -77} "NAD27 CONUS" { "Clarke 1866" -8 160 176 61 "" 5 5 6 405 15 60 -135 -60} "NAD27 CONUS East" { "Clarke 1866" -9 161 179 61a "Mean for CONUS (West of Mississippi River Excluding Louisiana, Missouri, Minnesota)" 5 5 8 129 18 55 -102 -60} "NAD27 CONUS West" { "Clarke 1866" -8 159 175 61b "" 5 3 3 276 19 55 -132 -87} "NAD27 Cuba" { "Clarke 1866" -9 152 178 62 "" 25 25 25 1 18 25 -87 -78} "NAD27 Greenland" { "Clarke 1866" 11 114 195 63 "Greenland (Hayes Peninsula)" 25 25 25 1 74 81 74 56} "NAD27 Mexico" { "Clarke 1866" -12 130 190 64 "" 8 6 6 22 10 38 -122 -80} "NAD27 San Salvador" { "Clarke 1866" 1 140 165 65 "" 25 25 25 1 23 26 -75 -74} "NAD83" { "GRS 80" 0 0 0 66 "Alaska (Excluding Aleutian Islands), Canada, CONUS, Central America, Mexico" 2 2 2 42 48 78 -175 -135} "NAD83; Aleutian Ids" { "GRS 80" -2 0 4 66a "" 5 2 5 4 51 74 -180 180} "NAD83; Canada" { "GRS 80" 0 0 0 66b "Canada" 2 2 2 96 36 90 -150 -50} "NAD83; CONUS" { "GRS 80" 0 0 0 66c "CONUS" 2 2 2 216 15 60 -135 -60} "NAD83; Hawaii" { "GRS 80" 1 1 -1 66d "" 2 2 2 0 17 24 -164 -153} "NAD83; Mexico" {"GRS 80" 0 0 0 66e "Mexico; Central America" 2 2 2 25 28 11 -122 -72} "Nahrwn Masirah Ilnd" { "Clarke 1880" -247 -148 369 67 "" 25 25 25 2 19 22 57 60} "Nahrwn Saudi Arbia" { "Clarke 1880" -243 -192 477 68 "GPStrans gives: -231 -196 482" 20 20 20 3 8 38 28 62} "Nahrwn United Arab" { "Clarke 1880" -249 -156 381 69 "United Arab Emirates" 25 25 25 2 17 32 45 62} "Naparima BWI" { "International 1924" -10 375 165 70 "Trinidad and Tobago; GPStrans gives: -2 374 172" 15 15 15 4 8 13 -64 -59} "Observatorio 1966" { "International 1924" -425 -169 81 71 "Azores (Corvo and Flores Islands); also known as: Observatorio Meteorologico 1939" 20 20 20 3 38 41 -33 -30} "Old Egyptian" { "Helmert 1906" -130 110 -13 72 "" 3 6 8 14 16 38 19 42} "Old Hawaiian" { "Clarke 1866" 61 -285 -181 73 "Mean for Hawaii, Kauai, Maui, Oahu" 25 20 20 15 17 24 -164 -153} "Old Hawaiian; Hawaii" { "Clarke 1866" 89 -279 -183 73a "" 25 25 25 2 17 22 -158 -153} "Old Hawaiian; Kauai" { "Clarke 1866" 45 -290 -172 73b "" 20 20 20 3 20 24 -161 -158} "Old Hawaiian; Maui" { "Clarke 1866" 65 -290 -190 73c "" 25 25 25 2 19 23 -158 -154} "Old Hawaiian; Oahu" { "Clarke 1866" 58 -283 -182 73d "" 10 6 6 8 20 23 -160 -156} "Old Hawaiian (Int)" { "International 1924" 201 -228 -346 73e "Mean for Hawaii, Kauai, Maui, Oahu" 25 20 20 0 17 24 -164 -153} "Old Hawaiian (Int); Hawaii" { "International 1924" 229 -222 -348 73f "" 25 25 25 0 17 22 -158 -153} "Old Hawaiian (Int); Kauai" { "International 1924" 185 -233 -337 73g "" 20 20 20 0 20 24 -161 -158} "Old Hawaiian (Int); Maui" { "International 1924" 205 -233 -355 73h "" 25 25 25 0 19 23 -158 -154} "Old Hawaiian (Int); Oahu" { "International 1924" 198 -226 -347 73i "" 10 6 6 0 20 23 -160 -156} "Oman" { "Clarke 1880" -346 -1 224 74 "" 3 3 9 7 10 32 46 65} "Ord Srvy Grt Britn" { "Airy 1830" 375 -111 431 75 "Ordnance Survey Great Britain 1936\nMean for England, Isle of Man, Scotland, Shetland Islands, Wales" 10 10 15 38 44 66 -14 7} "Ord Srvy Grt Britn; England" { "Airy 1830" 371 -112 434 75a "" 5 5 6 21 44 61 -12 7} "Ord Srvy Grt Britn; England+Wales" { "Airy 1830" 371 -111 434 75b "England, Isle of Man, Wales" 10 10 15 25 44 61 -12 7} "Ord Srvy Grt Britn; Scotland+Shetlands" { "Airy 1830" 384 -111 425 75c "Scotland, Shetland Islands" 10 10 10 13 49 66 -14 4} "Ord Srvy Grt Britn; Wales" { "Airy 1830" 370 -108 434 75d "" 20 20 20 3 46 59 -11 3} "Pico De Las Nieves" { "International 1924" -307 -92 127 76 "Canary Islands" 25 25 25 1 26 31 -20 -12} "Pitcairn Astro 1967" { "International 1924" 185 165 42 77 "Pitcairn Island" 25 25 25 1 -27 -21 -134 -119} "Prov So Amrican `56" { "International 1924" -288 175 -376 78 "Provisional South American 1956\nMean for Bolivia, Chile, Colombia, Ecuador, Guyana, Peru, Venezuela" 17 27 27 63 -64 18 -87 -51} "Prov So Amrican 56; Bolivia" { "International 1924" -270 188 -388 78a "" 5 11 14 5 -28 -4 -75 -51} "Prov So Amrican 56; Chile North" { "International 1924" -270 183 -390 78b "Chile (Northern, Near S19)" 25 25 25 1 -45 -12 -83 -60} "Prov So Amrican 56; Chile South" { "International 1924" -305 243 -442 78c "Chile (Southern, Near S43)" 20 20 20 3 -64 -20 -83 -60} "Prov So Amrican 56; Colombia" { "International 1924" -282 169 -371 78d "" 15 15 15 4 -10 16 -85 -61} "Prov So Amrican 56; Ecuador" { "International 1924" -278 171 -367 78e "" 3 5 3 11 -11 7 -85 -70} "Prov So Amrican 56; Guyana" { "International 1924" -298 159 -369 78f "" 6 14 5 9 -4 14 -67 -51} "Prov So Amrican 56; Peru" { "International 1924" -279 175 -379 78g "" 6 8 12 6 -24 5 -87 -63} "Prov So Amrican 56; Venezuela" { "International 1924" -295 173 -371 78h "" 9 14 15 24 -5 18 -79 -54} "Prov So Chilean `63" { "International 1924" 16 196 93 79 "Chile (Near S53); (Hito XVIII)" 25 25 25 2 -64 -25 -83 -60} "Puerto Rico" { "Clarke 1866" 11 72 -101 80 "Puerto Rico, Virgin Islands" 3 3 3 11 16 20 -69 -63} "Qatar National" { "International 1924" -128 -283 22 81 "" 20 20 20 3 19 32 45 57} "Qornoq" { "International 1924" 164 138 -189 82 "Greenland (South)" 25 25 32 2 57 85 -77 -7} "Reunion" { "International 1924" 94 -948 -1262 83 "Mascarenhas Islands" 25 25 25 1 -27 -12 47 65} "Rome 1940" { "International 1924" -225 -65 9 84 "Italy (Sardinia)" 25 25 25 1 37 43 6 12} "RT 90" { "Bessel 1841" 498 -36 568 85 "Sweden"} "Santo (DOS)" { "International 1924" 170 42 84 86 "Espirito Santo Island" 25 25 25 1 -17 -13 160 169} "Sao Braz" { "International 1924" -203 141 53 87 "Azores (Sao Miguel, Santa Maria Ids)" 25 25 25 2 35 39 -27 -23} "Sapper Hill 1943" { "International 1924" -355 21 72 88 "East Falkland Island; GPStrans gives: -355 16 74" 1 1 1 5 -54 -50 -61 -56} "Schwarzeck" { "Bessel 1841 (Namibia)" 616 97 -251 89 "Namibia" 20 20 20 3 -35 -11 5 31} "South American `69" { "South American 1969" -57 1 -41 90 "Mean for Argentina, Bolivia, Brazil, Chile, Colombia, Ecuador, Guyana, Paraguay, Peru, Trinidad and Tobago, Venezuela" 15 6 9 84 -65 -50 -90 -25} "South American 69; Argentina" { "South American 1969" -62 -1 -37 90a "" 5 5 5 10 -62 -23 -76 -47} "South American 69; Baltra" { "South American 1969" -47 26 -42 90b "" 25 25 25 0 -2 1 -92 -89} "South American 69; Bolivia" { "South American 1969" -61 2 -48 90c "" 15 15 15 4 -28 -4 -75 -51} "South American 69; Brazil" { "South American 1969" -60 -2 -41 90d "" 3 5 5 22 -39 -2 -80 -29} "South American 69; Chile" { "South American 1969" -75 -1 -44 90e "" 15 8 11 9 -64 -12 -83 -60} "South American 69; Colombia" { "South American 1969" -44 6 -36 90f "" 6 6 5 7 -10 16 -85 -61} "South American 69; Ecuador" { "South American 1969" -48 3 -44 90g "" 3 3 3 11 -11 7 -85 -70} "South American 69; Ecuador Galapagos" { "South American 1969" -47 26 -42 90h "Ecuador (Baltra, Galapagos)" 25 25 25 1} "South American 69; Guyana" { "South American 1969" -53 3 -47 90i "" 9 5 5 5 -4 14 -67 -51} "South American 69; Paraguay" { "South American 1969" -61 2 -33 90j "" 15 15 15 4 -33 -14 -69 -49} "South American 69; Peru" { "South American 1969" -58 0 -44 90k "" 5 5 5 6 -24 5 -87 -63} "South American 69; Trinidad+Tobago" { "South American 1969" -45 12 -33 90l "" 25 25 25 1 4 17 -68 -55} "South American 69; Venezuela" { "South American 1969" -45 8 -33 90m "" 3 6 3 5 -5 18 -79 -54} "South Asia" { "Modified Fischer 1960" 7 -10 -26 91 "Singapore" 25 25 25 1 0 3 102 106} "Southeast Base" { "International 1924" -499 -249 314 92 "= Porto Santo 1936"} "Southwest Base" { "International 1924" -104 167 -38 93 "= Graciosa Base SW 1948"} "Timbalai 1948" { "Everest (Sabah Sarawak)" -679 669 -48 94 "Brunei, E. Malaysia (Sabah Sarawak)\nGPStrans gives: datum=Everest (India 1830), -689 691 -46" 10 10 12 8 -5 15 101 125} "Tokyo" { "Bessel 1841" -148 507 685 95 "Mean for Japan, South Korea, Okinawa; GPStrans gives: -128 481 664" 20 5 20 31 23 53 120 155} "Tokyo; Japan" { "Bessel 1841" -148 507 685 95a "" 8 5 8 16 19 51 119 156} "Tokyo; Okinawa" { "Bessel 1841" -158 507 676 95b "" 20 5 20 3 19 31 119 134} "Tokyo; South Korea" { "Bessel 1841" -147 506 687 95c "also as: -146 507 687, 8 5 8" 2 2 2 29 27 45 120 139} "Tristan Astro 1968" { "International 1924" -632 438 -609 96 "Tristao da Cunha" 25 25 25 1 -39 -36 -14 -11} "Viti Levu 1916" { "Clarke 1880" 51 391 -36 97 "Fiji (Viti Levu Island)" 25 25 25 1 -20 -16 176 180} "Wake-Eniwetok `60" { "Hough 1960" 102 52 -38 98 "Marshall Islands" 3 3 3 10 1 16 159 175} "WGS 72" { "WGS 72" 0 0 5 99 "" -1 -1 -1 0} "WGS 84" { "WGS 84" 0 0 0 100 "" -1 -1 -1 0} "Zanderij" { "International 1924" -265 120 -358 101 "Suriname" 5 5 8 5 -10 20 -76 -47} "Potsdam" { "Bessel 1841" 587 16 393 102 "GPStrans has: 606 23 413"} "ED73" { "WGS 84" 238 -87 -27 gm102 ""} "Lisboa" { "WGS 84" 183.544 -46.902 -24.135 gm103 ""} "American Samoa 1962" { "Clarke 1866" -115 118 426 gm105 "American Samoa Islands" 25 25 25 2 -19 -9 -174 -165} "Antigua Island Astro 1943" { "Clarke 1880" -270 13 62 gm106 "Also known as: USNHO Astro 1943\nAntigua (Leeward Islands)" 25 25 25 1 16 20 -65 -61} "Astro Tern Island (FRIG)" { "International 1924" 114 -116 -333 gm107 "1961" 25 25 25 1 22 26 -166 -166} "Ayabelle Lighthouse" { "Clarke 1880" -79 -129 -145 gm108 "Djibouti" 25 25 25 1 5 20 36 49} "Bissau" { "International 1924" -173 253 27 gm109 "Guinea-Bissau" 25 25 25 2 5 19 -23 -7} "Bukit Rimpah" { "Bessel 1841" -384 664 -48 gm110 "Indonesia (Bangka and Belitung Ids)" -1 -1 -1 0 -6 0 103 110} "Camp Area Astro" { "International 1924" -104 -129 239 gm111 "Antarctica (McMurdo Camp Area)" -1 -1 -1 0 -85 -70 135 180} "Dabola" { "Clarke 1880" -83 37 124 gm112 "Guinea" 15 15 15 4 1 19 12 11} "Deception Island" { "Clarke 1880" 260 12 -147 gm113 "Deception Island, Antarctica" 20 20 20 3 -65 -62 58 62} "Fort Thomas 1955" { "Clarke 1880" -7 215 225 gm114 "Nevis, St. Kitts (Leeward Islands)" 25 25 25 2 16 19 -64 -61} "Gan 1970" { "International 1924" -133 -321 50 gm115 "Republic of Maldives" 25 25 25 1 -2 9 71 75} "Gunung Segara" { "Bessel 1841" -403 684 41 gm116 "Indonesia (Kalimantan)" -1 -1 -1 0 -6 9 106 121} "Herat North" { "International 1924" -333 -222 114 gm117 "Afghanistan" -1 -1 -1 0 23 44 55 81} "Hu-Tzu-Shan" { "International 1924" -637 -549 -203 gm118 "Taiwan; = TWD67" 15 15 15 4 20 28 117 124} "Indian (India, Nepal)" { "Everest (India 1956)" 295 736 257 gm119 "India, Nepal" 12 10 15 7 2 44 62 105} "Indian (Pakistan)" { "Everest (Pakistan)" 283 682 231 gm120 "Pakistan" -1 -1 -1 0 17 44 55 81} "Indian 1954" { "Everest (India 1830)" 217 823 299 gm121 "Thailand" 15 6 12 11 0 27 91 111} "Indian 1975" { "Everest (India 1830)" 210 814 289 gm122 "Thailand; also as: 209 818 290, 12 10 12" 3 2 3 62 0 27 91 111} "Indonesian 1974" { "Indonesian 1974" -24 -15 5 gm123 "Indonesia" 25 25 25 1 -16 11 89 146} "ISTS 061 Astro 1968" { "International 1924" -794 119 -298 gm124 "South Georgia Islands" 25 25 25 1 -56 -52 -38 -34} "Johnston Island 1961" { "International 1924" 189 -79 -202 gm125 "Johnston Island"} "Kusaie Astro 1951" { "International 1924" 647 1777 -1124 gm126 "Caroline Islands" 25 25 25 1 -1 12 134 167} "Leigon" { "Clarke 1880" -130 29 364 gm127 "Ghana" 2 3 2 8 -1 17 -9 7} "M'Poraloko" { "Clarke 1880" -74 -130 42 gm128 "Gabon" 25 25 25 1 -10 8 3 20} "Montserrat Island Astro 1958" { "Clarke 1880" 174 359 365 gm129 "Montserrat (Leeward Islands)" 25 25 25 1 15 18 -64 -61} "North Sahara 1959" { "Clarke 1880" -186 -93 310 gm130 "Algeria" 25 25 25 3 13 43 -15 11} "NTF (Nouvelle Triangulation de France)" { "Clarke 1880" -168 -60 320 gm131 "France (incl. Corsica)"} "Point 58" { "Clarke 1880" -106 -129 165 gm133 "Mean for Burkina Faso and Niger" 25 25 25 1 0 10 -15 25} "Pointe Noire 1948" { "Clarke 1880" -148 51 -291 gm134 "Congo" 25 25 25 1 -11 10 5 25} "Porto Santo 1936" { "International 1924" -499 -249 314 gm135 "Porto Santo, Madeira Islands; = Southeast Base" 25 25 25 2 31 35 -18 -15} "Pulkovo 1942" { "Krassovsky 1940" 28 -130 -95 gm136 "Russia" -1 -1 -1 0 36 89 -180 180} "Rijks Driehoeksmeting" { "Bessel 1841" 593.032 26 478.741 gm137 "Netherlands; also known as Amersfoort"} "S-42 (Pulkovo 1942); Albania" { "Krassovsky 1940" 24 -130 -92 gm138a "" 3 3 3 7 34 48 14 26} "S-42 (Pulkovo 1942); Czechoslavakia" { "Krassovsky 1940" 26 -121 -78 gm138b "" 3 3 2 6 42 57 6 28} "S-42 (Pulkovo 1942); Hungary" { "Krassovsky 1940" 28 -121 -77 gm138c "" 2 2 2 5 40 54 11 29} "S-42 (Pulkovo 1942); Kazakhstan" { "Krassovsky 1940" 15 -130 -84 gm138d "" 25 25 25 2 35 62 41 93} "S-42 (Pulkovo 1942); Latvia" { "Krassovsky 1940" 24 -124 -82 gm138e "" 2 2 2 5 50 64 15 34} "S-42 (Pulkovo 1942); Romania" { "Krassovsky 1940" 28 -121 -77 gm138f "" 3 5 3 4 38 54 15 35} "S-42 (Pulkovo 1942); Poland" { "Krassovsky 1940" 23 -124 -82 gm138g "" 4 2 4 11 43 60 8 30} "S-JTSK" { "Bessel 1841" 589 76 480 gm139 "Czechoslavakia (Prior 1 JAN 1993)" 4 2 3 6 43 56 6 28} "Selvagem Grande 1938" { "International 1924" -289 -124 60 gm140 "Salvage Islands" 25 25 25 1 28 32 -18 -14} "Tananarive Observatory 1925" { "International 1924" -189 -242 -91 gm141 "Madagascar" -1 -1 -1 0 -34 -8 40 53} "Voirol 1960" { "Clarke 1880" -123 -206 219 gm142 "Algeria" 25 25 25 2 13 43 -15 11} "Voirol 1874" { "Clarke 1880" -73 -247 227 gm142a "Algeria" -1 -1 -1 0 13 43 -15 11} "Wake Island Astro 1952" { "International 1924" 276 -57 149 gm143 "Wake Atoll" 25 25 25 2 17 21 -176 -171} "Yacare" { "International 1924" -155 171 37 gm144 "Uruguay" -1 -1 -1 0 -40 -25 -65 -47} "Austrian (MGI)" { "Bessel 1841" -575 -93 -466 gm145 "Austria"} "K12 Astro 1955" { "Clarke 1880" 9 183 236 gm146 "Nevis, St. Kitts (Leeward Islands)"} "Indian 1960; Vietnam (Con Son)" { "Everest (India 1830)" 182 915 344 gm147 "" 25 25 25 1 6 11 104 109} "Indian 1960; Vietnam (N16)" { "Everest (India 1830)" 198 881 317 gm148 "" 25 25 25 2 11 23 101 115} "Estonia Coord System 1937" { "Bessel 1841" 374 150 588 gm149 "Estonia" 2 3 3 19 52 65 16 34} "Graciosa Base SW 1948" { "International 1924" -104 167 -38 gm150 "Azores (Faial, Graciosa, Pico, Sao Jorge, Terceira); = Southwest Base" 3 3 3 5 37 41 -30 -26} "Hermannskogel" { "Bessel 1841 (Namibia)" 653 -212 449 gm151 "Croatia-Serbia, Bosnia-Herzegovina" -1 -1 -1 0} "Hermannskogel; old Yugoslavia" { "Bessel 1841" 682 -203 480 gm151b "" -1 -1 -1 0 35 52 7 29} "Korean Geodetic System" { "GRS 80" 0 0 0 gm152 "South Korea" 2 2 2 12} "Sierra Leone" { "Clarke 1880" -88 4 101 gm153 "" 15 15 15 8 1 16 -19 -4} "Israeli" { "Israeli" -235 -85 264 gm154 "" -1 -1 -1 0} "South American 69; Brazil/IBGE" { "South American 1969" -66.87 4.37 -39 gm155 "" -1 -1 -1 0} "Datum 73" { "International 1924" 223.237 110.193 -36.649 gm156 "Portugal" -1 -1 -1 0} "Dionisos" { "GRS 80" -200 75 246 gm157 "" -1 -1 -1 0} "NTF (NTF ellipsoid)" { "NTF" 168 60 -320 gm158 "Nouvelle Triangulation de France" -1 -1 -1 0} "Rome 1940; Luxembourg" { "International 1924" 263 -76 -45 gm159 "" -1 -1 -1 0} "European 1950; Belgium" { "International 1924" -126 80 -101 gm160 "" -1 -1 -1 0} "Austrian" { "Bessel 1841" 594 84 471 gm161 ""} "Egypt" { "International 1924" -133 -321 50 gm162 ""} "NGO 1948" { "Bessel 1841 (Norway)" 315 -217 528 gm163 ""} "Norsk" { "Bessel 1841 (Norway)" 278 93 474 gm164 ""} "Deutsches Hauptdreiecksnetz" { "Bessel 1841" 598.1 73.7 418.2 gm164 ""} "Hungarian Datum 1972" { "GRS 67" 56.91 -70.18 -9.49 gm165 "ftp/gps/honlap-jan2002.pdf"} } ###### known ellipsoids # when changing this list make sure you update the definitions below ## description of predefined ellipsoid menu set PREDEFELLIPSOIDDESCR \ [list \ @ [list Airy \ {Airy 1830} {Modified Airy}] \ {Andrae 1876} {Appl. Physics. 1965} {Australian National} \ @ [list Bessel \ {Bessel (Portugal)} {Bessel 1841} {Bessel 1841 (Namibia)} \ {Bessel 1841 (Norway)}] \ @ [list Clarke \ {Clarke 1858} {Clarke 1866} {Clarke 1880}] \ {Comm. des Poids et Mesures 1799} {Delambre 1810} {Engelis 1985} \ @ [list Everest \ {Everest (1948)} {Everest (India 1830)} \ {Everest (India 1956)} {Everest (Malaysia 1969)} \ {Everest (Pakistan)} {Everest (Sabah Sarawak)}] \ @ [list Fischer \ {Fischer 1960 (Mercury)} {Fischer 1968} \ {Modified Fischer 1960}] \ @ [list GRS \ {GRS 67} {GRS 75} {GRS 80}] \ {Helmert 1906} \ @ [list Hough \ {Hough 1956} {Hough 1960}] \ {IAU 1976} {Indonesian 1974} {International 1924} Israeli \ {Kaula 1961} \ {Krassovsky 1940} {Lerch 1979} {MERIT 1983} {Maupertius 1738} NTF \ NWL9D {Plessis 1817} SGS85 {South American 1969} {Southeast Asia} \ @ [list WGS \ {WGS 60} {WGS 66} {WGS 72} {WGS 84}] \ Walbeck] ## ellipsoid definitions # indexed by name # each list has: # - a (semi-major axis in metre, float), invf (inverse of flattening) # - comment ## those after "WGS 66" until "Walbeck" were taken from PROJ4.0 array set ELLPSDDEF { "Airy 1830" {6377563.396 299.3249646 "used in Great Britain"} "Andrae 1876" {6377104.43 300.0 "used in Denmark, Iceland"} "Appl. Physics. 1965" {6378137.0 298.25 ""} "Australian National" {6378160.0 298.25 ""} "Bessel 1841" {6377397.155 299.1528128 "used in Germany, Japan"} "Bessel (Portugal)" {6377397.155 297.152818860 ""} "Bessel 1841 (Namibia)" {6377483.865 299.1528128 ""} "Bessel 1841 (Norway)" {6377492.012 299.1528128 ""} "Clarke 1858" {6378363.63547 294.97870 "a=20926348 USft or ft?"} "Clarke 1866" {6378206.4 294.9786982 "used in North America"} "Clarke 1880" {6378249.145 293.465 "used in France, Africa; also know as: Clarke 1880 (Modified)"} "Comm. des Poids et Mesures 1799" {6375738.7 334.29 ""} "Delambre 1810" {6376428.0 311.5 "used in Belgium"} "Engelis 1985" {6378136.05 298.2566 ""} "Everest (1948)" {6377304.063 300.8017 "also known as: Everest (Malaysia+Singapore)"} "Everest (India 1830)" {6377276.345 300.8017 "used in India"} "Everest (India 1956)" {6377301.243 300.8017 ""} "Everest (Malaysia 1969)" {6377295.664 300.8017 ""} "Everest (Pakistan)" {6377309.613 300.8017 ""} "Everest (Sabah Sarawak)" {6377298.556 300.8017 "also known as: Everest (E. Malaysia, Brunei"} "Fischer 1960 (Mercury)" {6378166.0 298.3 ""} "Fischer 1968" {6378150.0 298.3 ""} "GRS 67" {6378160.0 298.247167427 "used in Australia and Hungary"} "GRS 75" {6378140.0 298.257 ""} "GRS 80" {6378137.0 298.257222101 "used in Australia"} "Helmert 1906" {6378200.0 298.3 ""} "Hough 1956" {6378270.0 297.0 ""} "Hough 1960" {6378270.0 297.0 ""} "IAU 1976" {6378140.0 298.257 ""} "Indonesian 1974" {6378160.0 298.247 ""} "International 1924" {6378388.0 297.0 "used in Europe, New Zealand"} "Israeli" {6377973.0 293.466001939} "Kaula 1961" {6378163.0 298.24 ""} "Krassovsky 1940" {6378245.0 298.3 "used in Russia; also known as: Krassovsky 1942)"} "Lerch 1979" {6378139.0 298.257 ""} "MERIT 1983" {6378137.0 298.257 ""} "Maupertius 1738" {6397300.0 191.0 ""} "Modified Airy" {6377340.189 299.3249646 ""} "Modified Fischer 1960" {6378155.0 298.3 ""} "NWL9D" {6378145.0 298.25 "Naval Weapons Lab., 1965"} "NTF" {6378025.0 303.20855706 "Nouvelle Triangulation de France"} "Plessis 1817" {6376523.0 308.640997 "used in France"} "SGS85" {6378136.0 298.257 "Soviet Geodetic System 85"} "South American 1969" {6378160.0 298.25 ""} "Southeast Asia" {6378155.0 298.3 ""} "WGS 60" {6378165.0 298.3 ""} "WGS 66" {6378145.0 298.25 "used in USA/DoD"} "WGS 72" {6378135.0 298.26 "used in USA/DoD"} "WGS 84" {6378137.0 298.257223563 ""} "Walbeck" {6376896.0 302.780 ""} } gpsman-6.4.4.2/gmsrc/gmicons/0000755000175000017500000000000012224351120014026 5ustar migmiggpsman-6.4.4.2/gmsrc/gmicons/triangle_blue15x15.gif0000644000175000017500000000011012224351120020025 0ustar migmigGIF89a! ,L/͚k|[(V 2eT;gpsman-6.4.4.2/gmsrc/gmicons/church15x15.gif0000644000175000017500000000013012224351120016467 0ustar migmigGIF89a! ,)y܃"A"qYEbSdRhKʧR;gpsman-6.4.4.2/gmsrc/gmicons/dot15x15.gif0000644000175000017500000000010712224351120016005 0ustar migmigGIF89a! , L q;5`t^A;gpsman-6.4.4.2/gmsrc/gmicons/pin_blue15x15.gif0000644000175000017500000000012212224351120017011 0ustar migmigGIF89a! ,# pěnjvz^+p̭;gpsman-6.4.4.2/gmsrc/gmicons/letter_a_green15x15.gif0000644000175000017500000000011412224351120020174 0ustar migmigGIF89a! ,#y F:Wm-ej*bFэR;gpsman-6.4.4.2/gmsrc/gmicons/letter_d_blue15x15.gif0000644000175000017500000000011412224351120020026 0ustar migmigGIF89a! ,#m{k[K9$}TxuhIE%kQV;gpsman-6.4.4.2/gmsrc/gmicons/box_blue15x15.gif0000644000175000017500000000013312224351120017015 0ustar migmigGIF89a! ,, ǒ:/ڰR^UQjnl/:=RP {;gpsman-6.4.4.2/gmsrc/gmicons/dollar15x15.gif0000644000175000017500000000011412224351120016472 0ustar migmigGIF89aԔ! ,#ykr }%r瑌gF+h|;gpsman-6.4.4.2/gmsrc/gmicons/bell15x15.gif0000644000175000017500000000012612224351120016136 0ustar migmigGIF89a! ,'?b=H-pYU#}#譤.M37@7-Q;gpsman-6.4.4.2/gmsrc/gmicons/buoy_green_red15x15.gif0000644000175000017500000000012412224351120020206 0ustar migmigGIF89a! ,%y܃:#lK-HaC Ǥ@t;gpsman-6.4.4.2/gmsrc/gmicons/number_4_green15x15.gif0000644000175000017500000000011312224351120020107 0ustar migmigGIF89a! ,"c11X!vtN}Vaa;gpsman-6.4.4.2/gmsrc/gmicons/oval_green15x15.gif0000644000175000017500000000010612224351120017337 0ustar migmigGIF89a! , Ǩ›)ޜny8^U;gpsman-6.4.4.2/gmsrc/gmicons/circle_x15x15.gif0000644000175000017500000000013412224351120017007 0ustar migmigGIF89a! ,-pcHNɩq#lm-$w( Rfz5d;gpsman-6.4.4.2/gmsrc/gmicons/open_24hr15x15.gif0000644000175000017500000000014012224351120017014 0ustar migmigGIF89a! ,1!rj Fu\xЊkj`Sw'a@(;gpsman-6.4.4.2/gmsrc/gmicons/avn_lom15x15.gif0000644000175000017500000000013312224351120016651 0ustar migmigGIF89a! ,, F&d!fdペ%ܱC&S6 ;gpsman-6.4.4.2/gmsrc/gmicons/pin_green15x15.gif0000644000175000017500000000012212224351120017162 0ustar migmigGIF89a! ,# pěnjvz^+p̭;gpsman-6.4.4.2/gmsrc/gmicons/cntct_pig15x15.gif0000644000175000017500000000013512224351120017172 0ustar migmigGIF89a! ,.pbl-ܵpq f+֚R,.@boE;gpsman-6.4.4.2/gmsrc/gmicons/number_7_red15x15.gif0000644000175000017500000000011112224351120017562 0ustar migmigGIF89a! , ơ[)fzKq6H赞jT;gpsman-6.4.4.2/gmsrc/gmicons/number_6_red15x15.gif0000644000175000017500000000011312224351120017563 0ustar migmigGIF89a! ,"Sz tM#2u:rzF;gpsman-6.4.4.2/gmsrc/gmicons/circle_blue15x15.gif0000644000175000017500000000010112224351120017461 0ustar migmigGIF89a! ,pfR޼{l8bM4;gpsman-6.4.4.2/gmsrc/gmicons/amusement_park15x15.gif0000644000175000017500000000015712224351120020237 0ustar migmigGIF89aR-! ,@ w &!a`"n;)HVd}"u˛EB< P2]Gd2Z6*: ;gpsman-6.4.4.2/gmsrc/gmicons/number_1_blue15x15.gif0000644000175000017500000000010712224351120017736 0ustar migmigGIF89a! ,Ȧ܃qfAdoIZ\z;gpsman-6.4.4.2/gmsrc/gmicons/buoy_red_green15x15.gif0000644000175000017500000000012412224351120020206 0ustar migmigGIF89a! ,%y܃:#lK-HaC Ǥ@t;gpsman-6.4.4.2/gmsrc/gmicons/swimming15x15.gif0000644000175000017500000000015112224351120017050 0ustar migmigGIF89a޸! ,.08&A\"zdEBDsڮ " ֠:pH, ;gpsman-6.4.4.2/gmsrc/gmicons/lodging15x15.gif0000644000175000017500000000012112224351120016636 0ustar migmigGIF89a! ," ^4*[k`|)hʶZ5H;gpsman-6.4.4.2/gmsrc/gmicons/mug15x15.gif0000644000175000017500000000014112224351120016005 0ustar migmigGIF89aڥ ! ,29y_ՉDhkW[%Y ncV aQ;gpsman-6.4.4.2/gmsrc/gmicons/school15x15.gif0000644000175000017500000000014112224351120016504 0ustar migmigGIF89a! ,2?̜DžGmsE( fhPoD* ,;gpsman-6.4.4.2/gmsrc/gmicons/letter_b_green15x15.gif0000644000175000017500000000011312224351120020174 0ustar migmigGIF89a! ,"m{k[Ks{dxTg!GY;gpsman-6.4.4.2/gmsrc/gmicons/gpsman-logo-small.gif0000644000175000017500000000357612224351120020061 0ustar migmigGIF89a58"$ |vf dӴqܾ\l\HΜ$l>ľLdtkTʄ̌}aĀ L0Ԧ,qQdRij)Lt쌆|DjdbT<2 wܾLAĒ 8v YJ9~l~$ԍnԞ$|T̮lbybܔttPƷtn\Ċ ԪLҴxT8愔jTtfDLdz˰yd>̤Lڌ~p$\O8ƺҼ\D:Ē$7qX|?֨ N4OCHLTeDC6D*p4p=\ 7;cJ5بF?-$Cx˔QN''d'X; 0=\?CلF:2=C3]FdC-CD4m dsK3=|qA3D?=4cCBhph(C3_3O<4<.pSDl=D3:`F=lSQ_74 Al.pBӆ\07Ix΁Ĥ Ndi X2\M+hŤ#4 N3*ZXk;gpsman-6.4.4.2/gmsrc/gmicons/number_4_blue15x15.gif0000644000175000017500000000011312224351120017736 0ustar migmigGIF89a! ,"c11X!vtN}Vaa;gpsman-6.4.4.2/gmsrc/gmicons/rect_green15x15.gif0000644000175000017500000000007412224351120017337 0ustar migmigGIF89a! ,kڋ޼cG;gpsman-6.4.4.2/gmsrc/gmicons/crossing15x15.gif0000644000175000017500000000014112224351120017044 0ustar migmigGIF89a! ,2?̜DžGw.]ؔvbehk;=J7dĎL* ;gpsman-6.4.4.2/gmsrc/gmicons/dam15x15.gif0000644000175000017500000000015212224351120015760 0ustar migmigGIF89a! ,/x Haa  ˰⾦29Or $;gpsman-6.4.4.2/gmsrc/gmicons/geocache15x15.gif0000644000175000017500000000013112224351120016752 0ustar migmigGIF89ai! ,* (@i7Ljnט^T(;gpsman-6.4.4.2/gmsrc/gmicons/rect_blue15x15.gif0000644000175000017500000000007412224351120017166 0ustar migmigGIF89a! ,kڋ޼cG;gpsman-6.4.4.2/gmsrc/gmicons/oval_red15x15.gif0000644000175000017500000000010612224351120017011 0ustar migmigGIF89a! , Ǩ›)ޜny8^U;gpsman-6.4.4.2/gmsrc/gmicons/avn_vor15x15.gif0000644000175000017500000000013412224351120016671 0ustar migmigGIF89a! ,-pQ*G'=ei[hcn  a;gpsman-6.4.4.2/gmsrc/gmicons/medium_city15x15.gif0000644000175000017500000000012512224351120017527 0ustar migmigGIF89a! ,& *@4U_U_( i4-^"S0Ў;gpsman-6.4.4.2/gmsrc/gmicons/radio_beacon15x15.gif0000644000175000017500000000014112224351120017622 0ustar migmigGIF89a! ,2{#..e͔"~I6f)ٺӒk ƓA+L#l;gpsman-6.4.4.2/gmsrc/gmicons/diver_down_115x15.gif0000644000175000017500000000012712224351120017601 0ustar migmigGIF89a! ,([ ONu) zk%,ék4v;gpsman-6.4.4.2/gmsrc/gmicons/fitness15x15.gif0000644000175000017500000000012312224351120016670 0ustar migmigGIF89aĐlذ! ,$yT`SmVihibTLj%vsMU5BI|J@@L;gpsman-6.4.4.2/gmsrc/gmicons/number_8_red15x15.gif0000644000175000017500000000011512224351120017567 0ustar migmigGIF89a! ,$yڃ˜h}хבTz4;gpsman-6.4.4.2/gmsrc/gmicons/is_highway15x15.gif0000644000175000017500000000012512224351120017352 0ustar migmigGIF89a! ,&y aTd(@dyq6G϶;gpsman-6.4.4.2/gmsrc/gmicons/house_215x15.gif0000644000175000017500000000016112224351120016563 0ustar migmigGIF89aP咥**ؿ! ,6HL 4_A 7$WBz0 j/2>TTZF@;gpsman-6.4.4.2/gmsrc/gmicons/military15x15.gif0000644000175000017500000000011012224351120017043 0ustar migmigGIF89a! , ǧ1voOh}w(Vm"U;gpsman-6.4.4.2/gmsrc/gmicons/chapel15x15.gif0000644000175000017500000000012412224351120016452 0ustar migmigGIF89a! ,% Te}h >zKHJN;gpsman-6.4.4.2/gmsrc/gmicons/wreck15x15.gif0000644000175000017500000000013012224351120016326 0ustar migmigGIF89a! ,) ;Q. BXfe^h%X6%,p^;gpsman-6.4.4.2/gmsrc/gmicons/zoo15x15.gif0000644000175000017500000000013512224351120016027 0ustar migmigGIF89aܿ! ,. k150Zt#+Lߦ]%&B8D;gpsman-6.4.4.2/gmsrc/gmicons/fuel15x15.gif0000644000175000017500000000013012224351120016146 0ustar migmigGIF89a! ,)pKsjtMT'ڭ2α ONYQ;gpsman-6.4.4.2/gmsrc/gmicons/heliport15x15.gif0000644000175000017500000000011712224351120017046 0ustar migmigGIF89a! ,& DZhPyv(Xd:b RԵ;gpsman-6.4.4.2/gmsrc/gmicons/WP_buoy_white15x15.gif0000644000175000017500000000012712224351120020005 0ustar migmigGIF89a! ,(yX{4JG͚an!\X8- x;gpsman-6.4.4.2/gmsrc/gmicons/duck15x15.gif0000644000175000017500000000015712224351120016152 0ustar migmigGIF89a.WUk/ ! ,4x p΍aU0f`v#mlA8T7ڭ&TȤr<&;gpsman-6.4.4.2/gmsrc/gmicons/car15x15.gif0000644000175000017500000000014512224351120015766 0ustar migmigGIF89a! ,*HH `ܧmd˩Rz*ڬ7P`#;gpsman-6.4.4.2/gmsrc/gmicons/bridge15x15.gif0000644000175000017500000000010312224351120016447 0ustar migmigGIF89a! ,}cLgmȼRJhjZ;gpsman-6.4.4.2/gmsrc/gmicons/truck_stop15x15.gif0000644000175000017500000000011712224351120017415 0ustar migmigGIF89a! , mZ[ =7f*'emNT;gpsman-6.4.4.2/gmsrc/gmicons/beach15x15.gif0000644000175000017500000000016112224351120016261 0ustar migmigGIF89aڥ ! ,6x ,@!`\lUǀL8&%ʝ K7aRIh: ;gpsman-6.4.4.2/gmsrc/gmicons/civil15x15.gif0000644000175000017500000000011112224351120016320 0ustar migmigGIF89a! , yΚ2w[޼k}mJ`>SZ;gpsman-6.4.4.2/gmsrc/gmicons/number_8_blue15x15.gif0000644000175000017500000000011512224351120017744 0ustar migmigGIF89a! ,$yڃ˜h}хבTz4;gpsman-6.4.4.2/gmsrc/gmicons/redframe17x17.gif0000644000175000017500000000011112224351120017003 0ustar migmigGIF89a! , /gC큛IYYlr\;gpsman-6.4.4.2/gmsrc/gmicons/large_city15x15.gif0000644000175000017500000000012512224351120017341 0ustar migmigGIF89a! ,&pcHKn}#a9%-Ե ՗5;gpsman-6.4.4.2/gmsrc/gmicons/landing15x15.gif0000644000175000017500000000012012224351120016626 0ustar migmigGIF89a! ,!{} ]T",nR(0E;gpsman-6.4.4.2/gmsrc/gmicons/ball15x15.gif0000644000175000017500000000012512224351120016131 0ustar migmigGIF89a! ,&pcHNZе |R(b^iJb#,Q;gpsman-6.4.4.2/gmsrc/gmicons/number_1_red15x15.gif0000644000175000017500000000010712224351120017561 0ustar migmigGIF89a! ,Ȧ܃qfAdoIZ\z;gpsman-6.4.4.2/gmsrc/gmicons/toll15x15.gif0000644000175000017500000000013212224351120016167 0ustar migmigGIF89a! ,+pf{RB@B %)'kT#L ;gpsman-6.4.4.2/gmsrc/gmicons/fhs_facility15x15.gif0000644000175000017500000000016112224351120017663 0ustar migmigGIF89aNw ĶI ! ,6HL 4_A 7$WBz0 j/2>TTZF@;gpsman-6.4.4.2/gmsrc/gmicons/mark_x15x15.gif0000644000175000017500000000011312224351120016475 0ustar migmigGIF89a! ,"Ƨu+nh Yyn8L;gpsman-6.4.4.2/gmsrc/gmicons/exit15x15.gif0000644000175000017500000000012412224351120016167 0ustar migmigGIF89a! ,%i<,%i`UQ3aJȶjj@;gpsman-6.4.4.2/gmsrc/gmicons/number_8_green15x15.gif0000644000175000017500000000011512224351120020115 0ustar migmigGIF89a! ,$yڃ˜h}хבTz4;gpsman-6.4.4.2/gmsrc/gmicons/square_blue15x15.gif0000644000175000017500000000006612224351120017532 0ustar migmigGIF89a! , ڋg;gpsman-6.4.4.2/gmsrc/gmicons/circle_green15x15.gif0000644000175000017500000000010112224351120017632 0ustar migmigGIF89a! ,pfR޼{l8bM4;gpsman-6.4.4.2/gmsrc/gmicons/car_repair15x15.gif0000644000175000017500000000016012224351120017325 0ustar migmigGIF89a ! ,5xHyJv2hz:< zN۠#4 ;gpsman-6.4.4.2/gmsrc/gmicons/box_green15x15.gif0000644000175000017500000000013312224351120017166 0ustar migmigGIF89a! ,, ǒ:/ڰR^UQjnl/:=RP {;gpsman-6.4.4.2/gmsrc/gmicons/small_city15x15.gif0000644000175000017500000000012712224351120017361 0ustar migmigGIF89a! ,( 4kuh!'Z f`A8H;gpsman-6.4.4.2/gmsrc/gmicons/horn15x15.gif0000644000175000017500000000013012224351120016161 0ustar migmigGIF89aH@! ,)ɷ H\̅W\‰ rJrU_;gpsman-6.4.4.2/gmsrc/gmicons/number_4_red15x15.gif0000644000175000017500000000011312224351120017561 0ustar migmigGIF89a! ,"c11X!vtN}Vaa;gpsman-6.4.4.2/gmsrc/gmicons/castle15x15.gif0000644000175000017500000000013012224351120016466 0ustar migmigGIF89aggg\ |! ,)?kXJI:}Qe)BbV/ݟ_;gpsman-6.4.4.2/gmsrc/gmicons/many_tracks15x15.gif0000644000175000017500000000014612224351120017535 0ustar migmigGIF89a**!#By Brian Baulch for use with GPSMan,c^)X tcU89Z!gM;gpsman-6.4.4.2/gmsrc/gmicons/trail_head15x15.gif0000644000175000017500000000011312224351120017310 0ustar migmigGIF89a޸! ,q˖ڋ2`̓q}!扦xm;gpsman-6.4.4.2/gmsrc/gmicons/scenic15x15.gif0000644000175000017500000000012012224351120016456 0ustar migmigGIF89a! ,'aZEI @GJa[vk8U;gpsman-6.4.4.2/gmsrc/gmicons/capitol_city15x15.gif0000644000175000017500000000011012224351120017674 0ustar migmigGIF89a! ,̜GfsNZ.-uy>a.K;gpsman-6.4.4.2/gmsrc/gmicons/cntct_smiley15x15.gif0000644000175000017500000000012512224351120017714 0ustar migmigGIF89a! ,&pfR2/uY*- >TQ;gpsman-6.4.4.2/gmsrc/gmicons/number_7_green15x15.gif0000644000175000017500000000011112224351120020110 0ustar migmigGIF89a! , ơ[)fzKq6H赞jT;gpsman-6.4.4.2/gmsrc/gmicons/avn_danger15x15.gif0000644000175000017500000000013212224351120017321 0ustar migmigGIF89a! ,+ - Ar\y%cUYun} ;gpsman-6.4.4.2/gmsrc/gmicons/biker15x15.gif0000644000175000017500000000017512224351120016320 0ustar migmigGIF89a! ,Bx pb2 4Ba0ABNl:8A2D'A|wأ=$;gpsman-6.4.4.2/gmsrc/gmicons/number_5_red15x15.gif0000644000175000017500000000011112224351120017560 0ustar migmigGIF89a! , ơ[Q oz.Q:HbzjS;gpsman-6.4.4.2/gmsrc/gmicons/weight_station15x15.gif0000644000175000017500000000013712224351120020252 0ustar migmigGIF89a! ,0p "l腋ӱ_V}JrcWZhrx6ړ΢lŸR;gpsman-6.4.4.2/gmsrc/gmicons/letter_b_red15x15.gif0000644000175000017500000000011312224351120017646 0ustar migmigGIF89a! ,"m{k[Ks{dxTg!GY;gpsman-6.4.4.2/gmsrc/gmicons/avn_map15x15.gif0000644000175000017500000000013712224351120016643 0ustar migmigGIF89a! ,0p xS]uR &xil !$ݷ 2P;gpsman-6.4.4.2/gmsrc/gmicons/flag_pin_red15x15.gif0000644000175000017500000000012412224351120017627 0ustar migmigGIF89a! ,% y{xh#eX@,ӵB;gpsman-6.4.4.2/gmsrc/gmicons/phone15x15.gif0000644000175000017500000000012212224351120016325 0ustar migmigGIF89a! ,#)bs+Z@k;7e(R"YB*u՞mX;gpsman-6.4.4.2/gmsrc/gmicons/avn_tacan15x15.gif0000644000175000017500000000013312224351120017150 0ustar migmigGIF89a! ,, xKo|[Tz%ۤlQ}#;gpsman-6.4.4.2/gmsrc/gmicons/cntct_goatee15x15.gif0000644000175000017500000000014412224351120017657 0ustar migmigGIF89a*! ,5 Ǩ܃L{|&jH3m4 F,LD*F;gpsman-6.4.4.2/gmsrc/gmicons/buoy_white_green15x15.gif0000644000175000017500000000015012224351120020553 0ustar migmigGIF89a! ,-H `Zāv%1ྰĴ4;pH%;gpsman-6.4.4.2/gmsrc/gmicons/gpsman-logo.gif0000644000175000017500000005466012224351120016753 0ustar migmigGIF89aw ' ,& :&B%<)#3-'M,D2E2J0)J4C60\4<92H61Y8S;FD=\COE6mAYC>WF2SF?eG zDtFPLBkLfL9oI@gQM8KjT.ZVKeT@xP5bTOcUFTvXQ RW|Z [_Z+HW[x`ZrbYyc>ucNkfZb_Ec[fHkhTeTl1m#jqKxsgsqgohr[nyqdmsv }2xeyq}&{6\}vx~hw~]qi&}N|CρOgS΀{˃iDē~wjlxғϚ#ޕ9ɞ$؛)̕Ӕȡ3z͙{ڗ}К}ǜޤܟDĥWʥGˣ`ܟZ٩ˣnܡq֦[«p⣙بݨ֩ǯʭӭϭIJŲ?Z綬}뻒—ԿŽ껜µڿ߿ţǫ]俶yLJ|·ȗǸʚέ̣ҰԛԨֺлֳͭнשܴJ0r! ,w H*\ȰÇ#JHŋ3jȱǏ CIɓ(S\ɲ˗0cʜI͛8sɳϟ@ R_=}D*]!ZάbL(U:UhTBkJ٘:5N$/EȘBg< "J<9cҳ+kT!m~P 'mBmSrJװcL[+LH4:KϴE6Jt%̐n¦Faس'Շ 5)`L6"Pݍ{)4 +䅌37@]H arv 6X:)ЈWp@(d_652}bT!qEB*X=8kcJ@Rm@%f5DG)d҈OD[~c0 hD1! TM!*h?iFJ(XQJ#I:^JU؀ QFiDPRE8Zyp`tVtvF̙ b*^CrD+[BO(fH26(< G=d^#"nX#n{[-hُ[SXC!%@S%KAk|Y;F{P70T8#{ %4y++v6 " JJ3hM3F6 BtY@[`b P-̄a"$/uA)^pP r=z({19\#X9)Ԗ(F溑m$f]2<:"h@C 0dgWGGH`piMx`ρ$!U\K>\Єӝ]A E;C<>x4 Sw=0@g>`,حY/WCvK7 &Uؐ"HJg$UP&x8f.p?) RN( xX PzY@4ETaJ`pAP0`>g ,r QP ?&&=G=00P  &  Ȏ)0P29MD! `1"DyO6AKcVAU3Uf&ACa ޶d }(!s(H} z#S r9I0 |{`t6sd0PpA Y1`RmX`LirPрB P Qb0`pdhmzIFwK/~=]1 @ П W Cpx`%`pm uEPg!m0!Δ{a0NE mP bTh&rh:~Fg60 @~ ^֟ `. C 9pC w Opn 0dp @evPy5y F O&mr FX`=:= 083*sJG*% Ojw8@ @p Tvp \c k7z-w3I*ʗ,d9DApy @`Ƨ M%cx4C@r ppm  @`v@ 29bTdgM0'{y:؀#//jku8 ^+qu ;E< Rs9yp .yp ĩBP]vBp@Ioi `/ ޹Sz @29 5`T)P O :Tl @QJ!t9J#Dv] :˪ 0D F+zyŐLq|)p:4Dž8g#?7 )ف^R5/jX)vyG{˷뷀+D[+b`q]ڗN`b'62prf#`6p+l %\`-<3 q `' ~{} pw@tp5YXQ؏5p/puWBE)-q)-Г/<yDHv\0;v`w Ѡ ,pɴpXeiL9qv7d/`3yNFp[Q*/췸K{d*堸kNȎJ VwM$iP >š e6p0 @ fsHm;$x@  y 3[bP Nbp;N -@O @!7 I,qX2&S0`Fʲ @-uo ɍvP߀ l@=h@rʣI t-f~7t#"Ugq ) /{<hIrKP kt@H `E !}kpk-#K"(㈡p@.Zg5W~mF1|RҠz?θ:!Yp X C.>n~p."s N OQ F~H  ,ލH2-qUglgx@w4LwfZJGd`S  kJ㡔J|r̦~ˤH]yW=y Mo2@Cd \@05YK RN  ^$ P bx00c>u-y3.bQvS^ck]%5Y(.WB]X/7w*p .>M"Q660 t2 \`0& po3V_*@``֍tr^ /'c9¯Ư Pc̯NRIQV UTUFT j<6f!5nv Q)'GB 3lC%Yq2"}dQ_Guz"EF81O=Q "6!  ,`;웁 "4JzK!G*ʢJCuԒKR#̛XXJv@9( SD6Yee!T*ȾR0>6US2QG'd2݀=U x*`#e8zQ^KB ,Q'Z1(E$CR07Su+\.6~(Gidd)!3 jy O bq(xp 폁d .K q3!\:Pyg'٣1pBNz`Ha&@`ZnG'zh ig aA,F޲50(tDBJh1W|q_`SP!{˥>c 4^ G^T2X4'fe5&؝"z7@5:TTlKҙ05@Ҭg=YINl@NLTbP!hM"h}@KX@0!9 `S*:%>J%f!zHc f w^3,gJ؏b,c  l5B[!B,$6K 8Ub*.dfi ! |IC^c!QI"@P(PzPare.C: Fe #/ BX&H~$;bX$d'z -q$q/K0%RɲJ(G]ӞL C2pF/j1QTh#33A7W4cKʋ,B%ȜQe \@z Aē{ԥHEXA Buj><P .FIuUcR6vLfz^A@cSCt DK(aυtj@>ň-0($@$%|f H?aV%ѐQLpr.@ Q8tvV+RNȴ%%jO նV1\ZnmmQJ2.v!m F;Q}x+ GTÊ!vfI@ctp舼 "Ixe=Y@':9Is'4(mf{־g/~BۭUz1 dr)xAӂF J> :.h( yp. 04I$ +:1-&8\ 1i?Fb-EهQV ~Q&3Y"K^kdJ#Hrbp~%cŁD9N` u~/%<܎`|b3 ^¥:N'&/0j Ā1Bu5Va%H+=Pu]gʴwk~$`;udyG92 bG;h6eM@:;@aZ]K[1M0[ʆR0"? {(yoa 7NSaZ1t|HX0-[$;Gq~`ȑ~hG6;r|<3 ^@ClZ9k^}#0gC ^_-#CPC@?Y72.iz0$*Q Y|4qla#wr U\,Q# HHE-d,IP!%&w*_e\S|4\Cl9.6>[yAO!c˖rg~t&'`,, NBMo^0?߆a~0c>u-}O؂>lV8;`r JZHbhb!= (ЂJYcf<(hC,Jmlu>˓-%r+P7.;0b$PPP X WTW! d{([iu`X9208 : mnh(. pTC#l206|؆.xh G~̀ h @,>ZPmHfhc2y@|} 8,g;CHԯr9݋}` 8pp;|HDI::aL+ȁIXRr`GXYCJ X[T!1xcmG0H}˻~Hpp9(F-6v`2H~#ʬ#x8Ϝ$dPHŴC˼87A0C<ɺD8 L׼#$OOSArq7l YhJfXB ,t(Y@ s{Sl(K0\@ЋG݁uPuM+8PphQQu6"xP.ML-0ۺXm(5P S@X&=9R_HNPP8(!l GЃrH!BpDHNpG݄MJłK54PIUPf|D"5,"e2OVG8̬ x82v؆ŔG! R7`Y}`pg2Q&=- PHVFMxrmV`[0E`R#9-(Rp5>skX]v-8C0-茺8M3R 8Q*~"UЃ8lOF}TZ@Y\PY\xTN`ԗQ8C`ӄX(`rT70A@ZSOQuYQ 5ā9hㅇq>Yd ~}dІnp8sgUP0u=B +8RMpWpcXgІMke*$7mqWq-Wt@iPW@`(7mX=uP)r+ǐ=X  2`Me\(EdȕUYNam]]O:9-[((5L%MiuUCQ@&Ł.hkBZ*MV-[mnX[we[U`]X-,(x8\cgΝ]]:yz}Ⱥ/Eg\sh# -U pݚ(EIX #mVmP[w80*bfEsps0^S,@ [^FEDxYF%_YE߹5MR%k`39+Bq Xa)b/6{HU\$(~E 6 =56-=slȆA .#aѨ8 ЎHطrY'6[j+&*IdTf؅=,0B7c:X]iX[c<LfW#xkȺm!\`S..͇dHhȇx`@x 0OF&R⊦atS(*~ؽ[h]%q$0fdX-4N9-%9L(tHطbnj`ga^#^h芞azh<-/7Ă8A؄W`hdg]htPׂ&SS@|iX-X5\܎dTdh.sP0G&\n0eeƜd5C8.X&ê 0R \m)nXaixfXƯ/rǩ*AtE5@av^]YӦk0VHu1pAx7xYM\=[pĽp[<F݂KF>gNspP6pPPl F^>5^}ga? >^bnІqyal=]&a?*-33ڂ26Q XzGu(8oքHoՆlXdXR4{ݦr`kÅPpDkpX-8D,x7Dxo|ݹM]xp2EyPm OYEibs0vc6``lq88qFa]태C腬~8n_exgXW@K|@ 0]՟]9iJ3˾g05kC%e64S 8G~@oDMjUynFOYarZ^`ٖŅ\Xl 987ާT]UQ`]Oxk8ʖqHi]`NFuuIvb'xq dd)Nl~7U`\ e!OmA(i"q(nrWXnqx\=Ar-a}6^ӹۆmpmh⁏-5dS61->q @p.3BQ@ m,kg݅k@ۡކdX ♯7&yaNP,J(`l2EluӎVe"'hXa1cϞq w.=sg\{*@!&W >ϝɅ˖Y#R 8Ro߾~j!eWmƍeRPm-?c|ӖcfR,q6CkjG.m4ԪMS * RHݾСF "D65$g˄![Vmrҋr:/^I8 FK hF?M)PTm9$Ë)(O>Q:qV8r2 199589>cvT_I)iJִH4M8`>t5|8$cZpnT5D%iV֌ÎE TZ-6`q t >'۰Q3@_cfacϘ i>%(; 6 VE!$$'&Kwq+.ژN4`C .Iqu2q5'00)6.#L1#:C|`E-~ PM QM;N38b-!tٌc 8E B56(ucOs5|"Hf#TTrS/2 8(t@D֨?jE4!H- 48 / Vb. 78H=Q\pAü` >jh .1H [p'/k,͜N%`-CTBr;$epb6#@@ 69 ")l%sC'XI94(B!ȓD. rlbK}Ḉ8)w|n"$^rG 9 JXRjXJB1|H=Ï7LiQ  p+ *A&PC[;>ՏĔ 8AvBe 7P@P/ Შ~BzdGVDװ ^j9`*$6`x@n\au|Jv >x dod*tbrb63D*c,# nd"-ӢB]W`vhƐ:” A[[B` 8"qrAuőJsH Y`C с>=BsV@d͝+r@\8 7 >P0q |? b51A 84zGZUZ]ʀSL"~Qv@L&A̼VuF2,1P+G+ xWF{@]<=F7@H& ˞G)ЁL4gLv4-x!̠j l]EvF۬YCF 8溡mAQQZẇ3dA/5"r4C0 i=?BbbPc|EXP#(D/Ѓ'xa x `$DhF3ԑfwC6F_ e'1/1`lMP#AvݱELBl+)} pBPWlhdS'!6sԞB(ps0->a'fi ȸm+V\d,ׄ  s 2&7FWu! +`84L6 F/N34>N!N`MCX~ sHC )[+-%ݵ]48ԡDw) ,aՉV!E>~3 #9̃0TP@ 'AhaBdaCA L4=9>@!BI3OՕًˋP[]5l - !9\M_P`lM7Y3ۏX *ʀ! Huӵ/$C,,{tA00\&<I2]`;>,'H:'| \#&Ѡ'ܠ- ~ 9@#v@ hDEV!F]QE:o`5I(($CTϔI&OH}D&&YF"-]O>&5 AdG8-D NdOԇ9$.#($Q&>Hҽ0xBBvwvwCCu@UOJ{&&-B1TL1D,`@]J,Qu3J'|Va(XV8108<-.\Ê9䏮(9l@l%2hR™Ne:"!mu&a =claiN 08dyE\RUPfC l B(i`6$fAGq,OrB,8,DC1n'|)HUB20C$A(%*lO>Vbf6/- 9Tٴ:gZHX3-,~OHVJ>Ziō8`@ `D3@ HkD6 .3`A Lϋ_fi+fmT-((wR1 L҅v B"G2\ĂD{HȖs.,*ɢ TJ(TsiBMfh?NrA8̂$/1Nmi*4ɒ-8( 8bc7*mך;bI99C Vóf!ٲ/t ħƥM:^ L٘Dj_H26 A&]J.C2T-3)<~}LB^oȆ#oi`A(#JT(A\4$j:)%eL/N3p|"\dU>X5-ȁG V!24G.B5E'LXPR 鐺H6<8c>șH)3`APOFh5zNDj dI&)~|c8*ڼB 9bdM딄\䍝Vÿc;C|g1:/rm4R8T'.hA<2X 3 '{G@ X4LH dwL`혩JL2.CQŁ'^k.'cZCb03hlҍC)'C%*AX00! \4b2]H|2/W.DL~i!47)DaaãIG9ĝ PPm+1VbOOH=E3-+ C(f} `#rD-t43U<*πG/lQ(kՕ,'kAlKKxB5GİNOA %h.%vUHX'6458^z\kŭċmf$e,l!. &E^3_;sCt1']&d+9s 2H>`s?jR|94\eV6<Ds29VȈOrpC(!W'Bli`mYO(qb'jO|D^69#pVDq\e3[9,oXJwnC;6BP 8V"h^G]70ĘXT$ZV=5lL!f8P!j8"VŌn(c+d`'<^j/iKxIC=Î qvUO\K'bA:#`cgOI 4HC9Dv#ZNV_<9<+. 5FLC%lϋU\rB׺΃aC- lijJJSW] t8Z8}+W>C(S{9'a h61.`@!2C@4kVm9s%oa>\8nڞ=8kP#pALh=xզ[0b.n֊#`:ffFj≈ܱ(Zđ 樂$Jh)}v%Hm٩fL1R&Ɇq >D DPhMB 밃;jŤ?P; ˕A$ p:;5lz͚70spt&BGE!ÿqFpÏ6Atԑn@BM-S">ǞP*iH>9E^ E ̱xřiqEPvyP!t+!ZY%xaG6Ls %~>b[*BƬl᥂2!ЈP XO9V\f1IBfa&3p}My{~0#Ý!P#l7@ {$ m.8$`oWvs8ALr0"B jpRMr"1y#"H m!+A!B!`xArCۨ@Co;Ib# ppQ@h-őf<䵮+IG)JNA4UCF$irO'ףw3zR6N1*B x42UA IAU wr1r g̃X@AV1]Her)0W0B7]NQf~( #4@ q*L}Uȅ5NpJ*gm$2 Pr &b+(3I,G n#6c\A '1E( &|t2 *U D`d^E{4|Cʋ.eXíy`n1OY#9'A.|hjpi&Xx VzjPZƽ@1;n@)Wp8Nҗ=Y,1)(W #=nת5EL$% ^kb`SMͪG2,d&A"!V1мBCǵ09FBɈ|$@r6024 Fj7/xOay(lbf}e۰w+ R7 G` Fmng;%B+ D^ U:gE0ptᠣ5##i7t/& ^A1q^j U!v!n+=ʣ'&G`Fq p$maO` Ph,"|b0# FnvL H .>N˽| <hش.sp1lf v`H`$tir4Nb1J}NBD̪5ZǂAv ^!)0` "dKဈ`V[J#b[(͜ 'Ňpta!(G (aaE&0HB[4Vo URLDL%qbV ~,AKN mn1Nݒ hha 2 OrT+D"H&=l`P^>M0G!*IA,(q,B4,pIUNǶ.<)D:` /UѨJlo AvA&!w1's2ra: A vI*u*o*baKoOXO h(Pˇv{ )Ɓ,aDbŢЌA~V \pʠ2`)P#bDd B#n`2d񔏞|9 $f1GP[S@rrJ$SrVZU4dA|,,&#GƁ#z( d|!Arh+ QR< x !xD !)y[(!N*ao%\,2Hʫ4!!Q P҄bs3%C "a4tGd+Da'2-!8 !eB3St܁',:s$!tNQf67%W -ȃDK4#5G/ D"F`2aG]J4b":H 6pDGD{GAPx:n L bDT GOhgp>cdRCknLfݡE؁$.WH!!\bk]dM=fa,J4dED5A Z{GDv< @bgU%A:%qڕ,!!A4#2#8bhk\-V<'Hhus5T$a] N ĈbCIY!H趧:sa^;4a5e#` n@ !^CC!bay)TvU:hW:`u!s!p*JZ;PA@55UTI# BCEg!x8 g#pqWw7qI)ar[qdHdZ3a>ZoLwK]oz-td(bZaU43Tu]wzGAdwAA>ax/>[]m qZJ!Anf][W>e7nA9!r%*?g|#8A̚Z"T >wnui\b]!|  h#L9(T79MR^7 '@c vRʡ-!Foв okxz7!`l*>tKOqn h-!=ve>86l#!g!A٣kXz룅:9  @AaJaTv%9},3Za7}u `2լ8z}} f!avAyeZ HZtYd8cY6>e[!y9wXzYeze\pI Wze;ڈiա![(cNSWYƦ!;E[y8۳#{#y E[>B{y;LwYڷzz뻿n샦cHta۷[eDOw7۽]ȴ3aڻtfo :eo^{[ojzaԻ{cC<3NKIq!>%~)-1>5~9=A>E~IMQ>U~Y]a>e~iEq^jNrwKo2@r^3A@ !3>nҠE` ^^~A>/#2> m+E !͞~2d ^2ȁeE 2癀' A?2>oap(Q_oE@o^CE5i?)p(cJp^}}w7C3,o6>=??3CosE)/?7?_ <0… :|"RX aQ!PD=N)\EHC.̆gڼ3Ν<{Y3aP&]VWɒ&QdK&$S(Ŭ\z 6,ϡt"~h.W 9}䤒L+ּ| ^fV[)C" eRNIeV^eZne^~ fbIfffjfn grI';gpsman-6.4.4.2/gmsrc/gmicons/number_9_blue15x15.gif0000644000175000017500000000011012224351120017740 0ustar migmigGIF89a! ,yڃ˜p`$iv紲'RL;gpsman-6.4.4.2/gmsrc/gmicons/null_215x15.gif0000644000175000017500000000006612224351120016416 0ustar migmigGIF89a! , ڋg;gpsman-6.4.4.2/gmsrc/gmicons/circle_red15x15.gif0000644000175000017500000000010112224351120017304 0ustar migmigGIF89a! ,pfR޼{l8bM4;gpsman-6.4.4.2/gmsrc/gmicons/street_int15x15.gif0000644000175000017500000000011312224351120017374 0ustar migmigGIF89a! ,"Ƨu+nh Yyn8L;gpsman-6.4.4.2/gmsrc/gmicons/number_9_green15x15.gif0000644000175000017500000000011012224351120020111 0ustar migmigGIF89a! ,yڃ˜p`$iv紲'RL;gpsman-6.4.4.2/gmsrc/gmicons/house15x15.gif0000644000175000017500000000014412224351120016343 0ustar migmigGIF89aP咥**ؿ! ,)0I) 8Ln u0a&rktyߞQ;gpsman-6.4.4.2/gmsrc/gmicons/info15x15.gif0000644000175000017500000000010612224351120016151 0ustar migmigGIF89a! ,༜ Zqu!mXZ'uQ;gpsman-6.4.4.2/gmsrc/gmicons/buoy_amber15x15.gif0000644000175000017500000000011712224351120017344 0ustar migmigGIF89a! , y܃:#lK}Bj r[;gpsman-6.4.4.2/gmsrc/gmicons/tide_pred_stn15x15.gif0000644000175000017500000000011212224351120020036 0ustar migmigGIF89a! ,!˽{=/$E*kjL;gpsman-6.4.4.2/gmsrc/gmicons/ladder15x15.gif0000644000175000017500000000011712224351120016453 0ustar migmigGIF89a! ,&Lz 4-{[vONIu%&a*K7Q;gpsman-6.4.4.2/gmsrc/gmicons/stump15x15.gif0000644000175000017500000000011112224351120016362 0ustar migmigGIF89a! , 32p]5~l*a 2S7;gpsman-6.4.4.2/gmsrc/gmicons/ntl_highway15x15.gif0000644000175000017500000000014712224351120017540 0ustar migmigGIF89a! ,8y aT! M߈X_l޼  خCﱉC7p `4"!;gpsman-6.4.4.2/gmsrc/gmicons/pharmacy15x15.gif0000644000175000017500000000013412224351120017023 0ustar migmigGIF89aUp\\! ,- ph`*I1 xÖ ׭lAV1=04;gpsman-6.4.4.2/gmsrc/gmicons/letter_b_blue15x15.gif0000644000175000017500000000011312224351120020023 0ustar migmigGIF89a! ,"m{k[Ks{dxTg!GY;gpsman-6.4.4.2/gmsrc/gmicons/oil_field15x15.gif0000644000175000017500000000016412224351120017150 0ustar migmigGIF89a! ,9HAA^^ ژڂɠU&B^NAh,VBT6@;gpsman-6.4.4.2/gmsrc/gmicons/restricted15x15.gif0000644000175000017500000000013312224351120017366 0ustar migmigGIF89a! ,, m^2:eMMaYi绉ZyUQ ;gpsman-6.4.4.2/gmsrc/gmicons/dock15x15.gif0000644000175000017500000000012112224351120016133 0ustar migmigGIF89a! ,"˝R̛ s͚Qo"h(;gpsman-6.4.4.2/gmsrc/gmicons/number_2_red15x15.gif0000644000175000017500000000011112224351120017555 0ustar migmigGIF89a! , yڃ˜U7reZxM⾒{;gpsman-6.4.4.2/gmsrc/gmicons/boat15x15.gif0000644000175000017500000000014712224351120016150 0ustar migmigGIF89a! ,,x0ʹ@ YV x j*%lypK;gpsman-6.4.4.2/gmsrc/gmicons/buoy_red15x15.gif0000644000175000017500000000011712224351120017030 0ustar migmigGIF89a! , y܃:#lK}Cj) r[;gpsman-6.4.4.2/gmsrc/gmicons/large_ramp_int15x15.gif0000644000175000017500000000013512224351120020203 0ustar migmigGIF89a! ,. @ F՜yfjp۪d)׈NG:G;gpsman-6.4.4.2/gmsrc/gmicons/cntct_female115x15.gif0000644000175000017500000000014212224351120017723 0ustar migmigGIF89a! ,3pyJZxQZ *ChzmK%AI#I !1f 7NH ;gpsman-6.4.4.2/gmsrc/gmicons/freeway15x15.gif0000644000175000017500000000012512224351120016661 0ustar migmigGIF89a! ,&yځP%Mf6~^XUB˙ 4P;gpsman-6.4.4.2/gmsrc/gmicons/ice_skating15x15.gif0000644000175000017500000000014612224351120017502 0ustar migmigGIF89a! ,+xpb2 46d9hҵ./D8y;;P;gpsman-6.4.4.2/gmsrc/gmicons/dropoff15x15.gif0000644000175000017500000000010412224351120016653 0ustar migmigGIF89a! , FZh/yq}!~U*;gpsman-6.4.4.2/gmsrc/gmicons/store15x15.gif0000644000175000017500000000011712224351120016354 0ustar migmigGIF89a! ,&yܘSZhj7m)ʮ s0KXF$S;gpsman-6.4.4.2/gmsrc/gmicons/cntct_pirate15x15.gif0000644000175000017500000000014212224351120017675 0ustar migmigGIF89a! ,3RAE@+^Q9AbU&ɌFBwX7 np;"u;gpsman-6.4.4.2/gmsrc/gmicons/mile_marker15x15.gif0000644000175000017500000000016212224351120017507 0ustar migmigGIF89a! ,7H ܭI5OtU8ni-NB,B) _&G\.B;gpsman-6.4.4.2/gmsrc/gmicons/deer15x15.gif0000644000175000017500000000013312224351120016135 0ustar migmigGIF89ah! ,,"pkҘp;W! ٺ9k}:Z;gpsman-6.4.4.2/gmsrc/gmicons/showers15x15.gif0000644000175000017500000000013712224351120016714 0ustar migmigGIF89a! ,0o Չ=Y>|ǑyBlz60 z7KTNS;gpsman-6.4.4.2/gmsrc/gmicons/number_5_blue15x15.gif0000644000175000017500000000011112224351120017735 0ustar migmigGIF89a! , ơ[Q oz.Q:HbzjS;gpsman-6.4.4.2/gmsrc/gmicons/diamond_blue15x15.gif0000644000175000017500000000011012224351120017633 0ustar migmigGIF89a! ,༜FZhs̺r|_(N^]6P;gpsman-6.4.4.2/gmsrc/gmicons/car_rental15x15.gif0000644000175000017500000000017312224351120017334 0ustar migmigGIF89a! ,@x );!  XZ(VmQ8fYo2M1h*.KGa(u;gpsman-6.4.4.2/gmsrc/gmicons/triangle_green15x15.gif0000644000175000017500000000011012224351120020176 0ustar migmigGIF89a! ,L/͚k|[(V 2eT;gpsman-6.4.4.2/gmsrc/gmicons/letter_d_red15x15.gif0000644000175000017500000000011412224351120017651 0ustar migmigGIF89a! ,#m{k[K9$}TxuhIE%kQV;gpsman-6.4.4.2/gmsrc/gmicons/avn_faf15x15.gif0000644000175000017500000000012012224351120016612 0ustar migmigGIF89a! ,'g ^{HSwLH6 dٹ׽gA+k(;gpsman-6.4.4.2/gmsrc/gmicons/number_9_red15x15.gif0000644000175000017500000000011012224351120017563 0ustar migmigGIF89a! ,yڃ˜p`$iv紲'RL;gpsman-6.4.4.2/gmsrc/gmicons/interr15x15.gif0000644000175000017500000000011012224351120016514 0ustar migmigGIF89a.! , Ǩ܃lJP=/a6Z~zL;gpsman-6.4.4.2/gmsrc/gmicons/avn_vordme15x15.gif0000644000175000017500000000013012224351120017353 0ustar migmigGIF89a! ,)  :oԅvbTiW(:>P;gpsman-6.4.4.2/gmsrc/gmicons/park15x15.gif0000644000175000017500000000017112224351120016155 0ustar migmigGIF89a22""H HSI&'Z'gJ0͵ Am0 ^! u gS*k;gpsman-6.4.4.2/gmsrc/gmicons/number_0_blue15x15.gif0000644000175000017500000000011412224351120017733 0ustar migmigGIF89a! ,#yڃ˜mxudI\JMiQ;gpsman-6.4.4.2/gmsrc/gmicons/number_2_blue15x15.gif0000644000175000017500000000011112224351120017732 0ustar migmigGIF89a! , yڃ˜U7reZxM⾒{;gpsman-6.4.4.2/gmsrc/gmicons/cntct_ranger15x15.gif0000644000175000017500000000013712224351120017673 0ustar migmigGIF89a@@! ,0y[q[i!l &]`x/,86٭dC'R;gpsman-6.4.4.2/gmsrc/gmicons/letter_c_blue15x15.gif0000644000175000017500000000011012224351120020021 0ustar migmigGIF89a! , TZF=^} y"!S[T;gpsman-6.4.4.2/gmsrc/gmicons/cntct_spike15x15.gif0000644000175000017500000000012512224351120017525 0ustar migmigGIF89a! ,&`cd I۱Id_#S`:X;gpsman-6.4.4.2/gmsrc/gmicons/cross_3p15x15.gif0000644000175000017500000000011012224351120016744 0ustar migmigGIF89a! ,y MQdT6iy(GG;gpsman-6.4.4.2/gmsrc/gmicons/pin_red15x15.gif0000644000175000017500000000012212224351120016634 0ustar migmigGIF89a! ,# pěnjvz^+p̭;gpsman-6.4.4.2/gmsrc/gmicons/exit_no_serv15x15.gif0000644000175000017500000000015612224351120017727 0ustar migmigGIF89a! ,304"]gnGfvJ:+̃P"=K1t8K;gpsman-6.4.4.2/gmsrc/gmicons/number_3_blue15x15.gif0000644000175000017500000000011312224351120017735 0ustar migmigGIF89a! ,"yڃ˜Uq}'dedXa;Q݄F;gpsman-6.4.4.2/gmsrc/gmicons/number_2_green15x15.gif0000644000175000017500000000011112224351120020103 0ustar migmigGIF89a! , yڃ˜U7reZxM⾒{;gpsman-6.4.4.2/gmsrc/gmicons/number_6_blue15x15.gif0000644000175000017500000000011312224351120017740 0ustar migmigGIF89a! ,"Sz tM#2u:rzF;gpsman-6.4.4.2/gmsrc/gmicons/letter_c_green15x15.gif0000644000175000017500000000011012224351120020172 0ustar migmigGIF89a! , TZF=^} y"!S[T;gpsman-6.4.4.2/gmsrc/gmicons/border15x15.gif0000644000175000017500000000012212224351120016471 0ustar migmigGIF89ai! ,#cq؂|ք Feu'rl1=;gpsman-6.4.4.2/gmsrc/gmicons/coast_guard15x15.gif0000644000175000017500000000011312224351120017507 0ustar migmigGIF89a! ," :<6cexAW碖CM;gpsman-6.4.4.2/gmsrc/gmicons/buoy_red_white15x15.gif0000644000175000017500000000015012224351120020225 0ustar migmigGIF89a! ,-HI6|+gyh˩K:p@h0pH%;gpsman-6.4.4.2/gmsrc/gmicons/buoy_green15x15.gif0000644000175000017500000000011712224351120017356 0ustar migmigGIF89a! , y܃:#lK}Cj) r[;gpsman-6.4.4.2/gmsrc/gmicons/tunnel15x15.gif0000644000175000017500000000016312224351120016526 0ustar migmigGIF89aϳQOO! ,8.vZgj i+@3LrټA݄_l8R ;gpsman-6.4.4.2/gmsrc/gmicons/knife_fork15x15.gif0000644000175000017500000000013112224351120017331 0ustar migmigGIF89a! ,*piB3p؁outNVʰꚁ7ӱ*5{m(;gpsman-6.4.4.2/gmsrc/gmicons/fastfood15x15.gif0000644000175000017500000000012512224351120017024 0ustar migmigGIF89a! ,&p˖ NjlҀ3Z}09hv z϶;gpsman-6.4.4.2/gmsrc/gmicons/hydrant15x15.gif0000644000175000017500000000012712224351120016672 0ustar migmigGIF89a! ,(/̂=j33egݩH6k VB;gpsman-6.4.4.2/gmsrc/gmicons/oval_blue15x15.gif0000644000175000017500000000010612224351120017166 0ustar migmigGIF89a! , Ǩ›)ޜny8^U;gpsman-6.4.4.2/gmsrc/gmicons/cntct_female215x15.gif0000644000175000017500000000016612224351120017732 0ustar migmigGIF89a*! ,;HJ+٤b 4 |fYejإ^ xw 8Tɀ¢Ss$$;gpsman-6.4.4.2/gmsrc/gmicons/cntct_bug15x15.gif0000644000175000017500000000014012224351120017164 0ustar migmigGIF89a! ,1LF;PVEl1*ɦmmI *o8B(;gpsman-6.4.4.2/gmsrc/gmicons/summit15x15.gif0000644000175000017500000000014112224351120016533 0ustar migmigGIF89aj'|hUxFhؕq;gpsman-6.4.4.2/gmsrc/gmicons/box_red15x15.gif0000644000175000017500000000013312224351120016640 0ustar migmigGIF89a! ,, ǒ:/ڰR^UQjnl/:=RP {;gpsman-6.4.4.2/gmsrc/gmicons/cemetery15x15.gif0000644000175000017500000000016612224351120017041 0ustar migmigGIF89a! ,;ۊŷhu2‡w c#☪')\d0@:^p7£l%dJ&;gpsman-6.4.4.2/gmsrc/gmicons/intersection15x15.gif0000644000175000017500000000013212224351120017723 0ustar migmigGIF89a! ,+/\xH e*yX&Hvb'4̷;gpsman-6.4.4.2/gmsrc/gmicons/letter_a_blue15x15.gif0000644000175000017500000000011412224351120020023 0ustar migmigGIF89a! ,#y F:Wm-ej*bFэR;gpsman-6.4.4.2/gmsrc/gmicons/avn_ndb15x15.gif0000644000175000017500000000012012224351120016621 0ustar migmigGIF89a! ,!pfR BJoq& Y~"2(aME;gpsman-6.4.4.2/gmsrc/gmicons/shopping_cart15x15.gif0000644000175000017500000000011612224351120020057 0ustar migmigGIF89a! ,% `frś{&Fu1|BIcn;gpsman-6.4.4.2/gmsrc/gmicons/ultralight15x15.gif0000644000175000017500000000013212224351120017374 0ustar migmigGIF89a! ,+ocʡ'޴ ]X9&jKt<DzAPn ;gpsman-6.4.4.2/gmsrc/gmicons/building15x15.gif0000644000175000017500000000012212224351120017011 0ustar migmigGIF89a咥**! ,#aR[iwv 皎=tS;gpsman-6.4.4.2/gmsrc/gmicons/theater15x15.gif0000644000175000017500000000017612224351120016661 0ustar migmigGIF89aͅ?ڥ R-Ewe! ,Cx{OH![aʟ]FâGL.REdTM@2cT ePhK53Hy ;gpsman-6.4.4.2/gmsrc/gmicons/diamond_red15x15.gif0000644000175000017500000000011012224351120017456 0ustar migmigGIF89a! ,༜FZhs̺r|_(N^]6P;gpsman-6.4.4.2/gmsrc/gmicons/soft_field15x15.gif0000644000175000017500000000012712224351120017337 0ustar migmigGIF89a! ,( ǒb Zym|#Zd)ihp*vrwLG;gpsman-6.4.4.2/gmsrc/gmicons/geo_name_water15x15.gif0000644000175000017500000000013312224351120020172 0ustar migmigGIF89a! ,,ǦJŔ]axAI~覮!'M0D6v-u;gpsman-6.4.4.2/gmsrc/gmicons/buoy_violet15x15.gif0000644000175000017500000000011712224351120017560 0ustar migmigGIF89a! , y܃:#lK}Bj r[;gpsman-6.4.4.2/gmsrc/gmicons/snow_skiing15x15.gif0000644000175000017500000000015212224351120017551 0ustar migmigGIF89a! ,/xpb2 4Y)*$" x@p;gpsman-6.4.4.2/gmsrc/gmicons/pizza15x15.gif0000644000175000017500000000015112224351120016353 0ustar migmigGIF89az! ,: Ǔ!X #8IY%B79jlP#] P@;gpsman-6.4.4.2/gmsrc/gmicons/cntct_cat15x15.gif0000644000175000017500000000013712224351120017164 0ustar migmigGIF89a! ,0 kn\NYٲH9R"RXt(Xwb> %:QP;gpsman-6.4.4.2/gmsrc/gmicons/beacon15x15.gif0000644000175000017500000000011112224351120016441 0ustar migmigGIF89a! , ǧQ.ssuyRdmzNU;gpsman-6.4.4.2/gmsrc/gmicons/buoy_black15x15.gif0000644000175000017500000000011712224351120017332 0ustar migmigGIF89a! , y܃:#lK}Bj r[;gpsman-6.4.4.2/gmsrc/gmicons/picnic15x15.gif0000644000175000017500000000012512224351120016464 0ustar migmigGIF89a! ,&`ZcJw-եsa<]q`l@^;gpsman-6.4.4.2/gmsrc/recmodels.tcl0000644000175000017500000001516312224351120015056 0ustar migmig# # This file is part of: # # gpsman --- GPS Manager: a manager for GPS receiver data # # Copyright (c) 1998-2013 Miguel Filgueiras migfilg@t-online.de # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. # # File: recmodels.tcl # Last change: 6 October 2013 # # Includes contributions by # - Brian Baulch (baulchb_AT_onthenet.com.au) marked "BSB contribution" # - Matt Martin (matt.martin_AT_ieee.org) marked "MGM contribution" # - Miguel Filgueiras (to code by others) marked "MF contribution" # # assuming trade mark is the first list element in $GPSREC set MYGPS [lindex $GPSREC 0] set MYGPSMODEL [lreplace $GPSREC 0 0] # lists of known receivers models # Garmin and Lowrance and Magellan: no need for model name array set RECMODELS { Garmin {} Lowrance {} Magellan {} } # protocols supported for each trade mark array set RECPROTOCOLS { Garmin {garmin garmin_usb nmea stext simul drivesim} Lowrance {lowrance nmea} Magellan {magellan} } ##### # related procs proc FillRecModelsMenu {menu commd} { # fill in menu with GPS receiver models, used when setting preferences # $menu is the parent menu to fill in # $commd is the callback to associate to each selection # whose arguments will be the receiver name and $menu (even on sub-menus) # a selection will also have a callback to change the description of # the options related to the receiver configuration global RECMODELS MAXMENUITEMS TXT GPSREC foreach tm [lsort -dictionary [array names RECMODELS]] { if { $RECMODELS($tm) != "" } { $menu add cascade -label $tm -menu $menu.m set mw $menu.m ; menu $mw -tearoff 0 set n 0 ; set m 0 foreach it $RECMODELS($tm) { if { $n > $MAXMENUITEMS } { $mw add cascade -label "$TXT(more) ..." -menu $mw.m$m set mw $mw.m$m ; menu $mw -tearoff 0 set n 0 ; incr m } $mw add command -label $it \ -command "RecModelChange $tm ; \ [list $commd "$tm $it" $menu]" incr n } } else { $menu add command -label $tm \ -command "RecModelChange $tm ; $commd $tm $menu" } } return } proc RecModelChange {tm} { # change the description of the options related to the receiver # configuration # $tm is the receivers trade-mark in {Garmin, Lowrance, Magellan} global GPSREC OPTTYPE OPTGRPL OPTMENUPROC OPTMENUNAMES OPTMENUPREFIX \ OPTMENUCONTS DISPOPTS RECPROTOCOLS RECBAUDS set OPTTYPE(_GPSRecConf) group switch $tm { Garmin { set OPTGRPL(_GPSRecConf) {DEFTRECPROTOCOL SERIALBAUD ACCEPTALLCHARS NAMELENGTH COMMENTLENGTH MAXWPOINTS MAXROUTES MAXWPINROUTE AutoNumRts MAXTPOINTS CREATIONDATE NOLOWERCASE DEFAULTSYMBOL DEFAULTDISPOPT SUPPORTLAPS} set OPTTYPE(DEFTRECPROTOCOL) fixedtextmenu set OPTTYPE(SERIALBAUD) fixedmenu set OPTMENUCONTS(SERIALBAUD) $RECBAUDS set OPTMENUCONTS(DEFTRECPROTOCOL) $RECPROTOCOLS(Garmin) set OPTMENUNAMES(DEFTRECPROTOCOL) TXT set OPTMENUPREFIX(DEFTRECPROTOCOL) {} set OPTTYPE(ACCEPTALLCHARS) boolean set OPTTYPE(NAMELENGTH) nat set OPTTYPE(COMMENTLENGTH) nat set OPTTYPE(MAXWPOINTS) nat set OPTTYPE(MAXROUTES) nat set OPTTYPE(MAXWPINROUTE) nat set OPTTYPE(AutoNumRts) boolean set OPTTYPE(MAXTPOINTS) nat set OPTTYPE(CREATIONDATE) boolean set OPTTYPE(NOLOWERCASE) boolean set OPTTYPE(DEFAULTSYMBOL) textmenu set OPTMENUPROC(DEFAULTSYMBOL) FillSymbolsMenu set OPTMENUNAMES(DEFAULTSYMBOL) TXT set OPTMENUPREFIX(DEFAULTSYMBOL) SY set OPTTYPE(DEFAULTDISPOPT) fixedtextmenu set OPTMENUCONTS(DEFAULTDISPOPT) $DISPOPTS set OPTMENUNAMES(DEFAULTDISPOPT) TXT set OPTMENUPREFIX(DEFAULTDISPOPT) DISP set OPTTYPE(SUPPORTLAPS) boolean } Lowrance { # BSB contribution set OPTGRPL(_GPSRecConf) {NAMELENGTH INTERVAL COMMENTLENGTH MAXWPOINTS MAXROUTES MAXWPINROUTE MAXTPOINTS CREATIONDATE NOLOWERCASE DEFAULTSYMBOL DEFAULTDISPOPT} set OPTTYPE(NAMELENGTH) nat set OPTTYPE(INTERVAL) nat set OPTTYPE(COMMENTLENGTH) nat set OPTTYPE(MAXWPOINTS) nat set OPTTYPE(MAXROUTES) nat set OPTTYPE(MAXWPINROUTE) nat set OPTTYPE(MAXTPOINTS) nat set OPTTYPE(CREATIONDATE) boolean set OPTTYPE(NOLOWERCASE) boolean set OPTTYPE(DEFAULTSYMBOL) textmenu set OPTMENUPROC(DEFAULTSYMBOL) FillSymbolsMenu set OPTMENUNAMES(DEFAULTSYMBOL) TXT set OPTMENUPREFIX(DEFAULTSYMBOL) SY set OPTTYPE(DEFAULTDISPOPT) fixedtextmenu set OPTMENUCONTS(DEFAULTDISPOPT) $DISPOPTS set OPTMENUNAMES(DEFAULTDISPOPT) TXT set OPTMENUPREFIX(DEFAULTDISPOPT) DISP } Magellan { # MGM contribution set OPTGRPL(_GPSRecConf) {NAMELENGTH SERIALBAUD COMMENTLENGTH MAXWPOINTS MAXROUTES MAXWPINROUTE MAXTPOINTS CREATIONDATE NOLOWERCASE DEFAULTSYMBOL DEFAULTDISPOPT} set OPTTYPE(NAMELENGTH) nat set OPTTYPE(SERIALBAUD) fixedmenu # MF change: RECBAUDS is set in recdefs.tcl set OPTMENUCONTS(SERIALBAUD) $RECBAUDS set OPTTYPE(INTERVAL) nat set OPTTYPE(COMMENTLENGTH) nat set OPTTYPE(MAXWPOINTS) nat set OPTTYPE(MAXROUTES) nat set OPTTYPE(MAXWPINROUTE) nat set OPTTYPE(MAXTPOINTS) nat set OPTTYPE(CREATIONDATE) boolean set OPTTYPE(NOLOWERCASE) boolean set OPTTYPE(DEFAULTSYMBOL) textmenu set OPTMENUPROC(DEFAULTSYMBOL) FillSymbolsMenu set OPTMENUNAMES(DEFAULTSYMBOL) TXT set OPTMENUPREFIX(DEFAULTSYMBOL) SY set OPTTYPE(DEFAULTDISPOPT) fixedtextmenu set OPTMENUCONTS(DEFAULTDISPOPT) $DISPOPTS set OPTMENUNAMES(DEFAULTDISPOPT) TXT set OPTMENUPREFIX(DEFAULTDISPOPT) DISP } } return } gpsman-6.4.4.2/gmsrc/garmin_symbols.tcl0000644000175000017500000002421012224351120016117 0ustar migmig# # This file is part of: # # gpsman --- GPS Manager: a manager for GPS receiver data # # Copyright (c) 1998-2013 Miguel Filgueiras migfilg@t-online.de # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. # # File: garmin_symbols.tcl # Last change: 6 October 2013 # # symbols used by Magellan # from magellan.tcl Copyright (c) 2003 Matt Martin (matt.martin _AT_ ieee.org) # needed for importation/exportation of MapSend files (files_foreign.tcl) set MAG_SYMTAB {WP_dot square_green house avn_vortac airport amusement_park casino car_repair boat camping exit 1st_aid avn_vordme buoy fuel deer golf lodging fish large_city light capitol_city boat_ramp medium_city museum danger park store knife_fork mountains diver_down_1 RV_park military scenic small_city oil_field stadium info truck_stop drinking_water wreck zoo} # symbol and display option codes from Garmin GPS Interface Specification # Version 1 Rev. 3, Rev. A and Rev. B proc GarminStdSymbols {} { # set codes for set of standard Garmin symbols global SYMBOLS SYMBOLCODE UNKNOWNSYMBOLS array set SYMBOLCODE { anchor 0 bell 1 diamond_green 2 diamond_red 3 diver_down_1 4 diver_down_2 5 dollar 6 fish 7 fuel 8 horn 9 house 10 knife_fork 11 light 12 mug 13 skull 14 square_green 15 square_red 16 WP_buoy_white 17 WP_dot 18 wreck 19 null 20 MOB 21 buoy_amber 22 buoy_black 23 buoy_blue 24 buoy_green 25 buoy_green_red 26 buoy_green_white 27 buoy_orange 28 buoy_red 29 buoy_red_green 30 buoy_red_white 31 buoy_violet 32 buoy_white 33 buoy_white_green 34 buoy_white_red 35 dot 36 radio_beacon 37 boat_ramp 150 camping 151 restrooms 152 showers 153 drinking_water 154 phone 155 1st_aid 156 info 157 parking 158 park 159 picnic 160 scenic 161 skiing 162 swimming 163 dam 164 controlled 165 danger 166 restricted 167 null_2 168 ball 169 car 170 deer 171 shopping_cart 172 lodging 173 mine 174 trail_head 175 truck_stop 176 exit 177 flag 178 circle_x 179 open_24hr 180 fhs_facility 181 bot_cond 182 tide_pred_stn 183 anchor_prohib 184 beacon 185 coast_guard 186 reef 187 weedbed 188 dropoff 189 dock 190 marina 191 bait_tackle 192 stump 193 is_highway 8192 us_highway 8193 st_highway 8194 mile_marker 8195 traceback 8196 golf 8197 small_city 8198 medium_city 8199 large_city 8200 freeway 8201 ntl_highway 8202 capitol_city 8203 amusement_park 8204 bowling 8205 car_rental 8206 car_repair 8207 fastfood 8208 fitness 8209 movie 8210 museum 8211 pharmacy 8212 pizza 8213 post_office 8214 RV_park 8215 school 8216 stadium 8217 store 8218 zoo 8219 fuel_store 8220 theater 8221 ramp_int 8222 street_int 8223 weight_station 8226 toll 8227 elevation 8228 exit_no_serv 8229 geo_name_man 8230 geo_name_water 8231 geo_name_land 8232 bridge 8233 building 8234 cemetery 8235 church 8236 civil 8237 crossing 8238 monument 8239 levee 8240 military 8241 oil_field 8242 tunnel 8243 beach 8244 tree 8245 summit 8246 large_ramp_int 8247 large_exit_ns 8248 police 8249 casino 8250 snow_skiing 8251 ice_skating 8252 tow_truck 8253 border 8254 geocache 8255 geocache_fnd 8256 cntct_smiley 8257 cntct_ball_cap 8258 cntct_big_ears 8259 cntct_spike 8260 cntct_goatee 8261 cntct_afro 8262 cntct_dreads 8263 cntct_female1 8264 cntct_female2 8265 cntct_female3 8266 cntct_ranger 8267 cntct_kung_fu 8268 cntct_sumo 8269 cntct_pirate 8270 cntct_biker 8271 cntct_alien 8272 cntct_bug 8273 cntct_cat 8274 cntct_dog 8275 cntct_pig 8276 hydrant 8282 flag_pin_blue 8284 flag_pin_green 8285 flag_pin_red 8286 pin_blue 8287 pin_green 8288 pin_red 8289 box_blue 8290 box_green 8291 box_red 8292 biker 8293 circle_red 8294 circle_green 8295 circle_blue 8296 diamond_blue 8299 oval_red 8300 oval_green 8301 oval_blue 8302 rect_red 8303 rect_green 8304 rect_blue 8305 square_blue 8308 letter_a_red 8309 letter_b_red 8310 letter_c_red 8311 letter_d_red 8312 letter_a_green 8313 letter_c_green 8314 letter_b_green 8315 letter_d_green 8316 letter_a_blue 8317 letter_b_blue 8318 letter_c_blue 8319 letter_d_blue 8320 number_0_red 8321 number_1_red 8322 number_2_red 8323 number_3_red 8324 number_4_red 8325 number_5_red 8326 number_6_red 8327 number_7_red 8328 number_8_red 8329 number_9_red 8330 number_0_green 8331 number_1_green 8332 number_2_green 8333 number_3_green 8334 number_4_green 8335 number_5_green 8336 number_6_green 8337 number_7_green 8338 number_8_green 8339 number_9_green 8340 number_0_blue 8341 number_1_blue 8342 number_2_blue 8343 number_3_blue 8344 number_4_blue 8345 number_5_blue 8346 number_6_blue 8347 number_7_blue 8348 number_8_blue 8349 number_9_blue 8350 triangle_blue 8351 triangle_green 8352 triangle_red 8353 airport 16384 intersection 16385 avn_ndb 16386 avn_vor 16387 heliport 16388 private 16389 soft_field 16390 tall_tower 16391 short_tower 16392 glider 16393 ultralight 16394 parachute 16395 avn_vortac 16396 avn_vordme 16397 avn_faf 16398 avn_lom 16399 avn_map 16400 avn_tacan 16401 seaplane 16402 } set UNKNOWNSYMBOLS $SYMBOLS foreach n [array names SYMBOLCODE] { if { [set i [lsearch -exact $UNKNOWNSYMBOLS $n]] != -1 } { set UNKNOWNSYMBOLS [lreplace $UNKNOWNSYMBOLS $i $i] } } return } proc SymbolsDOForProtocol {pid} { # change symbol and display option codes according to WPData protocol $pid # (if needs be) # change list of unknown symbols global SYMBOLS UNKNOWNSYMBOLS SYMBOLCODE DEFAULTSYMBOL \ DISPOPTS UNKNOWNDISPOPTS DISPOPTCODE DEFAULTDISPOPT \ GSym_Beg_Custom GSym_End_Custom # user customizable symbols; shown as $DEFAULTSYMBOL or WP_dot set GSym_Beg_Custom 7680 set GSym_End_Custom 8191 set UNKNOWNDISPOPTS "" # $garmin_dispopts sync-ed with $dispoptcodes; see also 2nd switch below set garmin_dispopts "s_name symbol s_comment" switch $pid { D103 - D107 { # non-standard symbols and display options set dispoptcodes "0 1 2" # these use the following new names: boat, exit, flag, duck # index of name in $names is its code! set names "WP_dot house fuel car fish boat anchor wreck exit \ skull flag camping circle_x deer WP_buoy_white traceback" set UNKNOWNSYMBOLS $SYMBOLS set c 0 foreach n $names { set SYMBOLCODE($n) $c ; incr c if { [set i [lsearch -exact $UNKNOWNSYMBOLS $n]] != -1 } { set UNKNOWNSYMBOLS [lreplace $UNKNOWNSYMBOLS $i $i] } } } D104 { # standard symbols and non-standard display options GarminStdSymbols set dispoptcodes "3 1 5" # 0 for "none" converted into "symbol" # HOW??? } D108 - D109 - D110 { # standard symbols and non-standard display options (as D103) GarminStdSymbols set dispoptcodes "0 1 2" } D155 { # standard symbols and display options GarminStdSymbols set dispoptcodes "3 1 5" } D100 - D150 - D151 - D152 { # with neither symbols nor display options foreach n [set UNKNOWNSYMBOLS $SYMBOLS] { set SYMBOLCODE($n) 0 } set dispoptcodes "0 0 0" set UNKNOWNDISPOPTS $DISPOPTS } D101 - D102 - D105 - D106 - D154 { # standard symbols but no display options GarminStdSymbols set dispoptcodes "0 0 0" set UNKNOWNDISPOPTS $DISPOPTS } } # codes of unknown symbols set to code of default symbol if possible, # otherwise to code of WP_dot if { [lsearch -exact $UNKNOWNSYMBOLS $DEFAULTSYMBOL] == -1 } { set ds $DEFAULTSYMBOL } else { set ds WP_dot } set c $SYMBOLCODE($ds) foreach n $UNKNOWNSYMBOLS { set SYMBOLCODE($n) $c } for { set u $GSym_Beg_Custom } { $u <= $GSym_End_Custom } { incr u } { set SYMBOLCODE(user:$u) $u } # display options set defcode -1 foreach opt $garmin_dispopts c $dispoptcodes { if {! [string compare $opt $DEFAULTDISPOPT] } { set defcode $c } set DISPOPTCODE($opt) $c } if { $defcode == -1 } { set defcode $DISPOPTCODE(s_name) } foreach opt $DISPOPTS { switch $opt { s_name - symbol - s_comment { } default { set DISPOPTCODE($opt) $defcode lappend UNKNOWNDISPOPTS $opt } } } return } gpsman-6.4.4.2/gmsrc/gendials.tcl0000644000175000017500000015033112224351120014664 0ustar migmig# # This file is part of: # # gpsman --- GPS Manager: a manager for GPS receiver data # # Copyright (c) 1998-2013 Miguel Filgueiras migfilg@t-online.de # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. # # File: gendials.tcl # Last change: 6 October 2013 # # Includes contributions by # - Brian Baulch (baulchb_AT_onthenet.com.au) marked "BSB contribution" # - Stefan Heinen (stefan.heinen_AT_djh-freeweb.de) marked "SH contribution" # # creating toplevels proc GMToplevel {w title geom trans prots binds} { # create a toplevel with given geometry # $w window path # $title if not empty title given as either "==TITLE" for TITLE, # or as an index in TXT array # $trans if not void is path of window of which $w is a transient # $prots list with in sequence a wm protocol and a command # $binds list with in sequence an event and a command # return $w global TXT if { $title != "" && ! [regsub {^==} $title "" title] } { set title $TXT($title) } toplevel $w if { $title != "" } { wm title $w "$title/GPSMan" } wm geometry $w $geom if { $trans != {} } { wm transient $w $trans } wm group $w . foreach {p c} $prots { wm protocol $w $p $c } foreach {e c} $binds { bind $w $e $c } return $w } # modal dialogs proc GMMessage {mess args} { # create modal dialog for displaying message # if $args=="wait" return only when user acknowledges message # except in command-line mode or if using the slow op window # single button: OK; binding: return global COLOUR EPOSX EPOSY TXT UNIX CMDLINE if { $CMDLINE } { puts stderr $mess flush stderr return } if { [winfo exists .slowop] } { SlowOpMessage $mess return } if { [winfo exists .mess] } { # add new message foreach s [pack slaves .mess.fr] { if { $s == ".mess.fr.ok" } { break } set last $s } if { ! [regexp {^\.mess\.fr\.text(.*)$} $last x n] } { BUG bad last message field in .mess return } if { $n == "" } { set n 1 } else { if { $n == 4 } { .mess.fr.text4 configure -text $mess update idletasks return } incr n } label .mess.fr.text$n -text $mess pack .mess.fr.text$n -side top -pady 5 -before .mess.fr.ok update idletasks return } # this avoids bugs but may create havoc with grabs set gs [grab current] GMToplevel .mess message +$EPOSX+$EPOSY . \ [list WM_DELETE_WINDOW [list DestroyRGrabs .mess $gs]] \ [list [list DestroyRGrabs .mess $gs]] if { ! $UNIX } { # SH contribution focus .mess } frame .mess.fr -borderwidth 5 -bg $COLOUR(messbg) label .mess.fr.title -text "!!!" -relief sunken label .mess.fr.text -text $mess button .mess.fr.ok -text $TXT(ok) -command [list DestroyRGrabs .mess $gs] pack .mess.fr -side top # changes in packing order must be reflected above when adding # new messages to existing window pack .mess.fr.title .mess.fr.text .mess.fr.ok -side top -pady 5 RaiseWindow .mess update idletasks grab .mess if { $args == "wait" } { while 1 { after 500 update if { ! [winfo exists .mess] } { return } } } return } proc GMConfirm {mess} { # create modal dialog for asking for confirmation # buttons: OK, Cancel; bindings: return, delete global GMResConf COLOUR EPOSX EPOSY TXT CMDLINE if { $CMDLINE } { return 1 } destroy .messres GMToplevel .messres message +$EPOSX+$EPOSY . \ {WM_DELETE_WINDOW {set GMResConf 0}} \ [list {set GMResConf 1} \ {set GMResConf 0}] frame .messres.fr -borderwidth 5 -bg $COLOUR(confbg) label .messres.fr.title -text "???" -relief sunken label .messres.fr.text -text $mess frame .messres.fr.bs button .messres.fr.bs.ok -text $TXT(ok) -command { set GMResConf 1 } button .messres.fr.bs.cancel -text $TXT(no) -command { set GMResConf 0 } pack .messres.fr.bs.ok .messres.fr.bs.cancel -side left -pady 5 pack .messres.fr.title .messres.fr.text .messres.fr.bs -side top -pady 5 pack .messres.fr -side top update idletasks set gs [grab current] grab .messres RaiseWindow .messres tkwait variable GMResConf DestroyRGrabs .messres $gs update idletasks return $GMResConf } proc GMSelect {mess blist vlist} { # create modal dialog for selecting values from $vlist under names in # $blist; if an element in $blist has the form @LIST then the # corresponding $vlist element is a list with one less element than LIST # menubuttons are created for each @LIST element whose label is the # first element of LIST, buttons being used for the other elements # bindings: return for first, delete for last element, or their # first elements in case of @LIST # (see proc GMChooseFrom for selection using a listbox) global GMResSel COLOUR EPOSX EPOSY TXT # assumes first and last elements of vlist are return values for # Return and Delete keys, respectively destroy .messres set e [lindex $blist 0] if { [string first "@" $e] == 0 } { set e [lindex [lindex $vlist 0] 0] } else { set e [lindex $vlist 0] } GMToplevel .messres selection +$EPOSX+$EPOSY . \ [list WM_DELETE_WINDOW "set GMResSel [lindex $vlist 0]"] \ [list "set GMResSel $e"] frame .messres.fr -borderwidth 5 -bg $COLOUR(selbg) label .messres.fr.title -text "???" -relief sunken label .messres.fr.text -text $mess frame .messres.fr.frsel set max 4 ; set c 0 ; set r 0 ; set lval "" ; set menus 0 foreach e $blist v $vlist { set b .messres.fr.frsel.b$r$c if { [regexp {^@(.+)$} $e x e] } { if { [llength $e] != [llength $v]+1 } { BUG GMSelect bad lengths of @LIST lists } incr menus set lval [lindex $v 0] menubutton $b -text [lindex $e 0] -menu $b.m menu $b.m foreach x [lreplace $e 0 0] y $v { $b.m add command -label $x -command "set GMResSel $y" } } else { set lval $v button $b -text $e -command "set GMResSel $v" } grid $b -column $c -row $r -sticky ew if { [incr c] >= $max } { set c 0 ; incr r } } bind .messres "set GMResSel $lval" pack .messres.fr -side top pack .messres.fr.title .messres.fr.text .messres.fr.frsel -side top -pady 5 set gs [grab current] update idletasks grab .messres if { $menus } { Raise .messres } else { RaiseWindow .messres } tkwait variable GMResSel DestroyRGrabs .messres $gs update idletasks return $GMResSel } proc GMChooseFrom {how mess wd blist vlist args} { # create modal dialog for selecting elements from list $blist # with associated return values in $vlist # $how in {single, many, many_0} defines number of elements that can # be selected, many_0 meaning that 0 is an alternative # a listbox is used with width $wd # $args if present is a pair with $vars $descs, suitable for use # with proc GMSetupParams, so that parameters may be selected # buttons: OK, Cancel # bindings: return for commit, extended select mode on listbox, # make visible by initial char on listbox # return list with selected values upon normal termination, and # an empty list or -1 if $how==many_0 # (see also proc GMSelect for selection of only one element with buttons) global GMResult DPOSX DPOSY COLOUR TXT UNIX set w .gmchoosefr if { [winfo exists $w] } { Raise $w ; bell ; return } GMToplevel $w "==$mess" +$DPOSX+$DPOSY . \ {WM_DELETE_WINDOW {set GMResult cnc}} \ [list {set GMResult ok}] frame $w.fr -borderwidth 5 -bg $COLOUR(dialbg) label $w.fr.text -text $mess # adjust list height according to number of parameters set lh [expr 15-[llength [lindex $args 0]]] if { [set ll [llength $blist]] > $lh } { set ll $lh } frame $w.fr.frbx if { $how == "single" } { set mode single } else { set mode extended } listbox $w.fr.frbx.bx -height $ll -width $wd -relief flat \ -selectmode $mode -yscrollcommand "$w.fr.frbx.bscr set" \ -exportselection 0 # SH contribution: no such bindings in non-unix systems if { $UNIX } { bind $w.fr.frbx.bx { focus %W } bind $w.fr.frbx.bx "focus $w.fr.frbx" } bind $w.fr.frbx.bx { ScrollListIndex %W %A } scrollbar $w.fr.frbx.bscr -command "$w.fr.frbx.bx yview" foreach i $blist { $w.fr.frbx.bx insert end $i } if { $ll == 1 } { $w.fr.frbx.bx selection set 0 } if { $args != "" } { set opts 1 frame $w.fr.fopt foreach "menus es" \ [GMSetupParams $w.fr.fopt [lindex $args 0] [lindex $args 1]] {} } else { set opts 0 ; set menus 0 } frame $w.fr.frbt button $w.fr.frbt.ok -text $TXT(ok) -command { set GMResult ok } button $w.fr.frbt.cnc -text $TXT(cancel) -command { set GMResult cnc } pack $w.fr.frbt.ok $w.fr.frbt.cnc -side left -pady 5 pack $w.fr.frbx.bx $w.fr.frbx.bscr -side left -fill y if { $opts } { pack $w.fr.text $w.fr.frbx $w.fr.fopt $w.fr.frbt -side top -pady 5 } else { pack $w.fr.text $w.fr.frbx $w.fr.frbt -side top -pady 5 } pack $w.fr update idletasks set gs [grab current] grab $w if { $menus } { Raise .fdlg } else { RaiseWindow .fdlg } while 1 { tkwait variable GMResult switch $GMResult { "" { } cnc { if { $how == "many_0" } { set res -1 } else { set res "" } break } ok { set ss [$w.fr.frbx.bx curselection] if { $ss == "" && $how != "many_0" } { bell continue } set res "" foreach i $ss { lappend res [lindex $vlist $i] } if { $opts } { GMUseEntries $w.fr.fopt $es } break } } } DestroyRGrabs $w $gs update idletasks return $res } proc GMChooseParams {mess vars descs} { # create modal dialog for choosing parameters # $vars and $descs are as described in GMSetupParams # buttons: OK, Cancel # bindings: return for commit # return 0 if cancelled global GMResult DPOSX DPOSY COLOUR TXT set w .gmchooseprsr if { [winfo exists $w] } { Raise $w ; bell ; return } GMToplevel $w "==$mess" +$DPOSX+$DPOSY . \ {WM_DELETE_WINDOW {set GMResult cnc}} \ [list {set GMResult ok}] frame $w.fr -borderwidth 5 -bg $COLOUR(dialbg) label $w.fr.text -text $mess frame $w.fr.fopt foreach "menus es" [GMSetupParams $w.fr.fopt $vars $descs] {} frame $w.fr.frbt button $w.fr.frbt.ok -text $TXT(ok) -command { set GMResult ok } button $w.fr.frbt.cnc -text $TXT(cancel) -command { set GMResult cnc } pack $w.fr.frbt.ok $w.fr.frbt.cnc -side left -pady 5 pack $w.fr.text $w.fr.fopt $w.fr.frbt -side top -pady 5 pack $w.fr update idletasks set gs [grab current] grab $w if { $menus } { Raise .fdlg } else { RaiseWindow .fdlg } while 1 { tkwait variable GMResult switch $GMResult { "" { } cnc { set res 0 ; break } ok { GMUseEntries $w.fr.fopt $es set res 1 ; break } } } DestroyRGrabs $w $gs update idletasks return $res } proc GMLogin {service} { # get or retrieve login information for accessing a given service # $service is a unique name for the service, needed for displaying # a message and indexing saved login information # save the login information for use in the current session if the user # asks for it # return list with user name and password or an empty list if cancelled global MESS TXT GMPInfo if { ! [catch {set up $GMPInfo($service)}] } { return $up } if { [GMChooseParams [format $MESS(loginto) $service] \ {GMPInfo(__tmp,u) GMPInfo(__tmp,p) GMPInfo(__tmp,s)} \ [list =$TXT(uname) =@$TXT(pword) @$TXT(remember)]] \ == 0 } { return {} } set up [list $GMPInfo(__tmp,u) $GMPInfo(__tmp,p)] unset GMPInfo(__tmp,p) if { $GMPInfo(__tmp,s) } { set GMPInfo($service) $up } return $up } ##### information window proc DisplayInfo {mess args} { # display information on a dialog # the dialog is created if it not exists, otherwise the message # will be added to it # $args may be "" or "tabs" followed by tabs list (man 3tk text) in # which negative numbers are to be converted from chars to screen # distances global CMDLINE COLOUR EPOSX EPOSY TXT FixedFont DInfo if { $CMDLINE } { return } set frt .gminfo.fr.frt if { ! [winfo exists .gminfo] } { GMToplevel .gminfo info +$EPOSX+$EPOSY {} \ {WM_DELETE_WINDOW {destroy .gminfo}} {} frame .gminfo.fr -borderwidth 5 -bg $COLOUR(messbg) label .gminfo.fr.title -text $TXT(info) -relief sunken frame $frt -relief flat -borderwidth 0 text $frt.txt -width 80 -font $FixedFont -wrap word \ -exportselection 1 -yscrollcommand "$frt.tscrl set" bind $frt.txt "$frt.txt yview scroll 1 pages ; break" bind $frt.txt "$frt.txt yview scroll -1 pages ; break" bind $frt.txt break bind $frt.txt break scrollbar $frt.tscrl -command "$frt.txt yview" set frb .gminfo.fr.frb frame $frb -relief flat -borderwidth 0 button $frb.save -text $TXT(save) \ -command "SaveDisplayInfo $frt.txt" button $frb.ok -text $TXT(ok) -command { destroy .gminfo } grid config $frt.txt -column 0 -row 1 -sticky nesw grid config $frt.tscrl -column 1 -row 1 -sticky nesw grid config $frb.save -column 0 -row 0 grid config $frb.ok -column 1 -row 0 pack .gminfo.fr.title $frt $frb -side top -pady 5 pack .gminfo.fr # info on this window catch {unset DInfo} # to help setting tabs, make public the "ex" in pixels set x20 "xxxxxxxxxxxxxxxxxxxx" set DInfo(ex) [expr round([font measure $FixedFont $x20]/20.0)] # number of next free tag; tags will have names started by "itg" set DInfo(nxttag) 1 } if { $args != "" } { set tags "" switch -- [lindex $args 0] { tabs { set tlst "" foreach x [lindex $args 1] { if { [regexp {^-([0-9]+)$} $x m n] } { # to pixels set x [expr $n*$DInfo(ex)] } lappend tlst $x } if { [catch {set tgname $DInfo($tlst)}] } { set tgname itg$DInfo(nxttag) incr DInfo(nxttag) $frt.txt tag configure $tgname -tabs $tlst set DInfo($tlst) $tgname } lappend tags $tgname } default { BUG bad args to DisplayInfo return } } $frt.txt insert end "$mess\n" $tags } else { $frt.txt insert end "$mess\n" } $frt.txt see end update idletasks return } proc SaveDisplayInfo {wtxt} { # save text in $wtxt text widget to file global TXT if { [set txt [$wtxt get 1.0 end]] == "" || \ [set f [GMOpenFile $TXT(saveto) Info wapp]] == ".." } { return } puts $f $txt close $f return } ### dialog window for controlling slow operations proc SlowOpWindow {mess} { # create dialog for controlling slow operation # to be called by application before entering the main loop of the slow # operation # within the loop there should be calls to proc SlowOpAborted that # returns 1 if the operation is to be aborted, or updates the interface # and returns 0 otherwise # any call within the loop to GMMessage will be diverted to this dialog # after the main loop there should be a call to proc SlowOpFinish with # the unique identifier that is returned by proc SlowOpWindow # returns a unique identifier to be used when calling proc SlowOpWindow global SlowOp COLOUR MAPCOLOUR EPOSX EPOSY TXT CMDLINE USESLOWOPWINDOW \ FixedFont if { $CMDLINE || ! $USESLOWOPWINDOW } { return } if { [winfo exists .slowop] } { set SlowOp(id) [clock seconds] set SlowOp(ids) [linsert $SlowOp(ids) 0 $SlowOp(id)] .slowop.fr.title configure -text $mess return $SlowOp(id) } set id [clock seconds] array set SlowOp [list aborting 0 id $id ids $id \ status "$TXT(working)..." grabs [grab current]] # avoid completely covering other dialogs set pos [expr $EPOSX+150] GMToplevel .slowop opinprogr +$pos+$EPOSY {} \ {WM_DELETE_WINDOW {set SlowOp(aborting) 1}} {} frame .slowop.fr -borderwidth 5 -bg $COLOUR(messbg) label .slowop.fr.title -text $mess -relief sunken set frs .slowop.fr.frs frame $frs -relief flat -borderwidth 0 label $frs.st -textvariable SlowOp(status) -fg $MAPCOLOUR(trvwrnimportant) checkbutton $frs.light -disabledforeground $COLOUR(check) -state disabled set frt .slowop.fr.frt frame $frt -relief flat -borderwidth 0 text $frt.txt -width 50 -font $FixedFont -wrap word \ -yscrollcommand "$frt.tscrl set" bind $frt.txt "$frt.txt yview scroll 1 pages ; break" bind $frt.txt "$frt.txt yview scroll -1 pages ; break" bind $frt.txt break scrollbar $frt.tscrl -command "$frt.txt yview" set frb .slowop.fr.frb frame $frb -relief flat -borderwidth 0 button $frb.abort -text $TXT(abort) -command SlowOpAbort button $frb.ok -text $TXT(ok) -state disabled \ -command [list DestroyRGrabs .slowop $SlowOp(grabs)] pack $frs.st $frs.light -side left grid config $frt.txt -column 0 -row 1 -sticky nesw grid config $frt.tscrl -column 1 -row 1 -sticky nesw grid config $frb.abort -column 0 -row 0 grid config $frb.ok -column 1 -row 0 pack .slowop.fr.title $frs $frt $frb -side top -pady 5 pack .slowop.fr update idletasks grab .slowop RaiseWindow .slowop return $id } proc SlowOpFinish {id mess} { # to be called by application when the operation ends (either normally # or not) # $id is unique identifier that was returned by proc SlowOpWindow # if $id is not in the $SlowOp(ids) stack the message is displayed # and nothing else happens # $mess will be displayed if not empty # the dialog window will be closed only when the stack of calls to # proc SlowOpWindow is empty # the dialog window is closed silently if there were no messages, # otherwise the Ok button is activated and the user must acknowledge it global SlowOp TXT if { ! [winfo exists .slowop] } { if { $mess != "" } { GMMessage $mess } return } if { $mess != "" } { SlowOpMessage $mess } if { [set ix [lsearch -exact $SlowOp(ids) $id]] == -1 || \ [set SlowOp(ids) [lreplace $SlowOp(ids) 0 $ix]] != {} } { return } if { ! $SlowOp(aborting) } { set SlowOp(status) $TXT(errwarn) } set SlowOp(aborting) 0 set txt .slowop.fr.frt.txt if { [$txt index end] == 2.0 } { DestroyRGrabs .slowop $SlowOp(grabs) return } set frb .slowop.fr.frb foreach b "abort ok" st "disabled normal" { $frb.$b configure -state $st } return } proc SlowOpAbort {} { # the user aborted the operation # not to be called directly from the application global SlowOp TXT set SlowOp(aborting) 1 set SlowOp(status) $TXT(aborted) return } proc SlowOpMessage {mess} { # show message in slow operation dialog window # not to be called directly from the application set txt .slowop.fr.frt.txt $txt insert end "$mess\n" $txt see end update idletasks return } proc SlowOpAborted {} { # to be called by the application to test if the operation was aborted # if not a call to update is made to ensure that the window is usable # return 1 if yes global SlowOp TXT if { ! [winfo exists .slowop] } { return 0 } if { $SlowOp(aborting) } { set SlowOp(status) $TXT(aborted) return 1 } set frs .slowop.fr.frs $frs.light toggle update return 0 } ### opening files proc GMOpenFile {act wh mode} { # create modal dialog for selecting and opening a file # $act is string describing the action to do on the file # $wh in $filetypes (see proc GMStart, setup.tcl) # $mode in {r, w, wapp} with wapp meaning write or possibly append # buttons: OK, Cancel # binding: return and double-left for commit, left-click for select global GMResult COLOUR DPOSX DPOSY LISTHEIGHT File TXT MESS UNIX if { [set f $File($wh)] == "" || [catch {cd [file dirname $f]}] } { set currfile "" } else { set currfile [file tail $f] } if { $mode == "wapp" } { set mode a } GMToplevel .fdlg file +$DPOSX+$DPOSY . \ {WM_DELETE_WINDOW {set GMResult cnc}} \ [list {set GMResult ok}] frame .fdlg.fr -borderwidth 5 -bg $COLOUR(selbg) label .fdlg.fr.title -text [format $MESS(fileact) $act $TXT(name$wh)] \ -relief sunken if { ! $UNIX } { menubutton .fdlg.fr.vols -text $TXT(volume) -menu .fdlg.fr.vols.m menu .fdlg.fr.vols.m bind .fdlg.fr.vols { FillMenuExec .fdlg.fr.vols.m {ChangeVolume .fdlg} file volume } } entry .fdlg.fr.wdir -width 30 ShowTEdit .fdlg.fr.wdir [pwd] 0 frame .fdlg.fr.frbx listbox .fdlg.fr.frbx.box -height $LISTHEIGHT -width 30 \ -yscrollcommand ".fdlg.fr.frbx.bscr set" \ -selectmode single -exportselection 1 bind .fdlg.fr.frbx.box { global GMResult set GMResult [%W nearest %y] } bind .fdlg.fr.frbx.box { .fdlg.fr.fn delete 0 end .fdlg.fr.fn insert 0 [%W get [%W nearest %y]] } scrollbar .fdlg.fr.frbx.bscr -command ".fdlg.fr.frbx.box yview" FillDir .fdlg.fr.frbx.box entry .fdlg.fr.fn -width 30 .fdlg.fr.fn insert 0 $currfile TextBindings .fdlg.fr.fn frame .fdlg.fr.bs button .fdlg.fr.bs.ok -text $TXT(ok) -command { set GMResult ok } button .fdlg.fr.bs.cnc -text $TXT(cancel) \ -command { set GMResult cnc } pack .fdlg.fr.bs.ok .fdlg.fr.bs.cnc -side left -pady 5 pack .fdlg.fr.frbx.box .fdlg.fr.frbx.bscr -side left -fill y if { $UNIX } { pack .fdlg.fr.title .fdlg.fr.wdir .fdlg.fr.frbx .fdlg.fr.fn \ .fdlg.fr.bs -side top -pady 5 } else { pack .fdlg.fr.title .fdlg.fr.vols .fdlg.fr.wdir .fdlg.fr.frbx \ .fdlg.fr.fn .fdlg.fr.bs -side top -pady 5 } pack .fdlg.fr -side top update idletasks set gs [grab current] grab .fdlg RaiseWindow .fdlg while 1 { tkwait variable GMResult switch $GMResult { "" { } cnc { set res ".." break } ok { set fn [.fdlg.fr.fn get] set f [GMCheckFile open $fn $mode] if { $f != ".." } { set File($wh) [file join [pwd] $fn] set res $f break } } 0 { cd .. ShowTEdit .fdlg.fr.wdir [pwd] 0 .fdlg.fr.frbx.box delete 0 end ; FillDir .fdlg.fr.frbx.box .fdlg.fr.fn delete 0 end } default { set fn [.fdlg.fr.frbx.box get $GMResult] set f [GMCheckFile open $fn $mode] if { $f != ".." } { set File($wh) [file join [pwd] $fn] set res $f break } } } } DestroyRGrabs .fdlg $gs update idletasks return $res } proc GMOpenFileParms {act wh mode vars vals} { # create modal dialog for selecting and opening a file and parameters # see arguments of proc GMGetFileName set fname [GMGetFileName $act $wh $mode $vars $vals] if { $fname == ".." } { return ".." } if { $mode == "wapp" } { set mode a } return [open $fname $mode] } proc GMGetFileName {act wh mode vars vals} { # create modal dialog for selecting a file name and parameters # $act is string describing the action to do on the file # $wh in $filetypes (see proc GMStart, setup.tcl) # $mode in {r, w, wapp} with wapp meaning write or possibly append # $vars is list of (global) vars to set # $vals is associated list of value descriptions (see proc GMSetupParams) # buttons: OK, Cancel # binding: return and double-left for commit, left-click for select global GMResult COLOUR DPOSX DPOSY LISTHEIGHT File TXT MESS UNIX if { [set f $File($wh)] == "" || [catch {cd [file dirname $f]}] } { set currfile "" } else { set currfile [file tail $f] } GMToplevel .fdlg file +$DPOSX+$DPOSY . \ {WM_DELETE_WINDOW {set GMResult cnc}} \ [list {set GMResult ok}] frame .fdlg.fr -borderwidth 5 -bg $COLOUR(selbg) label .fdlg.fr.title -text [format $MESS(fileact) $act $TXT(name$wh)] \ -relief sunken if { ! $UNIX } { menubutton .fdlg.fr.vols -text $TXT(volume) -menu .fdlg.fr.vols.m menu .fdlg.fr.vols.m bind .fdlg.fr.vols { FillMenuExec .fdlg.fr.vols.m {ChangeVolume .fdlg} file volume } } entry .fdlg.fr.wdir -width 30 ShowTEdit .fdlg.fr.wdir [pwd] 0 # adjust list height according to number of parameters set lh [expr $LISTHEIGHT-[llength $vars]] frame .fdlg.fr.frbx listbox .fdlg.fr.frbx.box -height $lh -width 30 \ -yscrollcommand ".fdlg.fr.frbx.bscr set" \ -selectmode single -exportselection 1 bind .fdlg.fr.frbx.box { global GMResult set GMResult [%W nearest %y] } bind .fdlg.fr.frbx.box { .fdlg.fr.fn delete 0 end .fdlg.fr.fn insert 0 [%W get [%W nearest %y]] } scrollbar .fdlg.fr.frbx.bscr -command ".fdlg.fr.frbx.box yview" FillDir .fdlg.fr.frbx.box # BSB contribution: wheelmouse scrolling Mscroll .fdlg.fr.frbx.box entry .fdlg.fr.fn -width 30 .fdlg.fr.fn insert 0 $currfile TextBindings .fdlg.fr.fn frame .fdlg.fr.fopt foreach "menus es" [GMSetupParams .fdlg.fr.fopt $vars $vals] {} frame .fdlg.fr.bs button .fdlg.fr.bs.ok -text $TXT(ok) -command { set GMResult ok } button .fdlg.fr.bs.cnc -text $TXT(cancel) \ -command { set GMResult cnc } pack .fdlg.fr.bs.ok .fdlg.fr.bs.cnc -side left -pady 5 pack .fdlg.fr.frbx.box .fdlg.fr.frbx.bscr -side left -fill y if { $UNIX } { pack .fdlg.fr.title .fdlg.fr.wdir .fdlg.fr.frbx .fdlg.fr.fn \ .fdlg.fr.fopt .fdlg.fr.bs -side top -pady 5 } else { pack .fdlg.fr.title .fdlg.fr.vols .fdlg.fr.wdir .fdlg.fr.frbx \ .fdlg.fr.fn .fdlg.fr.fopt .fdlg.fr.bs -side top -pady 5 } pack .fdlg.fr -side top update idletasks set gs [grab current] grab .fdlg if { $menus } { Raise .fdlg } else { RaiseWindow .fdlg } while 1 { tkwait variable GMResult switch $GMResult { "" { } cnc { set res ".." ; break } ok { set fn [.fdlg.fr.fn get] set f [GMCheckFile check $fn $mode] if { $f != ".." } { set File($wh) [file join [pwd] $fn] GMUseEntries .fdlg.fr.fopt $es set res $fn break } } 0 { cd .. ShowTEdit .fdlg.fr.wdir [pwd] 0 .fdlg.fr.frbx.box delete 0 end ; FillDir .fdlg.fr.frbx.box .fdlg.fr.fn delete 0 end } default { set fn [.fdlg.fr.frbx.box get $GMResult] set f [GMCheckFile check $fn $mode] if { $f != ".." } { set File($wh) [file join [pwd] $fn] GMUseEntries .fdlg.fr.fopt $es set res $fn break } } } } DestroyRGrabs .fdlg $gs update idletasks return $res } proc GMCheckFile {how f mode} { # check name of file $f and if ok either open it and return file descriptor # or return file name; otherwise return ".." # $how in {open check} # $mode in {r, w, wapp} global PERMS TXT MESS if { $f == "" } { bell ; return ".." } if { [file isdirectory $f] } { if { [file executable $f] } { cd $f ShowTEdit .fdlg.fr.wdir [pwd] 0 .fdlg.fr.frbx.box delete 0 end FillDir .fdlg.fr.frbx.box .fdlg.fr.fn delete 0 end } else { bell } } elseif { $mode == "r" } { if { [file readable $f] } { switch $how { open { return [open $f r] } check { return $f } } } else { bell } } elseif { [file exists $f] } { if { [file writable $f] } { if { $mode == "w" } { set l [list $TXT(ovwrt) $TXT(cancel)] set r {w 0} } else { # appending is an option set l [list $TXT(ovwrt) $TXT(app) $TXT(cancel)] set r {w a 0} } if { [set m [GMSelect $MESS(filexists) $l $r]] != 0 } { switch $how { open { return [open $f $m $PERMS] } check { return $f } } } } else { bell } } elseif { [file writable [pwd]] } { switch $how { open { if { $mode == "wapp" } { set mode a } return [open $f $mode $PERMS] } check { return $f } } } else { bell } return ".." } proc ChangeVolume {w vol} { # file volume has changed $vol in file-selection dialog $w if { ! [file isdirectory $vol] } { bell ; return } cd $vol ShowTEdit .fdlg.fr.wdir [pwd] 0 .fdlg.fr.frbx.box delete 0 end ; FillDir .fdlg.fr.frbx.box .fdlg.fr.fn delete 0 end return } ### font selection proc GMSelectFont {args} { # dialog for selecting a font # $args may contain the font description to return if the # default is selected; if empty "default" is returned # a font is defined by giving # one of [font families] and # the size in points or pixels, an integer > 0 # the weight, one of {normal bold} # the slant, one of {roman italic} # whether to use underline # whether to use overstrike # return empty list if cancelled, "default" or the description # in $args, or list with family, size, and other style # indicators in {normal bold roman italic underline overstrike} # where size follows the Tk convention (negative if in pixels) global GMFtDial TXT MESS LISTHEIGHT EPOSX EPOSY COLOUR array set GMFtDial { size 12 units points weight normal slant roman underline 0 overstrike 0 } if { [winfo exists .gmselfont] } { destroy .gmselfont } set w [GMToplevel .gmselfont selfont +$EPOSX+$EPOSY . \ {WM_DELETE_WINDOW {set GMFtDial(act) cancel}} \ [list {set GMFtDial(act) ok}]] frame $w.fr -borderwidth 5 -bg $COLOUR(selbg) label $w.fr.tit -text $TXT(selfont) set frbx $w.fr.frbx frame $frbx listbox $frbx.box -height $LISTHEIGHT -width 40 -selectmode single \ -yscrollcommand "$frbx.bscr set" -exportselection 1 scrollbar $frbx.bscr -command "$frbx.box yview" grid $frbx.box -row 0 -column 0 grid $frbx.bscr -row 0 -column 1 -sticky ns grid rowconfigure $frbx 0 -weight 1 grid columnconfigure $frbx 0 -weight 1 foreach fam [lsort -dictionary [font families]] { $frbx.box insert end $fam } frame $w.fr.frp set vars {} ; set descs {} foreach v {size units weight slant underline overstrike} { lappend vars GMFtDial($v) } set descs [list "=$TXT(size)" \ "~$TXT(units)/[list points pixels]" \ "~$TXT(weight)/[list normal bold]" \ "~$TXT(slant)/[list roman italic]" \ "@$TXT(underline)" "@$TXT(overstrike)"] set pes [lindex [GMSetupParams $w.fr.frp $vars $descs] 1] set frbs $w.fr.frbs frame $frbs foreach x {ok default cancel} { button $frbs.$x -text $TXT($x) -command "set GMFtDial(act) $x" pack $frbs.$x -side left } pack $w.fr.tit pack $frbs -side bottom -pady 5 pack $w.fr.frp -side bottom -pady 5 # must be the last one pack $w.fr.frbx -fill both -expand 1 -pady 5 grid $w.fr grid rowconfigure $w.fr 0 -weight 1 grid columnconfigure $w.fr 0 -weight 1 grid rowconfigure $w 0 -weight 1 grid columnconfigure $w 0 -weight 1 update idletasks # cannot use RaiseWindow because of menus set grabs [grab current] grab $w while 1 { tkwait variable GMFtDial(act) switch $GMFtDial(act) { cancel { set res {} ; break } default { if { [set res [lindex $args 0]] == {} } { set res default } break } ok { if { [set ix [$frbx.box curselection]] == {} } { GMMessage $MESS(mustselftfam) continue } GMUseEntries $w.fr.frp $pes set n [string trim $GMFtDial(size)] if { ! [CheckNumber GMMessage $n] } { continue } if { $n < 1 } { GMMessage [format $MESS(xcantbey) $TXT(size) 0] continue } if { $GMFtDial(units) == "pixels" } { set n [expr -$n] } set res [list [$frbx.box get $ix]] lappend res $n foreach x {weight slant} { lappend res $GMFtDial($x) } foreach x {underline overstrike} { if { $GMFtDial($x) } { lappend res $x } } break } } } DestroyRGrabs $w $grabs destroy $w return $res } ### utilities for dealing with parameters in a dialog proc GMSetupParams {w vars descs} { # set-up widgets for setting parameters in a dialog # $w is window parent # $vars is list of (global) vars to set; they must have a value # except those associated to entries which will be initialised to "" # and to menubuttons that if undefined will be initialised to ""; # array elements may also be given instead of normal variables but # the indices must be alphanumeric # $descs is associated list of value descriptions as: # @@TEXT button creating a balloon help with $TXT(TEXT), associated # variable declared as global but not used nor set # @TEXT checkbutton with label TEXT, values 0 1 # =@TEXT non-echo entry with label TEXT # =TEXT entry with label TEXT # !TEXT=MENUPROC/ARGS menubutton with label TEXT and menu filled by # proc MENUPROC; the arguments to the MENUPROC call are: # - the menu window # - the command to be associated with final entries, whose # arguments are the selected value and the menu window # - the elements of the list ARGS # |TEXT/LIST label TEXT and menubutton with text-variable for values # in LIST # +TEXT/LIST radiobuttons with possible values in LIST, label TEXT # /TEXT|LIST radiobuttons with possible values in LIST, label TEXT # ~TEXT/LIST radiobuttons with possible values in LIST but their # names are in the array TXT, label TEXT # LIST radiobutton with possible values in LIST # LISTs above cannot have repeated elements # return pair with flag set if there are menubuttons, and list of entries, # each as a triple, usually with path from $w to entry, the name of # global (array or normal) variable to be used in "global" and complete # name of variable to be used in "set"; for non-echo entries the # path is prefixed by a "@"; the list can be processed by proc GMUseEntries global COLOUR TXT NEEntry set i 0 ; set es "" ; set menus 0 foreach v $vars os $descs { if { [regexp {^([^(]+)[(]([^)]+)[)]$} $v x vname el] } { set vid "${vname}___ARR_$el" } else { set vid $v ; set vname $v } global $vname frame $w.f$i switch -glob -- $os { @@* { set os [string replace $os 0 1] set bh $w.f$i.bh$vid BalloonButton $bh $os pack $bh } @* { set os [string replace $os 0 0] set cb $w.f$i.c$vid checkbutton $cb -text $os -variable $v -anchor w \ -onvalue 1 -offvalue 0 -selectcolor $COLOUR(check) if { [set $v] } { $cb select } else { $cb deselect } pack $cb } =* { if { [string index $os 1] == "@" } { set z 1 } else { set z 0 } set os [string replace $os 0 $z] set wl [label $w.f$i.l$vid -text $os] set ppath f$i.e$vid set we [entry $w.f$i.e$vid -width 30] TextBindings $we if { $z } { set NEEntry($we) "" bind $we "GMNEEntry $we _ BackSpace ; break" bind $we "GMNEEntry $we %A %K ; break" set ppath "@$ppath" } if { [catch {set $v}] } { set $v "" } elseif { $z == 0 } { $we insert 0 [set $v] } pack $wl $we -side left lappend es [list $ppath $vname $v] } !* { set menus 1 if { ! [regexp {^!([^=]+)=([^/]+)/(.*)$} $os \ m lab menuproc mpargs] } { BUG Bad argument to GMSetupParams ! } set mb $w.f$i.mb$vid menubutton $mb -text $lab -relief raised \ -direction below -menu $mb.m menu $mb.m eval $menuproc $mb.m GMChangeParam $mpargs if { [catch {set $v}] } { set $v "" } set wl [label $w.f$i.l$vid -textvariable $v] pack $mb $wl -side left } |* { set menus 1 if { ! [regexp {^[|]([^/]+)/(.*)$} $os \ m lab lst] } { BUG Bad argument to GMSetupParams | } set wl [label $w.f$i.t$vid -text $lab -width 16] set mb $w.f$i.mb$vid menubutton $mb -textvariable $v -relief raised \ -direction below -menu $mb.m menu $mb.m foreach x $lst { $mb.m add command -label $x -command "set $v $x" } pack $wl $mb -side left } +* - /* - ~* { set labval [string first "~" $os] if { ! [regexp {^.([^/]+)/(.+)$} $os m lab lst] } { BUG Bad argument to GMSetupParams +/~ continue } pack [label $w.f$i.l$vid -text $lab] -side left set k 0 set wrb $w.f$i.r_${vid}_0 foreach o $lst { if { $labval } { set lv $o } else { set lv $TXT($o) } set rb $w.f$i.r_${vid}_$k radiobutton $rb -text $lv -variable $v \ -value $o -anchor w -selectcolor $COLOUR(check) pack $rb -side left -padx 2 if { [set $v] == $o } { set wrb $rb } incr k } $wrb invoke } default { set k 0 set wrb $w.f$i.rd_${vid}_0 foreach o $os { set rb $w.f$i.rd_${vid}_$k radiobutton $rb -text $o -variable $v \ -value $o -anchor w -selectcolor $COLOUR(check) pack $rb -side left -padx 2 if { [set $v] == $o } { set wrb $rb } incr k } $wrb invoke } } pack $w.f$i -side top -fill x -expand 1 incr i } return [list $menus $es] } proc GMNEEntry {e char ksym} { # keep track of characters typed in a non-echo entry $e # current contents are kept on global NEEntry($e) that should be unset # after use global NEEntry PASSWDECHO if { $PASSWDECHO == "none" } { echo 0 $e delete 0 end } else { set echo 1 } if { $ksym == "BackSpace" } { set NEEntry($e) [string replace $NEEntry($e) end end] if { $echo } { $e delete 0 } return } if { $ksym == $char || $ksym == "??" || [regexp {^[a-z]} $ksym] } { append NEEntry($e) $char if { $echo } { $e insert end $PASSWDECHO } } return } proc GMChangeParam {val varmenu args} { # parameter value changed by a selection in a menu # $varmenu is either the menu path assumed to have a single occurrence # of .mbVARID. or has the form =VARID where VARID either is the name # of the global simple variable to set, or has is the string # concatenation of a global array identifier, "___ARR_" and # an array index # $args may be TXT to force value to be $TXT($val) global TXT if { ! [regexp {^=(.+)$} $varmenu x v] } { regexp {\.mb([^.]+)\.} $varmenu x v } if { [regexp {^(.+)___ARR_(.+)$} $v x v ix] } { global $v append v "(" $ix ")" } else { global $v } if { $args == "TXT" } { set val $TXT($val) } set $v $val return } proc GMUseEntries {w es} { # set global variables according to entries set-up by proc GMSetupParams # $w is window parent # $es is list of triples usually with path from $w to entry, # name of global (array or normal) variable to be used in "global" and # complete name of variable to be used in "set"; for non-echo entries # the path is prefixed with a "@" # current contents of non-echo entries are kept on global array NEEntry # (see proc GMNEEntry) and corresponding elements are unset here global NEEntry foreach e $es { global [lindex $e 1] if { [string index [set ppath [lindex $e 0]] 0] == "@" } { set ppath $w.[string replace $ppath 0 0] set v $NEEntry($ppath) unset NEEntry($ppath) } else { set v [$w.$ppath get] } set [lindex $e 2] $v } return } ### image listbox widget proc ImageListbox {act path args} { # implements a new widget whose model is a listbox but has entries # with an image and possibly a text label # $act is the action to perform and determines $args # create SIZE WIDTH EHEIGHT SELECTMODE ?SCROLLBAR? # insert INDEX IMAGE TEXT ?TAGS?; return either index or -1 if entry # can not be inserted because IMAGE cannot be displayed and TEXT # is empty # delete INDEX ?INDEX? # get INDEX ?INDEX? ; return list of texts in entries # gettags INDEX ?INDEX? ; return list of tags in entries # selclr INDEX ?INDEX? ; clear selected # selset INDEX ?INDEX? ; set as selected (irrespective of SELECTMODE) # cursel "" ; return list of indices of currently selected entries # getsel "" ; return list of texts in currently selected entries # getseltags "" ; return list of lists each with the tags in currently # selected entries # seldel "" ; delete selected entries # index Y ; return index of entry at y-coordinate (inside listbox) # destroyall "" ; destroy all image listboxes under window $path # where # SELECTMODE is one of {single, extended} # EHEIGHT is the height for the entries in pixels (minimum used: 5) # INDEX is either a numeric index from 0 or "end" # TAGS is a list # the widget should be packed or grided by caller after being created # images that have more than EHEIGHT-4 in width or height are either # truncated to that size if they are of type photo, or not displayed # information related to these widgets is stored in global array GMIBox # auxiliary images are created but never deleted; their names can be # retrieved from GMIBox(img,*) entries # bindings on entries: # deselects everything, selects entry # if SELECTMODE=="extended": # toggles selection state of entry # selects range from last selected entry to entry global GMIBox COLOUR if { $act == "destroyall" } { foreach n [array names GMIBox $path*,csize] { regsub {,csize$} $n "" lbox destroy $lbox } array unset GMIBox $path* return } if { [set nargs [llength $args]] != 0 } { foreach "a1 a2 a3 a4 a5" $args { break } } if { $act != "create" } { if { [catch {set csize $GMIBox($path,csize)}] } { BUG trying to use non-existing ImageListbox } set end $csize if { $end > 0 } { incr end -1 } foreach x "sel eh ew mode" { set $x $GMIBox($path,$x) } } set res "" switch $act { create { # SIZE WIDTH EHEIGHT MODE ?SCROLLBAR? if { $nargs < 4 } { BUG missing args to ImageListbox create } if { $a3 < 5 } { set a3 5 } set height [expr $a1*$a3] foreach x "csize sel eh ew mode anchor base height" \ v "0 {} $a3 $a2 $a4 {} 0 $height" { set GMIBox($path,$x) $v } canvas $path -height $height -width $a2 -confine 1 \ -borderwidth 2 -relief sunken if { $a5 != "" } { $path configure -yscrollincrement $a3 \ -yscrollcommand "ImageListboxScroll $path $a5" \ -scrollregion "0 0 $a2 $height" trace variable GMIBox($path,csize) w ImageListboxResize } $path bind entry \ "ImageListboxESButton $path %y ; break" $path bind entry \ "ImageListboxECButton $path %y ; break" $path bind entry "ImageListboxEButton $path %y" } insert { # INDEX IMAGE TEXT ?TAGS? if { $nargs < 3 } { BUG missing args to ImageListbox insert } set ih [expr $eh-2] if { $a2 != "" && \ ([image width $a2] > $ih || [image height $a2] > $ih) } { if { [image type $a2] != "photo" } { if { $a3 == "" } { return -1 } set a2 "" } else { if { [catch {set im $GMIBox(img,for,$a2)}] } { set im [image create photo -width $ih -height $ih] $im copy $a2 -from 0 0 $ih $ih set GMIBox(img,for,$a2) $im } set a2 $im } } if { $a1 != "end" } { set na1 [ImageListboxIndices $path $end $a1] if { $a1 > $na1 } { # assuming given index must be an integer set na1 $csize } # update selection set s "" foreach e $GMIBox($path,sel) { if { $e >= $na1 } { incr e } lappend s $e } set GMIBox($path,sel) $s # move lower entries down set y0 [expr $na1*$eh] if { $csize > 0 && $na1 < $csize } { foreach it [$path find withtag entry] { if { [lindex [$path coords $it] 1] >= $y0 } { $path move $it 0 $eh } } } } else { set y0 [expr $csize*$eh] } $path create rectangle 1 [expr $y0+1] $ew [expr $y0+$eh] \ -fill $COLOUR(bg) -outline $COLOUR(bg) \ -tags [list txt entry bg "tgs=$a4"] # texts are created even if empty so that they can be retrieved $path create text [expr $eh+8] [expr $y0+$eh/2] -anchor w \ -text $a3 -fill $COLOUR(fg) \ -tags [list txt entry "txt=$a3"] if { $a2 != "" } { $path create image 5 [expr $y0+2] -anchor nw -image $a2 \ -tags "img entry" } incr GMIBox($path,csize) update idletasks } delete { # INDEX ?INDEX? if { $nargs < 1 } { BUG missing args to ImageListbox delete } foreach "a1 a2" [ImageListboxIndices $path $end [list $a1 $a2]] {} if { $a2 == "" } { set a2 $a1 } if { [set ndel [expr $a2-$a1+1]] == $csize } { $path delete all set GMIBox($path,sel) "" } else { # update selection set s "" foreach e $GMIBox($path,sel) { if { $e < $a1 } { lappend s $e } elseif { $e > $a2 } { lappend s [expr $e-$ndel] } } set GMIBox($path,sel) $s # move lower entries up set y0 [expr $a1*$eh] ; set yn [expr ($a2+1)*$eh] set dy [expr -$ndel*$eh] foreach it [$path find withtag entry] { if { [set y [lindex [$path coords $it] 1]] >= $y0 } { if { $y >= $yn } { $path move $it 0 $dy } else { $path delete $it } } } } set GMIBox($path,csize) [expr $csize-$ndel] update idletasks } get { # INDEX ?INDEX? if { $nargs < 1 } { BUG missing args to ImageListbox get } foreach "a1 a2" [ImageListboxIndices $path $end [list $a1 $a2]] {} if { $a2 == "" } { set a2 $a1 } set y0 [expr $a1*$eh] ; set yn [expr ($a2+1)*$eh] set r "" foreach it [$path find withtag txt] { if { [set y [lindex [$path coords $it] 1]] >= $y0 && \ $y < $yn } { foreach t [$path gettags $it] { if { [regsub {^txt=} $t "" tx] } { lappend r [list [expr round($y)] $tx] break } } } } foreach p [lsort -integer -index 0 $r] { lappend res [lindex $p 1] } } gettags { # INDEX ?INDEX? if { $nargs < 1 } { BUG missing args to ImageListbox gettags } foreach "a1 a2" [ImageListboxIndices $path $end [list $a1 $a2]] {} if { $a2 == "" } { set a2 $a1 } set y0 [expr $a1*$eh] ; set yn [expr ($a2+1)*$eh] set r "" foreach it [$path find withtag txt] { if { [set y [lindex [$path coords $it] 1]] >= $y0 && \ $y < $yn } { foreach t [$path gettags $it] { if { [regsub {^tgs=} $t "" tgs] } { lappend r [list [expr round($y)] $tgs] break } } } } foreach p [lsort -integer -index 0 $r] { lappend res [lindex $p 1] } } selset { # INDEX ?INDEX? # add to selection, irrespective of $mode # keep selection list ordered if { $nargs < 1 } { BUG missing args to ImageListbox selset } foreach "a1 a2" [ImageListboxIndices $path $end [list $a1 $a2]] {} if { $a2 == "" } { set a2 $a1 } set y0 [expr $a1*$eh+2] set s "" foreach ix $sel { if { $ix == $a1 } { if { [incr a1] > $a2 } { set a1 1e10 } else { set y0 [expr $y0+$eh] } } else { while { $a1 < $ix } { ImageListboxSelect sel $path $y0 lappend s $a1 if { [incr a1] > $a2 } { set a1 1e10 } else { set y0 [expr $y0+$eh] } } } lappend s $ix } while { $a1 <= $a2 } { ImageListboxSelect sel $path $y0 lappend s $a1 incr a1 ; set y0 [expr $y0+$eh] } set GMIBox($path,sel) $s update idletasks } selclr { # INDEX ?INDEX? # keep selection list ordered if { $nargs < 1 } { BUG missing args to ImageListbox selclr } foreach "a1 a2" [ImageListboxIndices $path $end [list $a1 $a2]] {} if { $a2 == "" } { set a2 $a1 } set s "" foreach ix $sel { if { $ix >= $a1 && $ix <= $a2 } { ImageListboxSelect clear $path [expr $ix*$eh+2] } else { lappend s $ix } } set GMIBox($path,sel) $s update idletasks } cursel { set res $sel } getsel { set dy [expr $eh-1] foreach ix $sel { set y0 [expr $ix*$eh] foreach it [$path find overlapping 0 $y0 100 [expr $y0+$dy]] { foreach t [$path gettags $it] { if { [regsub {^txt=} $t "" tx] } { lappend res $tx break } } } } } getseltags { foreach ix $sel { set y0 [expr ($ix+0.5)*$eh] foreach it [$path find overlapping 0 $y0 100 [expr $y0+4]] { foreach t [$path gettags $it] { if { [regsub {^tgs=} $t "" tgs] } { lappend res $tgs break } } } } } seldel { set dy [expr -$eh] foreach ix [lsort -integer -decreasing $sel] { # move lower entries up set y0 [expr $ix*$eh] ; set yn [expr $y0+$eh] foreach it [$path find withtag entry] { if { [set y [lindex [$path coords $it] 1]] >= $yn } { $path move $it 0 $dy } elseif { $y >= $y0 } { $path delete $it } } } set GMIBox($path,csize) [expr $csize-[llength $sel]] set GMIBox($path,sel) "" update idletasks } index { # Y (coordinates inside listbox) if { $nargs < 1 } { BUG missing args to ImageListbox index } set res [expr int($a1/$GMIBox($path,eh))+$GMIBox($path,base)] if { $res > $end } { set res $end } } default { BUG calling ImageListbox with wrong action } } return $res } proc ImageListboxScroll {path scr pos0 posf} { # scrolling image listbox # $scr is scrollbar # $pos0, $posf are the arguments to the scrolling command # percentage of vertical dimension for top and bottom positions global GMIBox set s $GMIBox($path,csize) set GMIBox($path,base) [expr round($s*$pos0)] $scr set $pos0 $posf return } proc ImageListboxResize {a aix op} { # called by trace when $GMIBox($path,csize) has been changed # resize scroll region after a change of size in image listbox global GMIBox regsub {,csize} $aix "" path if { ! [winfo exists $path] } { return } if { [set nh [expr $GMIBox($path,csize)*$GMIBox($path,eh)]] < \ [set max $GMIBox($path,height)] } { set nh $max } $path configure -scrollregion "0 0 $GMIBox($path,ew) $nh" return } proc ImageListboxSelect {act path y0} { # change aspect of entry when selection state changes # $act in {sel, clear} global GMIBox COLOUR if { $act != "sel" } { set act "" } foreach it [$path find overlapping 0 $y0 100 [expr $y0+4]]] { if { [lsearch -exact [$path gettags $it] bg] != -1 } { $path itemconfigure $it -fill $COLOUR(${act}bg) break } } return } proc ImageListboxIndices {path end ixs} { # check indices of image-listbox widget that must be in (non-strict) # increasing order # $ixs is list of non-negative integers, "end", or "" (discarded) # $end is either 0 or current size-1 # return list of integers in the 0..$end range set r "" ; set min 0 foreach ix $ixs { if { $ix == "" } { continue } if { $ix == "end" } { set ix $end } elseif { ! [regexp {^[1-9]*[0-9]+$} $ix] } { if { $ix != "end" } { BUG bad index for ImageListbox } set ix $end } elseif { $ix > $end } { set ix $end } if { $ix < $min } { BUG bad index for ImageListbox } set min $ix lappend r $ix } return $r } proc ImageListboxEButton {path y} { # mouse button-1 on ImageListbox entry global GMIBox if { $GMIBox($path,sel) != "" } { ImageListbox selclr $path 0 end } set ix [expr int($y/$GMIBox($path,eh))+$GMIBox($path,base)] ImageListbox selset $path $ix set GMIBox($path,anchor) $ix return } proc ImageListboxECButton {path y} { # mouse control-button-1 on ImageListbox entry global GMIBox if { $GMIBox($path,mode) != "extended" } { return } set ix [expr int($y/$GMIBox($path,eh))+$GMIBox($path,base)] if { [lsearch -exact $GMIBox($path,sel) $ix] != -1 } { ImageListbox selclr $path $ix set GMIBox($path,anchor) "" } else { ImageListbox selset $path $ix set GMIBox($path,anchor) $ix } return } proc ImageListboxESButton {path y} { # mouse shift-button-1 on ImageListbox entry global GMIBox if { $GMIBox($path,mode) != "extended" } { return } if { [set a $GMIBox($path,anchor)] == "" } { ImageListboxEButton $path $y return } if { [set ix [expr int($y/$GMIBox($path,eh))+$GMIBox($path,base)]] \ != $a } { if { $ix > $a } { ImageListbox selset $path $a $ix } else { ImageListbox selset $path $ix $a } } set GMIBox($path,anchor) $ix return } gpsman-6.4.4.2/gmsrc/main.tcl0000644000175000017500000002026312224351120014022 0ustar migmig# # This file is part of: # # gpsman --- GPS Manager: a manager for GPS receiver data # # Copyright (c) 1998-2013 Miguel Filgueiras migfilg@t-online.de # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. # # File: main.tcl # Last change: 6 October 2013 # # code here or called from here is not affected by patch files set VERSIONDATE(day) 6 set VERSIONDATE(month) 10 set VERSIONDATE(year) 2013 set VERSION 6.4.4.2 # these tests here prevent errors in the lang*.tcl files if { [lsearch -exact {KM NAUTMILE STATMILE} $DISTUNIT] == -1 } { puts stderr \ "Bad value in variable DISTUNIT: $DISTUNIT (see file config.tcl)" exit 1 } if { [lsearch -exact {M FT} $ALTUNIT] == -1 } { puts stderr "Bad value in variable ALTUNIT: $ALTUNIT (see file gpsman.tcl)" exit 1 } # conversion factors to km array set DSCALEFOR { KM 1 sub,KM 0.001 NAUTMILE 0.5399568 sub,NAUTMILE 0.00016457916 STATMILE 0.6213882 sub,STATMILE 0.00018939432 } # conversion factors from km2 to km2, and from nml2 to nml2 or stml2 array set ASCALEFOR { KM 1 NAUTMILE 1 STATMILE 2.5899881 } # conversion factors to metre array set ALSCALEFOR { M 1 FT 0.3048 } # MAPDISTS must have a single value of 1 (for the main distance unit) # all values before taken to be in sub-unit set MAPDISTSFOR(KM) [list "50 m" "100 m" "200 m" "500 m" "1 km" "2 km" \ "4 km" "8 km" "16 km" "32 km" "64 km" "128 km" "512 km"] set MAPDISTSFOR(NAUTMILE) [list "150 ft" "300 ft" "600 ft" "1200 ft" \ "2400 ft" "1 n ml" "2 n ml" "4 n ml" "8 n ml" "16 n ml" "32 n ml" \ "64 n ml" "128 n ml" "512 n ml"] set MAPDISTSFOR(STATMILE) [list "150 ft" "300 ft" "600 ft" "1200 ft" \ "2400 ft" "1 st ml" "2 st ml" "4 st ml" "8 st ml" "16 st ml" \ "32 st ml" "64 st ml" "128 st ml" "512 st ml"] # default denotations for units; can be overriden by lang*.tcl set MAPDISTUNITS(KM) [list km m] set MAPDISTUNITS(NAUTMILE) [list "n ml" ft] set MAPDISTUNITS(STATMILE) [list "st ml" ft] set DSCALE $DSCALEFOR($DISTUNIT) set SUBDSCALE $DSCALEFOR(sub,$DISTUNIT) set ASCALE $ASCALEFOR($DISTUNIT) set ALSCALE $ALSCALEFOR($ALTUNIT) set MAPDISTS $MAPDISTSFOR($DISTUNIT) set MAPFTSIZES "Tcl/Tk 9 10 11 12 14 18 24 36" # needed for error dialogs set WindowStack "" # knonw languages set KNOWNLANGS {deutsch engl es fr id it nl port ru} # known date formats are the indices of this array (for their widths in chars) array set DATEW { YYYYMMDD 19 ISO8601 22 YYYY-MM-DD 21 MMDDYYYY 19 DDMMMYYYY 20 YYYY/MM/DD 19 } # other source files # source the English messages; other language files can omit translations SourceEnc [file join $SRCDIR langengl.tcl] foreach f $SRCFILESBEGIN { SourceEnc [file join $SRCDIR $f.tcl] } # other tests if { int($TimeOffset) != $TimeOffset && int(2*$TimeOffset) != 2*$TimeOffset } { GMMessage $MESS(timeoffnotint) wait exit 1 } # fonts are needed in proc AboutInfo # save Tk default as it may be needed later set TkDefaultFont [font actual default] if { $DEFAULTFONT != "default" } { set DefaultFont $DEFAULTFONT option add *Font $DEFAULTFONT } else { set DefaultFont $TkDefaultFont } if { $FIXEDFONT != "default" } { set FixedFont $FIXEDFONT } else { set FixedFont fixed } ## proc AboutInfo {w} { # create widgets for displaying information about GPSMan in window $w # all widgets will be inside frame $w.fr and are packed global Logo VERSION VERSIONDATE DateFormat COLOUR EPOSX EPOSY TXT \ FixedFont frame $w.fr -relief flat -borderwidth 5 -bg $COLOUR(messbg) if { $Logo != "" } { label $w.fr.im -image $Logo -relief groove pack $w.fr.im } set d [FormatDay $DateFormat $VERSIONDATE(year) $VERSIONDATE(month) \ $VERSIONDATE(day)] label $w.fr.title -text "$TXT(GMtit) $VERSION / $d" -relief groove set frc $w.fr.frc frame $frc -relief flat -borderwidth 0 text $frc.txt -width 80 -height 12 -font $FixedFont -wrap word \ -yscrollcommand "$frc.tscrl set" bind $frc.txt "$frc.txt yview scroll 1 pages ; break" bind $frc.txt "$frc.txt yview scroll -1 pages ; break" bind $frc.txt break scrollbar $frc.tscrl -command "$frc.txt yview" $frc.txt insert 1.0 "Copyright (c) $VERSIONDATE(year) \ Miguel Filgueiras\n\ * $TXT(errorsto) migfilg _AT_ t-online.de\n\ $TXT(contrib):\n\ * Brian Baulch (baulchb_AT_onthenet.com.au)\n\ * Andreas Lange (Andreas.C.Lange_AT_GMX.de)\n\ * Alessandro Palmas (alpalmas_AT_tin.it)\n\ * Valere Robin (valere.robin_AT_wanadoo.fr)\n\ * Rob Buitenhuis (geo_AT_btnhs.nl)\n\ * Tri Agus Prayitno (acuss_AT_bk.or.id)\n\ * Matt Martin (matt.martin_AT_ieee.org)\n\ * Stefan Heine (stefan.heinen_AT_djh-freeweb.de)\n\ * Sabine Broda (sbb_AT_dcc.fc.up.pt)\n\ * Alberto Morales (amd77_AT_gulic.org)\n\ * Martin Buck (m_AT_rtin-buck.de)\n\ * David Kaplan (dmkaplan_AT_ucdavis.edu)\n\ * Jean H Theoret (ve2za_AT_rac.ca)\n\ * Paul Scorer (p.scorer_AT_leedsmet.ac.uk)\n\ * Nigel Orr (gps_AT_river-view.freeserve.co.uk)\n\ * David Gardner (djgardner_AT_users.sourceforge.net)\n\ * Nikolai Kosyakoff (priroda.net_AT_gmail.com)\n\ * Benoit Steiner (benetsteph_AT_free.fr)\n\ * Sandor Laky (laky.sandor_AT_freemail.hu)\n\ * Alexander B. Preobrazhenskiy (modul_AT_ihome.ru)\n * Rudolf Martin (rudolf.martin_AT_gmx.de)" grid $frc.txt -column 0 -row 1 -sticky nesw grid $frc.tscrl -column 1 -row 1 -sticky nesw pack $w.fr -side top pack $w.fr.title $frc -side top -pady 5 return } ### images needed when starting up # user-defined symbol menu (high-level description); see symbols.tcl set SYUSRMENU "" if { [file readable [set UFile(symenu) [file join $USERDIR symenu]]] } { LoadSymbolCustomMenu } InitImages ### on Unix systems GPSMan cannot be executed as root for security reasons ### this can be disabled by replacing the condition in the if by 0 (zero) if { $UNIX && $env(USER) == "root" } { GMMessage $MESS(cantexecasroot) wait exit 1 } ### if no user GPSMan-data directory force one being created if { $InitDir } { if { ! [GMConfirm [format $MESS(oktomkdir) $USERDIR]] || \ [catch {file mkdir $USERDIR}] } { GMMessage [format $MESS(createdir) $USERDIR] wait exit 1 } } elseif { $UDUnwritable } { GMMessage [format $MESS(cantwrtdir) $USERDIR] wait exit 1 } ## similar for temporary file directory, no question, clean all files if { ! [file exists $USERTMPDIR] } { if { [catch {file mkdir $USERTMPDIR}] } { GMMessage [format $MESS(createdir) $USERTMPDIR] wait exit 1 } } if { ! [file writable $USERTMPDIR] } { GMMessage [format $MESS(cantwrtdir) $USERTMPDIR] wait exit 1 } foreach f [glob -nocomplain $USERTMPDIR/*] { catch [file delete -force -- $f] } if { [glob -nocomplain $USERTMPDIR/*] != {} } { GMMessage [format $MESS(cantcleandir) $USERTMPDIR] } ### UserDefinitions ### if no preferences file force one being written if { $InitOpts || [OutDatedOptions] } { if { [SetOptions] } { GMMessage $MESS(goingdown) wait exit 0 } exit 1 } ### read source files # files that depend on receiver trade mark foreach f $SRCFILESFOR($MYGPS) { SourceEnc [file join $SRCDIR $f.tcl] } # files that may depend on the preferences file foreach f $SRCFILESEND { SourceEnc [file join $SRCDIR $f.tcl] } # conditional files foreach p $SRCFILESCOND { if { [set [lindex $p 0]] } { SourceEnc [file join $SRCDIR [lindex $p 1].tcl] } } # user code assumed to be in system encoding set ucode [file join $USERDIR patch.tcl] if { [file exists $ucode] } { source $ucode set VERSION "$VERSION-patched" } gpsman-6.4.4.2/gmsrc/langengl.tcl0000644000175000017500000013711112224351120014666 0ustar migmig# # This file is part of: # # gpsman --- GPS Manager: a manager for GPS receiver data # # Copyright (c) 1998-2013 Miguel Filgueiras migfilg@t-online.de # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. # # File: langengl.tcl # Last change: 6 October 2013 # # Includes contributions by # - Brian Baulch (baulchb _AT_ onthenet.com.au) # - Matt Martin (matt.martin _AT_ ieee.org) # - Jean H Theoret (ve2za _AT_ rac.ca) # - Valere Robin (valere.robin _AT_ wanadoo.fr) # - David Gardner (djgardner _AT_ users.sourceforge.net) # - Rudolf Martin (rudolf.martin _AT_ gmx.de) # # only 3 chars long names; check also ALLMONTH in file i18n-utf8.tcl set MONTHNAMES "Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec" set DLUNIT(KM,dist) km set DLUNIT(KM,subdist) m set DLUNIT(KM,speed) kph set DLUNIT(KM,area) "sq km" set DLUNIT(NAUTMILE,dist) "nm" set DLUNIT(NAUTMILE,subdist) ft set DLUNIT(NAUTMILE,speed) knot set DLUNIT(NAUTMILE,area) "sq nm" set DLUNIT(STATMILE,dist) "st ml" set DLUNIT(STATMILE,subdist) ft set DLUNIT(STATMILE,speed) mph set DLUNIT(STATMILE,area) "section" set DLUNIT(M,dist) $DLUNIT(KM,subdist) set DLUNIT(FT,dist) $DLUNIT(STATMILE,subdist) set DTUNIT $DLUNIT($DISTUNIT,dist) set SPUNIT $DLUNIT($DISTUNIT,speed) set ARUNIT $DLUNIT($DISTUNIT,area) set ALUNIT $DLUNIT($ALTUNIT,dist) set MESS(RTcomp) "#\tWP\t\t$DTUNIT\tdeg\t$ALUNIT" set MESS(TRcomp) "#\t\t\t\t$ALUNIT\t$DTUNIT\t$DTUNIT\th:m:s\t$SPUNIT\tdeg" set MESS(WPNearest) "WP\t\t$DTUNIT\tdeg" array set MESS { badscale "Bad value for map scale" oktoexit "Ok to exit (unsaved data will be lost)" okclrmap "Ok to clear map" namelgth "Name must not exceed %d characters" cmmtlgth "Comment must not exceed %d characters" namevoid "Name cannot be void" baddate "Bad date; line" badhdg "Bad heading %s: must be %s or +/-" badcoord "Bad coordinate range or format: \"%s\" must be %s" outofrng "Number out of range" UTMZN "Must be a letter in A..H, J..N, or P..Z" badstrg "Bad character(s)" strgvoid "String cannot be empty" nan "\"%s\" is not a number" written "Written by" undefWP "Route %s has undefined WP(s); not saved/exported" bigRT "Route %s > max number; not exported" unkndatum "Unknown datum" badcommdWP "Bad command when loading WPs; line" notabsWP "Bad WP definition; no tabs, line" undefinedWP "Reference to unknown WP: %s" undefinedTR "Unknown TR" nofieldsWP "Bad WP, not enough fields; line" excfieldsWP "Bad WP, too many fields; line" badWPsRT "RT with bad waypoints list; line" toomuchWPs "Warning: more than %d WPs in RT" badcommdTP "Bad command when loading TPs; line" badcommdLP "Bad command when loading LPs; line" badTP "Bad point in TR; line" badTPsTR "TR with bad trackpoints list; line" badLP "Bad point in LN; line" badLPsLN "LN with bad points list; line" noheader "File does not start with header" loaderr "Error when loading from file; line" unkncommd "Unknown command when loading from file; line" noformat "File does not start with Format line" badformat "Bad format line" badRT "Bad RT definition; line" badRTargs "Bad RT arguments; line" badTR "Bad TR definition; line" fileact "%s %s file?" filexists "File exists!" GPSok "Connection ok" toomany "Too many %ss (> %d)" cantfgt "Cannot forget %s: belongs to mapped item" cantfgted "Cannot forget %s: being edited" cantmapRTunkn "Route not mapped; no info for WP" cantmapRTed "Route not mapped; WP beig edited" cantrun "Cannot run" inprogr "Operation already in progress" cantread "Cannot read auxiliary file" cantwrtopt "Cannot write preferences file" voidRT "Route contains no waypoints" activeRT "Route 0 is active route; continue?" voidTR "Track contains no points" voidLN "Line contains no points" idinuse "Identifier already in use" cantunmap "Cannot unmap %s: belongs to mapped item" askrevert "Revert to initial data?" askforget "Forget this %s?" notimpl "Not implemented" forgetall "Forget all items in %s list?" counted "There are %d %ss defined" notlisted "Item not listed" wrgval "Bad value for" voidGR "Group has no elements" initselfGR "Group contains itself via" GRelout "Command for element outside GR definition; line" badGRels "Group with bad elements list; line" badcommdGRel "Bad command when loading GR elements; line" notypeforGRel "Element with no type; line" badGRel "Bad element definition; line" check "Checking connection" toomanyerr "Too many errors; aborting..." getWP "Getting WPoints" getRT "Getting Routes" getTR "Getting Tracks" getLAP "Getting Laps" getAL "Getting almanac" putWP "Putting WPoints" putRT "Putting Routes" putTR "Putting Tracks" fillbuffWP "Loading WP buffer" fillbuffRT "Loading RT buffer" noACKNAK "Got packet when expecting ACK/NAK; check GPS connection" badplatform "No I/O with serial port in this platform" badserial "Cannot open device %s" nodata "No %ss in receiver" badimage "Bad image file" mapadjust "Please place WPs on map; click Ok when finished" duplicate "%s already selected" clrcurrmap "Clear current map?" mbkbaddatum "No or unknown datum" mbkbadscale "Scale must be non-negative" mbkbadat "Bad arguments" edityourrisk "Edit at your own risk!" okclrbkmap "Ok to clear map background" okclrbkim "Ok to clear image at" badattrval "Wrong %s optional field value: %s" badattr "Unknown %s optional field name: %s" badSYMBOLcode "Bad symbol code" badDISPOPTcode "Bad display option code" goingdown "Preferences saved; please restart" putwhat "Put what item types?" readwhat "Read what item types?" noWPinx "Too many WPs for receiver" noICinx "Too many ICs for receiver" getIC "Getting Icons" serial1 "Incorrect Header Preamble" serial2 "Incorrect Command returned" checksum1 "Incorrect Header Checksum" checksum2 "Data Checksum error" receiver "Not connected to device!" importonly1 "Can only import 1 kind of data" exportonly1 "Can only export 1 kind of data" outdatedprefs "Preferences file outdated; please check it now" mustchoose1type "At least 1 kind of items must be selected" nosuchitems "No item corresponds to description" resultsin "Search results in Group" badWP "WP not given or undefined" badangle "Angle must be >0 and <360 degrees" georefhow "Geo-referencing method" cantsolve "Cannot solve equations" transfcantscale "No scaling with current transformation" oldfilefmt "Old file format; please save under new format!" unknProj "Unknown map projection" unknTransf "Unknown map transformation" badProjargs "Wrong arguments for projection" badTransfargs "Wrong arguments for transformation" badfield "Bad attribute=value pair" badattr "Bad attribute name" missattrs "Missing attribute(s)" mbkbadproj "Bad map projection" mbkbadtransf "Bad map transformation" notUTMproj "Saved info for UTM; proceed with projection set to" projchg "Please confirm projection parameters" badparam "Bad value for %s" connectedto "Connected to %s" recnotsuppd "Receiver model not supported" gotprots "Got protocols definition" badprots "Bad protocols definition" defprots "Using table of protocols" nohidden "Discard hidden data?" badRS "Route stage outside RT definition; line" badWPsRSs "RT stage before 1st or after last WP; line" windowdestr "The window has been destroyed!" badhidden "Bad format for hidden value" replname "Replace \"%s\" by a name having at most %d of the following characters: %s" badalt "Bad value for altitude" baddistunit "Bad distance unit for map scale in preferences file" badgridzone "Invalid grid zone" outofgrid "Position out of grid scope" timeoffnotint "Time offset must be an integer or end in .5" cantchkprot "Cannot check under current protocol" mustconn1st "Check connection with receiver first" rltmnotsupp "Real time log not supported by protocol in this receiver" createdir "Please create directory %s and restart" oktomkdir "Ok to create directory %s?" projnameabbr "Please give a name and a short name to the new projection" abbrevinuse "Short name already taken" nameinuse "Name already taken" projinuse "Projection is being used; changes will be discarded" gridneedsdatum "Bad grid definition for %s; no datum given" badgriddatum "Datum for the grid %s must be %s" cantchggriddatum "This grid needs the datum %s" gridinuse "Grid, used by %s, cannot be deleted; continue?" gridinusenochg "This grid is used by %s; no changes made" cantwrtprgr "Cannot write user projections file" cantwrtdtel "Cannot write user datums file" movingWP "Place %s with left-click\nCancel with right-click" missingdata "Not enough data!" needs1wp "Route must have at least 1 waypoint" emptypos "Position with empty field(s)" cantwrtsstate "Cannot write saved state file: %s" cantrdsstate "Cannot read saved state file: %s" corruptsstate "Corrupt saved state file: %s" editrisk "Edit at your own risk!" savestate "Save current state?" delsstate "Delete saved state files?" badmapinfo "Bad map parameters file" badMHloc "Wrong Maidenhead locator" areais "Area of (non-self intersecting) polygon is %.3f%s" areatoosmall "Area is too small (<%s sq km)" projarea "Computing projected area" selfintsct "Repeated WPs: RT cannot intersect itself!" badinvmdist "Approximation error when inverting meridional distance" badinvproj "Approximation error when inverting %s projection" negdlatlong "Lat/long range cannot be negative!" allundef "There are no definitions for the WPs in the GR" badfloats "Floating-point conversions not working correctly; are you sure you want to connect?" noprintcmd "No print command; give one in the options" cantexecasroot "GPSMan cannot be executed by root" badargtofunc "Bad argument to %s function" redefproj "User defined %s projection deletes a pre-defined projection under the same short name; please change your definition!" couldntcd "Failed to change to directory %s" shpext "Bad extension %s; ok to use .shp, .shx, .dbf?" shpcntopen "Could not create/open Shapefile files" shpcntcrtfs "Could not create Shapefile .dbf fields" shpcntwrtfs "Could not write Shapefile .dbf fields" shpoutmem "Out of memory!" shpemptyfile "Empty file" shpwrongfile "File type invalid" shplessdim "Dimension in file less than required; go on?" shpbadWPinRT "%d-th WP with bad coordinates ignored in RT %s" errorGTMread "Error when reading from GTrackMaker file" badGTMvers "GTrackMaker file version not acceptable" badGTMfile "Wrong initial string for GTrackMaker file" badGTMcounts "Negative count(s) in GTrackMaker file" badGTMlat "Latitude out of range in GTrackMaker file" badGTMlong "Longitude out of range in GTrackMaker file" badGTMdatum "Bad datum in GTrackMaker file" unobscmap "Error probably because there is a window/icon over the map; retry after delay?" cantwrtimg "Error writing image to file in %s format" cantsaveRTid "%d RT(s) not saved: non-numeric identifier" cantsaveTRid "%d TR(s) not saved: non-numeric identifier" badtrvconf "Corrupt configuration; restarting with empty one" drvsimoff "Driving simulator: not started yet!" needWP "Driving simulator: please load or define some WPs first" chgrecprot "Please change the receiver protocol" clrtrvlog "Clear travel log?" frgetGRcs "Forget group and all its elements?!" nmeainuse "Real-time log being captured or another NMEA file being read" badfile "Error when reading from file" RTnoWPname "WP given by name only in RT is no longer supported" distlarge "Distance too large!" convres "%s resulting from conversion created under name %s" outrngproj "Point out of range of projection!" badconv "Could not convert value for parameter %s: %s" badprmval "Wrong converted value for parameter %s: %s" timeconsmg "Time consuming operation: go on?" badtimeval "Bad time value" badLAP "Bad LAP; line" lapncnsdrd "LAP not considered" emptymenu "Empty menu; continue?" cantwrtsymenu "Cannot write symbol menu file" abbrevhasspaces "Short name cannot have blanks" needNpoints "You must give at least %s points!" twotimeoffsets "Different time offsets in file" notimeoffset "No time offset in file; assuming 0" baddateas "Bad date: %s" unknownenc "Unknown character encoding %s" chgbaudto "Trying to change baud rate to %s; please wait..." busytrylater "Other operations under way; please try later" baudchgfailed "Could not change baud rate" obssplit "Results of splitting %s named \"%s\"" samelgth "The two strings must have the same number of characters" rschkargs "Calling regsub gives an error; check the arguments" emptyrmeth "Renaming method cannot be void" cantwrtdefs "Cannot write file with user definitions" xcantbey "%s cannot be %s" mustselftfam "A font family must be selected" badpluginwhere "Bad plug-in \"where\" argument; must be list of triples" badpluginparam "Bad plug-in parameters: list of NAME EXPR, NAME starts with _" badpluginparamexec "When running plug-in %s, bad parameter: %s" pluginfailed "Plug-in %s failed with message: %s" loginto "Login %s" cantwrtdir "Cannot write on %s; please change its permissions" cantcleandir "Could not clear directory %s" defTERMCMD "The option for the command that opens a terminal window must be defined first" gpOutfile "Output is in file \"%s\" in your working directory." gpQuitgnuplot "Press Enter in xterm window to quit gnuplot." gpModgnuplot "Modify the viewing in the Gnuplot-window\ by dragging the mouse (left and middle button).\n\ After closing the gnuplot-window you will find\ the output in file \"%s\" in your working directory." htResult1 "Track=\"%s\"" htResult2 "Total distance=%s Total ascent=%s Total descent=%s" htResult3 "Used total time=%s Resting Time=%s(%s) Time in motion=%s" htResult4 "%s Cap.plain=%s Cap.asc=%s Cap.desc=%s Est. hiking time=%s" srResult1 "Rest periods (>5min) of track \"%s\"" badcumuls "Difference in altitude %s > total ascent %s and/or descent %s; altitude threshold %s %s option should be changed" } set TXT(RTcompflds) "# WP {$DTUNIT} deg {$ALUNIT} stage label" set TXT(TRcompflds) \ "TP {} {} {} {$ALUNIT} {$DTUNIT} {$DTUNIT} h:m:s {$SPUNIT} deg" set TXT(starttoend) "Start: to end %s $DTUNIT;" set TXT(startmax) "max %s $DTUNIT;" set TXT(WPnearflds) "WP {$DTUNIT} deg" set TXT(within) "Within (${DTUNIT}s)" set TXT(between) "Between (${DTUNIT}s)" array set TXT { GMtit "GPS Manager - version" exit Exit map Map load Load loadfrm "Load from" save Save saveels "Save elements" saveto "Save to" clear Clear clearall "Clear All" newWP "New WP" newRT "New RT" newTR "New TR" newLN "New LN" newGR "New GR" import Import importfrm "Import from" export Export exportels "Export elements" exportto "Export to" count Count trueN "True North" automagn "Auto Magnetic" usrdef "User Defined" nameWP WPoint nameRT Route nameTR Track nameLN Line nameLP "Line Point" nameGR Group namePlot Plot nameMap Map nameRTComp "Route Computation" nameTRComp "Track Computation" nameInfo Information GPSrec "GPS receiver" turnoff "Turn Off" get Get put Put all All select Select selection Selection options Options DMS DMS DMM DMM DDD DDD GRA Grades UTM/UPS UTM/UPS MH MH message Message cancel Cancel file File ovwrt Overwrite app Append online online offline offline check check create Create revert Revert colour colour Colour Colour grey grey mono mono portr portrait landsc landscape legend Legend incscale "Include scale" more More waypoint Waypoint name Name created Created cmmt Comment withWP "With this WP:" displ "Display on map" startRT "Start RT" route Route number Number numberid "Number/Id" insb "Insert before" insa "Insert after" del Delete repl "Replace by" comp Compute RTcomp "Route Computation" savecomp "Save computation" totdst "Total distance" tottime "Total time" totdstng "Total distance, no gaps" tottimeng "Total time, no gaps" totresttime "Total time of resting (>5min)" avgspmot "Average speed in motion" track Track chophd "Chop head" choptl "Chop tail" incb "Include before" date Date newdate "New date for next point" endprTR "End of previous track" begnxt "Beginning of next" date1st "Date for 1st point of next" TRcomp "Track Computation" avgsp "Average speed" maxsp "Max speed" minsp "Min speed" lat Lat long Long ze ZE zn ZN eastng Easting nrthng Northing zone Zone change Change forget Forget others Others opt_Interf "User interface" optLANG Language optISOLATIN1 "Compose chars" optDELETE "DEL deletes last char" optMWINDOWSCONF "Main window" optSERIALBAUD "Baud Rate" optGPSREC "GPS Model" opt_GPSRecConf "Receiver parameters" optACCEPTALLCHARS "Accept all characters" optNAMELENGTH "Max name length" optINTERVAL "Sampling interval" optCOMMENTLENGTH "Max comment length" optMAXWPOINTS "Max # WPoints" optMAXROUTES "Max # Routes" optMAXWPINROUTE "Max # WPs in Route" optMAXTPOINTS "Max # Trackpoints" optCREATIONDATE "Rec has creation date" optNOLOWERCASE "Rec has no lower case" optDEFAULTSYMBOL "Default WP symbol" optDEFAULTDISPOPT "Default WP display option" opt_Data "Data" optEQNAMEDATA "Data with same name" optKEEPHIDDEN "Keep hidden data" optDatum Datum optTimeOffset "Time offset" optACCFORMULAE "Accurate formulae" optASKPROJPARAMS "Confirm proj parameters" optBalloonHelp "Balloon help" optTRNUMBERINTVL "Show TP info on map at each" optTRINFO "TP info to show" opt_Formats "Units and formats" optDISTUNIT "Distance" optALTUNIT "Altitude" optUSESLOWOPWINDOW "Window to control slow operations" optDEFTRECPROTOCOL "Default protocol" optLNSREACT "Mapped LNs react to mouse" M m KM km NAUTMILE "nautical mile" STATMILE "statute mile" FT ft optPositionFormat "Position format" optDateFormat "Date format" opt_Geom "Window geometry" opt_MapGeom "Map geometry" optMAPWIDTH "Map width" optMAPHEIGHT "Map height" optMAPSCLENGTH "Map scale length" optMAPSCALE "Map scale" optMAXMENUITEMS "Max # menu items" optLPOSX "Lists window x-pos" optLPOSY "Lists window y-pos" optMPOSX "Map window x-pos" optMPOSY "Map window y-pos" optRPOSX "Rec window x-pos" optRPOSY "Rec window y-pos" optEPOSX "Error window x-pos" optEPOSY "Error window y-pos" optDPOSX "Dialog x-pos" optDPOSY "Dialog y-pos" optDPOSRTMAP "RT/map dialog offset" optLISTWIDTH "List width" optLISTHEIGHT "List height" optCOLOUR Colours optCOLOUR,fg Foreground optCOLOUR,bg Background optCOLOUR,messbg "Error background" optCOLOUR,confbg "Confirmation background" optCOLOUR,selbg "Selection background" optCOLOUR,dialbg "Input background" optCOLOUR,offline "Receiver offline" optCOLOUR,online "Receiver online" optCOLOUR,check "Selected checkbutton" optCOLOUR,ballbg "Balloon help background" optCOLOUR,ballfg "Balloon help foreground" optMAPCOLOUR "Map colours" optMAPCOLOUR,mapsel "Selected map item" optMAPCOLOUR,WP "Wayponts on map" optMAPCOLOUR,RT "Routes on map" optMAPCOLOUR,mkRT "Route defined on map" optMAPCOLOUR,TR "Tracks on map" optMAPCOLOUR,TP "Track points on map" optMAPCOLOUR,LN "Lines on map" optMAPCOLOUR,mapleg "Map legends" optMAPCOLOUR,anim "Animation on map" optMAPCOLOUR,emptygrid "Empty image" optMAPCOLOUR,fullgrid "Existing image" opt_Fonts "Fonts" optDEFTRTWIDTH "RT line width" optDEFTTRWIDTH "TR line width" optDEFTLNWIDTH "LN width" opt_Files "Device and files" optDEFSPORT "Device" optSAVESTATE "Save state on exit" optDELSTATE "Delete files after restoring state" optPERMS "File permissions" optPRINTCMD "Print command" optPAPERSIZE "Paper size" optMapGuideVersion "MapGuide version" optICONSIZE "Icon size" red Red green Green blue Blue owner Owner permgroup Group others Others fread Read fwrite Write fexec Exec YYYYMMDD YYYYMMDD MMDDYYYY MMDDYYYY DDMMMYYYY DDMMMYYYY YYYY-MM-DD YYYY-MM-DD YYYY/MM/DD YYYY/MM/DD ISO8601 "ISO8601" mainwd "Main window" distazim "Dist and bearing" nearestWPs "Nearest WPs" fromto "From %s to %s" degrees degrees nameWPDistBear "dist and bearing" nameWPNearest "nearest WPs" inrect "In rectangle" forthisWP "for this WP" formappedWPs "for mapped WPs" group Group element Element insert Insert joinGR "Add GR Els" TRtoRT "Conversion from TR to RT" TRtoLN "Conversion from TR to LN" TRtoTR "TR simplification" TRRTnpoints "No. points to keep" TRlinedispl "Display result now" TRTRdispl "Display TR now" WP WP RT RT TR TR TP TP LN LN LP LP GR GR LAP LAP commrec "Communication with receiver" abort Abort ACKs ACKs NAKs NAKs packets packets unnamed "(unknown)" fromTR "From TR: %s" mapload "Geo-referencing image" loadmback Load savemback "Save geo-ref info" chgmback Change clearmback Clear backgrnd Background nameMapBkInfo "Background info" nameMapInfo "Map settings" mpbkchg "Change background" mpbkgrcs "Grid position" nameImage Image symbol Symbol SY1st_aid "First aid" SYCATaviation Aviation SYCATgeneral "General use" SYCATland Land SYCATwater Water SYMOB "Man over board" SYRV_park "Recreational Vehicle park" SYWP_buoy_white "Buoy, white" SYWP_dot "WP" SYairport "Airport" SYamusement_park "Amusement park" SYanchor "Anchor" SYanchor_prohib "Anchor prohibited" SYavn_danger "Danger (avn)" SYavn_faf "1st approach fix" SYavn_lom "Localizer outer marker" SYavn_map "Missed approach point" SYavn_ndb "ND beacon" SYavn_tacan "TACAN" SYavn_vor "VHF omni-range" SYavn_vordme "VOR-DME" SYavn_vortac "VOR/TACAN" SYbait_tackle "Bait and tackle" SYball "Ball" SYbeach "Beach" SYbeacon "Beacon" SYbell "Bell" SYbiker "Biker" SYboat "Boat" SYboat_ramp "Boat ramp" SYborder "Border crossing" SYbot_cond "Bottom conditions" SYbowling "Bowling" SYbox_blue "Box, blue" SYbox_green "Box, green" SYbox_red "Box, red" SYbridge "Bridge" SYbuilding "Building" SYbuoy_amber "Buoy, amber" SYbuoy_black "Buoy, black" SYbuoy_blue "Buoy, blue" SYbuoy_green "Buoy, green" SYbuoy_green_red "Buoy, green red" SYbuoy_green_white "Buoy, green white" SYbuoy_orange "Buoy, orange" SYbuoy_red "Buoy, red" SYbuoy_red_green "Buoy, red green" SYbuoy_red_white "Buoy, red white" SYbuoy_violet "Buoy, violet" SYbuoy_white "Buoy, white" SYbuoy_white_green "Buoy, white green" SYbuoy_white_red "Buoy, white red" SYcamping "Camp site" SYcapitol_city "City, star" SYcar "Car" SYcar_rental "Rent-a-car" SYcar_repair "Car repair" SYcasino "Casino" SYcastle "Castle" SYcemetery "Cemetery" SYchapel "Chapel" SYchurch "Church" SYcircle_blue "Circle, blue" SYcircle_green "Circle, green" SYcircle_red "Circle, red" SYcircle_x "Circled X" SYcivil "Civil location" SYcntct_afro "Afro" SYcntct_alien "Alien" SYcntct_ball_cap "Ball cap" SYcntct_big_ears "Big ear" SYcntct_biker "Biker" SYcntct_bug "Bug" SYcntct_cat "Cat" SYcntct_dog "Dog" SYcntct_dreads "Dreads" SYcntct_female1 "Female 1" SYcntct_female2 "Female 2" SYcntct_female3 "Female 3" SYcntct_goatee "Goatee" SYcntct_kung_fu "Kung fu" SYcntct_pig "Pig" SYcntct_pirate "Pirate" SYcntct_ranger "Ranger" SYcntct_smiley "Smiley" SYcntct_spike "Spike" SYcntct_sumo "Sumo" SYcoast_guard "Coast guard" SYcontrolled "Controlled Area" SYcross "Cross hair" SYcross_3p "Cross hair 3p" SYcrossing "Crossing" SYdam "Dam" SYdanger "Danger" SYdeer "Deer" SYdiamond_blue "Diamond, blue" SYdiamond_green "Diamond, green" SYdiamond_red "Diamond, red" SYdiver_down_1 "Diver down 1" SYdiver_down_2 "Diver down 2" SYdock "Dock" SYdollar "Dollar" SYdot "Dot" SYdrinking_water "Drinking water" SYdropoff "Dropoff" SYduck "Duck" SYelevation "Elevation" SYexit "Exit" SYexit_no_serv "Exit, no services" SYfactory "Factory" SYfastfood "Fast food" SYfhs_facility "FHS facility" SYfish "Fish" SYfitness "Fitness" SYflag "Flag" SYflag_pin_blue "Flag pin, blue" SYflag_pin_green "Flag pin, green" SYflag_pin_red "Flag pin, red" SYfreeway "Freeway" SYfuel "Fuel" SYfuel_store "Fuel & store" SYgeo_name_land "Geo name, land" SYgeo_name_man "Geo name, man-made" SYgeo_name_water "Geo name, water" SYgeocache "Geocache" SYgeocache_fnd "Geocache found" SYglider "Glider" SYgolf "Golf" SYheliport "Heliport" SYhorn "Horn" SYhouse "House" SYhouse_2 "House 2" SYhydrant "Water hydrant" SYice_skating "Ice skating" SYinfo "Info" SYintersection "Intersection" SYis_highway "Highway" SYknife_fork "Food" SYladder "Ladder" SYlanding "Landing" SYlarge_city "City, large" SYlarge_exit_ns "Exit no serv, large" SYlarge_ramp_int "Ramp int, large" SYletter_a_blue "A, blue" SYletter_a_green "A, green" SYletter_a_red "A, red" SYletter_b_blue "B, blue" SYletter_b_green "B, green" SYletter_b_red "B, red" SYletter_c_blue "C, blue" SYletter_c_green "C, green" SYletter_c_red "C, red" SYletter_d_blue "D, blue" SYletter_d_green "D, green" SYletter_d_red "D, red" SYlevee "Levee" SYlight "Light" SYlodging "Lodging" SYmany_fish "Fish bank" SYmany_tracks "Many tracks" SYmarina "Marina" SYmark_x "Mark, x" SYmedium_city "City, medium" SYmile_marker "Mile marker" SYmilitary "Military location" SYmine "Mine" SYmonument "Monument" SYmountains "Mountains" SYmovie "Movie" SYmug "Mug" SYmuseum "Museum" SYntl_highway "National highway" SYnull "(transparent)" SYnull_2 "(void)" SYnumber_0_blue "0, blue" SYnumber_0_green "0, green" SYnumber_0_red "0, red" SYnumber_1_blue "1, blue" SYnumber_1_green "1, green" SYnumber_1_red "1, red" SYnumber_2_blue "2, blue" SYnumber_2_green "2, green" SYnumber_2_red "2, red" SYnumber_3_blue "3, blue" SYnumber_3_green "3, green" SYnumber_3_red "3, red" SYnumber_4_blue "4, blue" SYnumber_4_green "4, green" SYnumber_4_red "4, red" SYnumber_5_blue "5, blue" SYnumber_5_green "5, green" SYnumber_5_red "5, red" SYnumber_6_blue "6, blue" SYnumber_6_green "6, green" SYnumber_6_red "6, red" SYnumber_7_blue "7, blue" SYnumber_7_green "7, green" SYnumber_7_red "7, red" SYnumber_8_blue "8, blue" SYnumber_8_green "8, green" SYnumber_8_red "8, red" SYnumber_9_blue "9, blue" SYnumber_9_green "9, green" SYnumber_9_red "9, red" SYoil_field "Oil field" SYopen_24hr "Open 24 hours" SYoval_blue "Block, blue" SYoval_green "Block, green" SYoval_red "Block, red" SYparachute "Parachute" SYpark "Park" SYparking "Parking" SYpharmacy "Pharmacy" SYphone "Phone" SYpicnic "Picnic" SYpin_blue "Pin, blue" SYpin_green "Pin, green" SYpin_red "Pin, red" SYpizza "Pizza" SYpolice "Police" SYpost_office "Post-office" SYprivate "Private field" SYradio_beacon "Radio beacon" SYramp_int "Ramp intersection" SYrect_blue "Block, blue" SYrect_green "Block, green" SYrect_red "Block, red" SYreef "Reef" SYrestricted "Restricted Area" SYrestrooms "WC" SYscenic "Scenic" SYschool "School" SYseaplane "Seaplane base" SYshopping_cart "Shopping" SYshort_tower "Tower, short" SYshowers "Showers" SYskiing "Water skiing" SYskull "Skull" SYsmall_city "City, small" SYsnow_skiing "Snow skiing" SYsoft_field "Soft field" SYsquare_blue "Square, blue" SYsquare_green "Square, green" SYsquare_red "Square, red" SYst_highway "State highway" SYstadium "Stadium" SYstore "Store" SYstreet_int "Street intersection" SYstump "Stump" SYsummit "Summit" SYswimming "Swimming" SYtake_off "Take-off" SYtall_tower "Tower, tall" SYtheater Theater SYtide_pred_stn "Tide/current pred station" SYtoll Toll SYtow_truck "Tow truck" SYtraceback "Trace-back" SYtracks Tracks SYtrail_head "Trail head" SYtree "Tree" SYtriangle_blue "Triangle, blue" SYtriangle_green "Triangle, green" SYtriangle_red "Triangle, red" SYtruck_stop "Truck stop" SYtunnel "Tunnel" SYultralight "Ultralight" SYus_highway "US highway" SYweedbed "Weedbed" SYweight_station "Weight station" SYwreck "Wreck" SYzoo "Zoo" psvisible "Only visible part" DISPsymbol "Symbol only" DISPs_name "S & name" DISPs_comment "S & comment" DISPname "Name only" DISPcomment "Comment only" dispopt Display mapitems "Display items on map" nameIC Icon prod Product WPCapac "Waypoint Capacity" ICCapac "Icon Capacity" RTCapac "Route Capacity" TRCapac "Track Capacity" protcl "Protocol" ICGraph "Icon Graphics" WPperRT "Waypoints per Route" notinGR "not in (sub-)group" onlyinGR "only in (sub-)group" loadgrels "Load elements" importgrels "Import elements" about "On GPSMan..." contrib "With contributions by" errorsto "Error reports to:" obsTRToRT "WPs created by a TR to RT conversion" obsTRsimpl "TR resulting from simplification" nameLists "Lists" nameData "Data" MWCmap "Map" MWClists "Lists" MWCsingle "Single window" search "Search" rmrk "NB" closeto "Close to" with "With" srchres "FOUND" database "Database" where "Where" what "What" list "list" distance "Distance" fromWP "from Waypont" fromPos "from position" azimuth "Bearing" any "any" opening "Opening" suggested "suggested" another "Another" srchdd1 "Search on" srchdd2Data "all items" srchdd2GR "Group(s)" from "from" started "starting on" transf "Coords Transf" TRNSFAffine "Affine" TRNSFAffineConf "Aff Conformal" TRNSFNoRot "Conf No Rot" projection "Projection" lat0 "Lat of centre" long0 "Long of centre" lat1 "Lat 1st st parallel" lat2 "Lat 2nd st parallel" latF "Lat false origin" longF "Long false origin" k0 "Scale factor" PRJUTM "UTM/UPS" PRJTM "Transverse Mercator" PRJBMN "Austrian BMN Grid" PRJBNG "British National Grid" PRJBWI "British West Indies" PRJCMP "Portuguese Mil Map" PRJCTR "Carta Tecnica Reg (I)" PRJITM "Irish Transv Mercator" PRJGKK "German Grid" PRJLCC1 "Lambert Conic Conf 1" PRJLCC2 "Lambert Conic Conf 2" PRJKKJP "Basic Finnish Grid" PRJKKJY "Uniform Finnish Grid" PRJSEG "Swedish Grid" PRJMerc1 "Mercator 1" PRJMerc2 "Mercator 2" PRJCS "Cassini-Soldner" PRJAPOLY "American Polyconic" PRJStereogr Stereographic PRJTWG "Taiwan Grid" PRJSOM "Swiss Oblique Mercator" PRJLV03 "Swiss LV03 Grid" PRJIcG "Iceland Grid" PRJRDG "The Netherlands Grid" PRJSchreiber Schreiber PRJSphMerc "Spherical Mercator" PRJEqCyl "Equidistant Cylindrical" PRJEPSG:3857 "EPSG:3857" PRJEPSG:32663 "EPSG:32663" dontaskagain "Stop asking" rename "Use new name" oname "Original name" never "Never" ask "Ask" always "Always" stage "Stage" label "Label" alt "Altitude" locate "Locate" animation Animation fast Fast slow Slow start Start pause Pause speed Speed centred "Keep centred" state State animinit "at start/end" animon "running" animpause "paused" animabort "aborting" realtimelog "Real-time track log" garmin Garmin garmin_usb "Garmin USB" nmea "NMEA 0183" stext "Simple Text" simul "simulator" lowrance Lowrance magellan Magellan getlog "Get Log" stop Stop dolog Record show Show hide Hide posfixerror error posfix_ ? posfix2D 2D posfix3D 3D posfix2D-diff "2D d" posfix3D-diff "3D d" posfixGPS GPS posfixDGPS DGPS posfixAuto ok posfixsimul simul restart Restart mkTR "Make TR" PVTflds "# t lat long alt fix EPE EPH EPV vel_x vel_y vel_z TRK" namePVTData "Log data" mkavgWP "Make avg WP" move Move define Define open Open defs "Definitions" baseproj "Base projection" abbrev "Short name" grid Grid use Use unit Unit feasting "False easting" fnorthing "False northing" bounds Bounds max Max min Min easting Easting northing Northing fixeddatum "fixed datum" elevation Elevation usewps "Use WPs" chgpfrmt "Change position format" here Here atprevwp "At previous WP" prevwp "Previous WP" firstwp "First WP" chglstrs "Edit previous stage" chgnxtrs "Edit next stage" contnend "Add to end" closemenu "Close menu" ellpsd Ellipsoid datum Datum userdefs "User definitions" edmap "Edit on map" actual actual rtimelogintv "Log interval" inca "Include after" invert "Invert" recwindow "Receiver window" volume "Volume" latS "Lat S" latN "Lat N" longW "Long W" longE "Long E" no No computations Computations comparea "Compute area" cluster Cluster centre Centre mkclusters "Make clusters" quadr Quadrangle dlat "Latitude range" dlong "Longitude range" collcntr "Collecting centres..." compclstr "Computing clusters..." crtgclstrgrs "Creating groups..." chgdatum "Change datum..." print Print prevctr "Previous centre" printopt "Print options" cwpsdef "Control WPs to define now" nextTP "Next TP" generate Generate generateall "Generate all" width Width simplTRto "Simplify to" exstglog "Existing log" contnsly "Continuously" animate "animate" animabbrev "anim." noanabbr "no anim." zelev "Z-scale" xyelev "XY-scale" notext "no text" view "View" sideview "Side-view" persptv "Perspective" optMAPCOLOUR,trvtrk "TRK arrow" optMAPCOLOUR,trvtrn "TRN arrows" optMAPCOLOUR,trvcts "CTS arrow" optMAPCOLOUR,trvcts2 "2nd CTS arrow" optMAPCOLOUR,trvvel_z "Up/down arrow" optMAPCOLOUR,trvwrnimportant "Important warning (nav)" optMAPCOLOUR,trvwrnnormal "Warning (nav)" optMAPCOLOUR,trvwrninfo "Information (nav)" travel Travel notravel "Stop travelling" travdisplay "Configure display" travchgdisplay "Change to display %s" travdsetup "Configure travel display" navMOB "MOB: Man Over Board!" startnav "Navigate" navWP "Go to WP" goback "Go back" follow "Follow %s" exactly "exactly" fromnrst "from nearest" inrvrs "in reverse" forgetgoal "Forget goal" suspend "Suspend" resume "Resume" TRVfix "Fix" TRVhour "Time" TRVspeed "Speed" TRVpos "Pos" TRValt "Alt" TRVtrk "TRK" TRVnxtWP "To" TRVprvWP "From" TRVete "ETE" TRVeta "ETA" TRVvmg "VMG" TRVxtk "XTK" TRVcts "CTS" TRVtrn "TRN" TRVvel_z "V speed" TRVtrkcts "TRK, CTS" TRVdist "Dist" TRVc_trkcts "TRK/CTS arrows" TRVc_trn "TRN arrows" TRVc_vel_z "Up/down arrow" add "Add" addlabelled "Add with label" remove "Remove" mindist "Arrival distance" chggoal "Change to next goal" chginggoal "Changing to next goal" chggoalhlp "When to change from\ncurrent to next goal\nwhen following RT/TR" soon soon late late warnings "Warnings" dowarn "Issue warnings" warnconf "Configure warnings" priority Priority high high medium medium low low warnprox "Distance to WP <" warnanchor "Distance to WP >" warnspeed "Speed >" warntrn "TRN (abs)>" warnvspeed "Vertical speed" warnxtk "XTK (abs)>" trvhlpbox "Use right-button to reorder elements below" trvhlpbxs "Use right-button to reorder list elements" trvwarrv "Arriving at %s!" trvwleave "Leaving %s!" trvwspeed "Speed > %s!" trvwtrn "TRN > %s!" trvwvspeed "Vert speed not in [%s,%s]!" trvwxtk "XTK > %s!" trvwnolog "Real-time logging is off!" trvwnopos "Previous positions unavailable" trvwuwps "RT has undefined WP(s)" trvwchg "Going now to %s" drivesim "driving simulator" startfrom "Start from..." outofctrl "Out of control!" right Right left Left straight Straight rthlpdsim "Arrow keys: steer, change speed\nSpace bar: straight" hiddendata "Hidden data" Ghidden_class Class Ghidden_subclass Subclass Ghidden_lnk_ident "Stage id" Ghidden_colour Colour Ghidden_attrs Attributes Ghidden_depth Depth Ghidden_state State Ghidden_country Country Ghidden_facility Facility Ghidden_city City Ghidden_addr Address Ghidden_int_road "Intersection road" Ghidden_dtyp "Display opt+type" Ghidden_ete "ETE" Ghidden_display "Display?" Ghidden_yes Yes Ghidden_no No Ghidden_user "User" Ghidden_user_symbol "User (symbol only)" Ghidden_non_user "Non-user" Ghidden_avn_airport "Airport" Ghidden_avn_inters "Avn intersection" Ghidden_avn_NDB "NDB" Ghidden_avn_VOR "VOR" Ghidden_avn_airp_rway "Airport runway threshold" Ghidden_avn_airp_int "Airport intersection" Ghidden_avn_airp_NDB "Airport NDB" Ghidden_map_pt "Map point" Ghidden_map_area "Map area" Ghidden_map_int "Map intersection" Ghidden_map_addr "Map address" Ghidden_map_line "Map line" Ghidden_locked Locked Ghidden_default "Default" Ghidden_black Black Ghidden_white White Ghidden_red Red Ghidden_dark_red "Dark red" Ghidden_green Green Ghidden_dark_green "Dark green" Ghidden_blue Blue Ghidden_dark_blue "Dark blue" Ghidden_yellow Yellow Ghidden_dark_yellow "Dark yellow" Ghidden_magenta Magenta Ghidden_dark_magenta "Dark magenta" Ghidden_cyan Cyan Ghidden_dark_cyan "Dark cyan" Ghidden_light_gray "Light grey" Ghidden_dark_gray "Dark grey" Ghidden_transparent Transparent Ghidden_line Line Ghidden_link Stage Ghidden_net Net Ghidden_direct Direct Ghidden_snap Snap Ghidden_temp Temperature Ghidden_time "Time stamp" Ghidden_cat Category renres "RENAMED" forgetGRcs "Forget GR&Els" optDEFMAPPROJ "Map projection" optDEFMAPPFRMT "Map coordinates" optDEFMAPPFDATUM "Map coordinates datum" undo Undo UTMzone zone tfwfile "TFW file" ok Ok newWPatdb "New WP at..." PRJLamb93 "Lambert 93" PRJLambNTFe "Lambert NTF IIet" PRJLambNTF "Lambert NTF" NTFzone zone loop Loop crtLN "Create LN" PRJAEA "Albers Equal Area" PRJLEAC "Lambert Eq Area Conic" PRJTAlbers "Teale Albers" polasp "Polar aspect" north North south South distunit "Distance unit" altunit "Altitude unit" params "Parameters" dimens "Dimensions" version "Version" opinprogr "Operation in progress" working "Working" aborted "Aborted!" errwarn "Error/warning(s)!" changegroupsymbol "Change symbol" ozimapfile "Ozi Map file" info "Information" climbrate "Climb rate" BGAfeature "Feature" BGAfindblty "Findability" BGAairact "Air activity" dispitems "Displayed items" hiditems "Hidden items" mkgrp "Make Group" optAutoNumRts "Auto-number RTs when putting" numberfrom0 "Set counter to 1" items "Items" optSUPPORTLAPS "Support for laps" nameLAP "Lap" duration "Duration" calrs "Calories" syusrmenu "Custom symbol menu" cfgsymenu "Configure custom symbol menu" insmnb "Insert sub-menu before" insmna "Insert sub-menu after" opensbmn "Open sub-menu" clssbmn "Close sub-menu" syhlpbx "Use right-button to\nreorder list elements" lapsrun Run fromfile "from file" fromdef "from definition" mbaktoload "Background to load" none "none" nameAL "Almanac" alm_svid "satellite id" alm_week "week" alm_datatime "data ref time" alm_clockc1 "clock corr coeff s" alm_clockc2 "clock corr coeff s/s" alm_ecc "eccentricity" alm_sqrta "sqrt a" alm_mnanom "mean anomaly" alm_argprgee "arg perigee" alm_rightasc "right ascension" alm_rtrightasc "rate r ascension" alm_inclin "inclination" alm_health "health" lstsqs "Least Squares" lstsqsfile "Least Squares file" mapfitWPs "Display fit WPs on map" showfitinfo "Show fit information" xtcoord "xt" ytcoord "yt" delta "d" residual "rt" rmsxydev "rms(x,y-deviations)" resstderr "residual std error" chgdev "Change device" alt_cumula "Total ascent" alt_cumuld "Total descent" maxalt "Maximum altitude" minalt "Minimum altitude" optSHOWFILEITEMS "By default display on map items read in" vertgridlines "Vert Grid Lines" convert "Convert" split "Split" bysel "by selected points" byseg "by segments" openits "Open %s" PRJEOV EOV chgname "Change name" clicktoedit "Click to edit" renamethod "Renaming method" operators "Operators" keep1st "keep first char" keep1st_hlp "Keep first char\nfurther operations act on remaining chars" reset "reset" reset_hlp "Restart with initial name undoing any previous changes" case "change case" case_hlp "All letters to upper/lower case" maxlgth "max length" maxlgth_hlp "Current chars trimmed to given number" inslt "insert at left" inslt_hlp "Given string to be inserted before current left char" insrt "insert at right" insrt_hlp "Given string to be inserted at the end" replc "replace" replc_hlp "Any char in the first string will be replaced by\nthe corresponding one in the second" delany "delete any" delany_hlp "All chars in the given string will be deleted from name" rsub "re. substitution" rsub_hlp "Give regular expression and substitution specification\nsee the manual for details" accifnew "accept if new" accifnew_hlp "Accept result if it is a new name" guntilnew "append number until new" guntilnew_hlp "Try all possible values of the number until a new name is found" ndigits "Number of digits" gennames "Generating names..." rentest_hlp "Test present method on given name" renmove_hlp "Use right-button to reorder lines" tolower "to lower" toupper "to upper" applyto "Apply to" forall "for all" selfont "Selecting font" default "Default" size "Size" units "Units" points "points" pixels "pixels" weight "Weight" normal "normal" bold "bold" slant "Slant" roman "roman" italic "italic" underline "Underline" overstrike "Overstrike" optDEFAULTFONT "Default font" optFIXEDFONT "Fixed font" optMAPFONT "Map font" optTRAVELFONT "Travel display font" optPLOTFONT "Plot/graph font" failed "failed" plugin "Plug-in" unavailif "Unavailable if" tclcode "Tcl code" uname "User name" pword "Password" remember "Remember" wptotwitter "WP to Twitter" wptotwitternb "Send WP position, datum, altitude, name and comment to Twitter with tags #GPSMan #waypoint" exportTFW "Export TFW file" nametfwfile "TFW file" gpTRtoGnuplot2d "Side-view (Gnuplot)" gpTRtoGnuplot2d_nb "Send Track data to external program GNUPLOT and display altitude chart" gpTRtoGnuplot3d "Perspective (Gnuplot)" gpTRtoGnuplot3d_nb "Send Track data to external program GNUPLOT and display 3D-chart" gpParam2d "Parameters for Gnuplot 2D-Chart" gpParam3d "Parameters for Gnuplot 3D-Chart" gpFilename "Filename" gpCanwidth "Canvas width" gpCanheight "Canvas height" gpSTotals "Show totals" gpLeft "Left side" gpRight "Right side" gpNone "None" gpSRests "Show rests" gpRest "Rest" gpSymText "Symbol+Text" gpSymTime "Symbol+Time" gpText "Text" gpSHours "Show hours" gpTimetop "Time at top" gpTimebot "Time at bottom" gpSSpeed "Show speed" gpHike "Hike" gpBike "Bike" gpDrive "Drive" gpGlide "Glide" gpLimitDist "Max. Distance WP to Track (km)" gpLimitStat "Min. Lenght on Track for same WP (km)" gpDirection "Direction" gpForward "Forward" gpBackward "Backward" gp2D_hlp "If there is a groupname identical to the track name,\n\ the waypoints of this group will be displayed,\n\ in consideration of the given distances.\n\ When no matching group name exists,\ you can choose from a list or cancel." gpGenerated "Generated with gnuplot by GPSMan" gpModify "Modify viewing with mouse. Quit to save picture." htCalcHikeTime "Calculate Hiking Time" htCalcHikeTime_nb "Calculate Hiking Time with formula from DAV" htHeader "Estimated hiking time (without resting) for tracks\ using the formula from \"Deutscher Alpenverein\" with different parameters" htFooter1 "Capacity refers to one hour." htFooter2 "Suggested resting time is 20min after two hours (15%)." srShowRest_nb "Show rest periods > 5min." srTRTime "Track time" srTotals "Totals" optALTHRESHOLD "Altitude threshold" optDISPLAYCMD "Command to display image file" optTERMCMD "Command to open terminal window" optMANHTTPADDR "User manual HTTP address" } # the following definitions must be coherent with $TXT array set INVTXT { DMS DMS DMM DMM DDD DDD Grades GRA UTM/UPS UTM/UPS MH MH WP WP RT RT TR TR LN LN GR GR LAP LAP m M ft FT } # changes by Miguel Filgueiras to RM contribution set TXT(srChainage) $TXT(totdst) set TXT(srShowRest) $TXT(gpSRests) set TXT(gpSym) $TXT(symbol) set TXT(srRest) $TXT(gpRest) gpsman-6.4.4.2/manual/0000755000175000017500000000000012224351117012537 5ustar migmiggpsman-6.4.4.2/manual/html/0000755000175000017500000000000012224351120013475 5ustar migmiggpsman-6.4.4.2/manual/html/GPSMandoc_40.html0000644000175000017500000001205212170753404016454 0ustar migmig GPS Manager User Manual -- The getwrite Command
The readput CommandUsing GPSMan in Command-line ModeThe haslib CommandThe getwrite Command

The getwrite Command

The getwrite command gets information from the receiver and writes it to a file:

getwrite IN-TYPES FORMAT [OUT-PARAMS] [OUT-TYPES] PATH
where
  • IN-TYPES are the data types to get; the possible types are WP, RT and TR; all can be used as an abbreviation of WP RT TR;
  • FORMAT [OUT-PARAMS] is the output file format and its parameters (if any); use show formats for a list of the currently accepted formats;
  • OUT-TYPES may be absent in which case they are taken to be IN-TYPES, what is valid only when they are all valid for the selected output format; if RT occurs in IN-TYPES then WP can appear in OUT-TYPES but no other type "conversions" are allowed; some file formats impose that there is a single data type per file; all can be used as an abbreviation of WP RT TR;
  • PATH is the path to the output file, or, in the case of the Shapefile format, the path to the Shapefiles basename (file extensions will be discarded). If the PATH is stdout output will be to the standard output unless the format is the Shapefile format (in which case the command fails). Existing files will be silently overwritten.

This command only works with Garmin receivers.

Examples: the command

getwrite WP RT gpsman data/myWPRTs
download the waypoints and routes from the receiver and writes them to the file data/myWPRTs in GPSMan format, while the command
getwrite TR Shapefile dim=3 pformat=UTM datum="WGS 84" shp/myTRs
downloads the tracks and writes them in Shapefiles with basename myTRs in the directory shp, keeping altitude information (3 dimensions) and using UTM coordinates for the WGS84 datum.


GPSMan User Manual
Copyright 1998-2013 Miguel Filgueiras,

Creative Commons License
GPSMan User Manual and the GPSMan logo images by Miguel Filgueiras are licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.

Get gpsman at SourceForge.net. Fast,
secure and Free Open Source software downloads


The readput CommandUsing GPSMan in Command-line ModeThe haslib CommandThe getwrite Command
gpsman-6.4.4.2/manual/html/GPSMandoc_32.html0000644000175000017500000004644712170753404016474 0ustar migmig GPS Manager User Manual -- GPSMan Files
Files in Other FormatsUsing GPSMan in graphical modeMiscellaneousGPSMan Files

GPSMan Files

GPSMan uses text files to store data. The Load/Save options in the menus deal with files in GPSMan format. The Import/Export options deal with files in foreign formats. In the GPStrans format (described in the documentation of GPStrans), all positions are exported in DDD format, although any available position format is accepted in imported files.

Files in GPSMan format can be either item information files (with data of different types: waypoints, routes, tracks, polylines, laps and/or groups), or image information files (for saving information on background images for the map).

These file formats are independent of the language used. That is, there will not be commands in Tobagonian even if a lang*.tcl file was provided for it and GPSMan was set to use that language.

Item information files

Item information files in GPSMan format (based on the GPStrans format) are as follows:

  • lines whose first character is a ! character are commands:
    Format definition commands
    used to describe the format used thereafter; before the definition of waypoints, routes, polylines and tracks a position format and a datum must be given.

    • !Format: P T D, where P is the position format (DMS, DMM, DDD, GRA,UTM/UPS or a coordinates grid name), T is the time offset relative to UTC (a floating-point number between -12 and 12, 1 meaning 1 hour less than UTC), and D is the datum name (to end of line). The time offset must be given in files having waypoints with creation dates, tracks, or laps. Different time offsets are not allowed in the same file (beware of concatenating data files!).

    • !Position: P, where P is the position format (DMS, DMM, DDD, GRA,UTM/UPS or a coordinates grid name).

    • !Datum: D, where D is the datum name (to end of line).

    • !Creation: B, where B (one of yes or no) states whether creation date fields are used.
    Data commands
    used to start a data section:
    • !W:, next lines (up to another data command or end of file) describe waypoints.

    • !R: N, definition of route name (or number) N. After the name and a tabulation character, a comment will appear. After the comment a new tabulation may appear followed by fields (separated by tabulations) giving attribute-value pairs under the form Attr=Val. The possible attributes are: width, colour, and mapbak, for the width in pixels and the colour of lines on the map window, and the map background to load along with the route if the map is empty. After such a line there may appear a remark (see !NB: command below). Next lines (up to another data command or end of file) describe the route waypoints and the route stages if any.

    • !T: N, definition of track named N. After the name and a tabulation character, fields (separated by tabulations) may occur that have attribute-value pairs under the form Attr=Val. The possible attributes are: width, colour, and mapbak, for the width in pixels and the colour of lines on the map window, and the map background to load along with the track if the map is empty. After such a line there may appear a remark (see !NB: command below). Next lines (up to another data command, format definition command or end of file) describe the track points and the beginnings of segments (!TS: command).

    • !L: N, definition of polyline named N. After the name and a tabulation character, fields (separated by tabulations) may occur that have attribute-value pairs under the form Attr=Val. The possible attributes are: width, colour, and mapbak, for the width in pixels and the colour of lines on the map window, and the map background to load along with the track if the map is empty. After such a line there may appear a remark (see !NB: command below). Next lines (up to another data command, format definition command or end of file) describe the polyline points and the beginnings of segments (!LS: command).

    • !LAP: T, definition of a lap with time-stamp T. After the name and a tabulation, fields (separated by tabulations) give: the duration (hours:minutes:seconds, minutes:seconds, or seconds), total distance (metre), begin position, end position, calories, track index. A position may be empty, and if not has its sub-fields separated by a space. After such a line there may appear a remark (see !NB: command below). These lines are ignored if the support for laps is not active.

    • !G: M, definition of a group named M. After such a line there may appear a remark (see !NB: command below). Next lines (up to another data command, format definition command or end of file) describe the group elements.

    • !NB: T, text remark T for waypoint, route, track, line or group; must appear after a !R:, !T:, !G:, or !LN: command, or after a line describing a waypoint. The text is terminated by a blank line.

    Ancillary commands
    used

    • to describe route stages: !RS:.
    • to define the type of group elements (see below): !GW:, !GR:, !GT:, !GL:, !GLAP: and !GG:.
    • to begin a different segment of a track (except the first one): !TS:.
    • to begin a different segment of a polyline (except the first one): !LS:.

  • lines describing waypoints (a !W: or !R: command appeared before) have a name, a comment, a creation date (but see the !Creation: command) and a position; all these fields are separated by tabulation characters. After these fields, in the same line and also separated by tabulations, there may be pairs under the form Attr=Val, where Attr is an attribute and Val the corresponding value; attributes currently in use, apart from those for hidden information: alt for altitude (either as a value in metres, or as a list with value in metres, value in external unit and external unit), symbol (possible values: GPSMan symbol names, see file symbols.tcl), dispopt (possible values: GPSMan display option names, see file symbols.tcl), mapback for the map background to load along with the waypoint if the map is empty. After such a line there may appear a remark (see !NB: command above). A route waypoint must be given in full, and not solely by its name as before version 6.1; there is a separate script in the distribution (directory util, file wpsinfull.tcl) to convert old files.

  • lines describing route stages (only one between two consecutive route waypoints) start by !RS: followed by a tabulation, a field with the comment, a tabulation, and a field with the label. Attribute-value pairs for hidden information may appear after a new tabulation and separated by tabulations. Empty stages should not appear.

  • lines describing points in a track (a !T: command appeared before) have a tabulation character followed by a date, the position, the altitude and the depth (each one either as a value in metres, or as a list with value in metres, value in external unit and external unit), all fields being separated by tabulation characters. If the altitude and the depth are undefined both fields are omitted; if only the depth is undefined its field is omitted; otherwise the altitude field must be present and should be void if the altitude is undefined. GPSMan accepts track point positions in any available format, but will convert them to DMS.

  • lines describing points in a polyline (a !L: command appeared before) have a tabulation character followed by the position and the altitude (each one either as a value in metres, or as a list with value in metres, value in external unit and external unit), all fields being separated by tabulation characters. The positions must all be given in the same datum and format (there can be no commands to change the format, position format or datum between the !L: command and the last point).

  • lines describing elements of a group (a !G: command appeared before) have a first field followed by a tabulation character followed by a name (up to end of line). The first field is either empty or of the form !GW:, !GR:, !GT:, !GL:, !GLAP:, or !GG: that stand for group waypoint, route, track, polyline, lap and group, respectively, and describes the type of the element (laps will be discarded if support for them is not selected). If this field is empty the type is the same as that of the previous element. A group is assumed to be well-founded: it cannot be an element of itself even in an indirect way.

  • positions given by latitude/longitude are given as two fields (each as a DMS, DMM, DDD or GRA coordinate); positions in UTM/UPS have four fields: East zone number, North zone letter, x- and y-coordinates; positions in other coordinates grids have three fields: zone (possibly empty), easting and northing. All fields are separated by a tabulation character.

  • blank lines are ignored, except as terminators of remarks (see !NB: command above).

  • file comments (ignored by GPSMan) start by a % character that can be preceded only by spaces and extend to the end of line.

  • attribute-value pairs that describe hidden information are written as follows:
    • the attribute name starts with a capital letter that uniquely identifies the brand of the receiver (G for Garmin, L for Lowrance, M for Magellan); the rest of the name depends on the implementation but normally will describe the protocol and the data field;
    • the value is a string containing standard ASCII characters excluding all control characters (i.e., all codes must be >= 32 and <127); the codification of the value is also implementation dependent (for an example, see the comments in proc HiddenCode in file garmin.tcl).
    • for compatibility with older versions some attribute-value pairs no longer used for coding hidden information are still accepted when reading.

Image information files

These are files containing the following information:

  1. a !Image: P command, with P the absolute path of the file containing the image in an accepted graphics format;
  2. a !Datum: D command, with D the datum name for the coordinates;
  3. a !Projection: NP As command, with NP the name of the projection to use and As a sequence of attribute-value pairs under the form Atr=Val describing projection parameters; the tabulation is used as separator for NP and each pair;
  4. a !Transf: NT As command, with NT the name of the coordinate transformation to use and As a sequence of attribute-value pairs as in the previous command;
  5. a !Scale: S command, with S the floating-point value of the map scale in pixel/metre.

After this there may be one or more lines with a !Image at: XG,YG P command, where P is the absolute path of the file containing the image in an accepted graphics format, and XG,YG are the grid coordinates of the image. The grid coordinates of the first-loaded image are 0,0. GX changes by 1 (-1) for each image to the right (left), and GY changes by 1 (-1) for each image down (up).

No newlines are allowed within these commands, and arguments are separated by spaces or tabulation characters unless otherwise stated. Paths must use the slash (/) as separator.

Preparing an image information file can be done by using GPSMan in command-line mode: see the description of the georef command.

Least Squares files

These are files giving either waypoint names or the geodetic coordinates of control points, as well as their pixel coordinates to be used in computing the parameters of any kind of transformation by the Least Squares fit method. They follow the same conventions as other GPSMan files and contain the following, in the given order:

  1. optional !Format: P T D, !Position: P, and/or !Datum: D commands, in any order, describing the position format and datum to use, "WGS 84" and DDD being the defaults;
  2. lines for each point with fields separated by tabulations in one of the formats
    1. the position, in the selected/default datum and format, and the pixel coordinates
    2. the command !W:, a waypoint name, and the pixel coordinates,
    the pixel coordinates given in the order horizontal, vertical, with vertical coordinates increasing downwards. There must be at least 3 points and waypoints referred in the file must be defined beforehand.

Map information files

These are files currently used only for saving the state of the map when there is no background image. They follow the same conventions as the image information files and contain the following commands:

  1. a !Map: command;
  2. a !Datum: D command, with D the datum name for the coordinates;
  3. a !Projection: NP As command, with NP the name of the projection to use and As a sequence of attribute-value pairs under the form Atr=Val describing projection parameters; the tabulation is used as separator for NP and each pair;
  4. a !Transf: NT As command, with NT the name of the coordinate transformation to use and As a sequence of attribute-value pairs as in the previous command;
  5. !Position: P, where P is the position format (one of DMS, DMM, DDD, GRA, UTM/UPS or a coordinates grid name).
  6. a !PFDatum: Dpf command, where Dpf is the datum name for the map cursor coordinates.
  7. a !Scale: S command, with S the floating-point value of the map scale in pixel/metre.


GPSMan User Manual
Copyright 1998-2013 Miguel Filgueiras,

Creative Commons License
GPSMan User Manual and the GPSMan logo images by Miguel Filgueiras are licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.

Get gpsman at SourceForge.net. Fast,
secure and Free Open Source software downloads


Files in Other FormatsUsing GPSMan in graphical modeMiscellaneousGPSMan Files
gpsman-6.4.4.2/manual/html/GPSMandoc_30.html0000644000175000017500000005420412170753404016460 0ustar migmig GPS Manager User Manual -- Real-time logging
MiscellaneousUsing GPSMan in graphical modeDistances and bearingsReal-time logging

Real-time logging

At present there are two variants of the implementation, that will probably be merged in the future. Any receiver sending data in the NMEA 0183 v2.0 standard format can be used with GPSMan and can use any of the two variants. This also applies to Garmin and Lowrance receivers. For the time being there is no support for real-time logging if the receiver is declared to be a Magellan.

Users of Lowrance receivers will want to use the variant for Lowrance. Users of Garmin-defined protocols, be it the serial or USB Garmin protocols , or the Simple Text Output Protocol, should use the variant for Garmin.

Both variants implement some sort of simulator that can be helpful for tests and in getting acquainted with the interface before going to real-time usage.

GPSMan will work with the variant corresponding to the receiver brand selected in the options dialogs. After changing this option the program must be restarted because different code has to be loaded.

Variant for the Lowrance

This variant was designed and implemented by Brian Baulch (baulchb_at_hotkey.net.au) who has prepared a description of it.

The file exerciser.tcl used for simulation by this variant can be found in the util directory. It must be edited for configuration before use.

Variant for the Garmin

This variant implements:

  • Garmin and NMEA 0183 protocols,
  • recording of logging data that can be saved to file (at a certain moment, or continuously) and converted to a track,
  • real-time animation in the map window (moving map),
  • a travel/navigation interface, and
  • a driving simulator and a random generator that produce fake logging data, to be used in training/testing.

Protocols supported by this variant are the following:

  • Garmin PVT (position, velocity and time) Data Protocol, which is a part of the Garmin (GRMN/GRMN or Garmin) protocol,
  • Garmin Simple Text Output Protocol  (Text Out), and
  • part of NMEA 0183 v2.0.

Some receivers must be configured to use one of these protocols: this is done in some receivers in a Interface display under Setup. Not all Garmin receivers support the first two, in which case NMEA 0183 should be selected and the variant for the Lowrance may also be used. If the selected protocol is not supported, either GPSMan knows about that and issues a warning, or there will be no information captured by GPSMan.

Facts that may help in choosing among the available protocols:

  • Garmin PVT can be used along the rest of the Garmin (serial or USB) protocol, meaning that getting and putting other information from/into the receiver can be done while real time logging is on; the receiver will temporarily stop sending logging information while these operation take place -- this may be DANGEROUS if the logging information is crucially needed for navigation; it is the user's responsability not to initiate such operations in these conditions;

  • both Simple Text and the implemented part of NMEA 0183 are one way protocols: information is only sent from the receiver to GPSMan; this means that it is not possible for GPSMan to check the connection with the receiver: GPSMan will be passively waiting for information to appear on the serial port;

  • Simple Text carries less information than Garmin PVT (neither EPE, expected position error, nor EPV, expected position vertical error), while NMEA 0183 may carry more information than Garmin PVT; it is difficult to say more than this because there is no complete information on which NMEA sentences (commands) are sent by receivers.

Selecting the protocol in GPSMan is done in the GPSMan's receiver window using the Protocol menu, or the entry with this name of the GPS Receiver menu. Note that there is an option that defines the default protocol to be used.

If GPSMan was invoked by using the start travel command the protocol will be either the default in the preferences file or the protocol given by the -prot command option.

Two other entries in these menus start simulators of logging data that will be helpful in getting acquainted with the interface before real-time usage:

  • simulator generates random (and somewhat inconsistent) data;
  • driving simulator provides an interface for the user to "drive" (starting from a waypoint) and in this way generate logging data.
A simulator will be switched off only when a different protocol is selected.

Controlling the real-time logging is done with the three buttons Get Log (or Stop), Record and Animation in the receiver window, or the corresponding entries of the receiver menu under Real-time track log. The first starts and stops the input of logging information, the second launches a window that records that information, and the third starts the animation on the map. These buttons/entries can be actuated independently of each other, but it is obvious that the recording or the animation cannot start or go on if the input has not started or has been stopped. In this way the user may select when to record or when to have the animation. The recording window or the animation control window must be used to stop recording or the animation, respectively.

If GPSMan was invoked by using the start travel command the animation is started unless the connection to the receiver could not be established.

The control buttons in the recording window and in the animation control window affect only the recording and the animation, respectively, except in what concerns the logging time interval which is the same for the recording and the animation. The minimum value for the time interval depends on the rate at which the receiver sends information. The initial value for it is 2 seconds. The recording window and the animation control window will appear only after the first valid logging information is received, and this means at least 2 seconds from the clicking on the buttons/entries.

If GPSMan is invoked by using the start travel command the time interval can be given as the last argument to the command.

The recording window shows several columns with the logging information. These are, from left to right:

  • number of the fix,
  • local date and time,
  • the latitude and the longitude (datum: "WGS 84"),
  • altitude in metres (the existing option on user unit for altitude is not considered),
  • quality of the position fix,
  • EPE (estimated position error), EPH (expected position horizontal error), EPV (expected position vertical error) in metres,
  • the 3 coordinates of the velocity vector in metres/second,
  • TRK, the true track or bearing (CMG, course made good, track made good), true North.

Columns for which there is no information for the very first fix will be hidden automatically. The title of a column is a button that hides the column. This will be wanted for columns that are not being used or needed. The information in a hidden column is not lost and is updated. At any time a hidden column can be shown again by selecting its name from the Show menu.

The Restart button will destroy all the recorded information and restart recording.

The entries in the Save menu save as text the contents of the columns either in a one-shot fashion (Existing log), or writing the current contents and writing each new information when it comes up (continuously). In the latter case, the file will be closed when this menu entry is deselected or when real-time logging is stopped.

The text obtained with this menu cannot be re-loaded by GPSMan. To save the information in a format readable by GPSMan the Make TR button should be clicked to create a track, which can then be saved and loaded in the normal way.

The moving map works as the animation for a track described above. The main difference is in the scale that instead of setting the animation speed sets the logging interval.

For the time being there is no automatic loading of background images, a feature present in the variant for the Lowrance.

The travel/navigation interface provides  

  • two alternative displays, configurable by the user, to show real-time logging data and navigation information,
  • navigation information (including warnings) to
    • record the current position and return to it (MOB, man over board),
    • create a waypoint whose coordinates are those of the last point in the real-time log; this fails if the waypoint edit window already exists,
    • go to a selected waypoint,
    • follow a selected route, track or polyline,
    • go back, following in reverse the real-time track since travelling was started;
  • a Change menu (referred to as the menu in the remainder of this subsection) to control travelling/navigation and giving access to the receiver menu.


WARNING! use of this interface is at the sole risk of the user. In particular, the use of a laptop computer while driving alone is extremely dangerous. The user may also want to read the safety alert from the United States Coast Guard regarding the use of GPS equipment in boats.

A distinction is made here between travelling and navigating in the sense that the latter implies that there is a destination (when going to a waypoint or following a route) while the former does not. Starting a travel changes the map window top replacing the buttons by the travel/navigation displays. Stopping travelling restores the map window and will suspend (but not forget) current navigation objectives which will be resumed if travelling is again selected.

If GPSMan was invoked by using the start travel command travelling is started unless the connection to the receiver could not be established.

The following information from the real-time log can be shown when travelling:

  • local time,
  • position (latitude and longitude, "WGS 84" datum),
  • altitude in metres (the existing option on user unit for altitude is not considered),
  • TRK, true track, current bearing (COG, course over ground, CMG, course made good, track made good), true North,
  • quality of the position fix,
  • speed in user units,
  • vertical speed in metres/second and up/down arrow indicators,
  • type of receiver fix.

Other information only available when navigating:

  • CTS, course to steer,
  • TRK/CTS indicator, with an external compass ring (current track pointing up) and a CTS arrow,
  • TRN, turn (difference between course to steer and true track),
  • TRN arrow indicator,
  • To, current destination (when following a route or track, next point in it),
  • From, previous point in route or track,
  • distance to current destination,
  • ETA, expected time of arrival at current destination,
  • ETE, expected time in route to current destination,
  • VMG, velocity made good (velocity along the line from starting/previous point to current destination), in user units,
  • XTK, cross-track error (distance from current position to line from starting/previous point to current destination), in user units.

Navigation is started from the menu by selecting an objective which can be forgotten (navigation stops), suspended (navigation displays are frozen) and resumed.

Navigation to a point is made along a line of constant bearing with no drift (wind or stream effects) taken into account. This means that the transport velocity is assumed to be null and that CTS (the course to steer) is taken to be the bearing to the point. Computations use the so-called plane-sailing formulas that are commonly accepted as valid for distances up to 600 nautical miles [Gardner and Creelman, 1965], [Moore, 1964], [Macfarlane, 1963]. A point is arrived at when the distance to it is less than a user defined arrival distance.

Navigation along a route, track or polyline can be configured to be made:

  • either exactly, meaning that each point must be arrived at before the next is selected as current goal; or approximately, in the sense that the current goal is abandoned in favour of the next when a certain criterion is met even if the point is not yet arrived at (see below);
  • either starting from one end of the route or track, or from its nearest point (relative to the current position);
  • either in the normal direction, or in reverse.

At any moment the user can force a change to the next goal from the travel menu.

Following a route, track or polyline in an approximate way is implemented by considering only the current position and the next two points (the current destination and the point after it if there is one) because of efficiency issues. This means that navigation will be blind to all other points in the route, track or polyline even when the current position is closer to any of them than to the next two points. The criterion for changing the goal has a looseness parameter that can be changed from the menu. When a change to the next goal is about to be made a second CTS arrow (in a different colour) will be shown in the TRK/CTS indicator giving the bearing to it.

Tracks and polylines will be simplified to a certain number of points before being followed in an approximate way. In this case, numbers identifying track points will be preceded by an asterisk ("*") indicating that the numbers are different from those in the track.

Going back is implemented as following exactly the travelling log in reverse. This log is started when travelling begins and cleared only when restarting travelling, upon user confirmation. As a copy of it is used in going back, such a navigation will not be affected by clearing it.

Warnings will be issued as messages at the left upper corner of the map. Different colours are used for different priorities. User warnings can also be issued after configuration from the menu, and warnings (except those standing for danger) can be disabled without loosing the configuration. In case a warning is issued when another one is still being displayed it will either replace the previous one or be discarded depending on their relative priorities. There are the following classes of priority, in decreasing order:

    owner     usage
important GPSMan possibly dangerous situations
high user
medium user
normal GPSMan arrivals, errors
low user
info GPSMan other information

User warnings may be any of:

    when     needs
proximity to WP approaching WP, distance (user units)
leaving (anchor) WP, distance (user units)
speed in excess limit (user units)
vertical speed out of range minimun (may be <0), maximum (m/s)
turn in excess limit (degrees in -180 to 180)
cross-track error in excess limit (user units)

The configuration of the travel/navigation displays, warnings, arrival distance, and parameters for changing goal are kept on the saved state.


GPSMan User Manual
Copyright 1998-2013 Miguel Filgueiras,

Creative Commons License
GPSMan User Manual and the GPSMan logo images by Miguel Filgueiras are licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.

Get gpsman at SourceForge.net. Fast,
secure and Free Open Source software downloads


MiscellaneousUsing GPSMan in graphical modeDistances and bearingsReal-time logging
gpsman-6.4.4.2/manual/html/GPSMandoc_70.html0000644000175000017500000000663512170753404016471 0ustar migmig GPS Manager User Manual -- Version 6.4.4 -- 5 April 2013
Version 6.4.3 - 29 April 2012Recent ChangesVersion 6.4.4.1 - 15 July 2013Version 6.4.4 -- 5 April 2013

Version 6.4.4 -- 5 April 2013

  • new option in file config.tcl indicating whether GPSMan data can be appended to an existing file when saving; to be used with care as a file with conflicting time offsets can result that will not be loaded by GPSMan; asked by Zvi Grauer.

  • explicit support for the Garmin Street Pilot I, with thanks to Martin Espinoza who sent the protocols list.


GPSMan User Manual
Copyright 1998-2013 Miguel Filgueiras,

Creative Commons License
GPSMan User Manual and the GPSMan logo images by Miguel Filgueiras are licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.

Get gpsman at SourceForge.net. Fast,
secure and Free Open Source software downloads


Version 6.4.3 - 29 April 2012Recent ChangesVersion 6.4.4.1 - 15 July 2013Version 6.4.4 -- 5 April 2013
gpsman-6.4.4.2/manual/html/GPSMandoc_7.html0000644000175000017500000000643312170753404016405 0ustar migmig GPS Manager User Manual -- External utilities
Separate GPSMan utilitiesProgramsDownloading GPSManExternal utilities

External utilities

The following external utilities might be used if available:

  • gnuplot, to produce elevation graphs for tracks;
  • which or whereis, to check whether a program is available;
  • exif and/or metacam, to get the time-stamp of picture files when geo-referencing them.


GPSMan User Manual
Copyright 1998-2013 Miguel Filgueiras,

Creative Commons License
GPSMan User Manual and the GPSMan logo images by Miguel Filgueiras are licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.

Get gpsman at SourceForge.net. Fast,
secure and Free Open Source software downloads


Separate GPSMan utilitiesProgramsDownloading GPSManExternal utilities
gpsman-6.4.4.2/manual/html/GPSMandoc_15.html0000644000175000017500000001732212170753404016463 0ustar migmig GPS Manager User Manual -- Basic concepts
Names and renamingUsing GPSMan in graphical modeLaunching GPSManBasic concepts

Basic concepts

Here is a list of a few terms that will be used below.

Waypoints, routes, tracks and laps are examples of data used in GPS receivers.

  • a waypoint (sometimes abbreviated to WP) describes a precise location through its geographic coordinates 
  • a sequence of waypoints is called a route (RT) and is defined by the user
  • a track (TR, also called a trail in Lowrance receivers) is a sequence of track points (TPs) recorded by the GPS receiver over a time period and giving the positions, each with a time-stamp, of the receiver during that period, and including if possible the altitude and the depth (both in either metres or feet, depending on the existing option for this)
  • a lap (LAP) has a time-stamp for its start, a duration, the total distance, the calories spent, the start and stop positions, and an associated track; a sequence of laps is called a run, and runs are represented in GPSMan by groups that are automatically created when getting laps from the receiver; support for laps in GPSMan exists only for Garmin receivers and must be explicitly selected from the options (receiver parameters) window;

Route stages are the parts of a route between each two consecutive waypoints. Route stages are called edges in Graph Theory, legs in aviation, and links by Garmin. At present, GPSMan deals with three data fields for each stage: a comment, a label (that will appear in the map), and hidden information.

Data items refer to the elements stored in the GPSMan data-base. Apart from the data items used in GPS receivers GPSMan also works with

  • polylines (LN), also called polygonal lines, that are similar to tracks but have points (LPs) without time-stamps. Polylines are mainly used as background in the map window
  • groups (GR) can be seen as sets of items, or alternatively as directories/folders containing items. They can be used to collect together items that are related to each other, they allow for operations to be performed on a set of items and they can be the result of operations yielding a set of items (for instance, the result of a search).

Track and polyline segments are subdivisions that, in the case of tracks, normally indicate that there were time gaps in which the receiver got no position information. The representation in the map of a track or polyline having different segments is a polygonal line that is interrupted between each segment (segments with a single point will hardly be visible). Segments are defined by their starting points and in the track or polyline edit window it is possible to mark or unmark each point (except the first) as being a segment starter.

Comments and remarks (NB) can be specified for some types of items. The difference between them is that comments can be got from and put into the GPS receiver, while remarks are only kept by the interface and may be saved to and loaded from GPSMan files. The characters allowed in a comment, as well as its size, depend on what the receiver accepts with the exception that GPSMan will replace any newline by a space. In remarks the only constraint is that no blank lines are allowed.

A map background image name can be associated to each data item except for laps and groups, so that when the item is displayed on the map window the named image is automatically loaded if the map is empty. See below for the details.

Forgetting a data item means deleting it permanently from the data-base.

Input/Output operations in GPSMan have the following names (see below for the definitions of the GPSMan file formats):

  • loading from and saving to files in GPSMan format;
  • getting from and putting into the GPS receiver (this corresponds to the terms downloading and uploading, respectively, used in other software);
  • importing from and exporting to files in a foreign format. Currently recognized formats are given below.


GPSMan User Manual
Copyright 1998-2013 Miguel Filgueiras,

Creative Commons License
GPSMan User Manual and the GPSMan logo images by Miguel Filgueiras are licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.

Get gpsman at SourceForge.net. Fast,
secure and Free Open Source software downloads


Names and renamingUsing GPSMan in graphical modeLaunching GPSManBasic concepts
gpsman-6.4.4.2/manual/html/gpsman-logo-small.gif0000644000175000017500000000357611635427511017545 0ustar migmigGIF89a58"$ |vf dӴqܾ\l\HΜ$l>ľLdtkTʄ̌}aĀ L0Ԧ,qQdRij)Lt쌆|DjdbT<2 wܾLAĒ 8v YJ9~l~$ԍnԞ$|T̮lbybܔttPƷtn\Ċ ԪLҴxT8愔jTtfDLdz˰yd>̤Lڌ~p$\O8ƺҼ\D:Ē$7qX|?֨ N4OCHLTeDC6D*p4p=\ 7;cJ5بF?-$Cx˔QN''d'X; 0=\?CلF:2=C3]FdC-CD4m dsK3=|qA3D?=4cCBhph(C3_3O<4<.pSDl=D3:`F=lSQ_74 Al.pBӆ\07I GPS Manager User Manual -- Using GPSMan in Command-line Mode
Extending GPSMan: Plug-insTopUsing GPSMan in graphical modeUsing GPSMan in Command-line Mode

Using GPSMan in Command-line Mode

The command-line mode can only be used in operating systems supporting command line arguments, namely Unix/Linux systems. For the time being only Garmin receivers are supported in commands requiring a receiver.

In graphical mode GPSMan is launched by invoking gpsman or gpsman.tcl with either no arguments or a single argument standing for the serial or USB device, while in command-line mode there will always be 2 or more arguments. This is used to distinguish between the two situations, although the graphical mode can be entered from command-line mode.

The general form of invocation is (in the usual Unix notation)

gpsman [OPTIONS] COMMAND [COMMAND_ARGS]

Some commands accept parameters in the form NAME=VALUE. The term parameter when used here referring to arguments of a command has always this meaning. Care should be taken if the value part is a string with spaces (or other characters with special meaning for the shell or system command interpreter) in which case quotes or some other form of quoting should be used.

The possible options are:

-dev DEVICE
gives the serial device path
-log
creates a log file of the serial communication named logfile in the GPSMan user directory
-rec Garmin | Lowrance | Magellan
changes the brand of the receiver (NOTE: at present will only work with Garmin); this option can be useful to override the options in the preferences file; cannot be used with the readput command, nor with the -prefs option, and cannot occur after the -prot option;
-prefs PREFSFILE
gives the path for an alternative preferences file (read after the user preferences file); cannot be used with the -rec option
-prot PROTOCOL
selects the protocol to be used overriding the default protocol given in the preferences file; cannot occur before the -rec option; the show protocols command can be used to find out which protocols are available

Options not related with COMMAND will be silently ignored.

GPSMan exits with either a 0 if the command was successfully executed, or a 1 if not. Some commands will write information to the standard output channel. Error messages can possibly be written to the standard error channel, but most of the errors will not be explained. In case of doubt the graphical mode should be used to see if there are problems with files or the receiver.

Note that in command-line mode the saved state is not restored and the state is not saved unless the graphical mode is entered.

Available commands are:

is available
exits with 0

is connected
exits with 0 if a connection check with the receiver succeeds

show WHAT
writes help information to the standard output

haslib LIBRARY
checks availability of library

getwrite IN-TYPES FORMAT [OUT-PARAMS] [OUT-TYPES] PATH
transfers data from the receiver to a file

readput FORMAT [IN-PARAMS] [IN-TYPES] PATH [OUT-TYPES]
transfers data from a file to the receiver

getrtimelog PATH [INTERVAL]
gets the real-time log from the receiver and saves it to a file

getfix PATH [TIMEOUT]
gets the current fix data and saves it to a file

getalmanac PATH
gets the current almanac data and saves it to a file

read FORMAT [PARAMS] [TYPES] PATH
reads a data file and launches the graphical interface

translate
IN-FORMAT [IN-PARAMS] [IN-TYPES] IN-PATH [HOW-PARAMS]   OUT-FORMAT [OUT-PARAMS] [OUT-TYPES] OUT-PATH translates from a file format to another one

start travel [INTERVAL]
launches the graphical mode and starts real-time logging, animation and travelling, unless the connection to the receiver could not be established

project LATD LONGD DATUM PROJECTION [PARAMS]
writes to the standard output the projection of a point

georef
IMGPATH TRANSF LATD LONGD LATD LONGD [LATD LONGD] DATUM X Y X Y [X Y]   PROJECTION [PARAMS] writes to the standard output a map information file

geopicts
IN-FORMAT [IN-PARAMS] IN-TYPE IN-PATH [PROC-PARAMS]   OUT-FORMAT] [OUT-PARAMS] OUT-PATH PICT-PATHS geo-references files using either their time-stamps and a given track, or the sequence of waypoints in a group

source PATH
executes a Tcl/Tk script

exec PATH
executes a GPSMan script

File format names should be given as they appear in the output of the show formats command, or using only lowercase letters.


GPSMan User Manual
Copyright 1998-2013 Miguel Filgueiras,

Creative Commons License
GPSMan User Manual and the GPSMan logo images by Miguel Filgueiras are licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.

Get gpsman at SourceForge.net. Fast,
secure and Free Open Source software downloads


Extending GPSMan: Plug-insTopUsing GPSMan in graphical modeUsing GPSMan in Command-line Mode
gpsman-6.4.4.2/manual/html/GPSMandoc_37.html0000644000175000017500000000624712170753404016473 0ustar migmig GPS Manager User Manual -- The is connected Command
The show WHAT CommandUsing GPSMan in Command-line ModeThe is available CommandThe is connected Command

The is connected Command

The connection with the receiver is checked and the command exits with 0 if it succeeds. Only works with Garmin receivers.


GPSMan User Manual
Copyright 1998-2013 Miguel Filgueiras,

Creative Commons License
GPSMan User Manual and the GPSMan logo images by Miguel Filgueiras are licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.

Get gpsman at SourceForge.net. Fast,
secure and Free Open Source software downloads


The show WHAT CommandUsing GPSMan in Command-line ModeThe is available CommandThe is connected Command
gpsman-6.4.4.2/manual/html/GPSMandoc_8.html0000644000175000017500000001766112170753404016413 0ustar migmig GPS Manager User Manual -- Separate GPSMan utilities
Data and examplesProgramsExternal utilitiesSeparate GPSMan utilities

Separate GPSMan utilities

The GPSMan distribution includes (in the util directory) some other utilities that can also be downloaded from the GPSMan site.

The first three below were not integrated into GPSMan because the format of the HTML pages they read does not follow any known specification and may change at any time. They must be edited for configuration and GPSMan must be installed before they can be used.

MapBlast waypoints

mb2gmn.tcl converts the waypoints listed in HTML pages of the MapBlast site into GPSMan files. At its core is code contributed by Martin Ostermann (Aachen University of Technology). It translates HTML pages produced at the MapBlast site in answer to queries under the Directions section; the pages should be saved locally and then opened from the program.

MapsOnUS routes

mou2gmn.tcl converts the routes listed in HTML pages of the MapsOnUS site into GPSMan files. At its core is code contributed by Frank Kujawski (Frank_at_Kujawski.org). It translates HTML pages created at the MapsOnUS site as follows: go to the "General Options" (under the "Tools" menu), select "Show Latitude & Longitude", plan a route, "jump to turn-by-turn directions", hit the "non-tabular format" link and save locally the HTML page. These files are then opened from the program and the resulting files will contain the routes and their waypoints. The remark fields of the waypoints will have the directions in the HTML pages.

GreenFlag routes

gf2gmn.tcl converts the routes listed in HTML pages of the GreenFlag site into GPSMan files. At its core is code contributed by Nigel Orr (gps_at_river-view.freeserve.co.uk). It translates HTML pages produced at the GreenFlag site [link not working on June 2007] as follows:
  • enter the route details,
  • select Step by step maps under directions style (down on the page),
  • select Get Directions,
  • save the page you get (HTML only; the maps are not needed).

The saved pages are then opened from gf2gmn.tcl.

BGA (DOS) turnpoints

dos2gpsman.tcl converts BGA (British Gliding Association) DOS turnpoints files to GPSMan. It was contributed by Paul Scorer (p.scorer_at_leedsmet.ac.uk). It reads from and writes to the standard input and standard output unless otherwise specified by the arguments which are:
[-p feature] [-f findability] [-a air_activity] \
         [-i in_file] [-o out_file] [-h] [--help]
where findability is a letter in A to D or G, and air_activity is a 1 or 2-characters string.

Splitting a Shapefile into quadrants

shape2quadr.tcl reads a Shapefile and from a list of quadrangles (defined by extreme latitude and longitude) produces GPSMan files, one for the set of items in the file that belong to each quadrangle. Quadrangles may overlap. Items may belong to more than one quadrangle. This utility may prove helpful for dealing with large Shapefiles. It can be called in two ways:
  • giving a name and the extreme coordinates of each quadrangle, the arguments in call being
    FILE PREFIX [NAME LONGMIN LONGMAX LATMIN LATMAX]+
    
    where NAME is the name of each quadrangle
  • defining a grid of quadrangles, the arguments being
    FILE PREFIX -d QPREFIX LONG LONGRANGE STEPLONG MAXLONG \
                           LAT LATRANGE STEPLAT MAXLAT
    
    where QPREFIX is used in generating names for the quadrangles, each quadrangle having an extent of LONGRANGE by LATRANGE, the first has the southwest corner at LONG,LAT, and the southwest corners of the others follow at steps of LONGSTEP and LATSTEP and will not be greater than MAXLONG and MAXLAT
the common arguments being: FILE, the Shapefile to be read, and PREFIX that is used for generating a file name for each quadrangle.

Shapefiles with points are not supported and altitudes are not kept. The coordinates in the Shapefile are assumed to be in decimal degrees (DDD) in the "WGS 84" datum (it can easily be changed in the utility source).

All items read are saved as GPSMan polylines (LNs) in DDD format. Each quadrangle file will also have a group (GR) with all its polylines, so that it will be easy to display/hide all of them at once; the file starts with a comment giving the boundaries of the quadrangle. The file name is of the form PREFIX_QUAD where QUAD is the quadrangle name; each file is created in the current directory destroying any file under the same name.


GPSMan User Manual
Copyright 1998-2013 Miguel Filgueiras,

Creative Commons License
GPSMan User Manual and the GPSMan logo images by Miguel Filgueiras are licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.

Get gpsman at SourceForge.net. Fast,
secure and Free Open Source software downloads


Data and examplesProgramsExternal utilitiesSeparate GPSMan utilities
gpsman-6.4.4.2/manual/html/GPSMandoc_13.html0000644000175000017500000001205712170753404016461 0ustar migmig GPS Manager User Manual -- Using GPSMan in graphical mode
Using GPSMan in Command-line ModeTopConfigurationUsing GPSMan in graphical mode

Using GPSMan in graphical mode


GPSMan User Manual
Copyright 1998-2013 Miguel Filgueiras,

Creative Commons License
GPSMan User Manual and the GPSMan logo images by Miguel Filgueiras are licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.

Get gpsman at SourceForge.net. Fast,
secure and Free Open Source software downloads


Using GPSMan in Command-line ModeTopConfigurationUsing GPSMan in graphical mode
gpsman-6.4.4.2/manual/html/GPSMandoc_75.html0000644000175000017500000001252712170753404016473 0ustar migmig GPS Manager User Manual -- Version 6.3.2 -- June 2007
Version 6.3.1 - July 2006 Recent ChangesVersion 6.4 - October 2008Version 6.3.2 -- June 2007

Version 6.3.2 -- June 2007

  • Least Squares fit for geo-referencing images either by placing control points on the image, or by giving a file of coordinates of control points; asked by James B. Mehl (jmehl_at_rockisland.com) who kindly provided the formulas.

  • the track computation window now displays for each track point its date and position; there was a change in the order of the fields both in the window and in saved results; asked by Victor Yip.

  • enhanced support for GPX files; contributed by Valère Robin.

  • dealing with track segments in GPX files; asked by Tomi Ollila.

  • importing and exporting tracks using a file format similar to the Garmin Simple Text Output protocol.

  • getfix command now also produces the altitude if in a 3D fix; asked by Marc van der Sluys.

  • new geopicts command geo-references files (e.g., picture files from a digital camera) either based on their time-stamps and a given track, or by using the sequence of waypoints in a group. The result is a file with waypoints (at present in GPX format) that can be suitable for use with Web applications. Implemented using as model a Python script kindly contributed by Valère Robin.

  • new show symbols command prints for each waypoint symbol its internal name followed by the name in the user-selected language; symbol internal names may be needed in the geopicts command.

  • the read command that was only to be used in GPSMan scripts can now be used from the command-line in which case it reads a data file and launches the graphical interface; suggested by Valère Robin.

  • names of file formats in commands can now be given all in lower case letters.

  • for MS-Windows users, the manual now explains how to set the user directory under the user's Application Data directory; contributed by Harald Stauss (harald.stauss_at_web.de).

  • explicit support for some more Garmin receivers or their new firmware versions, including: the GPSMap 60, the StreetPilot i2, the eTrex Venture and the Forerunner 305; with thanks to all those who sent protocol lists: Philip Hands, Rolf Werum, Patrick Kik, Waldemar de Laurent, Jon Niehof, Harry Jensen, Alberto Ham, Hans-Peter Nilsson, Jorge Sanchez, Jeremiah Horner.


GPSMan User Manual
Copyright 1998-2013 Miguel Filgueiras,

Creative Commons License
GPSMan User Manual and the GPSMan logo images by Miguel Filgueiras are licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.

Get gpsman at SourceForge.net. Fast,
secure and Free Open Source software downloads


Version 6.3.1 - July 2006 Recent ChangesVersion 6.4 - October 2008Version 6.3.2 -- June 2007
gpsman-6.4.4.2/manual/html/GPSMandoc_17.html0000644000175000017500000002140312170753404016460 0ustar migmig GPS Manager User Manual -- Data
WaypointsUsing GPSMan in graphical modeNames and renamingData

Data

The contents of the GPSMan data-base are shown in lists, one per each item type. Item names, which are unique, are presented in alphabetical order.

List menus contain the actions allowed on the list, like creating a new item, opening an existing one, clearing the list, reading/writing items, and counting the number of items in the list. The menu for the groups list is a little different and is described below.

Loading operations read all the data in a GPSMan file irrespective of from what menu the operation was launched. Laps in a file will be ignored unless the support for laps is active.

To open an item for editing (only possible when no other item of the same kind is being edited) or viewing its data, use the appropriate menu entries in the sub-menus of the Data menu or in the list menus, or double-click on the item name with the mouse left-button. Double-clicking also works with the same meaning on other lists of item names, as well as on graphical representations of items (except polylines) in the map window.

An edit/show window for an item will be closed and re-opened in case there is a read operation redefining it.

To display/clear an item on/from the map click on the item name (in the corresponding list) with the mouse right-button, or use the Display on map or Clear entries in the Items menu-button on the map window. The Make Group entry allows for the creation of a group with all the items on the map, or with all the items not on the map.

A read operation redefining items that are currently on the map will cause the map to be updated in order to keep it consistent with the new definitions.

Pressing a key on a list will scroll it to make visible the first element whose initial character is the same or higher in ASCII order than the key character. Note that this is case sensitive (i.e., a is not A). This also works on lists presented for choosing items. Lists can be scrolled by moving the wheel of a wheelmouse.

Hidden information is kept (in the data-base and in files) associated to an item data that has been read in (from a file, or from the receiver) when that information cannot be edited using GPSMan. This is done mainly with data fields that are not of general use, and provides a means of restoring the data item back to any receiver that works with the same communication protocols, without loosing information. When the item data is modified its hidden information is either deleted, or kept, or acted upon as the user sees fit, according to an option. Keeping the hidden information may cause incoherent items to be created and therefore should be used with care.

Hidden information in a waypoint or a track can be displayed from their edit/show windows (a button for this is created only when such information exists).

Saving the program state when exiting is controlled by an option that may inhibit this feature, do the saving if the user confirms it, or do it without asking. When saving the state, files in the user data directory are created that contain the current data-base, the map state and information on which edit/show windows are currently being used. No information is kept on

  1. the state of the communication with the receiver
  2. the changes in pending edit operations or items partially defined
  3. the state of computation, elevation, and real-time log windows.

The saved state is automatically loaded when GPSMan is launched and finds a saved state file in the user directory. There is an option to control whether to delete saved state files after the state being restored; it can be set in the same way as the save state option. In any case GPSMan automatically overwrites saved state files when saving a new state, and it is therefore a good idea to save important data to a file before quitting the program.

Note that in command-line mode the saved state is not restored and the state is not saved.

Other information can be retrieved from the receiver and displayed as text that can then be saved to a file, without being stored in the data-base.

At present this is the case with GPS almanac data (only implemented for Garmin receivers). The following is a list of all the possible fields, the actual set used by each receiver depending on the protocol it uses:

  • satellite identification number, PRN;
  • GPS week number: 0-1023 since 22 August 1999 (in fact, since 6 January 1980, but goes back to 0 every 1024 weeks);
  • data reference time or time of applicability: number of seconds in orbit when almanac was generated;
  • clock bias, in seconds, af(0);
  • clock drift, in seconds per seconds, af(1);
  • eccentricity of orbit;
  • square root of the orbit semi-major axis;
  • mean anomaly im degrees: angle travelled past the longitude of ascending node, negative when going from the apogee to the perigee;
  • argument of perigee: angle along the orbital path from the ascending node to the perigee in the direction of the satellite motion;
  • right ascension at the time of almanac: geograpic longitude of the ascending node of the orbit plane at the weekly epoch;
  • rate of change of right ascension;
  • orbital inclination, angle between orbit plane and the equator;
  • satellite health, 0 meaning usable.

If the satellite identification numbers are missing, the order of the lines is the one provided by the receiver and is expected to follow the satellite numbers from 1 to 32.


GPSMan User Manual
Copyright 1998-2013 Miguel Filgueiras,

Creative Commons License
GPSMan User Manual and the GPSMan logo images by Miguel Filgueiras are licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.

Get gpsman at SourceForge.net. Fast,
secure and Free Open Source software downloads


WaypointsUsing GPSMan in graphical modeNames and renamingData
gpsman-6.4.4.2/manual/html/GPSMandoc_29.html0000644000175000017500000000741412170753404016471 0ustar migmig GPS Manager User Manual -- Distances and bearings
Real-time loggingUsing GPSMan in graphical modeProjections and coordinate gridsDistances and bearings

Distances and bearings

There are two sets of formulas for computing distances and bearings that the user may choose

  1. the so-called Law of Cosines for Spherical Trigonometry, that is not very accurate but is quite fast, and
  2. the modified Rainsford's Method with Helmert's elliptical terms with a high degree of accuracy but slower; this method cannot be applied if one of the points is a geographical pole, in which case GPSMan applies the Law of Cosines.

In some situations, namely when computing the total distance along a track having very small distances between consecutive points, the Law of Cosines will yield results with large errors and therefore it should only be used on very slow computers.

Bearings in GPSMan are always geographic (True North).


GPSMan User Manual
Copyright 1998-2013 Miguel Filgueiras,

Creative Commons License
GPSMan User Manual and the GPSMan logo images by Miguel Filgueiras are licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.

Get gpsman at SourceForge.net. Fast,
secure and Free Open Source software downloads


Real-time loggingUsing GPSMan in graphical modeProjections and coordinate gridsDistances and bearings
gpsman-6.4.4.2/manual/html/GPSMandoc_3.html0000644000175000017500000001777312170753404016412 0ustar migmig GPS Manager User Manual -- Main features
IntroductionContributorsMain features

Main features

What GPSMan does when in graphical mode:

  • GPSMan keeps lists of data items (waypoints, routes, tracks, polylines, laps and groups) whose information can be written to and read from text files, or, except for polylines, got from and put into supported GPS receivers;

  • GPSMan lets the user create new data items, as well as modify or delete those already defined; groups (sets) of data items are very helpful in keeping and classifying the existing information, as well as in the selection of information to be processed;

  • GPSMan makes conversions of

    • routes into tracks;
    • tracks into routes, tracks or polylines, by keeping a certain number (fixed by the user) of track points;
    • polylines into tracks;
    • tracks into a waypoint taking the averages of the latitudes, longitudes and altitudes of the track points;
    • waypoints in a group into a waypoint taking the averages of their latitudes, longitudes and altitudes;
    • routes, tracks and polylines into similar items by splitting at certain points;

  • GPSMan records real-time track logging information that can be displayed on a moving map and used to create a track (that may be then converted into a route or a polyline);

  • GPSMan retrieves GPS almanac data from the receiver;

  • GPSMan makes computations of,

    • for waypoints: distance and bearing to another waypoint, nearest waypoints (in fact, distances and bearings to all other waypoints ordered from nearest to furthest), clusters of waypoints with given centres,
    • for routes: distances, azimuths and differences in altitude between consecutive points, total distance, and enclosed area (under certain conditions),
    • for tracks: distances, differences in time, speed and azimuths between consecutive points, cumulative distance and altitude at each point, total distance and and time with and without considering gaps between segments, average speed distance from first to last point, maximum distance from first point to any track point, and if altitude information is available, cummulative ascent and descent, maximum and minimum altitudes,
    • for laps: stop time, average speed;

  • GPSMan can make a map to scale, using one of a choice of projections, showing waypoints, routes, tracks and polylines; the map can be saved or printed in Postscript or other graphics formats if the Img Tcl/Tk library is available; images may be used as background for the map and geo-referenced; waypoints can be represented in different ways (any combination of symbol and name or comment); an animation of the movement along the real-time track or of a recorded track can be shown on the map; elevation graphs, as side-views or perspectives, of routes and tracks can be plotted and saved or printed in Postscript or other formats if Img is available; speed and climb rate graphs for tracks can be plotted, saved and printed in a similar way;

  • GPSMan allows for data items to be searched by:
    • patterns matching the item name, comment and/or remark,
    • distance to a given waypoint or location (given by its coordinates), for waypoints and tracks,
    • symbol, for waypoints,
    • waypoints, for routes,
    • start date, for tracks.

  • GPSMan provides conversion between different position formats (latitude/longitude in DMS, DMM, DDD or grades, and several grid coordinates, including UTM/UPS) and/or different datums; there is support for user-defined datums, ellipsoids, projections and related coordinate grids.

  • GPSMan allows the user to change its configuration, providing a choice of languages (Dutch, English, French, German, Indonesian, Italian, Russian, Spanish and Portuguese in the current distribution), and accepting new values for parameters related to the GPS receiver, default settings, and concerning interface appearance (colours, dimensions, positions).

  • GPSMan can be extended through pre- and user-defined plug-ins coded in Tcl/Tk.

What GPSMan does when in command-line mode:

  • GPSMan makes availability and connection checks.
  • GPSMan provides information on its version, the supported protocols, data file formats, projections, coordinates transformations, datums, symbols and available commands.
  • GPSMan connects to the receiver, gets data, the real-time log, the current fix or almanac data and stores them in a file.
  • GPSMan reads data from a file in a user selected format, connects to the receiver and transfers the loaded information to it.
  • GPSMan reads data from a file in a user selected format and writes it to another file in another selected format.
  • GPSMan prints the projected coordinates of a point using a given projection.
  • GPSMan reads a data file and launches the graphical interface.
  • GPSMan launches the graphical interface and enters the travel mode.
  • GPSMan produces an image information file from geo-referencing data.
  • GPSMan produces a file of waypoints obtained by geo-referencing files based on their time-stamps.
  • GPSMan executes Tcl/Tk scripts and scripts made up of GPSMan commands.


GPSMan User Manual
Copyright 1998-2013 Miguel Filgueiras,

Creative Commons License
GPSMan User Manual and the GPSMan logo images by Miguel Filgueiras are licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.

Get gpsman at SourceForge.net. Fast,
secure and Free Open Source software downloads


IntroductionContributorsMain features
gpsman-6.4.4.2/manual/html/GPSMandoc_60.html0000644000175000017500000000633012170753404016460 0ustar migmig GPS Manager User Manual -- Support for Magellan receivers
Support for Garmin receiversSupport for Lowrance, Magellan and Garmin ReceiversSupport for Lowrance receiversSupport for Magellan receivers

Support for Magellan receivers

The support for Magellan receivers is a contribution of Matt Martin (matt.martin_at_ieee.org).


GPSMan User Manual
Copyright 1998-2013 Miguel Filgueiras,

Creative Commons License
GPSMan User Manual and the GPSMan logo images by Miguel Filgueiras are licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.

Get gpsman at SourceForge.net. Fast,
secure and Free Open Source software downloads


Support for Garmin receiversSupport for Lowrance, Magellan and Garmin ReceiversSupport for Lowrance receiversSupport for Magellan receivers
gpsman-6.4.4.2/manual/html/GPSMandoc_19.html0000644000175000017500000002366512170753404016476 0ustar migmig GPS Manager User Manual -- Routes
TracksUsing GPSMan in graphical modeWaypointsRoutes

Routes

Routes may happen to have waypoints that were permanently deleted by the user (Forget button in waypoint window). In this case the values of distances and bearings for such points and the total distance will not be shown. Saving, exporting or displaying a route with undefined waypoints will be prevented with a warning.

Routes have a colour and a width (in pixels) used in displaying it in the map.

A map background image name can be given for each route, so that when the route is displayed on the map window the named image is automatically loaded if the map is empty. See below for the details.

A route can be created from a track : see below.

A route can be changed or created by drawing on the map as explained below.

To change a route stage a double-click with the mouse left-button should be made on one of the stage fields in the route edit window. An edit window will pop up that must be used and closed before going on.

Changes in a waypoint belonging to a route being edited/inspected will be reflected in the route window.

When modifying a route the coherence of its waypoints and its stages cannot be checked by GPSMan. For instance, when adding a new waypoint after another one the stage starting from the latter is not affected, and when replacing a waypoint by another one the stages ending on and starting from it are not affected.

The edit window for routes allows some operations on routes that may be useful. They are:

  • "Delete": delete all selected waypoints;
  • "Insert before", or "Insert after": insert a waypoint before or after the, respectively, first or last selected waypoint; if there is no selection, the insertion will be done before the first or after the last waypoint, respectively;
  • "Replace by": replaces the first selected waypoint by another one;
  • "Invert": take the route from the last to the first waypoint;
  • "Chop head": all waypoints from the first to and including the first one selected are deleted; if there is no selection the first waypoint is deleted;
  • "Chop tail": all waypoints from and including the last one selected to the last are deleted; if there is no selection the last waypoint is deleted;
  • "Include before", or "Include after": include the route (whose number was selected in the sub-menu) before or after the, respectively, first or last selected waypoint; if there is no selection, the inclusion will be done before the first or after the last waypoint, respectively;
  • "Clear": delete all waypoints.

A route can be splitted by taking each selected waypoint as the first point of a new route extending up to and excluding the next selected point. Routes with at least two points obtained in this way are created, as well as a group with all of them. These new routes inherit the stages, width, colour and map background of the original route, but hidden information is discarded. They and the new group get names generated automatically. The original route is not affected by this operation.

A route can be converted into a track from the route window.

An elevation graph for a route can be plotted, as a side view or in perspective, from the route window if there are at least 3 waypoints with a valid altitude field.

In side-view graphs, a button displays or hides vertical grid lines and clicking with the mouse left-button will draw a line with the numbers of the waypoints at that horizontal coordinate. Clicking with the mouse left-button with the Control key depressed will show the number of the nearest waypoint, its altitude and cumulative distance. The Shift key and mouse left-button will clear all these lines and information.

The perspective graph is shown from South but different viewing directions can be obtained by using the N-E-S-W buttons, or the Show button after the +15, -15 (degrees) buttons. The bearing scale shows the viewing direction in degrees that is the current one only when the Show button is disabled (this button updates the graph). The scale can also be used to change the viewing direction if the animate button is checked. As the animation or a change of viewing direction may lead to a long computation, there is an Abort button to stop it. The menu from the View button allows for changes in the vertical or horizontal scales, and to hiding/displaying labels in the graph. A N-E-S-W cross is displayed in the graph and can be moved by using the mouse left-button. Clicking with the left-button on a point of the route and then using the mouse middle-button (or left- and right-buttons in a two-button mouse) will move the whole graph.

Elevation graphs can be saved as a Postscript file or further processed (e.g., printed) in Postscript -- cf. the "print command" option), or saved in other graphics formats if the Img Tcl/Tk library is available. This library has two problems when saving an image:

  • any window or icon over it will also be part of the saved image; and
  • depending on the format, errors can occur if the image has too many colours.

The area enclosed by a route can be computed under the following conditions -- badly wrong values will result if they are not met! The route stages are taken as sides of a polygon and if the last waypoint is not the same as the first, a "virtual" side from the first to the last waypoint is considered. The polygon must be non-intersecting: there can be no multiple occurrences of waypoints (apart from the first one being also the last) and no intersections of the polygon sides. GPSMan will only check for multiple occurrences of waypoints. The method for computing areas is an approximate method that is not reliable when there are sides of the polygon too small when compared to others or there are very small angles between the sides. Results of area computations should be used with care and if possible checked against results of other forms of area measurement.

The details of the area computation are as follows. An algorithm for computing the area of a (non-self intersecting) polygon on the sphere is first tried out. If there are very small intermediate values that may indicate approximation errors, the area is computed by first projecting the polygon onto the plane (using the Transverse Mercator projection centred at the first point of the polygon) and applying then an algorithm for computing the area of a (non-self intersecting) polygon on the plane. A warning message is issued if this happens.


GPSMan User Manual
Copyright 1998-2013 Miguel Filgueiras,

Creative Commons License
GPSMan User Manual and the GPSMan logo images by Miguel Filgueiras are licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.

Get gpsman at SourceForge.net. Fast,
secure and Free Open Source software downloads


TracksUsing GPSMan in graphical modeWaypointsRoutes
gpsman-6.4.4.2/manual/html/GPSMandoc_31.html0000644000175000017500000001166412170753404016464 0ustar migmig GPS Manager User Manual -- Miscellaneous
GPSMan FilesUsing GPSMan in graphical modeReal-time loggingMiscellaneous

Miscellaneous

  • changes in option values in some cases do not take effect immediately but only after GPSMan is restarted. Some care should be taken to avoid inconsistencies due to this. In particular, changes in the distance unit affect the possible values for the initial map scale, so that a change in the latter is normally needed in the next session after changing the former.

  • in order to prevent inconsistencies, windows presenting results that depend on the definition of an item, such as computations or graphs, may be (but is not guaranteed to be) closed by GPSMan when the item changes after being edited or being replaced when data is read-in.

  • anything that looks like a button normally is a button.

  • closing a window from the window manager may cause data to be lost, and GPSMan may be unable to create it again.

  • at any time only one waypoint, one route, one track, one polyline and one group may be open for editing; other such items may be viewed but not edited.

  • when exiting from the program (GPS Manager button, or ctrl-c in the GPSMan windows), unsaved data will be lost unless the interface state is to be saved (see above). As saved state files will be overwritten automatically by GPSMan it is a good idea to save important data to a file before quitting the program.

  • operations that can take a long time are either subject to confirmation (if they can not be interrupted), or can be controlled from a slow operation dialog window if the option on this is selected. This window has an "Abort" button for cancelling the operation and a text box where all the error messages during the operation are collected. When the operation ends the window is closed automatically if there are no messages, otherwise it must be closed manually.


GPSMan User Manual
Copyright 1998-2013 Miguel Filgueiras,

Creative Commons License
GPSMan User Manual and the GPSMan logo images by Miguel Filgueiras are licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.

Get gpsman at SourceForge.net. Fast,
secure and Free Open Source software downloads


GPSMan FilesUsing GPSMan in graphical modeReal-time loggingMiscellaneous
gpsman-6.4.4.2/manual/html/GPSMandoc_11.html0000644000175000017500000001041512170753404016453 0ustar migmig GPS Manager User Manual -- Known problems
ProgramsInstallationKnown problems

Known problems

The list of known problems (on 15 July 2013) is:

  1. developers of Tcl/Tk found out in May 2011 that the Tk raise command to raise a window may not work as expected in some situations. As its behaviour depends on the operating system graphics support and on the window manager there is no solution they can offer. GPSMan uses this command to present pop-up windows, in particular those asking for a confirmation or an answer and that must be attended to by the user before execution goes on. This means that when GPSMan seems to block and does not answer the user should check whether there is such a window hidden below other ones and waiting for some input.

  2. GPSMan blocks or gives strange error messages when trying to connect to a Garmin receiver that has been turned off but still answers to a product information request command.

  3. in Linux the Tcl/Tk error couldn't load file "/usr/lib/gpsmanshp.so", cannot open shared object file usually means that the gpsmanshp library was not correctly installed.

  4. GPSMan support for Garmin receivers may need to convert between bytes and floating point numbers. Tcl/Tk has no machine-independent way to do these conversions and GPSMan only implements them for little- or big-endian architectures that follow the IEEE floating point standard. Some Garmin receivers do not use protocols having floating point numbers and are not affected by this.


GPSMan User Manual
Copyright 1998-2013 Miguel Filgueiras,

Creative Commons License
GPSMan User Manual and the GPSMan logo images by Miguel Filgueiras are licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.

Get gpsman at SourceForge.net. Fast,
secure and Free Open Source software downloads


ProgramsInstallationKnown problems
gpsman-6.4.4.2/manual/html/GPSMandoc_43.html0000644000175000017500000001052412170753404016461 0ustar migmig GPS Manager User Manual -- The getfix Command
The getalmanac CommandUsing GPSMan in Command-line ModeThe getrtimelog CommandThe getfix Command

The getfix Command

The getfix command gets the current fix data from the receiver using the real-time log and saves it to a file:

getfix PATH [TIMEOUT]
where:
  • PATH is the path to the output file, unless it is stdout in which case output will be to the standard output. Existing files will be silently overwritten.
  • TIMEOUT is the number of seconds to wait for a good position fix before giving up. If this argument is not given or is 0, the program will not exit before getting a good position fix.

If a good position fix was read, the ouput will consist of the following lines:

  • latitude and longitude in decimal degrees separated by one space;
  • datum ("WGS 84" for Garmin receivers);
  • date and time formatted using the selected date format in the preferences file;
  • bearing in degrees (empty if undefined);
  • horizontal speed followed by the units (empty if undefined);
  • vertical speed (in metre/second);
  • expected position error (EPE, metre; empty if undefined);
  • horizontal expected position error (EPH, metre; empty if undefined);
  • vertical expected position error (EPV, metre; empty if undefined);
  • altitude (metre; empty if undefined).

This command only works with Garmin receivers.


GPSMan User Manual
Copyright 1998-2013 Miguel Filgueiras,

Creative Commons License
GPSMan User Manual and the GPSMan logo images by Miguel Filgueiras are licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.

Get gpsman at SourceForge.net. Fast,
secure and Free Open Source software downloads


The getalmanac CommandUsing GPSMan in Command-line ModeThe getrtimelog CommandThe getfix Command
gpsman-6.4.4.2/manual/html/blank.gif0000644000175000017500000000364607310716747015310 0ustar migmigGIF87a  3f333f3333f3ffffff3f̙3f3f333f333333333f33333333f33f3ff3f3f3f3333f33̙33333f3333333f3333f3ffffff3f33ff3f3f3f3fff3ffffffffffff3ffff̙fff3fffffff3ffffff3f333f3333f3ffffff3f̙̙3̙f̙̙̙̙3f3f̙333f3̙333f3fff̙fff3f̙̙3f̙3f̙3f333f3333f3ffffff3f̙3f3f, @e˖-[lٲe˖-[lٲe˖-[lٲe˖-[lٲe˖-[lٲe˖-[lٲe˖-[lٲe˖-[lٲe˖-[lٲe˖-[lٲe˖-[lٲe˖-[lٲe˖-[lٲe˖-[lٲe˖-[lٲe˖-[lٲe˖-[lٲe˖-[lٲe˖-[lٲe˖-[lٲe˖-[lٲe˖-[lٲe˖-[lٲe˖-[lٲe˖-[lٲe˖-[lٲe˖-[lٲe˖-[lٲe˖-[lٲe˖-[lٲe˖-[lٲe˖-[6ٲe˖-[lٲe˖-[lٲe˖-[lٲe˖-[lٲe˖-[lٲe˖-[lٲe˖-[lٲe˖-[lٲe˖-[lٲe˖-[lٲe˖-[lٲe˖-[lٲe˖-[lٲe˖-[lٲe˖-[lٲe˖-[lٲe˖-[lٲe˖-[lٲe˖-[lٲe˖-[lٲe˖-[lٲe˖-[lٲe˖-[lٲe˖-[lٲe˖-[lٲe˖-[lٲe˖-[lٲe˖-[lٲe˖-[lٲe˖-[lٲe˖-[lٲe˖ `lٲe˖-[lٲe˖-[lٲe˖-[lٲe˖-[lٲe˖-[lٲe˖-[lٲe˖-[lٲe˖-[lٲe˖-[lٲe˖-[lٲe˖-[lٲe˖-[lٲe˖-[lٲe˖-[lٲe˖-[lٲe˖-[lٲe˖-[lٲe˖-[lٲe˖-[lٲe˖-[lٲe˖-[lٲe˖-[lٲe˖-[lٲe˖-[lٲe˖-[lٲe˖-[lٲe˖-[lٲe˖-[lٲe˖-[lٲe˖-[lٲe˖-[lٲe-[lٲe˖-[lٲe˖-[lٲe˖-[lٲe˖-[lٲe˖-[lٲe˖-[lٲe˖-[lٲe˖-[lٲe˖-[lٲe˖-[lٲe˖-[lٲe˖-[lٲe˖-[lٲe˖-[lٲe˖-[lٲe˖-[lٲe˖-[lٲe˖-[lٲe˖-[lٲe˖-[lٲe˖-[lٲe˖-[lٲe˖-[lٲe˖-[lٲe˖-[lٲe˖-[lٲe˖-[lٲe˖-[lٲe˖-[lٲe˖-[lٲe˖-[lf˖-[lٲe˖- ;gpsman-6.4.4.2/manual/html/GPSMandoc_53.html0000644000175000017500000000723212170753404016464 0ustar migmig GPS Manager User Manual -- Extending GPSMan: Plug-ins
Support for Lowrance, Magellan and Garmin ReceiversTopUsing GPSMan in Command-line ModeExtending GPSMan: Plug-ins

Extending GPSMan: Plug-ins

GPSMan can be extended through pre- and user-defined plug-ins that are written in Tcl/Tk and are launched from either buttons and/or menu entries. In order to define a plug-in knowledge of programming in Tcl/Tk is required, while in some cases an understanding of parts of the GPSMan code might also be needed. This chapter is written assuming these prerequisites.


GPSMan User Manual
Copyright 1998-2013 Miguel Filgueiras,

Creative Commons License
GPSMan User Manual and the GPSMan logo images by Miguel Filgueiras are licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.

Get gpsman at SourceForge.net. Fast,
secure and Free Open Source software downloads


Support for Lowrance, Magellan and Garmin ReceiversTopUsing GPSMan in Command-line ModeExtending GPSMan: Plug-ins
gpsman-6.4.4.2/manual/html/GPSMandoc_18.html0000644000175000017500000002504012170753404016462 0ustar migmig GPS Manager User Manual -- Waypoints
RoutesUsing GPSMan in graphical modeDataWaypoints

Waypoints

Waypoint names can be changed using a renaming method from
  • the waypoint sub-menu under Data in the map window
  • the waypoint menu in the lists window
  • a group window: Use WPs->Change Name->...

A position format and a datum for presenting the position of each waypoint are chosen by the user. Changing the format or the datum may be made at will, but too many conversions may degrade the accuracy of the data.

The symbols, position formats and datums of all the waypoints in a group can be changed in a single operation as described below.

Some information that may be relevant for choosing a datum is given when describing how to define new datums.

The following position formats can be used: 

  • DMS for degrees followed by minutes, both as integers, followed by seconds as a floating point number; the degrees value can be preceeded by a minus sign or one of the letters N, S, E or W; examples are: 2 3 4.5, -8 34 10, S8 34 10, -160 59 58.7, W160 59 58.7
  • DMM for degrees as integer followed by minutes as a floating point number; the degrees value can be preceeded by a minus sign or one of the letters N, S, E or W; examples are: 12 58.997, W93 34.33, S56 34
  • DDD for degrees as a floating point number; this value can be preceeded by a minus sign or one of the letters N, S, E or W;
  • GRA for centesimal degrees as a signed floating point number;
  • UTM/UPS for easting zone number, northing zone letter, easting and northing of Universal Transverse Mercator or Universal Polar Stereographic coordinates.
  • one of the available grid systems, either predefined or user-defined, with a zone identifier (void for some grids), a easting and a northing (both in metres by default; user-defined ones may be in feet). The predefined grids are:
    • BMN: Austrian "Bundesmeldenetz";
    • BNG: British National Grid;
    • BWI: British West Indies grid;
    • CMP: Portuguese military maps grid;
    • CTR: Italian Carta Tecnica Regionale;
    • GKK: German grid ("Gauss-Krueger-Koordinatensystem")
    • IcG: Iceland grid;
    • ITM: Irish Transverse Mercator;
    • KKJP: basic Finnish grid;
    • KKJY: uniform Finnish grid;
    • Lamb93: French Lambert 93 grid;
    • LambNTF: French Lambert NTF ("Nouvelle Triangulation de France") grid;
    • LambNTFe: French Lambert NTF ("Nouvelle Triangulation de France") zone II étendue grid;
    • LV03: Swiss grid in the LV03 frame;
    • RDG: The Netherlands grid;
    • SEG: Swedish grid;
    • TAlbers: Teale Albers grid (used in California, USA);
    • TWG: Taiwan grid.
    More details on these grids can be found below.

  • MH Maidenhead locator coordinates: this is a special kind of grid used mainly for specifying the position of radio stations, each smallest subdivision being 5 minutes in longitude and 2.5 minutes in latitude. This means that conversions from other position formats to this one will most probably loose accuracy.

The altitude for a waypoint is given as a (possibly signed) floating point number in either metres or feet, depending on the existing option for this.

A symbol and a display option are also chosen for each waypoint. GPSMan symbols and display options may not all be supported by the receiver. When GPSMan is aware of this a tilde ~ will appear before the symbol name in the symbols menu. Symbols and display options not supported will be transmitted to the receiver as the default values; if these are also not supported, the symbol will be transmitted as a waypoint dot, and the display option as "Symbol & name".

User-defined symbols of Garmin receivers will be shown as waypoint dots as there is no documented way of importing their images from the receivers. Their code numbers are kept internally and in GPSMan data files. These symbols do not appear in menus and therefore cannot be selected.

The symbols menu can have a sub-menu defined by the user: more details below.

Symbols of all the waypoints in a group can be changed in a single operation as described below.

A map background image name can be given for each waypoint, so that when the waypoint is displayed on the map window the named image is automatically loaded if the map is empty. See below for the details.

Creating a waypoint can be made as for other items from menus and also in the following ways:

  • at a given distance and bearing in relation to an existing waypoint, from its window; the maximum allowed distance is about 20000km (more precisely, pi times the ellipsoid semi-major axis); if the distance is greater the new point will coincide with the old one;
  • from the map, if the map has been geo-referenced: see below;
  • from a track, either as one of its points, or by taking an average of the coordinates: see below;
  • from the waypoints in a group by taking an average of the coordinates: see below;
  • (Garmin variant only) from the travel menu, by taking the coordinates of the last point in the real-time log if there is one: see below.

The position of a waypoint displayed on the map can be changed there through a menu, as described below.

Clusters of waypoints can be created by giving a group of waypoints to be used as centres: see below.

Information on a waypoint can be sent to a Twitter account if the TclCurl library is available and the waypoint has a valid position. A pre-defined message is presented with tags #GPSMan and #waypoint, followed by the latitude and longitude in decimal degrees, the altitude if defined, the datum and, if defined, the name and the comment. This message may be edited and will be truncated to 140 characters if longer than that. Login information may be remembered during the current session but is not saved to disk. There are no error messages when the TclCurl library calls fail.


GPSMan User Manual
Copyright 1998-2013 Miguel Filgueiras,

Creative Commons License
GPSMan User Manual and the GPSMan logo images by Miguel Filgueiras are licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.

Get gpsman at SourceForge.net. Fast,
secure and Free Open Source software downloads


RoutesUsing GPSMan in graphical modeDataWaypoints
gpsman-6.4.4.2/manual/html/GPSMandoc_25.html0000644000175000017500000003423012170753404016461 0ustar migmig GPS Manager User Manual -- Map
Map background imagesUsing GPSMan in graphical modeSearching for data itemsMap

Map

The map window will contain a graphical representation of data. Several operations on the map can be made using the mouse or the keyboard and a summary of these can be found below. The map window can be resized, but resizing is independent of rescaling (zooming) that is controlled by the Change menu-button.

Its contents can be saved as a Postscript file or further processed (e.g., printed) in Postscript -- cf. the "print command" option.

It is assumed that the user has chosen the relevant datum and projection before asking for some data to be displayed.

Some information that may be relevant for choosing a datum is given below.

The available projections and the way new projections can be defined are described below. Projections may have parameters, in which case they are computed either when a data item is displayed and the map is void, or when a map background image is loaded. According to an option the user is asked to accept or change them.

When a map background image is loaded it will be geo-referenced and a transformation of coordinates may be selected for that purpose. There are three such transformations: affine, which covers rotation and non-conformality, affine conformal, and affine conformal with no rotation, that corresponds to applying only a scale factor and that is used when there is no background image. Obviously there will be deformation when either the projection or the transformation is not suitable for the image.

More detailed explanations of how to use background images and projections and coordinate grids are given in the next sections.

Measuring distances and azimuths on a non-empty large-scale map can be done by using the mouse right-button when pressing the Shift key to select a sequence of positions (at a distance greater than 1 metre). Arrows between each position to the next will be displayed and a dialog will show the total distance and the azimuth of the last position from the first. The arrows will be deleted when the dialog is closed. The dialog allows for the line formed by the arrows to be closed (linking the last position to the first, unless they stand at less than 1 metre) and to be used in creating a polyline item (LN). Note that distance values computed in this way can be wrong on small-scale maps if two consecutive points are too far away from each other.

Items can be displayed on the map by using the Display on map entry in the Items menu-button in the map window.

If the item has an associated map background image name and the map window is empty the image will be loaded before displaying the item. If the name refers to a non-existing or invalid file, it will be silently ignored. Please see below for further details on how to define map background names.

Other methods include:

  • using the Display on map option when reading new data from files or the receiver,
  • right-clicking on a name in an items list,
  • using the Display on map option of the edit window for an item,
  • using the display entry in the menu that pops up with Control-key left-click on a waypoint in the map.

To clear an item from the map there is the Clear entry in the Items menu-button in the map window. Other ways of achieving the same effect:

  • right-clicking on a name in an items list,
  • using the Display on map option of the edit window for an item,
  • using the clear entry in the menu that pops up with Control-key left-click on a waypoint in the map.

Groups can also be created for the items that are or are not currently displayed on the map. This is done using the Make Group entry of the Items menu-button on the map window.

A waypoint can be created on the map , if the map has been geo-referenced, by clicking with the mouse left-button on an empty place, or by using the Return (or Enter) key. This can only be done when no waypoint is being edited. When a route is being edited on the map the Return key has no effect, and the left-button on an empty place creates a waypoint that is added to the route (see below). The position format and datum for the new waypoint will be the one in use for the map cursor coordinates. Decimal degrees (DDD) will be used instead when the position is out of the range of the selected grid. To finely position the cursor, the arrow keys for scrolling the map and the Return key should be used instead of the mouse.

A menu-button for a waypoint on the map will be created by pressing the Control key and clicking on the waypoint with the mouse left-button in Unix/Linux systems, or only the mouse right-button in other systems. It will allow for moving the waypoint (i.e., changing its position), starting the definition of a route (see next paragraph), or for displaying or clearing:

  • all waypoints within a certain distance;
  • all waypoints in the rectangle having as opposite corners this waypoint and a waypoint chosen from the menu;
  • all routes containing this waypoint;
  • all routes containing waypoints on the map.

A waypoint that is being moved is placed in its new position by using the mouse left-button. The right-button cancels the operation. A balloon will show the possible actions.

A route can be changed or created on the map by using

  • the Edit on map button from the route edit window; there must be at least one waypoint in the route; or,
  • the Start RT entry of the menu corresponding to a mapped waypoint when no route is being edited; the route edit window will be opened and the waypoint becomes the route starting point.

In either case, changes made on the route on the map will appear in the route window. The cursor will show the current insertion point that at first is the end point of the route, but that can be moved to in between any two waypoints of the route (if there are as many) -- this may be seen as changing the corresponding route stage.

Edit operations are performed by using the mouse buttons and the Shift and Control keys, and/or by using a menu that will appear by pressing the Control key and clicking the mouse left-button (not on a waypoint!).

Clicking with the mouse

  • left-button on a waypoint adds it to the route; a waypoint cannot follow itself in a route;
  • left-button where there is no waypoint, creates a new waypoint and adds it to the route; if the operation is cancelled the waypoints created this way will be discarded;
  • left-button together with the Shift key removes the previous waypoint from the route unless there is only one;
  • right-button in Unix/Linux systems or Control key and the mouse left-button in other systems, stops the route definition from the map; if there is a waypoint under the cursor it will be added to the route, otherwise a new waypoint is created and added to the route; the route defined so far can now be further edited in its window;
  • right-button with the Control key changes the insertion point to the previous stage, if there is one;
  • right-button with both the Control and the Shift keys change the insertion point to the next stage, if there is one, or, when changing the last stage, to the end of the route;
  • middle-button (or left- and right-buttons) with the Shift key cancels the definition; the same can be achieved by using the Cancel button of the route edition window.

The operations available from the menu (Control key and the mouse left-button in Unix and Linux systems, or only the mouse right-button in other systems, not on a waypoint) are the following (only those that are meaningful will be shown at any given moment; the corresponding shortcut using the mouse/keyboard is shown if there is any):

  • stop editing on the map, and either include the current point under the cursor (right click), or do not add any more points;
  • cancel the whole edit operation (Shift and middle click);
  • delete either the previous waypoint (the one before the current insertion point; Shift and left click), or the first waypoint of the route;
  • edit previous stage, i.e., change the insertion point to the previous stage (Control and right click);
  • edit next stage, i.e., change the insertion point to the next stage, if there is one, otherwise to the end of the route (Control and right click);
  • add to end, i.e., change the insertion point to the end of the route (when editing the last stage, this can be done with Control and right click);
  • close menu, destroying the menu-button.

When using Control-right click and Control-Shift-right click to go from one stage to another the lines in the map are only redrawn when the cursor moves.

During the edition of the route, waypoints can be moved to other positions as described above.

Scrolling and panning the map can be done by using the Locate entry in the Items menu-button, the mouse, the keyboard, or a wheelmouse.

Selecting an item with the Locate entry in the Items menu-button (only items on the map are listed) scrolls the map so that the selected item becomes centred. In case of a route, track or polyline this applies to its first point.

Dragging the mouse with the middle button down or moving it with the Control key pressed will pan the map.

The keyboard arrow keys and the Space and Delete keys scroll the map in the expected way, while the arrow keys with the Shift key scroll the map in the SE-NW and NE-SW directions.

Users of a wheelmouse can use the wheel in it for the same purpose: with no modifier key for vertical motion, with the Shift key for vertical motion by one page, with the Alt key for horizontal motion, and with the Control key for horizontal motion by one page.

As the cursor coordinates are updated when the cursor moves, the use of the keyboard for scrolling is also a means for finely positioning the cursor.

Reading items that are on the map will update the map, so that the items are shown according to their newly read definitions.


GPSMan User Manual
Copyright 1998-2013 Miguel Filgueiras,

Creative Commons License
GPSMan User Manual and the GPSMan logo images by Miguel Filgueiras are licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.

Get gpsman at SourceForge.net. Fast,
secure and Free Open Source software downloads


Map background imagesUsing GPSMan in graphical modeSearching for data itemsMap
gpsman-6.4.4.2/manual/html/GPSMandoc_64.html0000644000175000017500000000637012170753404016470 0ustar migmig GPS Manager User Manual -- Map: Mouse and Keyboard Shortcuts
Recent ChangesTopReferencesMap: Mouse and Keyboard Shortcuts

Map: Mouse and Keyboard Shortcuts

The tables of the following two sections summarise the availabe shortcuts for map operations. The last section explains the notation for events.


GPSMan User Manual
Copyright 1998-2013 Miguel Filgueiras,

Creative Commons License
GPSMan User Manual and the GPSMan logo images by Miguel Filgueiras are licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.

Get gpsman at SourceForge.net. Fast,
secure and Free Open Source software downloads


Recent ChangesTopReferencesMap: Mouse and Keyboard Shortcuts
gpsman-6.4.4.2/manual/html/GPSMandoc_66.html0000644000175000017500000002307412170753404016472 0ustar migmig GPS Manager User Manual -- By Event
Notation for EventsMap: Mouse and Keyboard ShortcutsBy OperationBy Event

By Event

<Key-Up>     scroll up (move map down) slowly
<Shift-Up> scroll NE (move map SW) slowly
<Key-Down> scroll down (move map up) slowly
<Shift-Down> scroll SW (move map NE) slowly
<Key-Left> scroll left (move map right) slowly
<Shift-Left> scroll NW (move map SE) slowly
<Key-Right> scroll right (move map left) slowly
<Shift-Right> scroll SE (move map NW) slowly
<Key-Delete> scroll up (move map down) fast
<Key-space> scroll down (move map up) fast
<Return> create waypoint
<Control-Motion> panning slowly
<Button-1> create waypoint, or
add waypoint to route being edited on map (if any)
<Double-1> open item (if over item)
<Control-1> open waypoint menu (if over waypoint); otherwise
Unix: open route menu if editing it on the map
non-Unix: finish edition of route on map
<Shift-1> delete waypoint from route being edited on map (if any)
<B2-Motion> panning fast
<Shift-2> cancel edition of route on map

<Button-3>

stop motion of waypoint (if one moving)
Unix: finish edition of route on map
non-Unix: open waypoint menu (if over waypoint); otherwise
non-Unix: open route menu if editing it on the map
<Shift-3> mark positions to measure distance and compute azimuth
(not when loading an image or editing a route on map)
<Control-3> edit previous stage of route being edited on map (if any)
<Control-Shift-3> edit next stage of route being edited on map (if any)
<Button-4> scroll up (move map down)
<Shift-4> scroll up (move map down) fast
<Control-4> scroll left (move map right) fast
<Alt-4> scroll left (move map right)
<Button-5> scroll down (move map up)
<Shift-5> scroll down (move map up) fast
<Control-5> scroll right (move map left) fast
<Alt-5> scroll right (move map left)


GPSMan User Manual
Copyright 1998-2013 Miguel Filgueiras,

Creative Commons License
GPSMan User Manual and the GPSMan logo images by Miguel Filgueiras are licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.

Get gpsman at SourceForge.net. Fast,
secure and Free Open Source software downloads


Notation for EventsMap: Mouse and Keyboard ShortcutsBy OperationBy Event
gpsman-6.4.4.2/manual/html/previous.gif0000644000175000017500000000037407310716747016070 0ustar migmigGIF89a |si_VLCv:m0c&YPFy =p3f, ` dihlp,GcL.QCHAa4\DiT#hBW0t!"p5# ̈́ # ~}I"EcWtoGPWv=sh 4h`cQ ^e 76+!;gpsman-6.4.4.2/manual/html/GPSMandoc_26.html0000644000175000017500000004302012170753404016457 0ustar migmig GPS Manager User Manual -- Map background images
Datums and ellipsoidsUsing GPSMan in graphical modeMapMap background images

Map background images

A map background image can be loaded by selecting either a file or a map background image name. In the case of a file it can be either a file containing an image in a recognized graphics format, in which case it must be geo-referenced, or an image information file that contains geo-referencing information together with the path of the files containing images. Preparing an image information file can be done by using GPSMan in command-line mode: see the description of the georef command.

A map background image name is a user-selected identifier for an image information file. These names are defined or edited from the Definitions menu, and can also be defined when saving a new image information file. Along with the name and the path to the file, a remark can also be saved. The path to the file is only checked when trying to use the name.

GPSMan will automatically detect the kind of file it has to load from when one selects either the entry Map->Background->Load->from file from the Map menu-button (if the main window is the map window), or the entry Load->from file of the Background menu-button (if the main window is the lists window). If the file is an image information file, loading the image and setting up the map window is done without user intervention. It only makes sense to have as background images maps in one of the projections that GPSMan implements.

Tcl/Tk accepts both the GIF and PNM graphics formats. GPSMan tries to load the Img Tcl/Tk library that provides support also for JPEG, TIFF and other formats. This library has two problems when saving an image:

  • any window or icon over it will also be part of the saved image; and
  • depending on the format, errors can occur if the image has too many colours.

Geo-referencing an image

In order to use a background image GPSMan needs to know how to convert from Earth coordinates (latitude and longitude or grid coordinates) to map image coordinates (in screen pixels). This conversion is done in two steps corresponding to the application of

  1. a projection, that from geodetic coordinates computes Cartesian plane coordinates, and
  2. a coordinates transformation, that from Cartesian plane coordinates computes pixel coordinates. This is needed because the image can be rotated or distorted.
Going from map image coordinates to geodetic coordinates is done by inverting this process.

As most projections and transformations have parameters, they cannot be used before the values of these parameters are known. The usual way to provide them is to place control waypoints on the image, so that the parameters can be computed from the geodetic coordinates and pixel coordinates of the control waypoints. An alternative for some transformations is to have a transformation file either with the parameters values, or with pairs of geodetic/pixel coordinates.

When geo-referencing an image to be loaded from a file in one of the accepted graphics formats, the following information must be known:

  • the projection used in the image,
  • the datum,
  • the coordinates transformation to use, unless there is a transformation file defining it; see below.
If the image is that of a map, the projection and the datum will hopefully be described in it. The corresponding options should be selected from the two menu-buttons at the left on the bottom of the map window, if the map window is the main window, or the Datum and Projection menu-buttons of the map window, if the lists window is the main window. If a transformation file is used, the projection and the datum are selected from a dialog after the file is read.

As to the datum, it must be emphasised that some maps have a cartographic datum (the one used for projecting the map elements) and then one or more sets of grid lines projected using other different datums. The datum to be selected in GPSMan is the cartographic one, not any of those for the grids. On the other hand, if the intersection points of a grid are to be used as control points for geo-referencing the image, the datum for the grid should be used when creating the corresponding waypoints. More information on datums can be found below.

After having selected the projection and datum as described above, geo-referencing proceeds by choosing the coordinates transformation and by giving information from which the parameters of the transformation and possibly of the projection can be computed.

Coordinates transformations

The transformations presently available in GPSman are

  • affine. This is the more general transformation: the central vertical of the image can have any orientation and there may be distortion in different directions. It should be used unless one is sure that the conditions given below for the other transformations are met. It is used if geo-referencing is done with a TFW or a OziExplorer map file.

  • affine conformal. To be used when there is no distortion in different directions (in other words, in each point the map scale is the same irrespective of the direction that is considered).

  • affine conformal with no rotation. The central vertical line of the map image must be oriented North-South (geographic, not magnetic) and there is no distortion in different directions. In case of doubt about any of these conditions it is safer to use any of the previous transformations.

The Least Squares fit method can be used to compute the parameters of any of these transformations. Normally this is the method of choice for large scale maps when the projection is not known and there are several (at least 3) control points with known coordinates whose geodetic coordinates and placement in the image are known. If the number of control points is large it may be preferable to create and use a GPSMan Least Squares file instead of placing the points in the image by hand.

This method will change the placement of the control points in the image in order to minimise the deviations for the whole set of points. The following information on the resulting deviations is shown (as an option when a GPSMan Least Squares file is used):

  1. for each control point: name (if it is a waypoint), terrain coordinates, horizontal and vertical deviations, total deviation
  2. root-mean-square deviation: sqrt(s/(2*n)), where s is the sum of the squared deviations (also known as residuals or errors)
  3. standard residual error (a statistical measure of how good is the fit): sqrt(s/f), where f is the number of degrees of freedom, given by twice the number of points minus the number of parameters.
It is suggested that this data is taken into account in trying to increase the quality of the fit by eliminating control points whose deviation is too large.

Geo-referencing can also be done with a certain number of control waypoints that will be placed at fixed positions in the image. These waypoints can either be selected from the ones already defined, or be defined when geo-referencing the image; in the latter case only the name and position will be asked for, and if no name is given one is automatically generated. If they are defined beforehand it is a good idea to use either no symbol, or to use the Mark, x symbol so that later on they can be placed exactly where they should be on the image. If the transformation is the affine conformal one 2 waypoints will be needed, and the other transformations 3. In the latter case, the waypoints should be chosen so as to form an almost equilateral triangle, in order to minimise positioning errors.

After defining any control waypoints, either the entry Map->Background->Load from the Map menu-button (if the main window is the map window), or the entry Load of the Background menu-button (if the main window is the lists window) should be selected. The image file to be loaded is then chosen.

Dialog windows will allow for the selection of the transformation to be used and the waypoints that will serve as control points. The image is then presented in the map window.

In the case of the "affine" and "affine conformal" transformations, or the Least Squares method, each waypoint is placed by the user over the image where it should be and its name and position entered if it did not exist.

If the "affine conformal no rotation" transformation was selected, the user is asked for the names and positions of the control waypoints to be defined if there are any. One of the waypoints is placed first and 2 lines will de drawn. Each of the other 2 waypoints must be on each of these lines. When the mouse is moved, the 2 wayponts will move on these lines until the user clicks the left-button to place them both at the same time.

The operation is finished by clicking on the Ok or Cancel buttons of the dialog window.

It is a fact that for the "affine conformal no rotation" transformation, 2 waypoints would be sufficient. However GPSMan asks for 3 to be placed so that the user may place 2 of them at the same time, in this way having more control on positioning errors. The 3 waypoints should form an almost equilateral triangle that can be shown in the map window. The order of the 3 waypoints is important, as the first one cannot be moved after being placed. This waypoint, then, should be such that there are no doubts on where it should go. It will be shown together with lines that will contain the other two, and will be placed by clicking the left-button. The other two will be placed as a pair in the same way, scale changes being displayed.

The "affine conformal" and "affine conformal no rotation" transformations are particular cases of the "affine" transformation. If possible the latter should be used as it is more accurate.

Using a transformation file is an alternative way of fixing the coordinates transformation and its parameters. At present there is support for the following formats:

  • TFW file (Tiff World file)
  • Ozi map file
  • GPSMan Least Squares file.

Files of the first two formats contain parameters for the affine transformation. The support for TFW files follows the description available from the ESRI ArcGIS 9.2 Desktop Help pages. Unfortunately, there is no publicly available description of the Ozi map file, so that the implementation is based on a popular guess of the meaning of the values in it and on observing sample files.

A GPSMan Least Squares file contains either waypoint names or the geodetic coordinates of control points, as well as their pixel coordinates to be used in computing the parameters of any kind of transformation.

When using a transformation file, the only thing to be done is to select either the entry Map->Background->Load from the Map menu-button (if the main window is the map window), or the entry Load of the Background menu-button (if the main window is the lists window), select the appropriate file method and choose the file. In the case of a TFW or a OziExplorer map file, GPSMan checks if there is a file with the same base name as the image file and the extension .TFW/.tfw, or .MAP/.map, and uses it if there is.

After this, the projection and the datum are selected/changed and a dialog window may appear if there are projection parameters that can be changed.

With a OziExplorer map file only part of the information in the file is used, namely: the datum, and the geodetic and pixel coordinates of control points. Three control points are chosen by finding the triangle whose side with minimum length is maximum. Information on the projection as found in the file is displayed in a window to help in selecting the projection and in setting the projection parameters.

After geo-referencing an image

The map scale cannot be changed if there is a background image, and an image can only be loaded to an empty map.

After geo-referencing an image, the information on it can (should) be saved through the entry Save geo-ref info (under either Map->Background, or Background menus) so that the next time it can be loaded with no need for geo-referencing. A TFW file can also be produced with the parameters for the current coordinates transformation.

Other background images can be loaded after having one image geo-referenced by using the Change option of the map Background menu.

All images must have the same datum, projection and coordinates transformation as the first image. Each image will be described by the path of its file.

In order to load different sheets of a map to the background, images assumed to have exactly the same size as the first image can be loaded to a slot in a grid. This is done by selecting the grid slot in the diagram that is shown and using the Load button. Selecting a non-empty slot will show the file path of the corresponding image.

For loading images that cannot be taken as being in a grid (overlapping other images or having different sizes) the Load button in the right panel of the dialog should be used. A single control waypoint is needed to be placed over the new image and can be either selected from the data-base or defined before being placed. The list of file paths for the images loaded in this way is shown in a list. Selecting one of them will create a representation of the image in the diagram of the left panel. It will appear only when the cursor is on the right panel, and it may be too far away to be seen.

The Clear buttons in the dialog will remove the selected images in either panel. The first image cannot be removed.


GPSMan User Manual
Copyright 1998-2013 Miguel Filgueiras,

Creative Commons License
GPSMan User Manual and the GPSMan logo images by Miguel Filgueiras are licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.

Get gpsman at SourceForge.net. Fast,
secure and Free Open Source software downloads


Datums and ellipsoidsUsing GPSMan in graphical modeMapMap background images
gpsman-6.4.4.2/manual/html/GPSMandoc_57.html0000644000175000017500000000750012170753404016466 0ustar migmig GPS Manager User Manual -- Pre-defined plug-ins
Extending GPSMan: Plug-insPlug-in code and executionPre-defined plug-ins

Pre-defined plug-ins

The definitions of plug-ins that are part of the GPSMan distribution can be found as elements of the array PLUGIN initialised in the file plugins.tcl. The following conventions should be observed when creating a new pre-defined plug-in:

  1. each element of PLUGIN is a list with the remark, the not-available condition, the code and the list describing widgets.
  2. the unique name and the remark should be elements of the TXT array, in order to be translated to the user selected language.
  3. when the code is large it should be replaced by a call to a procedure whose arguments are the plug-in parameters.
  4. procedures needed by plug-ins should have names starting with PCode_ and their definitions should appear at the end of the plugins.tcl.

The pre-defined plug-ins can also be inspected from the Definitions menu-button along with the user-defined ones.


GPSMan User Manual
Copyright 1998-2013 Miguel Filgueiras,

Creative Commons License
GPSMan User Manual and the GPSMan logo images by Miguel Filgueiras are licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.

Get gpsman at SourceForge.net. Fast,
secure and Free Open Source software downloads


Extending GPSMan: Plug-insPlug-in code and executionPre-defined plug-ins
gpsman-6.4.4.2/manual/html/GPSMandoc_59.html0000644000175000017500000000623312170753404016472 0ustar migmig GPS Manager User Manual -- Support for Lowrance receivers
Support for Magellan receiversSupport for Lowrance, Magellan and Garmin ReceiversSupport for Lowrance receivers

Support for Lowrance receivers

Support for Lowrance receivers was developed by Brian Baulch (baulchb_at_hotkey.net.au) who has written a draft supplement for the present document.


GPSMan User Manual
Copyright 1998-2013 Miguel Filgueiras,

Creative Commons License
GPSMan User Manual and the GPSMan logo images by Miguel Filgueiras are licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.

Get gpsman at SourceForge.net. Fast,
secure and Free Open Source software downloads


Support for Magellan receiversSupport for Lowrance, Magellan and Garmin ReceiversSupport for Lowrance receivers
gpsman-6.4.4.2/manual/html/GPSMandoc_77.html0000644000175000017500000001312012170753404016463 0ustar migmig GPS Manager User Manual -- Version 6.3 -- May 2006
Recent ChangesVersion 6.3.1 - July 2006 Version 6.3 -- May 2006

Version 6.3 -- May 2006

  • new options:
    • the information displayed when the pointer goes over a track point on the map can now be the point number or its date, depending on a new option; suggested by Hans Olzem.
    • font and icon sizes can now be configured for better usage in high-definition displays.

  • the command-line mode is no longer restricted to Unix/Linux systems; in answer to a request from Wes Johnston.

  • short names of user projections can no longer have blanks.

  • items may be associated with a map background image that will be displayed when the item is displayed on an empty map; suggested by Paulo Quaresma.

  • last directories visited when reading/writing files for each file type are now remembered and kept in the saved state; suggested by Paul Scorer.

  • time stamp and distance are now displayed in the TR animation dialog; asked by Tim Jacobs.

  • in travel mode it is now possible to follow a LN.

  • enhanced support for the GPX format, including exportation of WP altitudes (suggested by Matt Wilkie); with thanks to Valère Robin.

  • better support for Ozi .map files; thanks to Paulo Quaresma and Kari Likovuori.

  • new datum Deutsches Hauptdreiecksnetz, from the Frida data set, available from the Free Vector-Geodata Osnabrück (http://frida.intevation.org).

  • several menu-buttons that could create long menus of items replaced by buttons launching dialogs with listboxes.

  • new layout of the WP edit/show window.

  • support for the Garmin USB protocol in Linux kernels having the garmin_gps kernel driver; with thanks to the author of the kernel driver, Hermann Kneissel, for guidance on using it; thanks are also due to Ron Schmars and Asbjørn Djupdal for their help when trying to make an implementation based on the libusb library.

  • other updates to Garmin support following the specifications made available in September 2004.

  • almanac data can be retrieved from Garmin receivers and displayed if in graphical mode, or saved to a file if in command-line mode.

  • explicit support for several Garmin receivers or their new firmware versions, including: eTrex Legend C, eTrex Vista C, Forerunner 301, GPS 60, Quest, Rino 130; with thanks for all those who sent protocol lists: Jerry Walker, Vlatko Kosturjak, Alan Rogers, Peter MacDonald, Luca Marletta, Ariel Garcia, Cliff Dugal, Imre Simon, José Maria Alonso, Dennis Langenfeld, Eric Smith, Simon Wood, Al Nikolov, Oliver Theis, Chris Smith, Robert Joop, Jan Arne Fagertun, Marques Johansson, Dan Bluestein, Steven Kollmansberger, David Bannon, Harry Palmer, Wes Johnston, Frank Sommer.


GPSMan User Manual
Copyright 1998-2013 Miguel Filgueiras,

Creative Commons License
GPSMan User Manual and the GPSMan logo images by Miguel Filgueiras are licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.

Get gpsman at SourceForge.net. Fast,
secure and Free Open Source software downloads


Recent ChangesVersion 6.3.1 - July 2006 Version 6.3 -- May 2006
gpsman-6.4.4.2/manual/html/newarr.gif0000644000175000017500000000043507623136230015476 0ustar migmigGIF89a7ʟž޴rp[oZDSC.8-,7I8ͻ`(dpT[ ,Ea`  M \Cep?IL̶kq8=à,{Y-_qAANX=hj~vxyPsk6<(Dz GPS Manager User Manual -- The show WHAT Command
The haslib CommandUsing GPSMan in Command-line ModeThe is connected CommandThe show WHAT Command

The show WHAT Command

This command sends help information to the standard output according to its argument, one of: datums, formats, help, projections, protocols, symbols, transfs.

show datums prints the names of, and existing comments on the available datums.

show formats prints a table of the data file formats known to GPSMan and that can be used in other commands. An partial example of output is

BGA:    Read     WP
 Parameters
        Read:
                feature
                findability
                air_activity
EasyGPS:        Read     WP
Fugawi: Read     WP
GD2:    Read     WP RT TR
GPSMan: Read/Write       WP RT TR LN LAP GR Data
GPStrans:       Read/Write       WP RT TR
GPX:    Read/Write       WP RT TR Data
GTrackMaker:    Read     WP RT TR Data
IGC:    Read     TR
 Parameters
        Read:
                alt     gps
Kismet: Read     WP
 Parameters
        Read:
                group   0
KML:    Read     WP Data
        Write    WP RT TR Data

For each known format either there is an indication that the format is invalid (because, for instance, a library as missing or there is incompatibility with the receiver brand), or there is information on the possible read/write operations and item types which will be followed by "Data" if a file may contain items of different types. Parameters may appear followed by their default values if any.

show help prints the accepted commands and options.

show projections prints information on the available projections. For each projection there is the name to be used as argument to commands, a long name, and the list of accepted parameters. For each parameter the name to be used in a command, a type and a short explanation are given. An example of output is

Stereogr:       Stereographic
  Parameters
        ?datum
        lat0    (lat)   Lat of centre
        long0   (long)  Long of centre
        k0      (float>0)       Scale factor

meaning that the stereographic projection should be spelt Stereogr in commands, may have a datum=NAME parameter, and must have 3 other parameters under the names lat0, long0 and k0, respectively a latitude, a longitude and a positive floating-point number, standing for the coordinates of the centre of the projection and for the scale factor.

show protocols prints a list of known protocols that can be used with the -prot option. A possible list is

Garmin (Garmin)
Garmin_USB (Garmin)
NMEA (Garmin)
simul (Garmin)
SText (Garmin)

showing at the end the receiver brand with which they must be used.

show symbols prints for each waypoint symbol the name to be used in commands followed by the name in the user-selected language.

show transfs prints the list of available coordinates transformations with their names to be used in commands and longer names.


GPSMan User Manual
Copyright 1998-2013 Miguel Filgueiras,

Creative Commons License
GPSMan User Manual and the GPSMan logo images by Miguel Filgueiras are licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.

Get gpsman at SourceForge.net. Fast,
secure and Free Open Source software downloads


The haslib CommandUsing GPSMan in Command-line ModeThe is connected CommandThe show WHAT Command
gpsman-6.4.4.2/manual/html/gpsman-logo.gif0000644000175000017500000005466011162730466016440 0ustar migmigGIF89aw ' ,& :&B%<)#3-'M,D2E2J0)J4C60\4<92H61Y8S;FD=\COE6mAYC>WF2SF?eG zDtFPLBkLfL9oI@gQM8KjT.ZVKeT@xP5bTOcUFTvXQ RW|Z [_Z+HW[x`ZrbYyc>ucNkfZb_Ec[fHkhTeTl1m#jqKxsgsqgohr[nyqdmsv }2xeyq}&{6\}vx~hw~]qi&}N|CρOgS΀{˃iDē~wjlxғϚ#ޕ9ɞ$؛)̕Ӕȡ3z͙{ڗ}К}ǜޤܟDĥWʥGˣ`ܟZ٩ˣnܡq֦[«p⣙بݨ֩ǯʭӭϭIJŲ?Z綬}뻒—ԿŽ껜µڿ߿ţǫ]俶yLJ|·ȗǸʚέ̣ҰԛԨֺлֳͭнשܴJ0r! ,w H*\ȰÇ#JHŋ3jȱǏ CIɓ(S\ɲ˗0cʜI͛8sɳϟ@ R_=}D*]!ZάbL(U:UhTBkJ٘:5N$/EȘBg< "J<9cҳ+kT!m~P 'mBmSrJװcL[+LH4:KϴE6Jt%̐n¦Faس'Շ 5)`L6"Pݍ{)4 +䅌37@]H arv 6X:)ЈWp@(d_652}bT!qEB*X=8kcJ@Rm@%f5DG)d҈OD[~c0 hD1! TM!*h?iFJ(XQJ#I:^JU؀ QFiDPRE8Zyp`tVtvF̙ b*^CrD+[BO(fH26(< G=d^#"nX#n{[-hُ[SXC!%@S%KAk|Y;F{P70T8#{ %4y++v6 " JJ3hM3F6 BtY@[`b P-̄a"$/uA)^pP r=z({19\#X9)Ԗ(F溑m$f]2<:"h@C 0dgWGGH`piMx`ρ$!U\K>\Єӝ]A E;C<>x4 Sw=0@g>`,حY/WCvK7 &Uؐ"HJg$UP&x8f.p?) RN( xX PzY@4ETaJ`pAP0`>g ,r QP ?&&=G=00P  &  Ȏ)0P29MD! `1"DyO6AKcVAU3Uf&ACa ޶d }(!s(H} z#S r9I0 |{`t6sd0PpA Y1`RmX`LirPрB P Qb0`pdhmzIFwK/~=]1 @ П W Cpx`%`pm uEPg!m0!Δ{a0NE mP bTh&rh:~Fg60 @~ ^֟ `. C 9pC w Opn 0dp @evPy5y F O&mr FX`=:= 083*sJG*% Ojw8@ @p Tvp \c k7z-w3I*ʗ,d9DApy @`Ƨ M%cx4C@r ppm  @`v@ 29bTdgM0'{y:؀#//jku8 ^+qu ;E< Rs9yp .yp ĩBP]vBp@Ioi `/ ޹Sz @29 5`T)P O :Tl @QJ!t9J#Dv] :˪ 0D F+zyŐLq|)p:4Dž8g#?7 )ف^R5/jX)vyG{˷뷀+D[+b`q]ڗN`b'62prf#`6p+l %\`-<3 q `' ~{} pw@tp5YXQ؏5p/puWBE)-q)-Г/<yDHv\0;v`w Ѡ ,pɴpXeiL9qv7d/`3yNFp[Q*/췸K{d*堸kNȎJ VwM$iP >š e6p0 @ fsHm;$x@  y 3[bP Nbp;N -@O @!7 I,qX2&S0`Fʲ @-uo ɍvP߀ l@=h@rʣI t-f~7t#"Ugq ) /{<hIrKP kt@H `E !}kpk-#K"(㈡p@.Zg5W~mF1|RҠz?θ:!Yp X C.>n~p."s N OQ F~H  ,ލH2-qUglgx@w4LwfZJGd`S  kJ㡔J|r̦~ˤH]yW=y Mo2@Cd \@05YK RN  ^$ P bx00c>u-y3.bQvS^ck]%5Y(.WB]X/7w*p .>M"Q660 t2 \`0& po3V_*@``֍tr^ /'c9¯Ư Pc̯NRIQV UTUFT j<6f!5nv Q)'GB 3lC%Yq2"}dQ_Guz"EF81O=Q "6!  ,`;웁 "4JzK!G*ʢJCuԒKR#̛XXJv@9( SD6Yee!T*ȾR0>6US2QG'd2݀=U x*`#e8zQ^KB ,Q'Z1(E$CR07Su+\.6~(Gidd)!3 jy O bq(xp 폁d .K q3!\:Pyg'٣1pBNz`Ha&@`ZnG'zh ig aA,F޲50(tDBJh1W|q_`SP!{˥>c 4^ G^T2X4'fe5&؝"z7@5:TTlKҙ05@Ҭg=YINl@NLTbP!hM"h}@KX@0!9 `S*:%>J%f!zHc f w^3,gJ؏b,c  l5B[!B,$6K 8Ub*.dfi ! |IC^c!QI"@P(PzPare.C: Fe #/ BX&H~$;bX$d'z -q$q/K0%RɲJ(G]ӞL C2pF/j1QTh#33A7W4cKʋ,B%ȜQe \@z Aē{ԥHEXA Buj><P .FIuUcR6vLfz^A@cSCt DK(aυtj@>ň-0($@$%|f H?aV%ѐQLpr.@ Q8tvV+RNȴ%%jO նV1\ZnmmQJ2.v!m F;Q}x+ GTÊ!vfI@ctp舼 "Ixe=Y@':9Is'4(mf{־g/~BۭUz1 dr)xAӂF J> :.h( yp. 04I$ +:1-&8\ 1i?Fb-EهQV ~Q&3Y"K^kdJ#Hrbp~%cŁD9N` u~/%<܎`|b3 ^¥:N'&/0j Ā1Bu5Va%H+=Pu]gʴwk~$`;udyG92 bG;h6eM@:;@aZ]K[1M0[ʆR0"? {(yoa 7NSaZ1t|HX0-[$;Gq~`ȑ~hG6;r|<3 ^@ClZ9k^}#0gC ^_-#CPC@?Y72.iz0$*Q Y|4qla#wr U\,Q# HHE-d,IP!%&w*_e\S|4\Cl9.6>[yAO!c˖rg~t&'`,, NBMo^0?߆a~0c>u-}O؂>lV8;`r JZHbhb!= (ЂJYcf<(hC,Jmlu>˓-%r+P7.;0b$PPP X WTW! d{([iu`X9208 : mnh(. pTC#l206|؆.xh G~̀ h @,>ZPmHfhc2y@|} 8,g;CHԯr9݋}` 8pp;|HDI::aL+ȁIXRr`GXYCJ X[T!1xcmG0H}˻~Hpp9(F-6v`2H~#ʬ#x8Ϝ$dPHŴC˼87A0C<ɺD8 L׼#$OOSArq7l YhJfXB ,t(Y@ s{Sl(K0\@ЋG݁uPuM+8PphQQu6"xP.ML-0ۺXm(5P S@X&=9R_HNPP8(!l GЃrH!BpDHNpG݄MJłK54PIUPf|D"5,"e2OVG8̬ x82v؆ŔG! R7`Y}`pg2Q&=- PHVFMxrmV`[0E`R#9-(Rp5>skX]v-8C0-茺8M3R 8Q*~"UЃ8lOF}TZ@Y\PY\xTN`ԗQ8C`ӄX(`rT70A@ZSOQuYQ 5ā9hㅇq>Yd ~}dІnp8sgUP0u=B +8RMpWpcXgІMke*$7mqWq-Wt@iPW@`(7mX=uP)r+ǐ=X  2`Me\(EdȕUYNam]]O:9-[((5L%MiuUCQ@&Ł.hkBZ*MV-[mnX[we[U`]X-,(x8\cgΝ]]:yz}Ⱥ/Eg\sh# -U pݚ(EIX #mVmP[w80*bfEsps0^S,@ [^FEDxYF%_YE߹5MR%k`39+Bq Xa)b/6{HU\$(~E 6 =56-=slȆA .#aѨ8 ЎHطrY'6[j+&*IdTf؅=,0B7c:X]iX[c<LfW#xkȺm!\`S..͇dHhȇx`@x 0OF&R⊦atS(*~ؽ[h]%q$0fdX-4N9-%9L(tHطbnj`ga^#^h芞azh<-/7Ă8A؄W`hdg]htPׂ&SS@|iX-X5\܎dTdh.sP0G&\n0eeƜd5C8.X&ê 0R \m)nXaixfXƯ/rǩ*AtE5@av^]YӦk0VHu1pAx7xYM\=[pĽp[<F݂KF>gNspP6pPPl F^>5^}ga? >^bnІqyal=]&a?*-33ڂ26Q XzGu(8oքHoՆlXdXR4{ݦr`kÅPpDkpX-8D,x7Dxo|ݹM]xp2EyPm OYEibs0vc6``lq88qFa]태C腬~8n_exgXW@K|@ 0]՟]9iJ3˾g05kC%e64S 8G~@oDMjUynFOYarZ^`ٖŅ\Xl 987ާT]UQ`]Oxk8ʖqHi]`NFuuIvb'xq dd)Nl~7U`\ e!OmA(i"q(nrWXnqx\=Ar-a}6^ӹۆmpmh⁏-5dS61->q @p.3BQ@ m,kg݅k@ۡކdX ♯7&yaNP,J(`l2EluӎVe"'hXa1cϞq w.=sg\{*@!&W >ϝɅ˖Y#R 8Ro߾~j!eWmƍeRPm-?c|ӖcfR,q6CkjG.m4ԪMS * RHݾСF "D65$g˄![Vmrҋr:/^I8 FK hF?M)PTm9$Ë)(O>Q:qV8r2 199589>cvT_I)iJִH4M8`>t5|8$cZpnT5D%iV֌ÎE TZ-6`q t >'۰Q3@_cfacϘ i>%(; 6 VE!$$'&Kwq+.ژN4`C .Iqu2q5'00)6.#L1#:C|`E-~ PM QM;N38b-!tٌc 8E B56(ucOs5|"Hf#TTrS/2 8(t@D֨?jE4!H- 48 / Vb. 78H=Q\pAü` >jh .1H [p'/k,͜N%`-CTBr;$epb6#@@ 69 ")l%sC'XI94(B!ȓD. rlbK}Ḉ8)w|n"$^rG 9 JXRjXJB1|H=Ï7LiQ  p+ *A&PC[;>ՏĔ 8AvBe 7P@P/ Შ~BzdGVDװ ^j9`*$6`x@n\au|Jv >x dod*tbrb63D*c,# nd"-ӢB]W`vhƐ:” A[[B` 8"qrAuőJsH Y`C с>=BsV@d͝+r@\8 7 >P0q |? b51A 84zGZUZ]ʀSL"~Qv@L&A̼VuF2,1P+G+ xWF{@]<=F7@H& ˞G)ЁL4gLv4-x!̠j l]EvF۬YCF 8溡mAQQZẇ3dA/5"r4C0 i=?BbbPc|EXP#(D/Ѓ'xa x `$DhF3ԑfwC6F_ e'1/1`lMP#AvݱELBl+)} pBPWlhdS'!6sԞB(ps0->a'fi ȸm+V\d,ׄ  s 2&7FWu! +`84L6 F/N34>N!N`MCX~ sHC )[+-%ݵ]48ԡDw) ,aՉV!E>~3 #9̃0TP@ 'AhaBdaCA L4=9>@!BI3OՕًˋP[]5l - !9\M_P`lM7Y3ۏX *ʀ! Huӵ/$C,,{tA00\&<I2]`;>,'H:'| \#&Ѡ'ܠ- ~ 9@#v@ hDEV!F]QE:o`5I(($CTϔI&OH}D&&YF"-]O>&5 AdG8-D NdOԇ9$.#($Q&>Hҽ0xBBvwvwCCu@UOJ{&&-B1TL1D,`@]J,Qu3J'|Va(XV8108<-.\Ê9䏮(9l@l%2hR™Ne:"!mu&a =claiN 08dyE\RUPfC l B(i`6$fAGq,OrB,8,DC1n'|)HUB20C$A(%*lO>Vbf6/- 9Tٴ:gZHX3-,~OHVJ>Ziō8`@ `D3@ HkD6 .3`A Lϋ_fi+fmT-((wR1 L҅v B"G2\ĂD{HȖs.,*ɢ TJ(TsiBMfh?NrA8̂$/1Nmi*4ɒ-8( 8bc7*mך;bI99C Vóf!ٲ/t ħƥM:^ L٘Dj_H26 A&]J.C2T-3)<~}LB^oȆ#oi`A(#JT(A\4$j:)%eL/N3p|"\dU>X5-ȁG V!24G.B5E'LXPR 鐺H6<8c>șH)3`APOFh5zNDj dI&)~|c8*ڼB 9bdM딄\䍝Vÿc;C|g1:/rm4R8T'.hA<2X 3 '{G@ X4LH dwL`혩JL2.CQŁ'^k.'cZCb03hlҍC)'C%*AX00! \4b2]H|2/W.DL~i!47)DaaãIG9ĝ PPm+1VbOOH=E3-+ C(f} `#rD-t43U<*πG/lQ(kՕ,'kAlKKxB5GİNOA %h.%vUHX'6458^z\kŭċmf$e,l!. &E^3_;sCt1']&d+9s 2H>`s?jR|94\eV6<Ds29VȈOrpC(!W'Bli`mYO(qb'jO|D^69#pVDq\e3[9,oXJwnC;6BP 8V"h^G]70ĘXT$ZV=5lL!f8P!j8"VŌn(c+d`'<^j/iKxIC=Î qvUO\K'bA:#`cgOI 4HC9Dv#ZNV_<9<+. 5FLC%lϋU\rB׺΃aC- lijJJSW] t8Z8}+W>C(S{9'a h61.`@!2C@4kVm9s%oa>\8nڞ=8kP#pALh=xզ[0b.n֊#`:ffFj≈ܱ(Zđ 樂$Jh)}v%Hm٩fL1R&Ɇq >D DPhMB 밃;jŤ?P; ˕A$ p:;5lz͚70spt&BGE!ÿqFpÏ6Atԑn@BM-S">ǞP*iH>9E^ E ̱xřiqEPvyP!t+!ZY%xaG6Ls %~>b[*BƬl᥂2!ЈP XO9V\f1IBfa&3p}My{~0#Ý!P#l7@ {$ m.8$`oWvs8ALr0"B jpRMr"1y#"H m!+A!B!`xArCۨ@Co;Ib# ppQ@h-őf<䵮+IG)JNA4UCF$irO'ףw3zR6N1*B x42UA IAU wr1r g̃X@AV1]Her)0W0B7]NQf~( #4@ q*L}Uȅ5NpJ*gm$2 Pr &b+(3I,G n#6c\A '1E( &|t2 *U D`d^E{4|Cʋ.eXíy`n1OY#9'A.|hjpi&Xx VzjPZƽ@1;n@)Wp8Nҗ=Y,1)(W #=nת5EL$% ^kb`SMͪG2,d&A"!V1мBCǵ09FBɈ|$@r6024 Fj7/xOay(lbf}e۰w+ R7 G` Fmng;%B+ D^ U:gE0ptᠣ5##i7t/& ^A1q^j U!v!n+=ʣ'&G`Fq p$maO` Ph,"|b0# FnvL H .>N˽| <hش.sp1lf v`H`$tir4Nb1J}NBD̪5ZǂAv ^!)0` "dKဈ`V[J#b[(͜ 'Ňpta!(G (aaE&0HB[4Vo URLDL%qbV ~,AKN mn1Nݒ hha 2 OrT+D"H&=l`P^>M0G!*IA,(q,B4,pIUNǶ.<)D:` /UѨJlo AvA&!w1's2ra: A vI*u*o*baKoOXO h(Pˇv{ )Ɓ,aDbŢЌA~V \pʠ2`)P#bDd B#n`2d񔏞|9 $f1GP[S@rrJ$SrVZU4dA|,,&#GƁ#z( d|!Arh+ QR< x !xD !)y[(!N*ao%\,2Hʫ4!!Q P҄bs3%C "a4tGd+Da'2-!8 !eB3St܁',:s$!tNQf67%W -ȃDK4#5G/ D"F`2aG]J4b":H 6pDGD{GAPx:n L bDT GOhgp>cdRCknLfݡE؁$.WH!!\bk]dM=fa,J4dED5A Z{GDv< @bgU%A:%qڕ,!!A4#2#8bhk\-V<'Hhus5T$a] N ĈbCIY!H趧:sa^;4a5e#` n@ !^CC!bay)TvU:hW:`u!s!p*JZ;PA@55UTI# BCEg!x8 g#pqWw7qI)ar[qdHdZ3a>ZoLwK]oz-td(bZaU43Tu]wzGAdwAA>ax/>[]m qZJ!Anf][W>e7nA9!r%*?g|#8A̚Z"T >wnui\b]!|  h#L9(T79MR^7 '@c vRʡ-!Foв okxz7!`l*>tKOqn h-!=ve>86l#!g!A٣kXz룅:9  @AaJaTv%9},3Za7}u `2լ8z}} f!avAyeZ HZtYd8cY6>e[!y9wXzYeze\pI Wze;ڈiա![(cNSWYƦ!;E[y8۳#{#y E[>B{y;LwYڷzz뻿n샦cHta۷[eDOw7۽]ȴ3aڻtfo :eo^{[ojzaԻ{cC<3NKIq!>%~)-1>5~9=A>E~IMQ>U~Y]a>e~iEq^jNrwKo2@r^3A@ !3>nҠE` ^^~A>/#2> m+E !͞~2d ^2ȁeE 2癀' A?2>oap(Q_oE@o^CE5i?)p(cJp^}}w7C3,o6>=??3CosE)/?7?_ <0… :|"RX aQ!PD=N)\EHC.̆gڼ3Ν<{Y3aP&]VWɒ&QdK&$S(Ŭ\z 6,ϡt"~h.W 9}䤒L+ּ| ^fV[)C" eRNIeV^eZne^~ fbIfffjfn grI';gpsman-6.4.4.2/manual/html/GPSMandoc_9.html0000644000175000017500000000712512170753404016406 0ustar migmig GPS Manager User Manual -- Data and examples
InstallationProgramsSeparate GPSMan utilitiesData and examples

Data and examples

The following data and examples are available here:

More data is available from:


GPSMan User Manual
Copyright 1998-2013 Miguel Filgueiras,

Creative Commons License
GPSMan User Manual and the GPSMan logo images by Miguel Filgueiras are licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.

Get gpsman at SourceForge.net. Fast,
secure and Free Open Source software downloads


InstallationProgramsSeparate GPSMan utilitiesData and examples
gpsman-6.4.4.2/manual/html/GPSMandoc_63.html0000644000175000017500000000721112170753404016462 0ustar migmig GPS Manager User Manual -- References
Map: Mouse and Keyboard ShortcutsTopAcknowledgementsReferences

References

  1. A. C. Gardner and W. G. Creelman, Navigation. Pergamon Press, 1965.

  2. Paul S. Heckbert and Michael Garland, Survey of Polygonal Surface Simplification Algorithms. Technical report (draft), School of Computer Science, Carnegie Mellon University, 1997.

  3. Zhilin Li, An examination of algorithms for the detection of critical points on digital cartographic lines. The Cartographic Journal, 32, 121-125, 1995.

  4. William Macfarlane, Home Trade Navigation Guide. Brown, Son and Ferguson, 1963.

  5. D. A. Moore, Basic Principles of Navigation. Kandy Publications, 1964.


GPSMan User Manual
Copyright 1998-2013 Miguel Filgueiras,

Creative Commons License
GPSMan User Manual and the GPSMan logo images by Miguel Filgueiras are licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.

Get gpsman at SourceForge.net. Fast,
secure and Free Open Source software downloads


Map: Mouse and Keyboard ShortcutsTopAcknowledgementsReferences
gpsman-6.4.4.2/manual/html/up.png0000644000175000017500000000057210157255500014643 0ustar migmigPNG  IHDR D`PLTE|si_VLCv:m0c&YPFy =p3f?0IDATx} D2+o?{Y'tj;`&tO˧xM"7v T㣤P5ahKZ쥕@{lEӦ]Am P[mdPMD.䒑}l%VLq>ZLL Nׄl-1wA4=r`?7cj&$ph,@xx 3IENDB`gpsman-6.4.4.2/manual/html/GPSMandoc_21.html0000644000175000017500000001434212170753404016457 0ustar migmig GPS Manager User Manual -- Polylines
LapsUsing GPSMan in graphical modeTracksPolylines

Polylines

Polylines have a datum and a position format for all its points, a colour and a width (in pixels) used in displaying it on the map.

A map background image name can be given for each polyline, so that when the polyline is displayed on the map window the named image is automatically loaded if the map is empty. See below for the details.

Changing the position format to grid coordinates may produce the following effects:

  • the polyline datum is changed to the datum required by the grid
  • some/all positions are shown as undefined (either -- 0 0 or -- 0) if they are out of the scope of the grid; this however will not affect the internal representation of the position and a change to a suitable format will yield correct values. When reading a polyline from a file, positions may also be shown as undefined in which case the position format should be changed.

Each polyline point has a position and, possibly, its altitude in either metres or feet, depending on the existing option for this. A point can be changed by double-clicking on the corresponding line in the list of points of the polyline edit window.

A polyline can be subdivided into segments and the segments will be drawn unconnected when the polyline is displayed on the map. The first point always starts a segment, and any other point can be marked as a segment starter from the polyline edit window by using the mouse right-button on the last column of the points list.

A polyline can be created from a track : see above.

A polyline can be created by drawing on the map as explained below.

The edit window for polylines allows some operations on polylines that may be useful to clean uninteresting start or end parts, or to compose a single polyline from others. They are:

  • "Chop head": all polyline points from the first to and including the first one selected are deleted; if there is no selection the first point is deleted;
  • "Chop tail": all points from and including the last one selected to the last are deleted; if there is no selection the last point is deleted;
  • "Include before", or "Append": the points of a polyline are put before the first, or after the last point;
  • "Loop": a copy of the first point is added to the end of the polyline;
  • "Delete": deletes all the selected points;
  • "Clear": deletes all points.

A polyline can be splitted by taking either each selected point or segment starter as the first point of a new line extending up to and excluding the next such point. Lines with at least two points obtained in this way are created, as well as a group with all of them. These new lines inherit the datum, the position format, segments (unless when splitting by segment starters), width, colour and map background of the original line. They and the new group get names generated automatically. The original line is not affected by this operation.

A polyline can be converted into a track from the polyline window, keeping the information on segments.


GPSMan User Manual
Copyright 1998-2013 Miguel Filgueiras,

Creative Commons License
GPSMan User Manual and the GPSMan logo images by Miguel Filgueiras are licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.

Get gpsman at SourceForge.net. Fast,
secure and Free Open Source software downloads


LapsUsing GPSMan in graphical modeTracksPolylines
gpsman-6.4.4.2/manual/html/GPSMandoc_45.html0000644000175000017500000001031112170753404016455 0ustar migmig GPS Manager User Manual -- The read Command
The start travel CommandUsing GPSMan in Command-line ModeThe getalmanac CommandThe read Command

The read Command

The read command reads a data file and launches the graphical interface (for its meaning in GPSMan scripts see the exec command).

read FORMAT [PARAMS] [TYPES] PATH
where:
  • FORMAT [IN-PARAMS] is the input file format and its parameters (if any); use show formats for a list of the currently accepted formats;
  • IN-TYPES are the data types to read; the possible types depend on the format and some formats impose that there is a single data type per file; they may be absent if the format requires a unique data type or if the files can have items of different types; all can be used as an abbreviation of WP RT TR;
  • PATH is the path to the file to read from, or, in the case of the Shapefile format, the path to the Shapefiles basename (file extensions will be discarded). If the PATH is stdin input will be from the standard input unless the format is the Shapefile format (in which case the command fails).


GPSMan User Manual
Copyright 1998-2013 Miguel Filgueiras,

Creative Commons License
GPSMan User Manual and the GPSMan logo images by Miguel Filgueiras are licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.

Get gpsman at SourceForge.net. Fast,
secure and Free Open Source software downloads


The start travel CommandUsing GPSMan in Command-line ModeThe getalmanac CommandThe read Command
gpsman-6.4.4.2/manual/html/GPSMandoc_56.html0000644000175000017500000001037712170753404016473 0ustar migmig GPS Manager User Manual -- Plug-in code and execution
Pre-defined plug-insExtending GPSMan: Plug-insPlug-in widgetsPlug-in code and execution

Plug-in code and execution

Each plug-in definition has a list of alternating parameter names and Tcl expressions. Parameter names must be valid Tcl variable names and start with "_" (underscore). The expressions are evaluated in the context of the procedure that creates each plug-in widget (there may be more than one), and the resulting values togeteher with the parameter names are passed as optional arguments to the procedure PlugInExec used as call-back.

This procedure starts by setting up the plug-in parameters by assigning to each parameter name the corresponding value. If a name does not start with "_" (underscore) the procedure returns after issuing an error message. Otherwise the plug-in code is executed by using Tcl eval.

This way of dealing with parameters makes it possible for the plug-in code to access variables in the procedures that create the widgets thus avoiding the need to recompute information that is available there. The plug-in code may, of course, access global variables by declaring them as such. It should refrain to set global variables and in order to avoid clashes with GPSMan procedures and local variables of the call-back procedure it should use names starting by "_" (underscore) if procedures or local variables are defined.


GPSMan User Manual
Copyright 1998-2013 Miguel Filgueiras,

Creative Commons License
GPSMan User Manual and the GPSMan logo images by Miguel Filgueiras are licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.

Get gpsman at SourceForge.net. Fast,
secure and Free Open Source software downloads


Pre-defined plug-insExtending GPSMan: Plug-insPlug-in widgetsPlug-in code and execution
gpsman-6.4.4.2/manual/html/GPSMandoc_22.html0000644000175000017500000001147312170753404016462 0ustar migmig GPS Manager User Manual -- Laps
GroupsUsing GPSMan in graphical modePolylinesLaps

Laps

Laps are only supported for Garmin receivers (most of which do not use them) and if the corresponding option (under receiver parameters) is selected. Laps have a time-stamp for its start, a duration, the total distance, the calories spent, the start and stop positions, and an associated track. The only fields that can be edited are the remark, the position format and the datum.Further information is computed by GPSMan, namely the time-stamp for the end point and the average speed.

Some of these fields may be undefined and will be left blank. The associated track is only meaningful if its number is less than 223. In this case and if there is a track in the current data-base whose name is that number, it is possible to display the track on the map from the lap window.

Laps are identified by the start time formatted according to the current date format. These names must be unique, implying that two laps cannot have the same start time. Even if in a session the date format changes and laps with the same start time are saved to a file, loading the file in a different session will result in all but the last such lap to be available.

When getting laps from the receiver, laps will be aggregated in runs. For each run a group is created. Runs are computed as follows: from the sequence of laps sorted by increasing start time, a run is built for the first laps until and including a lap either having a track number less than 225, or being the last in the sequence and having a track number equal to 255; the same process is then applied to the rest of the sequence.

As laps are loaded only if the support for laps is active, some care should be taken to avoid loss of data. For instance, laps data will be lost if one loads a file having laps when laps are not supported and saves the current data-base under the same file name.

The list of laps is sorted in reverse chronological order (more recent lap at the top).


GPSMan User Manual
Copyright 1998-2013 Miguel Filgueiras,

Creative Commons License
GPSMan User Manual and the GPSMan logo images by Miguel Filgueiras are licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.

Get gpsman at SourceForge.net. Fast,
secure and Free Open Source software downloads


GroupsUsing GPSMan in graphical modePolylinesLaps
gpsman-6.4.4.2/manual/html/previous.png0000644000175000017500000000047010157255500016070 0ustar migmigPNG  IHDR D`PLTE|si_VLCv:m0c&YPFy =p3f?0IDATxՒA DiIZe/8vv$/ H5=S`'R3jBjy GPS Manager User Manual -- The source Command
The exec CommandUsing GPSMan in Command-line ModeThe geopicts CommandThe source Command

The source Command

The source command executes a source Tcl-command on the file whose path is given as argument:

source PATH


GPSMan User Manual
Copyright 1998-2013 Miguel Filgueiras,

Creative Commons License
GPSMan User Manual and the GPSMan logo images by Miguel Filgueiras are licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.

Get gpsman at SourceForge.net. Fast,
secure and Free Open Source software downloads


The exec CommandUsing GPSMan in Command-line ModeThe geopicts CommandThe source Command
gpsman-6.4.4.2/manual/html/GPSMandoc_54.html0000644000175000017500000001117712170753404016470 0ustar migmig GPS Manager User Manual -- The graphical interface for plug-in definitions
Plug-in widgetsExtending GPSMan: Plug-insThe graphical interface for plug-in definitions

The graphical interface for plug-in definitions

Plug-in definitions can be inspected or created from the Definitions menu-button. Each plug-in has:

  • a name that must be unique
  • a remark, for documentation purposes
  • a Tcl expression that evaluates to non-zero if the plug-in cannot be used, for instance when a needed library or external program is missing;the evaluation is done at top level so that global variables can be used
  • a sequence with alternating parameter names and Tcl expressions, used for setting up initial values needed by the plug-in code; parameter names must be valid Tcl variable names starting with "_" (underscore)
  • the Tcl code to be evaluated in order to execute the plug-in; as the text box has only basic editing features it may be wise to edit the code in a separate editor and paste it in the box when finished
  • a Tcl list with information on widgets to be created for launching the plug-in; each element is a list with
    • a Tcl glob pattern for paths of GPSMan toplevel windows; only some toplevel windows have support for plug-ins (cf. the array PLGSWelcomed in the GPSMan source file plugins.tcl)
    • a widget type: either button or menu
    • a widget path from the matching window path.

Care must be taken when defining a new plug-in as it is difficult or even impossible to automatically check the correctness of the given information. The best way to start writing plug-ins is to change an existing definition.

Information on user-defined plug-ins is kept on a file in the GPSMan user directory. Advanced users may wish to edit this file instead of using the graphical interface.


GPSMan User Manual
Copyright 1998-2013 Miguel Filgueiras,

Creative Commons License
GPSMan User Manual and the GPSMan logo images by Miguel Filgueiras are licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.

Get gpsman at SourceForge.net. Fast,
secure and Free Open Source software downloads


Plug-in widgetsExtending GPSMan: Plug-insThe graphical interface for plug-in definitions
gpsman-6.4.4.2/manual/html/GPSMandoc_34.html0000644000175000017500000006045112170753404016465 0ustar migmig GPS Manager User Manual -- GPSMan Symbols
Using GPSMan in graphical modeFiles in Other FormatsGPSMan Symbols

GPSMan Symbols

GPSMan defines a set of symbols for waypoints that is described below under four categories (not mutually exclusive): general use, land, water, and aviation. This set is based on the symbols described in the "Garmin GPS Interface Specification" (Revision A), but extends it, including, for instance, the symbols used by Lowrance receivers (contributed by Brian Baulch). The GIF files for these symbols provided in the distribution were produced expressly for use with GPSMan, with some by Brian Baulch and Robert Joop. It is recognized that both these images and the set of symbols can be improved and any help will be appreciated.

 As the set of symbols is large and some symbols may be of no use with the receiver a custom symbol menu can be created and edited. There is an entry for this in the Definitions menu-button. A description of the custom menu is automatically saved in a file in the GPSMan user directory, and will be loaded when GPSMan is started.

Category: General use

WP
Danger     Skull     Bell
Flag Flag pin, blue Flag pin, green Flag pin, red
Trace-back Dollar
(transparent) (void)
Ball Dot Mark, x Circled X
Diamond, blue Diamond, green Diamond, red
Square, blue Square, green Square, red
Box, blue Box, green Box, red
Pin, blue Pin, green Pin, red
Circle, blue Circle, green Circle, red
Block, red Block, green Block, blue
Triangle, blue Triangle, green Triangle, red
A, red B, red C, red D, red
A, green C, green B, green D, green
A, blue B, blue C, blue D, blue
0, red 1, red 2, red 3, red
4, red 5, red 6, red 7, red
8, red 9, red
0, green 1, green 2, green 3, green
4, green 5, green 6, green 7, green
8, green 9, green
0, blue 1, blue 2, blue 3, blue
4, blue 5, blue 6, blue 7, blue
8, blue 9, blue
Smiley Ball cap Big ear Spike
Goatee Afro Dreads
Female 1 Female 2 Female 3
Ranger Kung fu Sumo Pirate
Biker Alien
Bug Cat Dog Pig

Category: Land

First aid     Info       
City, small City, medium City, large City, star
Car Rent-a-car Car repair Tow truck
Biker
WC House Building Pharmacy
Phone Post-office Police Water hydrant
Tunnel Bridge Dam Levee
Mountains Elevation Summit
Ladder Trail head Tracks Many tracks
Deer Duck Fish Fish bank
Tree Parking Lodging Park
Castle Monument Church Chapel
Cemetery Museum Theater Casino
Zoo Scenic Airport Mine
Oil field
Food Fast food Mug Pizza
Movie School Shopping Store
Stadium Amusement park Beach Swimming
Showers Skiing Golf Bowling
Snow skiing Ice skating Fitness Picnic
Camp site Drinking water Geocache Geocache found
Recreational Vehicle park Fuel Fuel & store
Horn Exit Exit, no services Exit no serv large
Mile marker Border Toll
Freeway National highway Highway State highway
US highway Street intersection Ramp intersection Ramp int. large
Truck stop Weight station
Parachute Glider Ultralight Tower, tall
Tower, short Take-off Landing
Geo name, land Geo name, man-made Geo name, water
Civil location Military location

Category: Water

Anchor Fuel
Boat    Boat ramp     Fish     Fish bank
Light Man over board Beach Swimming
Wreck Dam Mile marker Radio beacon
Buoy, white Buoy, amber Buoy, black Buoy, blue
Buoy, green Buoy, green red Buoy, green white Buoy, orange
Buoy, red Buoy, red green Buoy, red white Buoy, violet
Buoy, white Buoy, white green Buoy, white red
Diver down 1 Diver down 2 Stump
Open 24 hours Fishing Hot Spots(TM) facility
Bottom conditions Tide/current pred station Anchor prohibited
Beacon Coast guard Reef Weedbed
Dropoff Dock Marina Bait and tackle

Category: Aviation

Airport     Heliport     Private field    
Seaplane base Soft field Landing Take-off
Radio beacon Danger (avn)
1st approach fix Localizer outer marker
Missed approach point ND beacon
TACAN VHF omni-range VOR-DME VOR/TACAN
Controlled Area Restricted Area Intersection
Parachute Glider Ultralight
Tower, tall Tower, short


GPSMan User Manual
Copyright 1998-2013 Miguel Filgueiras,

Creative Commons License
GPSMan User Manual and the GPSMan logo images by Miguel Filgueiras are licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.

Get gpsman at SourceForge.net. Fast,
secure and Free Open Source software downloads


Using GPSMan in graphical modeFiles in Other FormatsGPSMan Symbols
gpsman-6.4.4.2/manual/html/GPSMandoc_10.html0000644000175000017500000001713512170753404016460 0ustar migmig GPS Manager User Manual -- Installation
Known problemsProgramsData and examplesInstallation

Installation

As stated before Tcl/Tk (preferably version 8.4 or later) must be installed to run GPSMan. It can be got from the Active State site.

In Unix and Linux systems access to the serial or USB port is restricted. This means that either there is a program to lock the port with super-user privileges, or the permissions of the port are changed to give read/write access to a group of users or to all users. The latter is dangerous in that it creates security problems. In any case super-user privileges are needed to install the software or to give access to the serial or USB port group.

For security reasons, in Unix/Linux systems the program cannot be run by the super-user. This constraint can be overcome by editing the source file main.tcl, finding the line that contains cantexecasroot and doing the change described in the comment before it.

Support for the Garmin USB protocol needs a Linux kernel with the garmin_gps kernel driver which is part of the official kernels since version 2.6.11. WARNING: some recent Garmin receivers will need at least version 0.34 of this driver. To include the driver when compiling a custom kernel the option under "USB support", "USB Serial Converter support", "Garmin GPS driver" in the kernel configuration interface should be checked. The name of this option is USB_SERIAL_GARMIN. The system administrator may have to intervene if any installed application requires this driver to be blacklisted making it unusable.

Debian and other Linux distribution packages

The installation is done as with other such packages and there is no need for manual configuration. Users of GPSMan must belong to the group that owns the serial port to be used (normally dialout).

Other Unix and Linux systems

After unpacking the files (use tar xzvf gpsman-6.4.4.1.tgz) the GPSMan main file, gpsman.tcl, should be edited for configuration (see below) and put where it can be executed. The other GPSMan files should go into the directory whose path is given at the beginning of gpsman.tcl.

The package includes a file gpsman.sh in the util directory that is a shell script to call gpsman.tcl in graphical mode with no need to give the serial port as argument. This file should be edited for configuration and placed where it can be executed.

Launching the program from the command line

The program is launched by calling gpsman (or gpsman.tcl) that may have no arguments or a single argument with the path to the serial or USB port device, in which case the graphical interface will be used, or 2 or more arguments, in which case the command-line mode will be entered. An exception to this is the call
gpsman [OPTIONS] start travel [INTERVAL]
that is parsed as if in command-linde mode, but then launches the graphical interface (this will only work with Garmin receivers).

In the case of a single argument, a USB port device can be given with the prefix usb=, as in usb=/dev/ttyUSB0, to enforce the use of the Garmin USB protocol when this is not the default protocol.

MacOS X systems

GPSMan can be run under MacOS X systems by installing a suitable Tcl/Tk package and by using a USB to serial adapter. The following configuration is known to work (information kindly supplied by Mathias Herberts, Mathias.Herberts_at_iroise.net):

To install GPSMan, unpack the gpsman-6.4.4.1.tgz archive, and edit the GPSMan main file, gpsman.tcl for configuration (see below) and put it where it can be executed. The other GPSMan files should go into the directory whose path is given at the beginning of gpsman.tcl.

Other systems

After unpacking the gpsman-6.4.4.1.zip archive the GPSMan main file, gpsman.tcl, should be edited for configuration (see below) and put where it can be executed. The other GPSMan files should go into the directory whose path is given at the beginning of gpsman.tcl.


GPSMan User Manual
Copyright 1998-2013 Miguel Filgueiras,

Creative Commons License
GPSMan User Manual and the GPSMan logo images by Miguel Filgueiras are licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.

Get gpsman at SourceForge.net. Fast,
secure and Free Open Source software downloads


Known problemsProgramsData and examplesInstallation
gpsman-6.4.4.2/manual/html/newearr.gif0000644000175000017500000000043307623136230015641 0ustar migmigGIF89a9ʟž޴rp[oZDSC.8-,9I8ͻ`(d%@0\5ZĒPoX8Hk8&xaw Yby$iap. [@pk 6G&X@.a@CCP{R}jwy|t7:El)Fe>x\ZT =džCJ48o Ac&盢-;gpsman-6.4.4.2/manual/html/GPSMandoc_58.html0000644000175000017500000000640212170753404016467 0ustar migmig GPS Manager User Manual -- Support for Lowrance, Magellan and Garmin Receivers
AcknowledgementsTopExtending GPSMan: Plug-insSupport for Lowrance, Magellan and Garmin Receivers

Support for Lowrance, Magellan and Garmin Receivers


GPSMan User Manual
Copyright 1998-2013 Miguel Filgueiras,

Creative Commons License
GPSMan User Manual and the GPSMan logo images by Miguel Filgueiras are licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.

Get gpsman at SourceForge.net. Fast,
secure and Free Open Source software downloads


AcknowledgementsTopExtending GPSMan: Plug-insSupport for Lowrance, Magellan and Garmin Receivers
gpsman-6.4.4.2/manual/html/next.png0000644000175000017500000000047010157255500015172 0ustar migmigPNG  IHDR D`PLTE|si_VLCv:m0c&YP =p3f]=IDATx͓0Dc@ vͶ{MfrtF@ uQ@N ;:%فQ!XxmS1 ZOc*Tx< wqhA,Z~IENDB`gpsman-6.4.4.2/manual/html/GPSMandoc_72.html0000644000175000017500000001176512170753404016473 0ustar migmig GPS Manager User Manual -- Version 6.4.2 -- 19 September 2011
Version 6.4.1 - 30 December 2009Recent ChangesVersion 6.4.3 - 29 April 2012Version 6.4.2 -- 19 September 2011

Version 6.4.2 -- 19 September 2011

  • elevation graphs for tracks using gnuplot; implemented by plug-ins contributed by Rudolf Martin (rudolf.martin_at_gmx.de).

  • for tracks, improved computation of total (or cumulative) ascent/descent, computation of rest periods, total resting time and average speed in motion, estimated time for a hiking trail; contributed by Rudolf Martin.

  • new configuration parameter: user temporary files directory; must be set correctly for GPSMan to work; it defaults to .tmp under the user GPSMan directory.

  • new user options: altitude threshold when computing cumulative ascent/descent, operating system commands to display an image file and open a terminal (command-line) window; default of altitude threshold is appropriate for GPS receivers with non-barometric altimeter.

  • change in default for user option (was a configuration parameter): the print command starts now by being empty (meaning unavailable).

  • new projections: Mercator spherical case, Equidistant Cylindrical, and their particular cases EPSG:3857 (also known as EPSG:900913, EPSG:102113) and EPSG:32663 (Plate Carree with WGS 84 datum); asked by Rudolf Martin.

  • in order to avoid ill formed or inconsistent data files, appending to a file is no longer an option when writing to an existing file except in the case of results of computations, real-time logs and contents of information windows.

  • windows presenting results that depend on the definition of a route or track, such as computations or graphs, may be closed when the item changes after being edited or being replaced when data is read-in; based on a change suggested by Rudolf Martin.

  • unavailable expression of plug-ins are now evaluated at top level so that global variables can be used.

  • explicit support for the Garmin GPS 72H receiver; with thanks to Justin Arundell and Julian Barragan who sent protocol lists.


GPSMan User Manual
Copyright 1998-2013 Miguel Filgueiras,

Creative Commons License
GPSMan User Manual and the GPSMan logo images by Miguel Filgueiras are licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.

Get gpsman at SourceForge.net. Fast,
secure and Free Open Source software downloads


Version 6.4.1 - 30 December 2009Recent ChangesVersion 6.4.3 - 29 April 2012Version 6.4.2 -- 19 September 2011
gpsman-6.4.4.2/manual/html/GPSMandoc_39.html0000644000175000017500000000641612170753404016473 0ustar migmig GPS Manager User Manual -- The haslib Command
The getwrite CommandUsing GPSMan in Command-line ModeThe show WHAT CommandThe haslib Command

The haslib Command

The haslib command checks whether a certain library is available:

haslib LIBRARY
where LIBRARY is gpsmanshp, Img or TclCurl. The command exits with 0 if the library can be loaded.


GPSMan User Manual
Copyright 1998-2013 Miguel Filgueiras,

Creative Commons License
GPSMan User Manual and the GPSMan logo images by Miguel Filgueiras are licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.

Get gpsman at SourceForge.net. Fast,
secure and Free Open Source software downloads


The getwrite CommandUsing GPSMan in Command-line ModeThe show WHAT CommandThe haslib Command
gpsman-6.4.4.2/manual/html/GPSMandoc_50.html0000644000175000017500000001605412170753404016463 0ustar migmig GPS Manager User Manual -- The geopicts Command
The source CommandUsing GPSMan in Command-line ModeThe georef CommandThe geopicts Command

The geopicts Command

The geopicts command geo-references files (e.g., picture files from a digital camera) either based on their time-stamps and a given track, or by using the sequence of waypoints in a group. The result is a file with waypoints (at present in GPX format) that can be suitable for use with World Wide Web applications.

geopicts IN-FORMAT [IN-PARAMS] IN-TYPE IN-PATH [PROC-PARAMS] \
         [OUT-FORMAT] [OUT-PARAMS] OUT-PATH PICT-PATHS
where
  • IN-FORMAT [IN-PARAMS] and IN-PATH are the input file format, its parameters (if any) and path; use show formats for a list of the currently accepted formats;
  • IN-TYPE is the data type to read; the possible types are
    • TR, a track: the time-stamp of each file is compared with the track points time-stamps and a position is computed by linear interpolation/extrapolation; strange results can be caused by track points being widely apart in distance or time;
    • GR, a group: the files are sorted by their time-stamps in increasing order and each file is put into correspondence with a waypoint in the group in the order they appear there, undefined waypoints being discarded; if there are more files than waypoints, the last waypoint is used for the remaining files;
  • PROC-PARAMS, the processing parameters can be
    • id=ID gives the name or identifier number of the item to be used from the input file; if not given the last item of IN-TYPE that was read in is used;
    • date=DMODE describes how file time-stamps should be retrieved, DMODE being
      • pict (the default): the file is a picture file, the time-stamp should be got from the EXIF tags in the file; the following methods will be tried in sequence: using the Tcl exif package, running the exif or the metacam external utilities; if all of them fail, the file is discarded;
      • exif: the file is in the EXIF format (as produced by exif or metacam) and the time-stamp is retrieved from the EXIF tag;
      • fmod: the file last modification time as given by the operating system is taken as time-stamp;
    • dh=DHOUR: gives the difference in hours of the time zones of the track and files time-stamps, a positive value meaning the track time is later than the files times; useful when the camera and the GPS receiver are not set to the same time zone;
  • OUT-FORMAT and OUT-PATH are the output file format and path; at present the only supported format is GPX;
  • OUT-PARAMS are the parameters for OUT-FORMAT but may also contain the following ones used when generating the resulting waypoints
    • datum=DATUM;
    • sy=SYMBOL, with SYMBOL the internal name of the symbol; use show symbols for a list of the symbol names;
    • prefix=STRING gives the prefix of the waypoint names, the default being P; each name starts with the prefix and is followed by a 5 digit number;
  • PICT-PATHS are the paths to the files to be geo-referenced.

A file with a time-stamp already found will be discarded.

Example: the following command

gpsman.tcl geopicts gpsman TR data/Esp.trk date=exif dh=1 \
    gpx lacpicts.gpx photo/exifs/LaC-*
uses the track in GPSMan format in file data/Esp.trk and the EXIF files photo/exifs/LaC-*, which have time-stamps 1 hour later than the time-stamps in the track, in producing the GPX file lacpicts.gpx.


GPSMan User Manual
Copyright 1998-2013 Miguel Filgueiras,

Creative Commons License
GPSMan User Manual and the GPSMan logo images by Miguel Filgueiras are licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.

Get gpsman at SourceForge.net. Fast,
secure and Free Open Source software downloads


The source CommandUsing GPSMan in Command-line ModeThe georef CommandThe geopicts Command
gpsman-6.4.4.2/manual/html/next.gif0000644000175000017500000000037507310716747015173 0ustar migmigGIF89a |si_VLCv:m0c&YP =p3f, ` dihlp,Gcl.P?Ih0B QDEPPs׆H*Rh#rn{,6`:bjABf> IBMFpJ>Q}FQ<3DNk 76 \%!;gpsman-6.4.4.2/manual/html/GPSMandoc_20.html0000644000175000017500000003522412170753404016460 0ustar migmig GPS Manager User Manual -- Tracks
PolylinesUsing GPSMan in graphical modeRoutesTracks

Tracks

A track has a datum for all its points, a colour and a width (in pixels) used in displaying it on the map. The colour will be sent to the GPS receivers supporting it, in which process a colour matching algorithm will be applied if the original colour is not in the set of colours accepted by the receiver. Any colour matching algorithm may give unexpected results and the one used in GPSMan is no exception.

A map background image name can be given for each track, so that when the track is displayed on the map window the named image is automatically loaded if the map is empty. See below for the details.

Each track point has the following information: time stamp, position (always shown in the DMS format), altitude and depth in either metres or feet, depending on the existing option for this.

A track can be subdivided into segments by some receivers at points in which the GPS fix was lost. The first track point always starts a segment, and any other track point can be marked as a segment starter from the track edit window by using the mouse right-button on the last column of the points list. When displaying a track with segments on the map, the segments will not be connected.

The edit window for tracks allows some operations on tracks that may be useful to clean uninteresting start or end parts of a track, or to compose a single track from several others. They are:

  • "Chop head": all track points from the first to and including the first one selected are deleted; if there is no selection the first track point is deleted;
  • "Chop tail": all track points from and including the last one selected to the last are deleted; if there is no selection the last track point is deleted;
  • "Include before", or "Append": the track points of another track are put before the first, or after the last track point. To ensure sensible values for speed between track points, their dates may have to be changed. GPSMan will show the distance between the last point in the first track to the first point in the second and will propose a new date for this one. This date is computed assuming a constant speed and may be changed by the user. All dates in the second track will be adjusted according to the chosen date, keeping the original differences;
  • "Delete": deletes all selected track points.

The computation results are the following

  • for each point: point number, time stamp, latitude (DMS), longitude (DMS), altitude in the unit selected by the user, distance to next point, cumulative distance to next point, time to next point, speed in the line to the next point and bearing to the next point.

  • total distance and time.

  • total distance and time without considering gaps between segments, only shown if different from the previous ones.

  • average speed (not considering gaps), distance from first to last point, maximum distance from first point to any track point.

  • if altitude information is available, cummulative ascent and descent (only if consistent with the selected altitude threshold), and maximum and minimum altitudes.

  • from the More menu-button other results can be obtained: estimated times for a hiking trail according to the Deutscher Alpenverein formulas, and rest periods.

An elevation graph for a track can be plotted, as a side-view or a perspective, from the track computation window if there are at least 3 track points with a valid altitude field. They are similar to the elevation graphs for routes, although the side-view graph can be plotted against time instead of total distance if there is valid time information. Another difference is that gaps between segments are shown as interrupted lines.

Elevation graphs by gnuplot can also be obtained from the same window if gnuplot is available and there are at least 3 track points with a valid altitude field. In Linux/Unix systems the perspective (3D) graph also needs that the user option giving the operating system command to open a terminal (command-line) window is defined (not empty).

Parameters are first selected and if waypoints are to be displayed in the graph, a group with waypoints must be selected; cancelling this selection means no waypoints are required. The graph images are written to a file in the current directory whose name is one of the parameters; if the file exists it will be silently overwritten.

For the side-view (2D) graph the parameters define how some values (total values, rest periods, time, speed) should appear, the output file, the maximum/minimum distance from the track that a waypoint should be to be displayed in the graph, and the graph dimensions in pixels. For efficiency, distances of waypoints to the track are computed in a inaccurate way. If the Img Tcl/Tk library is available the graph will be displayed in a GPSMan window. Otherwise if the user option giving the operating system command to display an image file is defined (not empty) this command is executed to display the graph.

The perspective (3D) graph has parameters for the direction in which to take the track, the output file and the graph dimensions in pixels. Selecting a group with waypoints makes all of them to be displayed irrespective of their distance to the track. After these steps gnuplot is run to display the graph allowing for it to be changed: the mouse left-button rotates it and the middle-button changes the altitude scale. Exiting normally from gnuplot will make it write the image to the output file and finish. In Linux/Unix systems a terminal window is used to run gnuplot; a Return (or Enter) key on it makes gnuplot exit normally while an interrupt (usually Control-c) or destroying the window will abort the operation.

A speed graph for a track can be plotted from the track computation window if there are at least 3 track points with valid time information. It is similar to the side-view elevation graph and can also be plotted against time instead of total distance, but does not answer to Control key plus mouse left-button.

A climb rate graph for a track can be plotted from the track computation window if there are at least 3 track points with valid time information. The graph is plotted against time, the vertical units being (user selected) altitude unit per second. If there is enough points a noise-reducing filter, kindly provided by Paul Scorer, is applied to the data.

Creating a waypoint from a track point can be done by double clicking with the mouse left-button on a track point listed in a track window. This will open, for edition, a new waypoint having the same coordinates unless there is already a waypoint being edited. If the track is currently on the map the number of each track point together with the track name will appear in the help balloon when the cursor is over the point.

A waypoint with average coordinates can be created from a track window. Its latitude, longitude and altitude will be computed as the averages of the latitudes, longitudes and altitudes of the track points. This will be useful for obtaining more precise coordinates for a waypoint by recording a track with the receiver standing still.

A track can be splitted by taking either each selected track point or segment starter as the first point of a new track extending up to and excluding the next such point. Tracks with at least two points obtained in this way are created, as well as a group with all of them. These new tracks inherit the datum, segments (unless when splitting by segment starters), width, colour and map background of the original track but hidden information is discarded. They and the new group get names generated automatically. The original track is not affected by this operation.

A track can be converted into other sorts of line items by a simplifying algorithm that keeps a certain number of the track points as points of the new line, which can be a route, another track, or a polyline. When converting to a polyline information on segments is only used if all the points are kept.

The algorithm that was developed for this may be seen as a variant of the Douglas-Peucker algorithm for finding critical points in polylines (see, e.g., [Heckbert and Garland, 1997] or [Li, 1995]). It starts from a straight line between the first and the last track points; if the number of points to keep is greater than 2, any point that stands furthest from the line will be retained, and the line is replaced by two new lines, those from the first to the new point and from it to the last one. This procedure is repeated always replacing one of the lines for which the distance to an intermediate point is maximum. The review of [Heckbert and Garland, 1997] describes an algorithm by Ballard and Brown (published in 1982) that seems to be very close to this one.

The sequence available here shows examples of routes with 3, 6, 11, 15 and 31 waypoints obtained from a track having 739 track points.

Although GPSMan lets the user fix the number of points to keep between 2 and the number of track points, there is a maximum number of points per route depending on the GPS receiver. It should also be noted that the time needed to find the simplified line will increase significantly with the number of points (although keeping all the track points will take only the time to create the new item).

So that a choice may be made between different numbers of points, GPSMan may be asked to display the simplified line and also the original track on the map on the fly. When the user clicks the Ok button, the map will be restored, the simplified line is used in forming a new item (in the case of a route, with new waypoints having names of the form ZTn, with n a 4-digit integer), and an edit window will be opened for editing the new item. If the edit window for the item type was already in use, then the item is created under an automatically generated name. For a route GPSMan will create a new group with all the new waypoints for easier access.

An animation of the movement corresponding to a track can be viewed in the map window (Animation button in the track edit/show window). A control window will appear that allows for (re-)starting, pausing, or aborting the animation, for skipping to the next track point, for setting the speed (the scale changes are exponential), and for choosing whether the last point shown will be centred on the map window. The default speed is that in the track: the delay between the presentation of two consecutive points is the difference between their time stamps. If a time stamp is not defined the default delay is 30 seconds. The state of the animation, the total (real) time since the beginning (if defined), the time stamp (if defined) and total distance along the track are displayed.

A track can be created from a route or a polyline from the route window or the polyline window.


GPSMan User Manual
Copyright 1998-2013 Miguel Filgueiras,

Creative Commons License
GPSMan User Manual and the GPSMan logo images by Miguel Filgueiras are licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.

Get gpsman at SourceForge.net. Fast,
secure and Free Open Source software downloads


PolylinesUsing GPSMan in graphical modeRoutesTracks
gpsman-6.4.4.2/manual/html/GPSMandoc_36.html0000644000175000017500000000602612170753404016465 0ustar migmig GPS Manager User Manual -- The is available Command
The is connected CommandUsing GPSMan in Command-line ModeThe is available Command

The is available Command

This command exits with 0 and is intended for a quick check on the availability of GPSMan in command line mode.


GPSMan User Manual
Copyright 1998-2013 Miguel Filgueiras,

Creative Commons License
GPSMan User Manual and the GPSMan logo images by Miguel Filgueiras are licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.

Get gpsman at SourceForge.net. Fast,
secure and Free Open Source software downloads


The is connected CommandUsing GPSMan in Command-line ModeThe is available Command
gpsman-6.4.4.2/manual/html/GPSMandoc_62.html0000644000175000017500000004543212170753404016470 0ustar migmig GPS Manager User Manual -- Acknowledgements
ReferencesTopSupport for Lowrance, Magellan and Garmin ReceiversAcknowledgements

Acknowledgements

Thanks are due to:

  • Alberto Morales (amd77_at_gulic.org) for contributing the support for Spanish and for his suggestions.
  • Alexander B. Preobrazhenskiy (modul_at_ihome.ru) for contributing with translations for Russian.
  • Alessandro Palmas (alpalmas_at_tin.it) for his implementation of elevation graphs for routes and tracks, for providing continued support for Italian, for contributing the exportation of data in OziExplorer format, and for his help in debugging and his suggestions for improvements.
  • Anders Lennartsson (anders.lennartsson_at_sto.foa.se) for permission to translate code in GPStrans for the Swedish grid coordinates.
  • Andreas Lange (Andreas.C.Lange_at_GMX.de) for providing continued support for German and the description of the GKK projection.
  • Andy Walls (cwalls_at_radix.net) who provided pointers to Gamin protocol specifications available in different documents on the Garmin site.
  • Asbjørn Djupdal (asbjoern_at_djupdal.org) who provided invaluable help, including remote access to his desktop and receiver, in making experiments with a first implementation of the Garmin USB protocol.
  • Ashutosh Dutta (dutta_at_cs.columbia.edu) for testing the communication with the Garmin GPS 72 receiver and for his suggestions.
  • Attila Berenyi (berenyi.attila_at_gmail.com) for his suggestions and help concerning the support for the Hungarian Datum and projection.
  • Barry Samuels (bjsamuels_at_beenthere-donethat.org.uk) for his help in debugging.
  • Benoit Steiner (benetsteph_at_free.fr) who contributed code for displaying information on points of 2D elevation graphs and computing the cummulative ascent (height of climbing) for tracks, and who prepared documentation on GPSMan.
  • Brian Baulch (baulchb_at_hotkey.net.au) for his work on adapting GPSMan for Lowrance receivers, for his ideas on improvements to GPSMan, for the wheelmouse support, real-time logging (variant for the Lowrance), and help on finding and destroying bugs.
  • Brice-Olivier Demory (brice-olivier.demory_at_epfl.ch) who did the tests leading to the explicit support of the Garmin GPS 76 receiver.
  • Carsten Tschach (tschach_at_zedat.fu-berlin.de) for making available GPStrans.
  • Dan Jacobson (jidanni_at_yahoo.com.tw) for his help in debugging, his suggestions and the information on the Taiwan grid.
  • Daniel Dorau (daniel.dorau_at_alumni.tu-berlin.de) for his help in debugging the support for the Garmin GPSMAP 60CSX.
  • David Gardner (djgardner_at_users.sourceforge.net) for contributing code that creates a group from (un)displayed items, and that re-numbers routes when sending to the receiver, and for his help in debugging.
  • David Kaplan (dmkaplan_at_ucdavis.edu) for contributing the RPM packages of GPSMan (2003-2004).
  • David Wolfskill (david_at_catwhisker.org) who prepared a FreeBSD package of GPSMan, and helped with the use of the Img package.
  • Edouard Lafargue who tested the communication with the Garmin eMap.
  • Eduardo Veloso who kindly provided links to information on aviation symbols.
  • Elric Milon Beltran (elric_at_grupoikusnet.com) for his help in debugging the support for the Garmin EDGE 205.
  • Feczák Szabolcs (feczo_at_siodigit.hu) for his help in debugging the support for the Garmin EDGE 305.
  • Frank Jordan (Universität Duisburg) for his help and patience in testing the communication with the Garmin eTrex receiver, for his suggestions on improvements to GPSMan and for his help in the process of making the GPSMan Debian package a part of the official Debian distribution.
  • Frank Kujawski (Frank_at_Kujawski.org), for the tests with the eTrex Legend and the contribution of code for converting route information in MapsOnUS HTML format into GPSMan format.
  • Hans Olzem (holzem_at_cantv.net) who helped with the testing of the communication with the Garmin GPSMAP 276C.
  • Harald Koenig (Universität Tübingen) for the tests of the communication over a USB serial port under Linux and his suggestions.
  • Harald Stauss (harald.stauss_at_web.de) for his help in debugging, his suggestions, and for testing the communication with the Garmin eTrex Euro.
  • Heiko Thede (Heiko.Thede_at_gmx.de) that contributed a shell and Tcl scripts to convert export files from Map&Guide 2002 and 2003/2004 text formats to GPSMan format.
  • Herbert Tammer (H.E.Tammer_at_DNB.NL) for the tests with the GPSMAP 76.
  • Hermann Kneissel, the author of the Garmin USB Linux kernel driver, for making it available, his help on how to use it and his availability to correct bugs.
  • James B. Mehl (jmehl_at_rockisland.com) who provided the formulas for the Least Squares fit method and helped with tests and detailed suggestions.
  • Jan Max Krueger (University of Konstanz) for making available sample IGC files and information on their use.
  • Janne Sinkkonen (janne_at_iki.fi) for permission to translate code in GPStrans for the Finnish KKJY grid coordinates.
  • Jean H. Theoret (ve2za_at_rac.ca) who contributed the code for changing the symbol of each waypoint in a group.
  • Jim McGuire (jxmcguire1_at_ualr.edu) who provided information on TFW files.
  • Jim Wang who tested the communication with the Garmin GPSMAP 295.
  • João Pedro Pedroso (Universidade do Porto) for his help with the criteria to change goals when navigating a route in an approximate way.
  • John Hay (jhay_at_icomtek.csir.co.za) for his suggestions and tests.
  • John M. Quinn (U. S. Geological Survey) for making available the GEOMAG algorithm for estimating the magnetic declination.
  • Jonathan Pennington (john_at_coastalgeology.org) who tested the communication with the Garmin GPS III+.
  • José Paulo Leal and Luís Damas (Universidade do Porto) who keep solving my problems with Tcl/Tk.
  • Klaus Ethgen (Klaus_at_Ethgen.de) for his great help in testing the communication with the Garmin GPSMAP 76S, and in debugging the low-level communication with Garmin receivers, and for sending information on the Garmin GPSMAP 60C.
  • Kyle Grieser (yuf_at_phoenixdsl.com) for all the work in testing the communication with the Garmin 12Map.
  • Lance DeVooght (devooght_at_comcast.net) for the tests of the communication with the Garmin Forerunner 301.
  • Laurent Bonnaud (bonnaud_at_lis.inpg.fr) for sending a list of protocols and corrections on language support files.
  • Luísa Bastos (Universidade do Porto), Gil Gonçalves (Universidade de Coimbra), José Alberto Gonçalves (Universidade do Porto) and Sérgio Cunha (Universidade do Porto) for their help with geodetic formulas and information.
  • Mariusz Dabrowski (mgd4_at_poczta.onet.pl) who corrected a bug in reading GPX files with geocache names.
  • Marko Hyvärinen (mth_at_sun3.oulu.fi) for testing the communication with the Garmin 12CX.
  • Martin Buck (m_at_rtin-buck.de) who contributed the resizing of 2D graphs, and a change to track edit window.
  • Martin Ostermann (Aachen University of Technology) who contributed code for converting waypoint information in MapBlast HTML format into GPSMan format.
  • Mathias Herberts (Mathias.Herberts_at_iroise.net) for the information on how to use GPSMan under MacOS X systems.
  • Matt Martin (matt.martin_at_ieee.org) who implemented the support for Magellan receivers.
  • Max Spring (mspring_at_cisco.com) for testing the communication with the Garmin eTrex Mariner.
  • Nigel Orr (gps_at_river-view.freeserve.co.uk) who contributed the conversion of routes listed in HTML pages of the GreenFlag site into GPSMan data.
  • Niki Hammler (http://www.nobaq.net) who wrote a Perl script for reading waypoints data in Fugawi export format.
  • Nikolai Kosyakoff (priroda.net_at_gmail.com) who contributed the support for Russian.
  • Odilon Ferreira Jr (odilonf@estaminas.com.br), the author of GPS-TrackMaker, who kindly provided information on the file formats and datums used by his program.
  • Paul Scorer (P.Scorer_at_leedsmet.ac.uk) who suggested the importation of FAI IGC data files and the drawing of climb rate graphs, kindly providing a noise-reduction filter for them, and contributed code for importing BGA DOS turnpoint files.
  • Peter H. Dana (University of Texas) who provided help in correcting bugs in the conversion of UTM/UPS coordinates and information on map projections.
  • Pierre Thibaudeau (prt3_at_sympatico.ca) for all his effort in debugging the communication with the Garmmin Forerunner and exportation to Ozi files.
  • Povl H. Pedersen (pope_at_my.terminal.dk) who corrected a bug in the implementation of the Garmin protocol.
  • Rob Buitenhuis (geo_at_btnhs.nl) who contributed the support for Dutch, the definition of the Schreiber projection and of the Netherlands grid and helped in debugging.
  • Robert Joop (rj_at_rainbow.in-berlin.de) who contributed new symbols, provided valuable suggestions and information on the Garmin eTrex Vista C, and helped in debugging.
  • Rogério Reis (Universidade do Porto) for an algorithm for simplifying tracks, for his ideas on the interface functionality, help in debugging and his work on creating and maintaining a Linux Debian GPSMan package.
  • Rolf Hatt (rolf_at_hatt.com) who tested the communication with the Garmin GPSMAP 180.
  • Ron Schmars (ron_at_schmars.com) who helped with tests of a first implementation of the Garmin USB protocol.
  • Rudolf Martin (rudolf.martin_at_gmx.de) who contributed plug-ins and code that use gnuplot in producing elevation graphs for tracks and compute new values related to tracks, suggested a great number of changes to GPSMan and corrected or helped in correcting a number of bugs.
  • Russell Nelson (nelson_at_crynwr.com) for his help in debugging the communication with the Garmmin Forerunner.
  • Sabine Broda (Universidade do Porto) who contributed the support for German since version 6.0.
  • Sándor Laky (laky.sandor_at_freemail.hu) for his contribution implementing the EOV (Hungarian National) projection and grid.
  • Stefan Hauser (etienne_at_imp.ch) who made the tests of the communication with the Garmin eMap 2.71 and for his suggestions.
  • Stefan Heinen (Stefan.Heinen_at_synopsys.com) who tested the communication with the Garmin eTrex Summit, contributed new data structures for datums, the procedure to access them and changes to improve the focus policy and bindings under MS-Windos, as well as for his worked out suggestions.
  • Steve Brown for his help in debugging the communication with the Lowrance Globalmap 100 receiver.
  • Thomas Trauber for testing the communication with the Garmin eTrex receiver.
  • Thomas Zumbrunn (t.zumbrunn_at_unibas.ch) for his help in debugging the support for the Garmin GPSMAP 76CSX.
  • Tri Agus Prayitno (acuss_at_bk.or.id) who provided the support for Indonesian.
  • Valère Robin (valere.robin_at_wanadoo.fr) who contributed the support for French and the importation of the EasyGPS export and GPX formats, the exportation in GPX and KML formats and for his suggestions.
  • Wes Johnston (wes_at_kd4rdb.com) for the tests of the command-line mode under Cygwin.
  • William D. Hamblen (william.d.hamblen_at_dartmouth.edu) for his help in debugging the communication with the Garmmin Forerunner.
  • Zvi Grauer (zvi.grauer_at_gmail.com) for creating a site with documentation on GPSMan, for his PHP script to post information to Twitter, for his help in debugging and his suggestions.
  • those who sent lists of protocols for Garmin receivers: John Matthews, Christoph Dworzak, Sabine Sagner-Weigl, Matthias M. Weber, David Klotz, Gerrit Huizenga, Hugo Trippaers, Eric D. Christensen, Gracjan Ziolek, Louis Mandelstam, Dan Hobner, Peter Van Loock, Aapo Rista, Chuck Cox, Alexander Damyanov, Joel Staker, Pierre Thibaudeau, Russell Nelson, William D. Hamblen, Jerry Walker, Vlatko Kosturjak, Alan Rogers, Peter MacDonald, Luca Marletta, Ariel Garcia, Cliff Dugal, Imre Simon, José Maria Alonso, Dennis Langenfeld, Eric Smith, Simon Wood, Al Nikolov, Oliver Theis, Chris Smith, Jan Arne Fagertun, Marques Johansson, Dan Bluestein, Steven Kollmansberger, David Bannon, Harry Palmer, Wes Johnston, Frank Sommer, Doug Larrick, Thomas Zumbrunn, Jiri Dvorak, Daniel Dorau, Nenad, Elric Milon Beltran, Michel Equeter, Dominic Hargreaves, Sébastien Roy, Nicolas Brouard, Reinhold Pschierer, Sven Anders, Jon Stockill, Philip Hands, Rolf Werum, Patrick Kik, Waldemar de Laurent, Jon Niehof, Harry Jensen, Alberto Ham, Hans-Peter Nilsson, Jorge Sanchez, Jeremiah Horner, Wouter Amsterdam, Facundo Ariel Perez, David W. Capella, Hiroshi Iwamoto, András Veres-Szentkirályi, Steven Winikoff, Stefan Heller, Greg McQuat, Andy Walls, Jeff Hanson, Gerry Creager, Paul B. Hoch, Johann Spies, Bruce Dawson, Bogdan Hlevca, Ralf Kleineisel, David Antliff, Slaven Rezic, Matthias Wenzel, Lovro Palaversa, Adrian Lawrence, Oliver Hegner, David P. Brown, M. Gutman, Jean-Yves Sage, Damien Porquet, Vincent Arkesteijn, Patrice Arnal, Zvi Grauer, James B. Mehl, Ken Stephens, Elven Decker, Bill Rainey, Thomas D. Dean, Mark N. Reihart, Pekka Ahoi, Alexander B. Preobrazhenskiy, Fred Weijs, Mario Borgnia, Justin Arundell, Julian Barragan, Martin Espinoza, and anonymous.
  • those who sent screenshots of GPSMan use: Eric Spierings, Luca de Alfaro , Mathias Herberts, Tim Jacobs
  • Wolfgang Rupprecht, Tony Mollica, Andrey Semiuglov, Ron Thomas, John Madore, Kevin Geiss, Russell Senior, Urs Forster, Scot E. Wilcoxon, David Fletcher, Dragan Milicic, Anto Veldre, Slaven Rezic, Ronaldo Reis Jr., Tomasz R. Surmacz, Andreas Hünnebeck, Kenneth Ingham, Gianluca Interbartolo, Victor Yip, Siegfried Leisen, Christian Hubbauer, David Klotz, Paulo Quaresma, Christian Potthoff, Ron Schmars, Paul Makepeace, Louis Mandelstam, Dan Hobner, Chuck Cox, Paolo Cavallini, Meinolf Braeutigam, Pascal Brisset, Stefan Nickl, Joakim Majander, Graham Meadows, Frank Mohr, John Francis Lee, Jens C. Rasmussen, Balazs Lengyak, Daniele Scarselli, Delbert D. Franz, Wes Johnston, Johannes Bitterling, Juraj Lehuta, Matthias Prinke, Bert Lange, John Martin, Mark Boal, Tim Jacobs, Simon Wood, Menashay, Tomasz Motylewski, Franz J. Polster, Greg Metcalfe, Kevin R. Battersby, Josh Freeman, Matt Wilkie, Kari Likovuori, Cvetan Ivanov, Sébastien Roy, Bernd Stuht, Marc van der Sluys, Terry Feldman, Jon Niehof, Jeremy Dinsel, Tomi Ollila, Leonardo Boselli, Steve Brown, Carlo Dietl, Stephen Berryman, Peter Eiserloh, Hans P. Stroebel, Rob Gom, Rogier Wolff, Ian Gibbs, Martin Lthi, Wilhelm Spickermann, Ute Platzer, Han Holl, Richard Zidlicky, Miguel Paulin, Anthony Mascola, for their help in detecting and tracking down bugs and/or for their suggestions.


GPSMan User Manual
Copyright 1998-2013 Miguel Filgueiras,

Creative Commons License
GPSMan User Manual and the GPSMan logo images by Miguel Filgueiras are licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.

Get gpsman at SourceForge.net. Fast,
secure and Free Open Source software downloads


ReferencesTopSupport for Lowrance, Magellan and Garmin ReceiversAcknowledgements
gpsman-6.4.4.2/manual/html/GPSMandoc_41.html0000644000175000017500000001246712170753404016467 0ustar migmig GPS Manager User Manual -- The readput Command
The getrtimelog CommandUsing GPSMan in Command-line ModeThe getwrite CommandThe readput Command

The readput Command

The readput command reads information from a file and sends it to the receiver:

readput FORMAT [IN-PARAMS] [IN-TYPES] PATH [OUT-TYPES]
where:
  • FORMAT [IN-PARAMS] is the input file format and its parameters (if any); use show formats for a list of the currently accepted formats;
  • IN-TYPES are the data types to read; the possible types depend on the format and some formats impose that there is a single data type per file; they may be absent if the format requires a unique data type or if the files can have items of different types; all can be used as an abbreviation of WP RT TR;
  • PATH is the path to the file to read from, or, in the case of the Shapefile format, the path to the Shapefiles basename (file extensions will be discarded). If the PATH is stdin input will be from the standard input unless the format is the Shapefile format (in which case the command fails);
  • OUT-TYPES are the data types to put; the possible types are WP, RT and TR and may be absent in which case they are taken to be IN-TYPES (this is valid only when the receiver has support for all of them; if RT occurs in IN-TYPES then WP can appear in OUT-TYPES but no other type "conversions" are allowed; all can be used as an abbreviation of WP RT TR.

As usual, putting information into the receiver can cause data stored in it to be overwritten.

This command only works with Garmin receivers.

Examples: the command

readput gpsman data/myWPRTs WP RT
reads the data in the file data/myWPRTs in GPSMan format and uploads the waypoints and routes to the receiver, while the command
readput Shapefile dim=3 pformat=UTM datum="WGS 84" TR shp/myTRs
reads the tracks in the Shapefiles with basename myTRs in the directory shp, with altitude information (3 dimensions) and using UTM coordinates for the WGS84 datum and uploads them to the receiver.


GPSMan User Manual
Copyright 1998-2013 Miguel Filgueiras,

Creative Commons License
GPSMan User Manual and the GPSMan logo images by Miguel Filgueiras are licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.

Get gpsman at SourceForge.net. Fast,
secure and Free Open Source software downloads


The getrtimelog CommandUsing GPSMan in Command-line ModeThe getwrite CommandThe readput Command
gpsman-6.4.4.2/manual/html/blank.png0000644000175000017500000000153310157255500015304 0ustar migmigPNG  IHDR DPLTE 3f333f3333f3ffffff3f̙3f3f333f333333333f33333333f33f3ff3f3f3f3333f33̙33333f3333333f3333f3ffffff3f33ff3f3f3f3fff3ffffffffffff3ffff̙fff3fffffff3ffffff3f333f3333f3ffffff3f̙̙3̙f̙̙̙̙3f3f̙333f3̙333f3fff̙fff3f̙̙3f̙3f̙3f333f3333f3ffffff3f̙3f3fCAIDATxcI0*U0`*d.IENDB`gpsman-6.4.4.2/manual/html/GPSMandoc_1.html0000644000175000017500000001251012170753404016370 0ustar migmig GPS Manager User Manual -- Introduction
ProgramsTopIntroduction

Introduction

GPSMan is a stand-alone Tcl/Tk program. Its use in real-time is at the sole risk of the user.

Software copyright notice
The GPSMan version available on 15 July 2013 is number 6.4.4.1. This software is under copyright (1998-2013) by Miguel Filgueiras, with the contributions listed below under copyright by their authors. This software, as stated in the source files, is distributed under the GNU General Public License, a copy of which can be found in the distribution, with absolutely no warranties.

Documentation copyright notice
This manual is under copyright (1998-2013) by Miguel Filgueiras, with two Appendices under copyright by Brian Baulch (see their copyright notices). The manual is distributed in PDF and in HTML under the following license: This work is licensed under the Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License. To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/3.0/ or send a letter to Creative Commons, 444 Castro Street, Suite 900, Mountain View, California, 94041, USA.

Logos and other images copyright notice
The two logos used in the HTML version of this manual and in the GPSMan pages and all other images in the GPSMan distribution are under copyright (1998-2013) by Miguel Filgueiras. The logos are under the following license: This work is licensed under the Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License. To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/3.0/ or send a letter to Creative Commons, 444 Castro Street, Suite 900, Mountain View, California, 94041, USA. The other images are under the following license: This work is licensed under the Creative Commons Attribution-ShareAlike 3.0 Unported License. To view a copy of this license, visit http://creativecommons.org/licenses/by-sa/3.0/ or send a letter to Creative Commons, 444 Castro Street, Suite 900, Mountain View, California, 94041, USA.

Other documentation on GPSMan can be found in


GPSMan User Manual
Copyright 1998-2013 Miguel Filgueiras,

Creative Commons License
GPSMan User Manual and the GPSMan logo images by Miguel Filgueiras are licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.

Get gpsman at SourceForge.net. Fast,
secure and Free Open Source software downloads


ProgramsTopIntroduction
gpsman-6.4.4.2/manual/html/GPSMandoc_46.html0000644000175000017500000000666312170753404016475 0ustar migmig GPS Manager User Manual -- The start travel Command
The translate CommandUsing GPSMan in Command-line ModeThe read CommandThe start travel Command

The start travel Command

The start travel command launches the graphical interface and starts real-time logging, animation and travelling, unless the connection to the receiver could not be established

start travel [INTERVAL]
where:
  • INTERVAL is the number of seconds between two consecutive entries in the log and defaults to 2.

This command only works with Garmin receivers.


GPSMan User Manual
Copyright 1998-2013 Miguel Filgueiras,

Creative Commons License
GPSMan User Manual and the GPSMan logo images by Miguel Filgueiras are licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.

Get gpsman at SourceForge.net. Fast,
secure and Free Open Source software downloads


The translate CommandUsing GPSMan in Command-line ModeThe read CommandThe start travel Command
gpsman-6.4.4.2/manual/html/GPSMandoc_73.html0000644000175000017500000001163712170753404016472 0ustar migmig GPS Manager User Manual -- Version 6.4.1 -- 30 December 2009
Version 6.4 - October 2008Recent ChangesVersion 6.4.2 - 19 September 2011Version 6.4.1 -- 30 December 2009

Version 6.4.1 -- 30 December 2009

  • complete revision to avoid problems in dealing with toplevel windows caused by a bug in the Gnome Metacity window manager; thanks to Sergei Golovan.

  • accurate formulas for computing distances and bearings are now the default and should be used except on very slow computers; most users should select them when upgrading; thanks to Valère Robin.

  • full support for TFW files following the description available from the ESRI site; with the help of Jim McGuire (jxmcguire1_at_ualr.edu).

  • fonts can now be fully configured, with real-time configuration for map and plots fonts; font sizes selected in previous versions will not be considered when upgrading and manual selection is needed; in answer to a suggestion from Paul Gogan (pgmail_at_gogan.org).

  • user-defined methods for renaming waypoints; after a suggestion by Zvi Grauer.

  • changes in group window, suggested by Zvi Grauer: element names are coloured depending on being in the data-base (only updated when clicking or double-clicking on them), more than one element can be selected.

  • tentative support for importation of waypoints from points of interest in MapEdit Polish format files; asked by Zvi Grauer.

  • information on a waypoint can be sent to a Twitter account if the TclCurl library is available; with thanks to Zvi Grauer for his PHP script to do a similar thing.

  • GPSMan can now be extended through pre- and user-defined plug-ins coded in Tcl/Tk.

  • patch files may now change the procedures that set up the interface and initialise global variables.

  • explicit support for some new Garmin receivers; with thanks to Ken Stephens, Geoff, Elven Decker, Bill Rainey, Thomas D. Dean, Mark N. Reihart, Pekka Ahoi, Alex Preobrazhenskiy and Mario Borgnia who sent protocol lists.


GPSMan User Manual
Copyright 1998-2013 Miguel Filgueiras,

Creative Commons License
GPSMan User Manual and the GPSMan logo images by Miguel Filgueiras are licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.

Get gpsman at SourceForge.net. Fast,
secure and Free Open Source software downloads


Version 6.4 - October 2008Recent ChangesVersion 6.4.2 - 19 September 2011Version 6.4.1 -- 30 December 2009
gpsman-6.4.4.2/manual/html/GPSMandoc_44.html0000644000175000017500000000735112170753404016466 0ustar migmig GPS Manager User Manual -- The getalmanac Command
The read CommandUsing GPSMan in Command-line ModeThe getfix CommandThe getalmanac Command

The getalmanac Command

The getalmanac command gets the current almanac data from the receiver and saves it to a file:

getalmanac PATH
where:
  • PATH is the path to the output file, unless it is stdout in which case output will be to the standard output. Existing files will be silently overwritten.

The output will consist of a line with the field titles, separated by commas, and a line for each satellite with the field values separated by a single space. If the satellite identification numbers are missing, the order of the lines is the one provided by the receiver and is expected to follow the satellite numbers from 1 to 32.

This command only works with Garmin receivers.


GPSMan User Manual
Copyright 1998-2013 Miguel Filgueiras,

Creative Commons License
GPSMan User Manual and the GPSMan logo images by Miguel Filgueiras are licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.

Get gpsman at SourceForge.net. Fast,
secure and Free Open Source software downloads


The read CommandUsing GPSMan in Command-line ModeThe getfix CommandThe getalmanac Command
gpsman-6.4.4.2/manual/html/GPSMandoc_14.html0000644000175000017500000000776712170753404016476 0ustar migmig GPS Manager User Manual -- Launching GPSMan
Basic conceptsUsing GPSMan in graphical modeLaunching GPSMan

Launching GPSMan

If GPSMan was installed from a Debian or RPM package, just call gpsman from a shell or from the applications menu of the window manager (if it was set up by the package installation program).

When using a command line, like the Unix/Linux shell, call gpsman.tcl or use the shell scriptgpsman.sh (it must be configured first).

In this situation there could be a single argument with the path to the serial or USB port device, or the call has the form
gpsman [OPTIONS] start travel [INTERVAL]
that will be parsed as if in command-line mode, but then launches the graphical interface (this will only work with Garmin receivers).

In the case of a single argument, a USB port device can be given with the prefix usb=, as in usb=/dev/ttyUSB0, to enforce the use of the Garmin USB protocol when this is not the default protocol.

In other systems, execute gpsman.tcl with the Tcl/Tk wish program.


GPSMan User Manual
Copyright 1998-2013 Miguel Filgueiras,

Creative Commons License
GPSMan User Manual and the GPSMan logo images by Miguel Filgueiras are licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.

Get gpsman at SourceForge.net. Fast,
secure and Free Open Source software downloads


Basic conceptsUsing GPSMan in graphical modeLaunching GPSMan
gpsman-6.4.4.2/manual/html/GPSMandoc_42.html0000644000175000017500000000707312170753404016465 0ustar migmig GPS Manager User Manual -- The getrtimelog Command
The getfix CommandUsing GPSMan in Command-line ModeThe readput CommandThe getrtimelog Command

The getrtimelog Command

The getrtimelog command gets the real-time log from the receiver and saves it to a file, until the process is killed:

getrtimelog PATH [INTERVAL]
where:
  • PATH is the path to the output file, unless it is stdout in which case output will be to the standard output. Existing files will be silently overwritten.
  • INTERVAL is the number of seconds between two consecutive entries in the log and defaults to 2.

This command only works with Garmin receivers.


GPSMan User Manual
Copyright 1998-2013 Miguel Filgueiras,

Creative Commons License
GPSMan User Manual and the GPSMan logo images by Miguel Filgueiras are licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.

Get gpsman at SourceForge.net. Fast,
secure and Free Open Source software downloads


The getfix CommandUsing GPSMan in Command-line ModeThe readput CommandThe getrtimelog Command
gpsman-6.4.4.2/manual/html/GPSMandoc_16.html0000644000175000017500000003241012170753404016457 0ustar migmig GPS Manager User Manual -- Names and renaming
DataUsing GPSMan in graphical modeBasic conceptsNames and renaming

Names and renaming

Data items have names (or identifiers) that are unique for each type of item: no two items of the same type may have the same name.

There are important issues concerning names: which characters can be used in them, what is their maximum length and how to rename items either to avoid clashes with existing names or to follow the constraints on acceptable characters or length. Allowed characters and length depend on the receiver brand and model: GPSMan behaviour is controlled by some user options on this.

There should be some caution in setting these options. For instance, if data files are to be shared among users with receivers of different brands, the more strict rules should be followed. In particular, using a large maximum length may result in data loss if names are truncated and then become equal to existing names.

Waypoint names obey the following rules:

  • Garmin names should only have uppercase letters and digits, even if Garmin receivers may use others (see the Garmin specification...). GPSMan also accepts either lowercase letters and hyphens, or any character, depending on the options.
  • Lowrance names can have uppercase letters, digits, hyphen, single quote, period, parentheses, slash and also space.
  • There are no constraints on Magellan names.

When a waypoint name with characters not allowed or exceeding the maximum length is read from a file or from the receiver, the user is asked for a new name but has the choice between applying a   renaming method to it or letting GPSMan automatically generate a new name for it. This can be done not only for the present name but also for any forthcoming unacceptable name in the current input operation. The replacement name can neither be in use by other waypoint in the data-base, nor be the same as a previous replacement name in the current input operation (there is no check on whether the name is listed in a route or a group). The user can also choose to cancel the renaming in which case the waypoint is ignored. This will cause an inconsistency if it belongs to a route.

A renaming method can also be applied to waypoint names from

  • the waypoint sub-menu under Data in the map window
  • the waypoint menu in the lists window
  • a group window: Use WPs->Change Name->...

Allowed characters in route names also depend on the brand of the receiver. Although some receivers require route names to be numbers, there are others accepting letters and other characters as well.

GPSMan does not check the characters in the route name, but will refuse to output a route with a non-numeric name to a receiver or file if the receiver protocol or the file format disallow it.

When working with Garmin receivers GPSMan will, if the option on this is selected, automatically give numbers to routes with non-numeric names when putting them on the receiver, avoiding numbers already in use for routes and without affecting the data-base. There is a counter for this, initially set to 1 and that can be reset from the receiver window or the receiver menu (Put->Route->Set counter to 1).

A unique name is used for each item of each type. When a new item is read in and it has the name of an item of the same type in the data-base the latter is forgotten and overwritten. Exceptions to this are waypoints with the same name and different positions

  1. if the renaming option was previously selected by the user.
  2. when getting data from a Garmin receiver, if the waypoints were not defined by the user.
in which case automatically generated names will be used for them.

It should be noted that

  1. all input operations with the exception just mentioned are destructive: new items will replace data-base items having the same name. This is the behaviour of most GPS receivers, and avoids having obsolete information in the data-base.

  2. the test for the equality of waypoint positions may fail because of rounding errors, at least when the comparison implies a change of position format or a change of datum.

Renaming raises the problem of generating a new suitable name for the item. Currently, GPSMan will try to keep the first part of the old name following it by digits. If the constraints on name length and uniqueness cannot be met, the new name will be a two-letter code for the item type and a hyphen followed by a number.

When an item is renamed, its previous name is kept in the remark field.

When generating a name for a new item or for replacing names with unacceptable characters, GPSMan will use a name with a two-letter code for the item type and a hyphen followed by a number, except in the case of routes for which a number will be used.

Renaming waypoints can lead to ambiguities in what are the actual waypoints of groups. This will only happen when reading from a file in GPSMan format having groups in which there are different waypoints under the same name.

To minimise the problems with these situations, GPSMan creates a group containing the items that were renamed and those for which there may be ambiguities, after any input operation in which they occur.

Renaming methods for waypoint names can be defined and inspected by the user from the Definitions menu. Each method gives a sequence of operations that are applied to the original name in order to get a new name. If the resulting name is not already in use it will be given to the waypoint; otherwise GPSMan falls back to its default method of generating names.

Each renaming method has a name, a remark and a textual description of the operators to be applied in order, one per line. The list of operators is edited from a dialog that opens up by clicking on the text. This dialog shows the same text, which can be cleared (Clear all button) and where an operator can be selected and deleted (Delete button) or moved up or down (dragging with the mouse right-button). The buttons under the Add label correspond to operators that can be added to the list, some of them having parameters. At the end of the dialog there is an area for experimenting the current definition on a given name: clicking on the Apply button the resulting name is shown together with an indication on whether the name is acceptable and not in use.

The operators available are:

  1. keep first character: further operations will preserve the leftmost active character changing only the characters to its right; the leftmost active character becomes the character to the right of the previous leftmost active character; when starting the leftmost active character is the first character in the original name
  2. reset: forget the current result and restart with the initial name
  3. change case: change all letters to lower- or to upper-case
  4. cut to the specified maximum length: the current result is chopped at the right end so that it will not have more than the given lentgh
  5. insert the given string immediately before the leftmost active character,;the leftmost active character becomes the first character of the inserted string
  6. append: insert the given string at the end
  7. delete any: delete all occurrences of any character in the given string
  8. replace characters: the two given strings must have the same length, all occurrences of each character in the first string will be replaced by the character at the same position in the second string; for instance, applying this operator with strings AB and zC means that each A will be replaced by a z and each B by a C, in this order (left to right in each string), making AMB0aXA into zMC0aXz
  9. apply a regular expression substitution (for users knowing what a regular expression is): this is a call to the Tcl command regsub with the -all option; for further details see the Tcl manual pages for regsub and re_syntax
  10. accept if result is a new name: the renaming process is finished if the current result is acceptable; otherwise the following operators will be applied
  11. generate names using a prefix followed by a number: the prefix is the current result and the number has a specified number of digits; numbers start from 1 and all possible values are tried until a new name is found; if this fails no change is made on the current result.

Examples of renaming methods are as follows:

  • the following list of operators:
    1. keep first character
    2. keep first character
    3. insert 00 at the beginning
    4. maximum length is 8
    will convert Labrusques into La00brusqu, i.e., the two first characters are preserved, 00 is inserted at the beginning of the remaining string and the result of the insertion is cut down to 8 characters
  • the following list of operators:
    1. change case to upper
    2. delete any AEIOU
    will convert all letters to upper-case and then deletes all vowels
  • to make sure there are only upper-case letters and digits and the length is at most 10, the following list could be used:
    1. change case to upper
    2. apply the regular expression substitution [^A-Z0-9] with an empty string: this will delete all characters that are not upper-case letters or digits (note the ^ after the opening bracket)
    3. accept if new: stop if the current name is new
    4. maximum length is 7: keep only the first 7 characters
    5. append number with 3 digits until new
    this last step may fail in giving an acceptable name, but as already mentioned if the renaming method fails, GPSMan will generate a new name using its default method.


GPSMan User Manual
Copyright 1998-2013 Miguel Filgueiras,

Creative Commons License
GPSMan User Manual and the GPSMan logo images by Miguel Filgueiras are licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.

Get gpsman at SourceForge.net. Fast,
secure and Free Open Source software downloads


DataUsing GPSMan in graphical modeBasic conceptsNames and renaming
gpsman-6.4.4.2/manual/html/GPSMandoc_33.html0000644000175000017500000002440512170753404016463 0ustar migmig GPS Manager User Manual -- Files in Other Formats
GPSMan SymbolsUsing GPSMan in graphical modeGPSMan FilesFiles in Other Formats

Files in Other Formats

GPSMan can import and/or export data in the following formats:

  • BGA for importation of British Glider Association DOS turnpoints files as waypoints; there are three optional parameters that filter which turnpoints to import: feature (also called place) that must be given exactly as it occurs in the file, findability as one of the letters A to D or G, and air activity as a 1 or 2 characters string. There is also a separate utility for converting BGA DOS files to GPSMan format.
  • EasyGPS export format; only for importation of waypoints;
  • Fugawi export format; only for importation of waypoints;
  • GD2; for importation only;
  • GPStrans;
  • GPX; for importation and exportation; empty names for tracks and routes are accepted and replaced by generated names; The XML character encoding tag is supported but not Byte Order Marks (BOMs), the default encoding being UTF-8;
  • GTrackMaker; for importation only; all waypoints, routes and tracks will be read from the file, the other information being discarded;
  • IGC; for importation of tracks only; each file corresponds to a single track; there is a parameter for selecting either GPS altitude or barometric (pressure) altitude; positions in 2D fixes are discarded if the latitude and longitude are 0 and there was no previously accepted fix, or if there is a change of more than 5 degrees either in latitude or longitude from the previous fix; a valid fix after a discarded one will be marked as a segment starter in the track; the track name will be that of the file without any extension unless the name is in use; the remark field indicates that barometric altitudes were used if that is the case, and the file name if it is not the track name; a datum number of 999 is taken to mean "WGS 84";
  • Kismet  .network files with location information; networks with valid position information and of pre-configured types are imported as waypoints whose symbols will depend on the network type and encryption mode; each waypoint will have the average coordinates of the maximum and minimum locations of the corresponding network; names will be either the SSID name, or, if that is not acceptable or is in use, a generated name; generated names and channel information will appear in the remark fields; some options can be changed by editing the file config.tcl and redefining the KISMETOPT array elements; there is a single parameter for enabling the creation of a group with the imported waypoints for each type of network;
  • KML files for use with Goggle map products, for exportation of waypoints, routes and tracks, and importation of waypoints;
  • MapEdit Polish format files for importation of points of interest as waypoints; as no description was found the implementation is based on observation of sample files and may therefore fail; coordinates of each waypoint are taken as the average of the coordinates of the corresponding point of interest; repeated names are replaced by automatically generated ones;
  • MapGuide text (not XML!) export formats from 2002 or 03/04 versions. Warning: undetected errors may occur if the version given when opening the file does not correspond to that of the file. This format is only for importation of routes; each file corresponds to a single route that will be split in several ones according to the maximum number of waypoints in a route; a number or identifier for the (first) route can be given when opening the file, as well as, a comment and a remark; if the original route yields more than one route, a suitable remark will be added to each route after the first one;
  • MapSend;
  • Meridian, only in the Magellan variant;
  • NMEA real-time log; only in the Garmin variant, and only for for importation of tracks; each file is taken as a track;
  • OziExplorer waypoints and tracks files; can be used for exportation of waypoints (not more than 1000 per file) and tracks (one per file);; and for importation of waypoints, the fields that are kept being the name, the position, the altitude, the comment and the date;
  • Shapefile if the gpsmanshp Tcl/Tk library is available; version 1.1 or later is required; a single data type is kept in a file as described in the gpsmanshp documentation; data can be stored in 2 or 3 dimensions and GPSMan needs the following parameters when reading/writing a file in this format: dimension, position format (that must consist of a single number for each coordinate), zone (for grids), datum, distance unit and altitude unit. Warning: use of a UTM zone with points belonging to another zone may produce conversion errors that are not reported. In GPSMan versions before 6.1 there were two different names for 2 and 3 dimensions, the position format, the datum and altitude unit were assumed to be decimal degrees (DDD), "WGS 84", and metre. The information on track or polyline segments is saved to Shapefile files. With gpsmanshp versions 1.1 or later, routes, tracks and polylines can be read from Shapefile polylines or polygons. With version 1.2, items read in from a file not written by gpsmanshp will have in their remarks any fields of the .dbf file. There is also a separate utility for splitting the polylines in a Shapefile into different GPSMan files according to their coordinates.
  • Simple Text for importation and exportation of tracks only; this is a format based on the Garmin Simple Text Output protocol and the following rules: for exportation, the position status is either g or G, for 2D or 3D, depending on altitude being defined, EPH is always ___ (undefined), the altitude is _____ if undefined (position status g), the horizontal and vertical speeds are computed from the previous point if any, or undefined, two consecutive tracks are separated by two sentences with all fields as undefined, and two consecutive segments in a track are separated by a sentence with all fields undefined; for importation, lines with position status different from g or G are discarded, a single discarded line (not at the beginning of the file) is taken as a segment start marker, and two or more discarded lines in sequence (not at the beginning of the file) are taken as starting a new track.


GPSMan User Manual
Copyright 1998-2013 Miguel Filgueiras,

Creative Commons License
GPSMan User Manual and the GPSMan logo images by Miguel Filgueiras are licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.

Get gpsman at SourceForge.net. Fast,
secure and Free Open Source software downloads


GPSMan SymbolsUsing GPSMan in graphical modeGPSMan FilesFiles in Other Formats
gpsman-6.4.4.2/manual/html/GPSMandoc_24.html0000644000175000017500000001244412170753404016463 0ustar migmig GPS Manager User Manual -- Searching for data items
MapUsing GPSMan in graphical modeGroupsSearching for data items

Searching for data items

In order to search for data items the user specifies a set of constraints. An item will be included in the search results only if it verifies all the constraints in the set that are applicable to its type.

The types of items to be searched for can be more than one, to each type being applied only the constraints that make sense for it.

The search domain is either the entire data-base, or a set of groups. In the latter case, the search will be recursive, i.e., will also explore the groups that are elements of the given groups, and so on. Furthermore, if the search includes the type "Group", the given groups will be included in the search results.

The patterns for searching by names, comments and/or remarks follow the Tcl/Tk glob command conventions. In brief:

  1. ? stands for any single character
  2. * stands for zero or more characters
  3. [xyz] stands for any of the characters within the brackets
  4. [a-z] stands for any character in the range a to z, inclusive
  5. \c stands for the character c.

The distance to a waypoint or to a location given by its coordinates can be used to search for waypoints (a related operation is making clusters of waypoints) and/or tracks. With tracks all track points of each track may have to be checked what may take a long time.

The search is based on either an allowable maximum distance, or a distance interval. A bearing for the search can also be given, together with an angle that will be centred along it.

Results , if any, are presented as elements of a new group with a name of the form FOUND n where n is a number. The remark of the group gives a succint description of the constraints used in the search.

A dialog window will be presented giving the choice between ending the search or making a new one, in any case while keeping the group with the results (Ok or Another buttons) or forgetting it (Cancel or verb+Change+ buttons).


GPSMan User Manual
Copyright 1998-2013 Miguel Filgueiras,

Creative Commons License
GPSMan User Manual and the GPSMan logo images by Miguel Filgueiras are licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.

Get gpsman at SourceForge.net. Fast,
secure and Free Open Source software downloads


MapUsing GPSMan in graphical modeGroupsSearching for data items
gpsman-6.4.4.2/manual/html/index.html0000777000175000017500000000000012224351120020130 2GPSMandoc.htmlustar migmiggpsman-6.4.4.2/manual/html/GPSMandoc_49.html0000644000175000017500000001041112170753404016462 0ustar migmig GPS Manager User Manual -- The georef Command
The geopicts CommandUsing GPSMan in Command-line ModeThe project CommandThe georef Command

The georef Command

The georef command, that cannot have options, writes to the standard output a GPSMan map information file containing geo-referencing information for an image:

georef IMGPATH TRANSF LATD LONGD LATD LONGD [LATD LONGD] DATUM \
       X Y X Y [X Y] PROJECTION [PARAMS]
where:
  • IMGPATH is the path to the image file;
  • TRANSF is the coordinates transformation to use; the command show transfs produces a list of the available transformations;
  • the LATD LONGD pairs and DATUM are the latitude and longitude in signed decimal degrees and the datum of the 2 or 3 control points whose pixel coordinates are the X Y pairs in the same order; the origin of the pixel coordinates is the top left corner of the image and the y-coordinates increase downwards;
  • PROJECTION [PARAMS] defines the projection and its parameters; if no datum=X parameter is given the datum of the points is used; the command show projections gives a list of the available projections and their parameters.


GPSMan User Manual
Copyright 1998-2013 Miguel Filgueiras,

Creative Commons License
GPSMan User Manual and the GPSMan logo images by Miguel Filgueiras are licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.

Get gpsman at SourceForge.net. Fast,
secure and Free Open Source software downloads


The geopicts CommandUsing GPSMan in Command-line ModeThe project CommandThe georef Command
gpsman-6.4.4.2/manual/html/GPSMandoc.html0000644000175000017500000001631512170753404016157 0ustar migmig GPS Manager User Manual


GPS Manager User Manual

Miguel Filgueiras,

15 July 2013


GPS Manager (GPSMan) is a graphical manager of GPS data that makes possible the preparation, inspection and edition of GPS data in a friendly environment. GPSMan supports communication and real-time logging with Garmin, Lowrance and Magellan receivers and accepts real-time logging information in NMEA 0183 from any GPS receiver. GPSMan can also be used in command mode (with no graphical interface).



GPSMan User Manual
Copyright 1998-2013 Miguel Filgueiras,

Creative Commons License
GPSMan User Manual and the GPSMan logo images by Miguel Filgueiras are licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.

Get gpsman at SourceForge.net. Fast,
secure and Free Open Source software downloads


gpsman-6.4.4.2/manual/html/GPSMandoc_23.html0000644000175000017500000002612412170753404016462 0ustar migmig GPS Manager User Manual -- Groups
Searching for data itemsUsing GPSMan in graphical modeLapsGroups

Groups

Groups are very useful in cataloguing the available data and in operating on sets of items. The possible operations are

As groups are also used by GPSMan to present the results of a search as described below, searching for items is an effective way of creating a group with items that are then operated upon from the group window.

Groups can also be created for the items that are or are not currently displayed on the map. This is done using the Make Group entry of the Items menu-button on the map window.

When getting laps from the receiver, runs will be stored as groups.

A group contains a certain number of data items and is represented internally as set of item names (together with their types). Operations on a group may fail or only partially succeed if one of its elements is not currently in the data-base. The names of elements in the group window have different colours depending on their being in the data-base. The colour of a name is only updated when clicking or double-clicking on it, and so it can be wrong.

The group window may have at a certain time more than one selected element. When this happens, a replace will act on the first selected element (from the top of the list), deleting will act on all selected elements. Inserting a new element will always put it after all the elements of the same type.

Groups can have other groups as elements but one group cannot be an element of itself even if indirectly (in technical terms: groups are well-founded sets).

This property can be explained as follows. Groups that are elements of a group G can be seen as its sons. These groups may have their own sons which are called the grand-sons of G and that, in turn, may have sons (the grand-grand-sons of G), and so on. All the sons, grand-sons, grand-grand-sons, and so on, of a group form the set of its descendants. A group is well-founded by not being its own descendant.

Some operations on a group will act not only on its elements but also on the elements of all its descendants. In this case the first step is to collect all these elements by a recursive inspection of the group descendants.

Clearing from the map an item that belongs to a group that has been displayed will not affect the display-state of the group. To be sure that all the elements of a group are actually displayed, the user should clear the group from the map and then display it again.

Deleting from or adding items to a group will not affect their display-state.

Forgetting a group will delete permanently the group from the data-base but not its elements. This operation is not prevented by the fact that any of its elements cannot be cleared from the map.

Forgetting a group and all its elements will delete permanently not only the group but also all its elements (recursively, i.e., including the elements of groups in the group). The group is deleted even if some of its elements cannot be cleared from the map and are therefore not deleted.

Saving a group (to a GPSMan file) will save all the information on the group and on its elements.

Creating an average waypoint from the waypoints in a group can be made from the group window. The coordinates of the new waypoint will be the averages of the latitudes, longitudes and altitudes of waypoints in the group and its descendants (recursively).

Changing the data of waypoints in a group can also be made from the group window in what concerns:

  • the symbol,
  • the position format, or
  • the datum.
All the waypoints in the group and its descendants (recursively) will change to the (same) selected value. If one of the waypoints is being edited, the edit window will also be changed. In the case of the position format or the datum the position will revert to its initial value (when the edit window was created). In the case of the symbol, the change will be reflected on the map if necessary.

Clusters of waypoints can be created from a group by taking the waypoints in it (and its descendants, recursively) as centres of the clusters and searching the data-base for waypoints that fulfil a selected condition for each centre. The conditions that can be tested are: that the waypoint is within a given distance range of the centre, or that the waypoint belongs to the quadrangle of given latitude and longitude ranges whose middle-point is the centre. It is obvious that the first condition will be much slower to evaluate than the second, and therefore making clusters based on quadrangles should be preferred when the number of waypoints currently defined is large. Each cluster will be created as a group: its name is of the form Cluster n, and its remark has the name of the centre and either the quadrangle dimensions, or the distance range.

Input/output operations on the elements of a group allow for selecting which items of which types to read or write. In general the user will choose the groups and the item types for the operation. Then GPSMan collects in a list the names of the items of the given types that belong to the selected groups and that are currently in the data-base. This list of names is used to perform the I/O operation.

Selecting the "Group" type means that the search for items will be done in the groups that are elements of the selected groups, recursively. In more technical terms, the resulting list may be seen as a flattening of the group structure. In no case the list of names will contain names of groups.

Details of each specific operation are as follows:

  • in output operations, the "All" menu entry means that all groups will be considered. When writing elements to a file this also means that all suitable types should be considered.

  • in input operations, there is the option of reading either the items whose names are not in the list of names GPSMan builds, or the items having the names in that list. The former is useful for preserving data in the selected groups; items that are not in the data-base will also be read in. The latter is useful for updating or restoring the information in the selected groups without affecting the other data; items that are not in the data-base will not be read in. All items of non-selected types will be discarded except waypoints belonging to routes if the route type was selected.

  • when putting to or getting data from the receiver, or when exporting or importing information to/in any foreign format with a single type per file, a single type (apart from "Group") must be chosen.

  • when getting information from the receiver the "Track" type cannot be used. There are two reasons for this: there is no point in updating or changing previously recorded tracks, and some receivers do not keep names for tracks.

Examples of using a group when putting are as follow. For transferring to the receiver the waypoints that belong to some groups, select the type waypoint and then select the relevant groups. This will result in an inspection of each selected group for gathering the waypoints in its list that are currently in the data-base. All these waypoints will be transferred.

In some cases it is useful to transfer not only the elements of the selected groups, but also the elements of any of their descendants. For this to take place select the type Group along with the type of items to be transferred.


GPSMan User Manual
Copyright 1998-2013 Miguel Filgueiras,

Creative Commons License
GPSMan User Manual and the GPSMan logo images by Miguel Filgueiras are licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.

Get gpsman at SourceForge.net. Fast,
secure and Free Open Source software downloads


Searching for data itemsUsing GPSMan in graphical modeLapsGroups
gpsman-6.4.4.2/manual/html/up.gif0000644000175000017500000000047407310716747014641 0ustar migmigGIF89a |si_VLCv:m0c&YPFy =p3f, ` d9 fì*8QH@u}1A!Is@JkeeKȡ@lۊ3D h?+j5N Db50m N D"J51Z$K%j1%DT% v2e%|5/%O5U* D%x)%u%D"җ"DL׀y !;gpsman-6.4.4.2/manual/html/GPSMandoc_61.html0000644000175000017500000002747012170753404016471 0ustar migmig GPS Manager User Manual -- Support for Garmin receivers
Support for Lowrance, Magellan and Garmin ReceiversSupport for Magellan receiversSupport for Garmin receivers

Support for Garmin receivers

Most Garmin receivers, including recent models using only the Garmin USB protocol in a Linux system, should connect with no problems to GPSMan. Known exceptions are the following models: GNC 250, 250 XL, 300 and 300 XL, and GPS 150.

GPSMan supports the Garmin USB protocol in Linux systems with a kernel having the Garmin USB driver written by Hermann Kneissel, that is standard in kernels 2.6 after (at least) 2.6.11; see the section on installation for information on compiling a custom kernel. WARNING: some recent Garmin receivers will need at least version 0.28 of this driver. This driver also implements the Garmin serial protocol so that a receiver connected to the USB port can also use it. The serial protocol will be much slower than the USB protocol. GPSMan must be set to use one of them by selecting the appropriate entry in the protocol menus of the receiver window or the receiver menu.

The receiver must be set to use one of the Garmin (USB or serial) protocols in case this can be configured. In some receivers there is a Interface display, under Setup, where the Garmin/Garmin or Garmin option must be selected. Alternatively, for real-time logging only, it can be set to use the NMEA 0183 protocol, by selecting the NMEA option. For the use of this protocol see above.

When using a Garmin protocol GPSMan may need to convert between bytes and floating point numbers. Tcl/Tk has no machine-independent way to do these conversions and GPSMan only implements them for little- or big-endian architectures that follow the IEEE floating point standard (this will cover most personal computers and workstations). Some Garmin receivers do not use protocols having floating point numbers and are not affected by this. In any case when connecting to the receiver GPSMan tests whether there are problems with the conversions, in which case the user is asked to confirm or cancel the operation.

GPSMan follows closely the "Garmin GPS Interface Specification", dated 19 May 2006, 001-000063-00 Rev. C, available from the Garmin WWW site, but not (yet) covering some new protocols for fitness-oriented receivers. Unfortunately this document does not describe all the protocols, leaving out, for instance, those used for loading maps.

Some data fields are not directly accessible to the user but are nevertheless kept by GPSMan as hidden information as described above. This is the case with the data on proximity distance, facility name, city, state, country code, and class.

GPSMan identifies the receiver model when connecting to it for the first time in a session. If the receiver implements the Protocol Capabilities protocol the list of protocols it uses is also obtained. This will probably be the case with the more recent models. Otherwise a table of protocols is looked up. At present there are entries in it for the receiver models in the table below.

When GPSMan gets a list of protocols for a receiver not yet listed in the table a file is created in the GPSMan user directory and the user is asked to send it to the author of GPSMan. This file should not be removed until the table is updated so that GPSMan knows these steps were already taken.

Some Garmin protocols allow transfers only in one direction, for instance, from the receiver to the computer. In that case, GPSMan will do nothing and will not warn if the user asks for a unsupported transfer.

When getting waypoints not defined by the user from the receiver, those with the same name but different positions will be renamed instead of overwritten.

The baud rate of the serial communication (not USB!) with some Garmin receivers can be changed from the GPSMan receiver window or menu. The implementation is based on the description of a protocol in the manual Garmin provides for the GPS 15H and 15L receivers and it is in an experimental state. To change the baud rate the serial communication must be reset and for safety reasons this will not be allowed when real-time logging is in effect. If the selected new baud rate is invalid the change request will be ignored silently. When a baud rate change fails either the serial port is kept at 9600, the default used by Garmin, or the connection is closed. GPSMan now uses the option for the default baud rate as follows: if its value is different from 9600 whenever connecting in serial mode to a receiver supporting this protocol there will be an attempt to change the baud rate to the selected value.


EDGE     205, 305
eMap
eTrex _, Euro, H, Legend (_, C, Cx, J, H, HC, HCx), Mariner,
Summit (_, HC), Venture (_, HC), Vista (_, C, HCx)
ForeRunner _, 205, 301, 305
ForeTrex
Geko 201, 301
GPS 5, 48, 65, 72, 75, 76, 89, 90, 125 Sounder, 126, 128
GPS 12 _ (Arabic), XL (Chinese, Japanese), CX, Map
GPS 18 USB
GPS 20x USB
GPS 38 _ (Chinese, Japanese)
GPS 40 _ (Chinese, Japanese)
GPS 45 _ (Chinese), XL
GPS 50
GPS 55 _, AVD
GPS 60
GPS 72 _, H
GPS 85
GPS 92
GPS 96 _, AVD, XL
GPS 120 _ (Chinese), XL
GPS II _, Plus
GPS III _, Pilot, Plus
GPSCOM 170, 190
GPSMAP 60, 60C, 60CSX, 76, 76S, 76CSX, 135 Sounder, 162, 175, 176, 180,
195, 196, 205, 210, 215, 220, 235 Sounder, 276C, 295, 378 SYS
GPSMAP 130 _ (Chinese)
GPSMAP 230 _ (Chinese)
Quest
Rino 110, 120, 130, 530HCx
StreetPilot 3, I, i2, c320, c330, c340, 2720


GPSMan User Manual
Copyright 1998-2013 Miguel Filgueiras,

Creative Commons License
GPSMan User Manual and the GPSMan logo images by Miguel Filgueiras are licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.

Get gpsman at SourceForge.net. Fast,
secure and Free Open Source software downloads


Support for Lowrance, Magellan and Garmin ReceiversSupport for Magellan receiversSupport for Garmin receivers
gpsman-6.4.4.2/manual/html/GPSMandoc_55.html0000644000175000017500000001041512170753404016463 0ustar migmig GPS Manager User Manual -- Plug-in widgets
Plug-in code and executionExtending GPSMan: Plug-insThe graphical interface for plug-in definitionsPlug-in widgets

Plug-in widgets

Plug-ins may be launched from buttons and/or menu entries that are created for them in certain toplevel windows. Information on these windows and where the widgets can be created is kept on the global array PLGSWelcomed (defined in file plugins.tcl). Each index is a Tcl glob pattern for the paths of windows (this allows for similar windows to be dealt with in the same way). Each element is a list of lists whose heads are widget types (button or menu) and whose rests are sub-window paths, relative to the path matching the glob pattern, where the plug-in widgets or entries will be inserted. For a button the sub-window is a frame managed by grid and the button is created at the right of the lower right corner. For a menu entry, the sub-window is a menu and the entry will be the last one. The widget will be disabled if the plug-in cannot be used according to the evaluation of the corresponding expression.

A GPSMan procedure that creates a toplevel window having support for plug-ins calls the procedure AttachPlugIns that in turn creates the widgets for all plug-ins that can be called from the window. This creation fails silently for any widget whose sub-window does not exist.


GPSMan User Manual
Copyright 1998-2013 Miguel Filgueiras,

Creative Commons License
GPSMan User Manual and the GPSMan logo images by Miguel Filgueiras are licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.

Get gpsman at SourceForge.net. Fast,
secure and Free Open Source software downloads


Plug-in code and executionExtending GPSMan: Plug-insThe graphical interface for plug-in definitionsPlug-in widgets
gpsman-6.4.4.2/manual/html/GPSMandoc_78.html0000644000175000017500000013257512170753404016504 0ustar migmig GPS Manager User Manual -- Index
TopRecent ChangesIndex

Index

Symbols A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
Symbols



A
accurate formulas
accurate formulas
almanac data
altitude
altitude
altitude threshold
altitude unit
animation, track
B
bearing
BGA
C
character set
characters in names, RT
characters in names, WP
climb rate graph
colours, interface
command mode, exec
command mode, geopicts
command mode, georef
command mode, getalmanac
command mode, getfix
command mode, getrtimelog
command mode, getwrite
command mode, parameters
command mode, project
command mode, read
command mode, readput
command mode, source
command mode, start travel
command mode, translate
command mode, haslib
command mode, is available
command mode, is connected
command mode, show datums
command mode, show formats
command mode, show help
command mode, show projections
command mode, show protocols
command mode, show symbols
command mode, show transfs
command mode, show
configuration
configuration, temporary directory
configuration, user code
configuration, user directory
coordinates
current version
D
dangerous use
dangerous use
dangerous use
data-base
data-base
data-base
data-base
date format
datum
datum, change
datum, default
datum, user-defined
datum, variant
datum, waypoint
DDD
depth
distance unit
distance unit
distance unit
distance unit, coordinates grid
distance, computation
DMM
DMS
E
elevation graph, font
elevation graph, for RT
elevation graph, for TR
elevation graph, for TR (gnuplot)
ellipsoid
export
export
F
file
file
file, displaying items
file, foreign format, BGA
file, foreign format, EasyGPS
file, foreign format, Falk
file, foreign format, Fugawi
file, foreign format, GD2
file, foreign format, GPStrans
file, foreign format, GPStrans
file, foreign format, GPX
file, foreign format, GTrackMaker
file, foreign format, IGC
file, foreign format, Kismet
file, foreign format, Kismet
file, foreign format, KML
file, foreign format, MapEdit
file, foreign format, MapGuide
file, foreign format, MapSend
file, foreign format, Meridian
file, foreign format, NMEA
file, foreign format, OziExplorer
file, foreign format, Power Route
file, foreign format, Shapefile
file, foreign format, Simple Text
file, GPSMan formats
file, GPSMan formats
file, GPSMan formats, image information
file, GPSMan formats, image information
file, GPSMan formats, image information
file, GPSMan formats, item information
file, GPSMan formats, item information
file, GPSMan formats, Least Squares file
file, GPSMan formats, map information
file, not saved on exit
file, permissions
file, translator, BGA
file, translator, GreenFlag
file, translator, MapBlast
file, translator, MapsOnUS
file, translator, Shapefile
font
G
Garmin, baud rate
get
gnuplot
gnuplot
gpsman
gpsman
gpsman
gpsman.sh
gpsman.sh
gpsman.tcl
gpsman.tcl
gpsman.tcl
gpsman.tcl
gpsman.tcl
gpsman.tcl
gpsman.tcl
GRA
graphics formats
graphics formats
GreenFlag
grid coordinates
grid coordinates
grid coordinates, Austrian BMN grid
grid coordinates, Austrian BMN grid
grid coordinates, Basic Finnish grid
grid coordinates, Basic Finnish grid
grid coordinates, BMN
grid coordinates, BMN
grid coordinates, BNG
grid coordinates, BNG
grid coordinates, British National Grid
grid coordinates, British National Grid
grid coordinates, British West Indies Grid
grid coordinates, British West Indies grid
grid coordinates, BWI
grid coordinates, BWI
grid coordinates, Carta Tecnica Regionale (Italy)
grid coordinates, CMP
grid coordinates, CMP
grid coordinates, CTR
grid coordinates, CTR
grid coordinates, EOV
grid coordinates, German grid
grid coordinates, German grid
grid coordinates, German grid
grid coordinates, GKK
grid coordinates, GKK
grid coordinates, Iceland Grid
grid coordinates, Iceland grid
grid coordinates, IcG
grid coordinates, IcG
grid coordinates, Irish Transverse Mercator grid
grid coordinates, Irish Transverse Mercator grid
grid coordinates, ITM
grid coordinates, ITM
grid coordinates, KKJP
grid coordinates, KKJY
grid coordinates, KKJY
grid coordinates, KKP
grid coordinates, Lamb93
grid coordinates, Lamb93
grid coordinates, Lambert 93 grid
grid coordinates, Lambert 93 grid (France)
grid coordinates, Lambert NTF grid
grid coordinates, Lambert NTF grid (France)
grid coordinates, Lambert NTF étendue grid
grid coordinates, Lambert NTF étendue grid (France)
grid coordinates, LambNTF
grid coordinates, LambNTF
grid coordinates, LambNTFe
grid coordinates, LambNTFe
grid coordinates, LV03
grid coordinates, Netherlands Grid
grid coordinates, Netherlands grid
grid coordinates, Portuguese Military Maps grid
grid coordinates, Portuguese Military Maps grid
grid coordinates, RDG
grid coordinates, RDG
grid coordinates, SEG
grid coordinates, SEG
grid coordinates, Swedish Grid
grid coordinates, Swedish Grid
grid coordinates, Swiss LV03 Grid
grid coordinates, Swiss LV03 grid
grid coordinates, Taiwan Grid
grid coordinates, Taiwan Grid
grid coordinates, TAlbers
grid coordinates, TAlbers
grid coordinates, Teale Albers
grid coordinates, Teale Albers
grid coordinates, TWG
grid coordinates, TWG
grid coordinates, Uniform Finnish grid
grid coordinates, Uniform Finnish grid
grid coordinates, user-defined
grid coordinates, UTM/UPS
grid, map background image
group
group
group as search domain
group elements
group elements
group on map
group to WP
group, clusters of WPs
group, create
group, datum of WPs
group, for a run
group, for a run
group, forget
group, forget elements
group, generated WPs
group, position format of WPs
group, read/write
group, save
group, search results
group, symbol of WPs
group, usage
H
hidden information
hidden information
hidden information
hidden information
how to create clusters of WPs
how to, create, LN on map
how to, create, WP when geo-referencing
how to, create, WP when geo-referencing
how to: change RT stage
how to: control real-time logging
how to: create item
how to: create LN from TR
how to: create RT from TR
how to: create RT on map
how to: create simplified TR
how to: create WP during travel
how to: create WP from GR
how to: create WP from TP
how to: create WP from TR
how to: create!WP on map
how to: datum of WPs
how to: define/change coordinates grid
how to: define/change datum
how to: define/change ellipsoid
how to: define/change projection
how to: edit RT on map
how to: geo-reference image
how to: load background image
how to: load background image, more than one
how to: map/un-map item
how to: map/un-map item
how to: map/un-map item
how to: open item
how to: position format of WPs
how to: position map cursor
how to: read/write filtering with GR
how to: read/write item
how to: scroll/pan map
how to: select real-time protocol
how to: start real-time simulator
how to: symbol of WPs
I
import
import
input/output operations
installing GPSMan
item
item name, allowed characters
item name, allowed characters
item, forget
item, comment
item, count
item, create
item, create
item, forget
item, forget
item, forget
item, forget
item, forget
item, name
item, name
item, on map
item, on map
item, on map
item, open
item, open, constraint
item, overwrite
item, overwrite
item, read/write
item, read/write
item, remark
item, remark
item, rename
item, rename
item, rename
item, same name
item, same name
L
language
language
language
lap
lap
lap, loading
lap, loading
lap, run
lap, run
lap, support
launching GPSMan
link, route
list
list, clear
list, menus
list, scroll
load
load
load
M
map
map background image
map background image
map background image, more than one
map cursor
map datum
map datum
map datum
map datum
map scale
map scale
map scale
map, transformation of coordinates, Least Squares fit
map, background image name
map, background image name
map, background image name
map, background image name
map, background image name
map, create RT
map, create WP
map, create, LN
map, cursor
map, distance and azimuth
map, edit RT
map, font
map, geo-referenced
map, geo-referenced
map, menu for WP
map, scale, small-scale
map, scroll/pan
map, size
map, transformation file
map, transformation of coordinates
map, transformation of coordinates
map, transformation of coordinates
map, transformation of coordinates
map, transformation of coordinates, Least Squares file
map, transformation of coordinates, Ozi map file
map, transformation of coordinates, TFW file
MapBlast
MapsOnUS
menu, for WP on map
menu, size
MH coordinates
O
OS command, display image
OS command, display image
OS command, open terminal
OS command, open terminal
OS command, print/process PS
OS command, print/process PS
OS command, print/process PS
P
paper size
platform
platform, Linux
platform, Linux, Debian
platform, Linux, Debian
platform, Linux, other
platform, Linux, RPM package
platform, Linux, RPM package
platform, Macintosh
platform, non-Unix
platform, other
platform, other
platform, Unix
platform, Unix
polyline
polyline
polyline point
polyline point, altitude
polyline point, position
polyline, colour
polyline, create
polyline, create
polyline, operations on
polyline, position format
polyline, reacting to events
polyline, segment
polyline, segment
polyline, segment
polyline, splitting
polyline, to TR
polyline, width
polyline, width
position
position
position format, cursor
position, format
position, format
position, format
position, format
preferences file
preferences file
preferences, changes
problems, known
projection
projection
projection
projection
projection, Albers Equal Area
projection, American Polyconic
projection, associated grid
projection, Austrian BMN grid projection
projection, Basic Finnish Grid projection
projection, British National Grid projection
projection, British West Indies projection
projection, Carta Tecnica Regionale projection
projection, Cassini-Soldner
projection, confirm parameters
projection, confirm parameters
projection, EPSG:32663
projection, EPSG:3857, 900913, 102113
projection, Equidistant Cylindrical
projection, German Grid projection
projection, Hungarian National Projection
projection, Iceland Grid
projection, Irish Transverse Mercator Grid projection
projection, Lambert 93 grid projection
projection, Lambert Conic Conformal
projection, Lambert Equal Area Conic
projection, Lambert NTF grid projection
projection, Lambert NTF étendue grid projection
projection, Mercator
projection, Mercator, spherical
projection, Plate Carree
projection, Portuguese Military Maps
projection, Schreiber
projection, small scale maps
projection, Spherical Mercator
projection, Stereographic
projection, Swedish Grid projection
projection, Swiss LV03 Grid projection
projection, Swiss Oblique Mercator
projection, Taiwan Grid projection
projection, Teale Albers grid projection
projection, Transverse Mercator
projection, Transverse Mercator, particular cases
projection, Uniform Finnish Grid projection
projection, user-defined
projection, UTM/UPS
projection, world maps
protocol, Garmin
protocol, Garmin
protocol, Garmin, PVT
protocol, Garmin, Simple Text
protocol, Garmin, Simple Text
protocol, Garmin, USB
protocol, Magellan
protocol, NMEA 0183
protocol, NMEA 0183
put
R
real-time log
real-time log, Garmin variant
real-time log, Garmin variant, animation
real-time log, Garmin variant, control
real-time log, Garmin variant, create TR
real-time log, Garmin variant, information
real-time log, Garmin variant, protocols
real-time log, Garmin variant, simulator
real-time log, Garmin variant, time interval
real-time log, Garmin variant, time interval
real-time log, Garmin variant, travel/navigation
real-time log, Lowrance variant
real-time log, Lowrance variant, simulator
real-time log, Magellan
receiver brand
receiver brand
receiver brand
receiver brand
receiver brand, Garmin
receiver brand, Magellan
receiver protocols
receiver, comments
receiver, dates
receiver, lowercase
receiver, lowercase
receiver, names
receiver, no. of items
receiver, parameters
receiver, protocols
receiver, sampling interval
restore saved state
route
route
route stage
route stage
route stage, comment
route stage, label
route to TR
route, area enclosed by
route, change on map
route, colour
route, create
route, create
route, create
route, deleted WP
route, elevation graph
route, GreenFlag
route, MapsOnUS
route, name
route, name,numbering
route, name,numbering
route, operations on
route, splitting
route, stage
route, width
route, width
S
sample data
save
save
save
save, state
save, state
save, state
save, state
save, to PS
save, to PS
save, to PS
save, to PS
search
search by distance
search domain
search pattern
search results
serial port
serial port
serial port
speed graph
symbols
symbols
symbols of general use
symbols of use in aviation
symbols of use in land
symbols of use in water
symbols, change in group
symbols, custom menu
symbols, default
symbols.tcl
T
Tcl/Tk
Tcl/Tk
Tcl/Tk
time offset
time offset
time offset
track
track
track from LN
track from real-time log
track from RT
track point
track point
track point number
track point to WP
track point, altitude
track point, altitude
track point, depth
track point, depth
track point, info to show
track point, number
track point, position
track point, time stamp
track simplification
track to RT
track to WP
track, animation
track, colour
track, computation
track, create
track, graph, climb rate
track, graph, elevation
track, graph, elevation (gnuplot)
track, graph, speed
track, operations on
track, segment
track, segment
track, segment
track, splitting
track, width
track, width
travel window
travel window, font
U
utilities, external
utilities, GPSMan
UTM/UPS, coordinates
W
waypoint
waypoint
waypoint clusters
waypoint, altitude
waypoint, BGA tunrpoint
waypoint, create
waypoint, create
waypoint, create
waypoint, create
waypoint, create
waypoint, create
waypoint, create, at distance/bearing from another
waypoint, create, when geo-referencing
waypoint, create, when geo-referencing
waypoint, datum
waypoint, datum, change in group
waypoint, display option
waypoint, display option, default
waypoint, GreenFlag
waypoint, in route
waypoint, in route
waypoint, in route
waypoint, MapBlast
waypoint, MapsOnUS
waypoint, menu on map
waypoint, name
waypoint, position
waypoint, position change
waypoint, position change
waypoint, position format
waypoint, position format, change in group
waypoint, renaming method
waypoint, renaming method
waypoint, renaming method
window, closing from window manager
window, main
window, positions
window, sizes
window, slow operation
window, slow operation


GPSMan User Manual
Copyright 1998-2013 Miguel Filgueiras,

Creative Commons License
GPSMan User Manual and the GPSMan logo images by Miguel Filgueiras are licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.

Get gpsman at SourceForge.net. Fast,
secure and Free Open Source software downloads


TopRecent ChangesIndex
gpsman-6.4.4.2/manual/html/GPSMandoc_6.html0000644000175000017500000001117012170753404016376 0ustar migmig GPS Manager User Manual -- Downloading GPSMan
External utilitiesProgramsCurrent versionDownloading GPSMan

Downloading GPSMan

The GPSMan site makes available GPSMan (version 6.4.4.1) for downloading. Debian, Fedora and RPM from .deb packages as well as a FreeBSD port are also available for easy installation in Linux. GPSMan can also be retrieved as part of the Debian, Ubuntu and Fedora official Linux distributions, FreeBSD Unix, and of the Linux Live-CDs AI9NL and GIS-Knoppix.

In order to run GPSMan, Tcl/Tk (preferably version 8.4 or later) must be previously installed. It can be got from the Active State site.

The following Tcl/Tk libraries will be used if they are installed:

  • gpsmanshp, a library that provides the means for creating and reading files in the ESRI Shapefile format; it is available from its page
  • Img, a library implementing enhanced support for graphics and graphic formats; it is part of recent Tcl/Tk distributions.
  • exif, a Tcl/Tk package that is part of the standard Tcl/Tk distribution, used here for trying to know the time-stamp of picture files when geo-referencing them.
  • TclCurl, a library with bindings to libcurl that gives support for accessing World Wide Web servers; it is provided by the Debian Linux package tclcurl.


GPSMan User Manual
Copyright 1998-2013 Miguel Filgueiras,

Creative Commons License
GPSMan User Manual and the GPSMan logo images by Miguel Filgueiras are licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.

Get gpsman at SourceForge.net. Fast,
secure and Free Open Source software downloads


External utilitiesProgramsCurrent versionDownloading GPSMan
gpsman-6.4.4.2/manual/html/GPSMandoc_71.html0000644000175000017500000000700312170753404016460 0ustar migmig GPS Manager User Manual -- Version 6.4.3 -- 29 April 2012
Version 6.4.2 - 19 September 2011Recent ChangesVersion 6.4.4 - 5 April 2013Version 6.4.3 -- 29 April 2012

Version 6.4.3 -- 29 April 2012

  • support for more ISO8601 date formats, contributed by Valère Robin.

  • support for Dutch, French, Italian and Spanish updated with thanks to Rob Buitenhuis, Vaère Robin, Alessandro Palmas and Alberto Morales.

  • altitude threshold may now be a floating point number.

  • cumulative ascent/descent values not shown if inconsistent with warning about altitude threshold; suggested by Han Holl (han.holl_at_pobox.com).


GPSMan User Manual
Copyright 1998-2013 Miguel Filgueiras,

Creative Commons License
GPSMan User Manual and the GPSMan logo images by Miguel Filgueiras are licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.

Get gpsman at SourceForge.net. Fast,
secure and Free Open Source software downloads


Version 6.4.2 - 19 September 2011Recent ChangesVersion 6.4.4 - 5 April 2013Version 6.4.3 -- 29 April 2012
gpsman-6.4.4.2/manual/html/GPSMandoc_69.html0000644000175000017500000000570112170753404016472 0ustar migmig GPS Manager User Manual -- Version 6.4.4.1 -- 15 July 2013
Version 6.4.4 - 5 April 2013Recent ChangesVersion 6.4.4.1 -- 15 July 2013

Version 6.4.4.1 -- 15 July 2013

  • Change of email address for reporting bugs.


GPSMan User Manual
Copyright 1998-2013 Miguel Filgueiras,

Creative Commons License
GPSMan User Manual and the GPSMan logo images by Miguel Filgueiras are licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.

Get gpsman at SourceForge.net. Fast,
secure and Free Open Source software downloads


Version 6.4.4 - 5 April 2013Recent ChangesVersion 6.4.4.1 -- 15 July 2013
gpsman-6.4.4.2/manual/html/migfaddr.png0000644000175000017500000000216012224325030015760 0ustar migmigPNG  IHDRU?gAMA abKGD pHYsuIDATh_l_cl2ڲf$"A$:2Yl 5' DBd3 YE:ֱ骋r\x߯oM79s{yRB *Tl6qd G>|~xgL;f|o'_ l pY8wb'Ōmʙ&%BVg,s8)L:di`vXwȴ{MX5H7DlƟwl%r3l{[S^[ҁO3a a)7Ҳ.1R 8ӈތ4bGbf7'K$vI{͌t,䯩0- ΋+V\" GPS Manager User Manual -- Projections and coordinate grids
Distances and bearingsUsing GPSMan in graphical modeDatums and ellipsoidsProjections and coordinate grids

Projections and coordinate grids

Selecting and defining projections

Selecting the map projection is done by using the second (from the left) menu-buttons on the bottom of the map window if the map window is the main window, or the Projection menu-button if the lists window is the main window.

If a background image is to be loaded the projection and the datum should be set to the projection and datum used in the image (see above for the details on this). If there is no image, the map projection should be selected according to the map scale and the geometry of the region to be covered.

World maps and small-scale maps need suitable projections, such as Mercator. Using projections that were developed for large-scale maps, such as the Transverse Mercator will give strange results or even errors. With small-scale maps the following should also be noted:

  • a map cannot have overlapping parts; this implies that for each point on the Earth the projection procedure will give a single projected point;
  • for projections having a central longitude or false longitude parameter, GPSMan converts any longitude value to the range from -180 to 180 (inclusive) centred on that central/false longitude; this means that it may happen that a point created too far to the West (or East) of this longitude will be mapped to the East (or West) of it, causing lines (routes, tracks or polylines) to be displayed in a wrong way; it is therefore very important that the central or false longitude be given an appropriate value;
  • when initializing a map projection the default value for the central/false longitude in GPSMan is the average of longitudes of the points that are to be displayed then; if the option on asking for confirmation of projection parameters is set, the user will have the opportunity to change it;
  • measuring distances on a small-scale map as explained above can yield wrong values for points too distant from each other.

Projections can be either predefined or user-defined. There are a small set of predefined projections. Some of them admit particular cases, in the sense that they have parameters whose values can be fixed. The user may define such particular cases along with a coordinates grid associated to it.

Each projection has an associated coordinates grid that will be used as default position format for displaying the map cursor coordinates and when a waypoint is created from the map. This position format and the associated datum can be changed from the map window (menu-buttons near the cursor coordinates). If the position format is a grid requiring a fixed datum, the datum will be set automatically when the format is changed and cannot be changed.

When defining a projection, the user may also define a new coordinates grid. User-defined grids cannot have more than one zone.

User-defined projections and grids are automatically saved in a file in the GPSMan user directory, and will be loaded when GPSMan is started.

To define/change a projection there are the appropriate entries under the Definitions menu-button.

When defining a new projection, which is necessarily a particular case of a general projection, the user must select first the general projection to use, along with a name and short name. The short name, that can not have blanks, is for internal use and will also serve as the coordinates grid name, if the user associates one to the new projection. The values of the projection parameters must be then given. The user may either associate to the new projection an existing grid, or create a new grid by selecting a distance unit (currently either metres or feet), by giving the values for the false easting and northing (for some projections these parameters are in fact the easting/northing of the false origin or of the projection centre), sensible bounds to the coordinates, and by choosing whether or not a fixed datum must be used with the grid. The bounds given will be used to check that the grid is not used outside its intended scope. All values of latitudes and longitudes must be given either in the datum of the grid if there is a fixed one, or in the datum being used for the map.

An user-defined grid cannot be forgotten if it is currently associated to another projection or in use for displaying the map coordinates. Changing the definition of a user-defined grid may cause inconsistencies in previously projected data.

Predefined projections and grids

With the UTM/UPS (Universal Transverse Mercator/Universal Polar Stereographic) projection a single UTM zone is used, that of the first point displayed. Points in different zones will be projected into the same zone what may produce some deformation. There are no parameters that can be changed by the user.

The Transverse Mercator projection, also known as Gauss or Gauss-Kruegger projection is used with large scale maps and is not suitable for longitude ranges larger than about 6 degrees. It has 3 parameters: the latitude and longitude of the centre and the scale factor at the central meridian. The first two are computed by GPSMan as the averages of the latitudes/longitudes of the first points being mapped, while the third one has the default value of 0.9996 (used for UTM).

Particular cases of the Transverse Mercator projection are used in several maps usually for a certain country or region. Besides UTM, GPSMan predefines the following ones:

  • the Austrian "Bundesmeldenetz" (BMN) projection. Parameters: central latitude 0, central longitude in three zones of 3 degrees named M28, M31 and M34 and centred at 10.3333333, 13.3333333 and 16.3333333E, scale factor 1. The datum to be used is called "Austrian (MGI)". Coordinates in the BMN grid have a false northing of 0 and a false easting that depends on the zone: 150km in zone M28, 460km in M31, and 750km in M34.

  • the British National Grid (BNG) projection. Parameters: central latitude 49, central longitude -2, scale factor 0.9996012717. The datum to be used is called "Ordnance Survey Great Britain". Coordinates in this grid correspond to a false easting of 400km and a false northing of 100km.

  • the British West Indies projection. Parameters: central latitude 0, central longitude -62, scale factor 0.9995. The datum to be used should be based on the "Clarke 1880" ellipsoid. Coordinates in this grid correspond to a false easting of 400km.

  • the projection used in the Italian Carta Tecnica Regionale (CTR). Parameters: central latitude 0, central longitude in two zones of 6 degrees centred at 9 and 15E, scale factor 0.9996. Coordinates in the CTR grid have a false northing of 0 and a false easting that depends on the zone: 1500km in the first zone, and 2520km in the second one.

  • the German Grid projection (GKK: Gauss-Krueger-Koordinatensystem). Parameters: central latitude 0, central longitude in zones of 6 degrees centred at 0, 3, 6, 9, 12, and 15E, scale factor 1. Coordinates in the GKK grid have a false easting of z×1000 + 500 km, where z is the zone number.

  • the Irish Transverse Mercator Grid (ITM) projection. Parameters: central latitude 53.5, central longitude -8, scale factor 1.000035. The datum to be used is called "Ireland 1965". Coordinates in this grid correspond to a false easting of 200km and a false northing of 250km.

  • the Portuguese Military Maps projection, used in 1:25000 maps published by the Portuguese Army Geographic Institute. Parameters: central latitude 39.66666666666667, central longitude -8.13190611111111, scale factor 1. The datum to be used is called "Lisboa". Military coordinates in these maps correspond to a false easting of 200km and a false northing of 300km.

  • the Swedish Grid (SEG) projection. Parameters: central latitude 0, central longitude 15.808277777778, scale factor 1. Coordinates in this grid correspond to a false easting of 1500km.

  • the Taiwan Grid projection (TWG). Parameters: central latitude 0, central longitude in 6 zones of 2 degrees centred at 115, 117, ..., 125, and scale factor 0.9999. Coordinates in the TWG grid have a false easting of 250km. This grid is usually employed with either the "Hu-Tzu-Shan" datum (also known as "TWD67"), or the "TWD97" datum (whose definition could not be found for inclusion in GPSMan).

  • the Uniform Finnish Grid (KKJY) projection. Parameters: central latitude 0, central longitude 27, scale factor 1. Coordinates in this grid correspond to a false northing of 500km. There is a single zone named 27E.

  • the Basic Finnish Grid (KKJP) projection. Parameters: central latitude 0, central longitude in zones of 6 degrees centred at 21, 24, 27, and 30E, scale factor 1. Coordinates in the KKJP grid have a false easting of z×1000 + 500 km, where z is the zone number.

The Swiss Oblique Mercator projection is a particular case of an Oblique Mercator projection, which in turn differs from the Mercator and Transverse Mercator projections in that the central line with true scale is neither the equator (as in the Mercator), nor a meridian (as in the Transverse Mercator), and is chosen to suit the region to be mapped. In the Swiss Oblique Mercator this line has an azimuth of 90 degrees and contains the centre of the projection. There are three parameters: the latitude and longitude of the centre, and the scale factor, the default values in GPSMan being the averages of latitudes and of longitudes of the first points to be projected and 1, respectively.

The Swiss LV03 Grid projection is a particular case of the Swiss Oblique Mercator projection with centre at Bern, N46.9524055556, E7.43958333333 degrees in the "CH-1903" datum, and a scale factor of 1.

The Swiss LV03 grid has false easting and northing of 600km and 200km, and use the "CH-1903" datum.

The Uniform Hungarian National projection (EOV: Egységes országos vetület) is a reduced oblique Mercator projection that has no parameters and should be used with the "Hungarian Datum 1972". Coordinates in the associated grid are by definition presented in the order northing then easting but this convention is not followed here. They correspond to a false easting of 650km and a false northing of 200km. Acceptable ranges of values are: 400000-950000m for easting, 0-400000m for northing, 45-49 degrees for latitude, and 16-23 degrees for longitude.

The Lambert Conic Conformal projection has two variants: single standard parallel (under the name Lambert Conic Conf 1 in GPSMan), and two standard parallels (called in GPSMan Lambert Conic Conf 2).

The former has 3 parameters: the latitude and longitude of the centre and the scale factor at the natural origin. The first two are computed as the averages of the latitudes/longitudes of the first points being mapped, while the third one has the default value of 1 (corresponding to a tangent cone; a value of less than 1 stands for a secant cone).

The latter has 4 parameters: latitudes of the two standard parallels (along which the cone intersects the geoid) and of the false origin, and longitude of the false origin. The first two default to the extremes of latitudes of the first points being mapped, and the position of the false origin defaults to the average of the positions of these points.

The Iceland Grid projection is a particular case of the Lambert Conic Conformal projection with 2 standard parallels at N64.75 and N64.25 degrees, a false origin at N65, W19 degrees and the "WGS 84" datum.

The Iceland grid has a false easting and a false northing of 500km.

The Lambert 93 grid projection is a particular case of the Lambert Conic Conformal projection with 2 standard parallels at N44 and N49 degrees, a false origin at N46.5 E3 degrees and a datum based on the "GRS 80" ellipsoid. The "WGS 84" datum can be used for applications with handheld GPS receivers.

The Lambert 93 grid has a false easting of 700km and a false northing of 6600km.

The Lambert NTF grid projection has 4 zones, named I, II, III and IV, each corresponding to a particular case of the Lambert Conic Conformal projection with 2 standard parallels with the following parameters (in degrees):

zone    I    II    III    IV
1st parallel 50.3959116667 45.8989188889 43.1992913889 41.5603877778
2nd parallel 48.5985227778 47.6960144444 44.9960938889 42.0000593542
lat f origin 49.5 46.8 44.1 42.165

the longitude of the false origin being that of the Paris meridian at E2.3372083333 degrees, and the "NTF (Nouvelle Triangulation de France)" datum.

The Lambert NTF grid has for zones I to III a false easting of 600km and a false northing of 200km, and for zone IV a false easting of 234.358m and false northing of 185861.369m.

The Lambert NTF étendue grid projection is the same as the projection for zone II of the Lambert NTF grid projection.

The Lambert NTF étendue grid has a false easting of 600km and a false northing of 2200km.

Lambert Equal Area Conic projection is a conic, equal-area projection. It has four parameters: the latitude of a standard parallel, the polar aspect (either north or south), and the latitude and longitude of the centre.

The Albers Equal Area projection is a conic, equal-area projection. It has four parameters: the latitudes of the two standard parallels, and the latitude and longitude of the centre.

The Teale Albers grid projection is a particular case of the Albers Equal Area projection with standard parallels at 34 and 40.5 degrees North, and centre at the equator, 120 degrees West.

The Teale Albers grid uses this projection with the NAD27 CONUS datum, false easting of 0 and false northing of -4000km. Note that coordinate values may be negative.

The Mercator projection can be defined as a Lambert Conic Conformal projection either with the equator as its single standard parallel, or with two standard parallels at equal North and South latitudes (i.e., symmetrical with respect to the equator).

This leads to two variants: single standard parallel (named in GPSMan Mercator 1), and two standard parallels (named in GPSMan Mercator 2).

The former has 2 parameters: the longitude of the centre and the scale factor at the natural origin. They are taken as the average of the longitudes of the first points being mapped, and as 1, respectively.

The latter has 3 parameters: the latitudes of one of the two standard parallels and of the false origin, and longitude of the false origin. The first default to the maximum of the absolute values of the latitudes of the first points being mapped, the position of the false origin defaults to the average of the positions of these points.

Yet another variant is the spherical case where latitude and longitude are taken to be in a sphere. It has 2 parameters, the central latitude and longitude that default to the average of the first points being mapped. This projection although introducing large errors when used directly with ellipsoidal coordinates is generally used with the "WGS 84" datum in map imagery available on the Web, such as OpenStreetMap, Nasa WMS, Yahoo Maps, Google Maps (an alternative is the Equidistant Cylindrical projection).

A particular case of the Spherical Mercator is the EPSG:3857 projection (also known as EPSG:900913, EPSG:102113) whose central point has latitude and longitude 0 with datum "WGS 84". Large distortion is to be expected far from this central point.

The Stereographic projection is an azimuthal conformal projection used both for large scale and small scale mapping. There are 3 possible aspects: polar, oblique and equatorial, which are dealt with automatically by GPSMan. A particular case of this projection is the Universal Polar Stereographic that is used in the UTM/UPS.

The Stereographic projection has three parameters: the latitude and the longitude of the centre (tangent point) and a scale factor. By default the scale factor is 1 and the coordinates of the centre are taken as the average of the latitudes of the first points to be mapped.

The Schreiber double projection is a variant of the Stereographic projection, in which each point in the ellipsoid is first projected in a sphere and the resulting point projected in a plane that intersects the sphere. This projection must be used with a datum based on the "Bessel 1841" ellipsoid, usually the "Rijks Driehoeksmeting" datum. If the given datum is for a different ellipsoid, GPSMan will change the datum to "Rijks Driehoeksmeting". All parameters for this projection are fixed: the centre is at N52 09 22.178 E5 23 15.5 in the "Rijks Driehoeksmeting" datum (coordinates of the Amersfoot OLV church), the scale factor is 0.9999079, and the constants for the conversions between the isometric latitudes in the ellipsoid and in the sphere are n=1.00047585668 and m=0.003773953832.

The Netherlands grid uses the Schreiber dual projection with a false easting of 155km and a false northing of 463km, and the "Rijks Driehoeksmeting" datum. Acceptable ranges of values are: 0-290000m for x, 290000-630000m for y, 50.3-53.45 degrees for latitude, and 3-7.45 degrees for longitude.

The Cassini-Soldner projection is a neither conformal nor equal-area projection used in the 19th century. It is still used for mapping areas with a small E-W extent. Scale is true along a central meridian and distortion increases significantly with distance from it. It has two parameters: the latitude and the longitude of the natural origin. These parameters are taken as the averages of the latitudes and longitudes of the first points being mapped.

The American Polyconic projection is also a neither conformal nor equal-area projection used before the computer era. It has a single parameter: the standard latitude, whose default value is taken as the average of the latitudes of the first points to be mapped.

The Equidistant Cylindrical projection is a simplistic projection where latitudes and longitudes are taken as rectangular coordinates making it only appropriate for very large scale maps. Its single parameter is the central latitude that in GPSMan defaults to the average latitude of the first points being mapped. This projection, as the Spherical Mercator, is generally used with the "WGS 84" datum in map imagery available on the Web, such as OpenStreetMap, Nasa WMS, Yahoo Maps, Google Maps.

A particular case of this projection with central latitude 0 is known as the "Plate Carrée" (not pre-defined in GPSMan). When used with the "WGS 84" datum it is known as the EPSG:32663 projection (pre-defined in GPSMan). Neither of them should be used with maps far from the Equator.


GPSMan User Manual
Copyright 1998-2013 Miguel Filgueiras,

Creative Commons License
GPSMan User Manual and the GPSMan logo images by Miguel Filgueiras are licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.

Get gpsman at SourceForge.net. Fast,
secure and Free Open Source software downloads


Distances and bearingsUsing GPSMan in graphical modeDatums and ellipsoidsProjections and coordinate grids
gpsman-6.4.4.2/manual/html/GPSMandoc_27.html0000644000175000017500000001247512170753404016472 0ustar migmig GPS Manager User Manual -- Datums and ellipsoids
Projections and coordinate gridsUsing GPSMan in graphical modeMap background imagesDatums and ellipsoids

Datums and ellipsoids

A horizontal (or geodetic) datum defines the form and the position relative to the Earth axis of the geometric reference surface of the Earth used for locating points and in projections. The form is an ellipsoid which is usually defined by giving its semi-major axis a, and its flattening f (or its inverse), i.e., the quotient of the difference between its semi-major and semi-minor axes by its semi-major axis. Its relative position is described by the shift in Cartesian coordinates (dx, dy, dz) with respect to a reference datum, usually the "WGS 84".

GPSMan contains comprehensive sets of datums and ellipsoids. Their definitions have a remark field used for documenting them whenever possible, as well as fields for the error estimate in metres (ex, ey, ez; the value -1 stands for unknown), the number of satellite measurement stations, and the zone of validity given by S-N latitudes and W-E longitudes. All these fields are for information only and may be empty. The definitions can be inspected (but not changed) from the corresponding entries under the Definitions menu-button. It should be noted that some datums have variants for different regions. For instance, the "European Datum 1950" has at least 15 such variants and it has been observed that Garmin receivers do use the local variant for Portugal/Spain when this datum is selected and a waypoint in Portugal is created. This means that using the average "European Datum 1950" in such a situation may lead to large position errors. Probably the same will happen with other datums having variants.

Users may define their own datums and ellipsoids from the entries under the Definitions menu-button. These definitions, that cannot override those in GPSMan, are automatically saved in a file in the GPSMan user directory, and will be loaded when GPSMan is started. Currently GPSMan does not prevent changing or forgetting a datum or ellipsoid that is in use: it is the user's responsability to avoid inconsistencies due to such operations. When sharing files having data depending on user-defined datums with other users, the definitions of the relevant datums and ellipsoids should also be shared.


GPSMan User Manual
Copyright 1998-2013 Miguel Filgueiras,

Creative Commons License
GPSMan User Manual and the GPSMan logo images by Miguel Filgueiras are licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.

Get gpsman at SourceForge.net. Fast,
secure and Free Open Source software downloads


Projections and coordinate gridsUsing GPSMan in graphical modeMap background imagesDatums and ellipsoids
gpsman-6.4.4.2/manual/html/GPSMandoc_48.html0000644000175000017500000000755312170753404016476 0ustar migmig GPS Manager User Manual -- The project Command
The georef CommandUsing GPSMan in Command-line ModeThe translate CommandThe project Command

The project Command

The project command, that can have no options, writes to the standard output the projection of a point:

project LATD LONGD DATUM PROJECTION [PARAMS]
where:
  • LATD LONGD DATUM are the latitude and longitude in signed decimal degrees and the datum of the point to project
  • PROJECTION [PARAMS] defines the projection to use and its parameters; if no datum=X parameter is given the datum of the point is used; use show projections for a list of the available projections and their parameters.

The result consists in two numbers corresponding to the x- and y-coordinates of the projected point. In the case of projections related to grids, except for UTM, no false easting or northing is added. Information on zones is not given.


GPSMan User Manual
Copyright 1998-2013 Miguel Filgueiras,

Creative Commons License
GPSMan User Manual and the GPSMan logo images by Miguel Filgueiras are licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.

Get gpsman at SourceForge.net. Fast,
secure and Free Open Source software downloads


The georef CommandUsing GPSMan in Command-line ModeThe translate CommandThe project Command
gpsman-6.4.4.2/manual/html/info/0000755000175000017500000000000012224351117014436 5ustar migmiggpsman-6.4.4.2/manual/html/info/l_realtime.doc.txt0000644000175000017500000001570007455276610020101 0ustar migmig*** WARNING! *** Use of a laptop computer by the driver of a moving vehicle incurs risk! Use this program at your own peril! Do not attempt keyboard or mouse input whilst moving! *************************** Welcome to GPSMan-autoMapic. *************************** GPSMan-autoMapic is beta software designed to give moving-map real-time plotting. It is not receiver-specific, and should work with any GPS receiver that has the ability to output a standard NMEA 0183 v2.0 "GGA" sentence. It has been developed on a ThinkPad 380 (150Mhz Pentium) using a Lowrance GlobalNav 212 receiver. GPSMan-autoMapic has been tested with both the Auslig RASTER250K map series (150 dpi, original margins cropped, map sliced into three sheets 1 degree latitude by 0.5 degree longitude by the author) and with a4 scans (150 & 120 dpi) such as city street-maps. It also has operated sessions in excess of 12 hours and 980 km travelled without any operator input required. * Track log files. * The software writes a log file to disk (in the current directory)for each map image loaded. These files have the name "mapname.trk" derived from the "mapname.img" of the current image loaded, and are in GPSMan standard format. If a track crosses a specific mapsheet more than once, such tracks will be appended to the original file. Each such track will have a unique name "mapname-n" wher n is a number 0 to 999. With the "Manual plot" function the track name is user selectable, defaulting to "NMEA1". *** Warning *** The performance of this software is dependent on computer speed! GPS Receivers that output a full string of NMEA sentences, without the ability to turn off those not required, may cause buffer-overflow when using slower computers. This is a Tcl feature and beyond my control at the moment. This bug may limit the size of map images that can be loaded. For example, an a3 image appears to be the limit with all sentences turned on in the Lowrance receiver & using a ThinkPad 380. A more powerful machine will handle larger images, test with "exerciser", details are given below. Feedback to baulchb@hotkey.net.au will help us in deciding on future development. Use of the software is straightforward. The Map images required should have been prepared and georeferenced in the normal GPSMan fashion. All NMEA sentences are to the WGS 84 datum, so set GPSMan to WGS 84 in the options menu for georeferencing. However the georeferencing waypoints should of course be to the same datum as the mapsheet being referenced. When this has been done an ".aut" file has to be prepared to show the bounding box for each georeferenced sheet needed. This file has to be manually prepared and has five or six tab-separated fields in each record, one record per line. The fields required are - Image-file path. (The full path of the .img file created during georeferencing) Latitude of the bottom of the image quadrangle, signed DDD format. Latitide of the top of the image quad, likewise. Longitude of the left side. Longitude of the right side. Optional image name or number. Can include any ASCII character including space. There is no header required or permitted. A simple example file (example.aut) - ~/Images/SE5401.img -17 -16 138 139.5 CHARTERS TOWERS ~/Images/SE5402.img -17 -16 139.5 141 MOUNT ISA For portability of recorded logs, the image filename may need to be upper-case only. Check your GPS receiver specifications. However I have not yet ever needed to re-load a recorded track into the GPS. GPSMan capability is fully adequate, and can handle lower-case. The images must be specified in degrees. If working with UTM or national grids, convert the co-ordinates to DDD positions with GPSMan. Adjacent images can overlap, in fact this is preferable. If a point falls into a space between adjacent images a warning will be posted by GPSMan, the same warning will be posted if no .aut file is loaded or the position "falls off the edge of the world". As soon as the position falls within an image's bounds again then that image will be loaded. Tracks recorded with no image currently loaded will be saved in "Blank.trk" as "Blank-n" (n 0 to 999 as above). The plotting function is started from the "GPS receiver/Real-time track log/ Get Log" menu of GPSMan. Use "Lowrance" protocol not NMEA. From the "Start log" button a window will appear from which the logging interval can be set and the *.aut file loaded. The plotting interval cannot be changed, all points received will be plotted. To stop plotting/logging select "GPS Receiver/Real-time track log/STOP". "Interval" defaults to 10 seconds. At this setting the 12 hour log mentioned earlier would take approx 220 kb of disk space. If disk space is at a premium increase the value of "Interval" accordingly. If NMEA logging is all that is required, use the "GPSReceiver/Real-time track log/Start/Manual plot" menu to start the software. A map image can be preloaded but need not be. If no image is loaded the map scale can be changed whilst plotting. Manual loading is a useful way of using slow machines, but introduces safety and convenience issues for single-manned vehicles. The track is automatically saved to disk (default name NMEA1.trk) when logging is stopped. This trackname can be changed from the setup window before starting the log. The "exerciser.tcl" test sentence generator. ******************************************* (Note - some Lowrance/Eagle models include a "Simulator" which is preferable to the "exerciser". Follow the instructions in the Lowrance manual.) This program can be used for stationary testing of the autoMapic function. It requires the use of another computer and a null-modem cable or adaptor (e.g. a breakout box). Exerciser.tcl will send a series of NMEA sentences at preset intervals. Initial settings are controlled by the "set" statements at the top of the program, change with a text editor. An explanation is given below, but make the changes in the program, not here. set SRLPORT /dev/ttyS0 # set serial port correctly. set BaudRate 4800 # NMEA Standard. set Hours "0" # Do not change set Minutes "0" # ditto set Seconds "0" # ditto # Set Interval to 1000 (1 sec.) for Lowrance (2000 for Garmin?) set Interval 1000 # Latitude of the desired starting point. set LatDeg 27 set LatMin 54.30 set LatSign S # N or S as applicable. # Longitude of the desired starting point. set LongDeg 153 set LongMin 19.334 set LongSign E # E or W as applicable. # Size and direction of steps. The units are minutes. set LatIncr 0.03 set LongIncr -0.05 # Change to 1 (true) to send the entire (Lowrance) series of sentences. # 0 (false) sends only the required GGA sentence. set SendDummies 0 To use the exerciser, first copy exerciser.tcl to the "dummy" computer which must have Tcl/tk loaded. Start exerciser.tcl then start GPSMan on the "Primary" computer. The two computers should have had serial ports already connected with the null-modem cable. Brian Baulch (baulchb@hotkey.net.au) 3 Apr 2002. copyright (c) Brian Baulch 2000, 2002. gpsman-6.4.4.2/manual/html/info/instupdate.tcl.asc0000644000175000017500000000027510006754013020071 0ustar migmig-----BEGIN PGP SIGNATURE----- Version: GnuPG v1.2.3 (GNU/Linux) iD8DBQBAG9gLl5aajWpeChMRAlhLAJ4/9lCLEio+eoDYtpoYrAvLkt2aiwCfW2sk MQq1bncuvLlY9m2OqbaggDQ= =82v9 -----END PGP SIGNATURE----- gpsman-6.4.4.2/manual/html/info/samplemap.ps0000644000175000017500000140204306541176060016774 0ustar migmig%!PS-Adobe-3.0 EPSF-3.0 %%Creator: Tk Canvas Widget %%For: Miguel Filgueiras %%Title: Window .fr1.frm.frmap1.map %%CreationDate: Fri Apr 10 19:29:34 1998 %%BoundingBox: 44 268 567 524 %%Pages: 1 %%DocumentData: Clean7Bit %%Orientation: Landscape %%DocumentNeededResources: font Fixed %%EndComments %%BeginProlog 50 dict begin % This is a standard prolog for Postscript generated by Tk's canvas % widget. % SCCS: @(#) prolog.ps 1.7 96/07/08 17:52:14 % The definitions below just define all of the variables used in % any of the procedures here. This is needed for obscure reasons % explained on p. 716 of the Postscript manual (Section H.2.7, % "Initializing Variables," in the section on Encapsulated Postscript). /baseline 0 def /stipimage 0 def /height 0 def /justify 0 def /lineLength 0 def /spacing 0 def /stipple 0 def /strings 0 def /xoffset 0 def /yoffset 0 def /tmpstip null def % Define the array ISOLatin1Encoding (which specifies how characters are % encoded for ISO-8859-1 fonts), if it isn't already present (Postscript % level 2 is supposed to define it, but level 1 doesn't). systemdict /ISOLatin1Encoding known not { /ISOLatin1Encoding [ /space /space /space /space /space /space /space /space /space /space /space /space /space /space /space /space /space /space /space /space /space /space /space /space /space /space /space /space /space /space /space /space /space /exclam /quotedbl /numbersign /dollar /percent /ampersand /quoteright /parenleft /parenright /asterisk /plus /comma /minus /period /slash /zero /one /two /three /four /five /six /seven /eight /nine /colon /semicolon /less /equal /greater /question /at /A /B /C /D /E /F /G /H /I /J /K /L /M /N /O /P /Q /R /S /T /U /V /W /X /Y /Z /bracketleft /backslash /bracketright /asciicircum /underscore /quoteleft /a /b /c /d /e /f /g /h /i /j /k /l /m /n /o /p /q /r /s /t /u /v /w /x /y /z /braceleft /bar /braceright /asciitilde /space /space /space /space /space /space /space /space /space /space /space /space /space /space /space /space /space /dotlessi /grave /acute /circumflex /tilde /macron /breve /dotaccent /dieresis /space /ring /cedilla /space /hungarumlaut /ogonek /caron /space /exclamdown /cent /sterling /currency /yen /brokenbar /section /dieresis /copyright /ordfeminine /guillemotleft /logicalnot /hyphen /registered /macron /degree /plusminus /twosuperior /threesuperior /acute /mu /paragraph /periodcentered /cedillar /onesuperior /ordmasculine /guillemotright /onequarter /onehalf /threequarters /questiondown /Agrave /Aacute /Acircumflex /Atilde /Adieresis /Aring /AE /Ccedilla /Egrave /Eacute /Ecircumflex /Edieresis /Igrave /Iacute /Icircumflex /Idieresis /Eth /Ntilde /Ograve /Oacute /Ocircumflex /Otilde /Odieresis /multiply /Oslash /Ugrave /Uacute /Ucircumflex /Udieresis /Yacute /Thorn /germandbls /agrave /aacute /acircumflex /atilde /adieresis /aring /ae /ccedilla /egrave /eacute /ecircumflex /edieresis /igrave /iacute /icircumflex /idieresis /eth /ntilde /ograve /oacute /ocircumflex /otilde /odieresis /divide /oslash /ugrave /uacute /ucircumflex /udieresis /yacute /thorn /ydieresis ] def } if % font ISOEncode font % This procedure changes the encoding of a font from the default % Postscript encoding to ISOLatin1. It's typically invoked just % before invoking "setfont". The body of this procedure comes from % Section 5.6.1 of the Postscript book. /ISOEncode { dup length dict begin {1 index /FID ne {def} {pop pop} ifelse} forall /Encoding ISOLatin1Encoding def currentdict end % I'm not sure why it's necessary to use "definefont" on this new % font, but it seems to be important; just use the name "Temporary" % for the font. /Temporary exch definefont } bind def % StrokeClip % % This procedure converts the current path into a clip area under % the assumption of stroking. It's a bit tricky because some Postscript % interpreters get errors during strokepath for dashed lines. If % this happens then turn off dashes and try again. /StrokeClip { {strokepath} stopped { (This Postscript printer gets limitcheck overflows when) = (stippling dashed lines; lines will be printed solid instead.) = [] 0 setdash strokepath} if clip } bind def % desiredSize EvenPixels closestSize % % The procedure below is used for stippling. Given the optimal size % of a dot in a stipple pattern in the current user coordinate system, % compute the closest size that is an exact multiple of the device's % pixel size. This allows stipple patterns to be displayed without % aliasing effects. /EvenPixels { % Compute exact number of device pixels per stipple dot. dup 0 matrix currentmatrix dtransform dup mul exch dup mul add sqrt % Round to an integer, make sure the number is at least 1, and compute % user coord distance corresponding to this. dup round dup 1 lt {pop 1} if exch div mul } bind def % width height string StippleFill -- % % Given a path already set up and a clipping region generated from % it, this procedure will fill the clipping region with a stipple % pattern. "String" contains a proper image description of the % stipple pattern and "width" and "height" give its dimensions. Each % stipple dot is assumed to be about one unit across in the current % user coordinate system. This procedure trashes the graphics state. /StippleFill { % The following code is needed to work around a NeWSprint bug. /tmpstip 1 index def % Change the scaling so that one user unit in user coordinates % corresponds to the size of one stipple dot. 1 EvenPixels dup scale % Compute the bounding box occupied by the path (which is now % the clipping region), and round the lower coordinates down % to the nearest starting point for the stipple pattern. Be % careful about negative numbers, since the rounding works % differently on them. pathbbox 4 2 roll 5 index div dup 0 lt {1 sub} if cvi 5 index mul 4 1 roll 6 index div dup 0 lt {1 sub} if cvi 6 index mul 3 2 roll % Stack now: width height string y1 y2 x1 x2 % Below is a doubly-nested for loop to iterate across this area % in units of the stipple pattern size, going up columns then % across rows, blasting out a stipple-pattern-sized rectangle at % each position 6 index exch { 2 index 5 index 3 index { % Stack now: width height string y1 y2 x y gsave 1 index exch translate 5 index 5 index true matrix tmpstip imagemask grestore } for pop } for pop pop pop pop pop } bind def % -- AdjustColor -- % Given a color value already set for output by the caller, adjusts % that value to a grayscale or mono value if requested by the CL % variable. /AdjustColor { CL 2 lt { currentgray CL 0 eq { .5 lt {0} {1} ifelse } if setgray } if } bind def % x y strings spacing xoffset yoffset justify stipple DrawText -- % This procedure does all of the real work of drawing text. The % color and font must already have been set by the caller, and the % following arguments must be on the stack: % % x, y - Coordinates at which to draw text. % strings - An array of strings, one for each line of the text item, % in order from top to bottom. % spacing - Spacing between lines. % xoffset - Horizontal offset for text bbox relative to x and y: 0 for % nw/w/sw anchor, -0.5 for n/center/s, and -1.0 for ne/e/se. % yoffset - Vertical offset for text bbox relative to x and y: 0 for % nw/n/ne anchor, +0.5 for w/center/e, and +1.0 for sw/s/se. % justify - 0 for left justification, 0.5 for center, 1 for right justify. % stipple - Boolean value indicating whether or not text is to be % drawn in stippled fashion. If text is stippled, % procedure StippleText must have been defined to call % StippleFill in the right way. % % Also, when this procedure is invoked, the color and font must already % have been set for the text. /DrawText { /stipple exch def /justify exch def /yoffset exch def /xoffset exch def /spacing exch def /strings exch def % First scan through all of the text to find the widest line. /lineLength 0 def strings { stringwidth pop dup lineLength gt {/lineLength exch def} {pop} ifelse newpath } forall % Compute the baseline offset and the actual font height. 0 0 moveto (TXygqPZ) false charpath pathbbox dup /baseline exch def exch pop exch sub /height exch def pop newpath % Translate coordinates first so that the origin is at the upper-left % corner of the text's bounding box. Remember that x and y for % positioning are still on the stack. translate lineLength xoffset mul strings length 1 sub spacing mul height add yoffset mul translate % Now use the baseline and justification information to translate so % that the origin is at the baseline and positioning point for the % first line of text. justify lineLength mul baseline neg translate % Iterate over each of the lines to output it. For each line, % compute its width again so it can be properly justified, then % display it. strings { dup stringwidth pop justify neg mul 0 moveto stipple { % The text is stippled, so turn it into a path and print % by calling StippledText, which in turn calls StippleFill. % Unfortunately, many Postscript interpreters will get % overflow errors if we try to do the whole string at % once, so do it a character at a time. gsave /char (X) def { char 0 3 -1 roll put currentpoint gsave char true charpath clip StippleText grestore char stringwidth translate moveto } forall grestore } {show} ifelse 0 spacing neg translate } forall } bind def %%EndProlog %%BeginSetup /CL 2 def %%IncludeResource: font Fixed %%EndSetup %%Page: 1 1 save 306.0 396.0 translate 90 rotate 0.4834 0.4834 scale -113 -539 translate -150 1079 moveto 376 1079 lineto 376 0 lineto -150 0 lineto closepath clip newpath gsave 192.774999999 983.25 moveto 196.224999999 985.425 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 192.099999999 981.675 moveto 192.774999999 983.25 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 191.424999999 980.025 moveto 192.099999999 981.675 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 187.449999999 983.175 moveto 191.424999999 980.025 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 186.174999999 987.15 moveto 187.449999999 983.175 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 188.799999999 993.9 moveto 186.174999999 987.15 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 190.299999999 998.55 moveto 188.799999999 993.9 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 191.874999999 1007.325 moveto 190.299999999 998.55 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 191.574999999 1015.65 moveto 191.874999999 1007.325 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 190.299999999 1020.3 moveto 191.574999999 1015.65 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 187.449999999 1018.8 moveto 190.299999999 1020.3 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 182.949999999 1018.8 moveto 187.449999999 1018.8 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 180.774999999 1014.6 moveto 182.949999999 1018.8 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 180.624999999 1010.85 moveto 180.774999999 1014.6 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 180.624999999 1008.75 moveto 180.624999999 1010.85 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 183.324999999 1004.925 moveto 180.624999999 1008.75 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 182.124999999 1005.075 moveto 183.324999999 1004.925 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 179.649999999 1006.95 moveto 182.124999999 1005.075 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 176.574999999 1005.975 moveto 179.649999999 1006.95 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 178.524999999 1002.075 moveto 176.574999999 1005.975 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 182.499999999 1001.85 moveto 178.524999999 1002.075 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 184.149999999 1005.15 moveto 182.499999999 1001.85 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 181.524999999 1006.725 moveto 184.149999999 1005.15 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 180.924999999 1003.725 moveto 181.524999999 1006.725 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 184.599999999 1001.175 moveto 180.924999999 1003.725 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 187.449999999 1002.9 moveto 184.599999999 1001.175 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 186.924999999 1006.125 moveto 187.449999999 1002.9 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 184.899999999 1003.95 moveto 186.924999999 1006.125 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 187.824999999 1002.375 moveto 184.899999999 1003.95 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 191.274999999 1005 moveto 187.824999999 1002.375 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 189.849999999 1008 moveto 191.274999999 1005 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 187.749999999 1006.575 moveto 189.849999999 1008 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 189.549999999 1003.35 moveto 187.749999999 1006.575 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 193.524999999 1004.1 moveto 189.549999999 1003.35 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 195.174999999 1008.075 moveto 193.524999999 1004.1 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 193.449999999 1008.75 moveto 195.174999999 1008.075 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 193.299999999 1004.55 moveto 193.449999999 1008.75 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 196.599999999 1007.175 moveto 193.299999999 1004.55 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 195.624999999 1010.4 moveto 196.599999999 1007.175 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 194.349999999 1007.1 moveto 195.624999999 1010.4 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 194.199999999 1003.2 moveto 194.349999999 1007.1 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 191.274999999 1003.125 moveto 194.199999999 1003.2 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 192.099999999 1005.975 moveto 191.274999999 1003.125 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 197.124999999 1007.4 moveto 192.099999999 1005.975 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 197.499999999 1004.625 moveto 197.124999999 1007.4 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 194.349999999 1003.425 moveto 197.499999999 1004.625 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 194.349999999 1005.975 moveto 194.349999999 1003.425 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 199.674999999 1009.5 moveto 194.349999999 1005.975 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 202.974999999 1007.25 moveto 199.674999999 1009.5 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 201.624999999 1006.05 moveto 202.974999999 1007.25 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 197.799999999 1007.625 moveto 201.624999999 1006.05 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 197.049999999 1011.075 moveto 197.799999999 1007.625 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 199.899999999 1014.6 moveto 197.049999999 1011.075 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 204.249999999 1013.1 moveto 199.899999999 1014.6 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 203.799999999 1011.45 moveto 204.249999999 1013.1 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 201.324999999 1012.35 moveto 203.799999999 1011.45 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 197.949999999 1009.725 moveto 201.324999999 1012.35 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 197.349999999 1002.075 moveto 197.949999999 1009.725 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 199.974999999 999.825 moveto 197.349999999 1002.075 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 204.324999999 999.45 moveto 199.974999999 999.825 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 207.024999999 1002 moveto 204.324999999 999.45 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 206.574999999 1005.9 moveto 207.024999999 1002 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 205.224999999 1006.125 moveto 206.574999999 1005.9 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 202.524999999 1002.825 moveto 205.224999999 1006.125 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 203.274999999 999.6 moveto 202.524999999 1002.825 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 208.599999999 999.45 moveto 203.274999999 999.6 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 210.924999999 1004.4 moveto 208.599999999 999.45 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 208.299999999 1006.2 moveto 210.924999999 1004.4 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 207.324999999 1003.2 moveto 208.299999999 1006.2 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 210.774999999 1002.525 moveto 207.324999999 1003.2 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 213.174999999 1003.725 moveto 210.774999999 1002.525 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 211.599999999 1005.975 moveto 213.174999999 1003.725 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 209.724999999 1003.425 moveto 211.599999999 1005.975 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 213.099999999 1000.95 moveto 209.724999999 1003.425 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 216.099999999 1004.7 moveto 213.099999999 1000.95 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 214.899999999 1006.95 moveto 216.099999999 1004.7 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 213.174999999 1004.85 moveto 214.899999999 1006.95 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 214.449999999 1003.5 moveto 213.174999999 1004.85 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 217.974999999 1007.475 moveto 214.449999999 1003.5 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 216.249999999 1009.35 moveto 217.974999999 1007.475 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 213.849999999 1008.375 moveto 216.249999999 1009.35 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 216.624999999 1005.6 moveto 213.849999999 1008.375 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 220.224999999 1009.125 moveto 216.624999999 1005.6 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 219.624999999 1011 moveto 220.224999999 1009.125 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 216.924999999 1011.375 moveto 219.624999999 1011 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 216.249999999 1007.925 moveto 216.924999999 1011.375 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 215.424999999 1003.5 moveto 216.249999999 1007.925 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 213.849999999 997.725 moveto 215.424999999 1003.5 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 216.099999999 995.175 moveto 213.849999999 997.725 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 220.749999999 994.575 moveto 216.099999999 995.175 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 224.574999999 995.1 moveto 220.749999999 994.575 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 226.899999999 991.2 moveto 224.574999999 995.1 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 225.849999999 987.675 moveto 226.899999999 991.2 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 218.949999999 988.5 moveto 225.849999999 987.675 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 211.674999999 989.55 moveto 218.949999999 988.5 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 209.649999999 988.875 moveto 211.674999999 989.55 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 213.174999999 983.1 moveto 209.649999999 988.875 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 217.524999999 978.525 moveto 213.174999999 983.1 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 224.499999999 976.35 moveto 217.524999999 978.525 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 226.974999999 970.8 moveto 224.499999999 976.35 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 226.524999999 967.125 moveto 226.974999999 970.8 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 223.899999999 968.7 moveto 226.524999999 967.125 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 214.074999999 978.3 moveto 223.899999999 968.7 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 209.724999999 984.225 moveto 214.074999999 978.3 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 202.674999999 990.825 moveto 209.724999999 984.225 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 198.699999999 993.75 moveto 202.674999999 990.825 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 192.924999999 995.55 moveto 198.699999999 993.75 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 191.274999999 990.675 moveto 192.924999999 995.55 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 189.474999999 984.375 moveto 191.274999999 990.675 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 187.449999999 983.7 moveto 189.474999999 984.375 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 188.799999999 984.15 moveto 187.449999999 983.7 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 190.974999999 978.6 moveto 188.799999999 984.15 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 190.674999999 972.375 moveto 190.974999999 978.6 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 180.924999999 970.35 moveto 190.674999999 972.375 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 170.499999999 970.95 moveto 180.924999999 970.35 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 159.624999999 973.8 moveto 170.499999999 970.95 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 144.174999999 975.15 moveto 159.624999999 973.8 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 135.024999999 976.65 moveto 144.174999999 975.15 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 129.849999999 977.025 moveto 135.024999999 976.65 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 125.049999999 975.6 moveto 129.849999999 977.025 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 121.224999999 975.525 moveto 125.049999999 975.6 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 115.524999999 976.35 moveto 121.224999999 975.525 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 111.174999999 976.5 moveto 115.524999999 976.35 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 108.849999999 973.725 moveto 111.174999999 976.5 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 107.874999999 968.625 moveto 108.849999999 973.725 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 102.174999999 967.35 moveto 107.874999999 968.625 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 96.6249999995 970.5 moveto 102.174999999 967.35 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 93.6249999995 974.175 moveto 96.6249999995 970.5 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 91.6749999995 978.075 moveto 93.6249999995 974.175 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 89.7999999995 984.075 moveto 91.6749999995 978.075 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 86.4999999995 985.425 moveto 89.7999999995 984.075 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 82.7499999995 984.9 moveto 86.4999999995 985.425 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 78.6999999995 990.825 moveto 82.7499999995 984.9 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 76.5249999995 996.825 moveto 78.6999999995 990.825 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 74.2749999995 998.175 moveto 76.5249999995 996.825 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 73.0749999995 995.4 moveto 74.2749999995 998.175 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 66.8499999995 997.35 moveto 73.0749999995 995.4 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 64.3749999995 998.475 moveto 66.8499999995 997.35 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 58.1499999995 1002.6 moveto 64.3749999995 998.475 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 55.6749999995 1006.95 moveto 58.1499999995 1002.6 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 55.7499999995 1012.5 moveto 55.6749999995 1006.95 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 52.4499999995 1015.2 moveto 55.7499999995 1012.5 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 50.1999999995 1013.1 moveto 52.4499999995 1015.2 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 53.3499999995 1009.425 moveto 50.1999999995 1013.1 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 56.1249999995 1011.825 moveto 53.3499999995 1009.425 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 55.1499999995 1018.95 moveto 56.1249999995 1011.825 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 50.5749999995 1021.65 moveto 55.1499999995 1018.95 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 48.3999999995 1018.65 moveto 50.5749999995 1021.65 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 44.1249999995 1016.7 moveto 48.3999999995 1018.65 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 40.5249999995 1014.825 moveto 44.1249999995 1016.7 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 38.6499999995 1011.075 moveto 40.5249999995 1014.825 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 36.3249999995 1007.325 moveto 38.6499999995 1011.075 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 36.1749999995 1003.875 moveto 36.3249999995 1007.325 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 33.3999999995 1005.9 moveto 36.1749999995 1003.875 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 29.5749999995 1007.025 moveto 33.3999999995 1005.9 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 28.8999999995 1005.6 moveto 29.5749999995 1007.025 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 31.0749999995 1000.35 moveto 28.8999999995 1005.6 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 34.6749999995 999.675 moveto 31.0749999995 1000.35 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 35.7999999995 1005.45 moveto 34.6749999995 999.675 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 33.9249999995 1006.125 moveto 35.7999999995 1005.45 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 29.4249999995 1006.8 moveto 33.9249999995 1006.125 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 25.7499999995 1006.275 moveto 29.4249999995 1006.8 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 21.4749999995 1006.875 moveto 25.7499999995 1006.275 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 16.5999999995 1005.9 moveto 21.4749999995 1006.875 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 17.1999999995 1000.35 moveto 16.5999999995 1005.9 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 15.9249999995 995.925 moveto 17.1999999995 1000.35 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 14.5749999995 992.25 moveto 15.9249999995 995.925 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 16.4499999995 982.725 moveto 14.5749999995 992.25 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 19.5999999995 980.475 moveto 16.4499999995 982.725 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 24.4749999995 979.425 moveto 19.5999999995 980.475 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 27.3249999995 983.4 moveto 24.4749999995 979.425 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 26.8749999995 989.4 moveto 27.3249999995 983.4 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 22.5249999995 990.225 moveto 26.8749999995 989.4 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 20.7249999995 987.225 moveto 22.5249999995 990.225 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 24.0249999995 983.55 moveto 20.7249999995 987.225 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 25.6749999995 987.975 moveto 24.0249999995 983.55 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 23.1999999995 993 moveto 25.6749999995 987.975 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 19.7499999995 991.35 moveto 23.1999999995 993 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 21.7749999995 984.9 moveto 19.7499999995 991.35 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 23.0499999995 982.425 moveto 21.7749999995 984.9 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 27.2499999995 990.75 moveto 23.0499999995 982.425 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 24.6249999995 993.075 moveto 27.2499999995 990.75 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 23.5749999995 989.55 moveto 24.6249999995 993.075 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 25.2249999995 985.2 moveto 23.5749999995 989.55 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 28.2999999995 988.05 moveto 25.2249999995 985.2 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 26.6499999995 993.525 moveto 28.2999999995 988.05 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 23.1999999995 993 moveto 26.6499999995 993.525 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 23.1249999995 988.875 moveto 23.1999999995 993 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 25.6749999995 987.525 moveto 23.1249999995 988.875 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 28.7499999995 991.95 moveto 25.6749999995 987.525 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 25.7499999995 996.75 moveto 28.7499999995 991.95 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 21.9249999995 996.75 moveto 25.7499999995 996.75 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 20.9499999995 993.9 moveto 21.9249999995 996.75 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 24.2499999995 991.875 moveto 20.9499999995 993.9 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 25.5999999995 994.95 moveto 24.2499999995 991.875 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 23.9499999995 999.975 moveto 25.5999999995 994.95 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 18.7749999995 1000.875 moveto 23.9499999995 999.975 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 17.9499999995 997.575 moveto 18.7749999995 1000.875 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 20.9499999995 996.45 moveto 17.9499999995 997.575 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 23.6499999995 1000.2 moveto 20.9499999995 996.45 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 21.6249999995 1004.85 moveto 23.6499999995 1000.2 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 18.0249999995 1006.875 moveto 21.6249999995 1004.85 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 16.5249999995 1003.575 moveto 18.0249999995 1006.875 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 19.5999999995 1002 moveto 16.5249999995 1003.575 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 21.8499999995 1003.875 moveto 19.5999999995 1002 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 20.1999999995 1010.775 moveto 21.8499999995 1003.875 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 17.5749999995 1010.775 moveto 20.1999999995 1010.775 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 17.9499999995 1007.775 moveto 17.5749999995 1010.775 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 20.5749999995 1007.55 moveto 17.9499999995 1007.775 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 21.9249999995 1011.975 moveto 20.5749999995 1007.55 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 19.5999999995 1016.325 moveto 21.9249999995 1011.975 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 17.3499999995 1015.65 moveto 19.5999999995 1016.325 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 17.4249999995 1011.9 moveto 17.3499999995 1015.65 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 17.7999999995 1007.1 moveto 17.4249999995 1011.9 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 21.1749999995 1003.425 moveto 17.7999999995 1007.1 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 18.7749999995 999.45 moveto 21.1749999995 1003.425 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 16.8249999995 994.8 moveto 18.7749999995 999.45 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 14.7999999995 991.5 moveto 16.8249999995 994.8 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 10.2999999995 989.175 moveto 14.7999999995 991.5 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 4.5249999995 984.675 moveto 10.2999999995 989.175 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 4.6749999995 971.025 moveto 4.5249999995 984.675 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 6.0249999995 965.475 moveto 4.6749999995 971.025 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 9.6999999995 957.9 moveto 6.0249999995 965.475 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 13.3749999995 947.1 moveto 9.6999999995 957.9 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 15.3249999995 942 moveto 13.3749999995 947.1 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 21.9999999995 934.05 moveto 15.3249999995 942 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 24.9999999995 932.25 moveto 21.9999999995 934.05 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 27.5499999995 921.825 moveto 24.9999999995 932.25 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 27.3249999995 910.725 moveto 27.5499999995 921.825 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 24.0249999995 891.45 moveto 27.3249999995 910.725 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 21.6249999995 879.45 moveto 24.0249999995 891.45 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 17.6499999995 867.75 moveto 21.6249999995 879.45 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 16.5249999995 861.525 moveto 17.6499999995 867.75 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 13.2999999995 857.55 moveto 16.5249999995 861.525 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 12.9999999995 851.55 moveto 13.2999999995 857.55 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 16.1499999995 849.525 moveto 12.9999999995 851.55 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 16.5999999995 853.2 moveto 16.1499999995 849.525 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 13.1499999995 854.775 moveto 16.5999999995 853.2 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 11.2749999995 850.125 moveto 13.1499999995 854.775 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 8.4249999995 835.5 moveto 11.2749999995 850.125 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 7.2999999995 828.3 moveto 8.4249999995 835.5 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 3.3999999995 822.675 moveto 7.2999999995 828.3 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 4.5249999995 817.425 moveto 3.3999999995 822.675 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 6.3999999995 809.55 moveto 4.5249999995 817.425 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 3.9249999995 798.675 moveto 6.3999999995 809.55 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 2.4999999995 792.375 moveto 3.9249999995 798.675 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave -0.350000000501 786.525 moveto 2.4999999995 792.375 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave -1.1000000005 779.4 moveto -0.350000000501 786.525 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 0.3249999995 773.625 moveto -1.1000000005 779.4 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 5.4249999995 765.825 moveto 0.3249999995 773.625 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 11.4249999995 760.575 moveto 5.4249999995 765.825 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 15.7749999995 756.675 moveto 11.4249999995 760.575 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 20.1999999995 750.3 moveto 15.7749999995 756.675 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 24.0999999995 740.625 moveto 20.1999999995 750.3 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 28.0749999995 731.925 moveto 24.0999999995 740.625 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 30.5499999995 728.25 moveto 28.0749999995 731.925 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 33.6249999995 729.675 moveto 30.5499999995 728.25 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 35.3499999995 732.45 moveto 33.6249999995 729.675 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 36.3249999995 735.225 moveto 35.3499999995 732.45 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 32.6499999995 736.125 moveto 36.3249999995 735.225 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 28.5249999995 736.275 moveto 32.6499999995 736.125 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 27.4749999995 739.05 moveto 28.5249999995 736.275 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 30.1749999995 743.475 moveto 27.4749999995 739.05 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 31.8249999995 747.9 moveto 30.1749999995 743.475 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 20.6499999995 752.4 moveto 31.8249999995 747.9 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 21.6999999995 751.5 moveto 20.6499999995 752.4 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 20.3499999995 753.75 moveto 21.6999999995 751.5 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 24.7749999995 756.15 moveto 20.3499999995 753.75 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 30.8499999995 753.9 moveto 24.7749999995 756.15 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 40.3749999995 752.925 moveto 30.8499999995 753.9 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 46.8249999995 749.55 moveto 40.3749999995 752.925 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 51.3999999995 744.3 moveto 46.8249999995 749.55 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 56.6499999995 739.05 moveto 51.3999999995 744.3 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 58.4499999995 735.375 moveto 56.6499999995 739.05 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 61.7499999995 730.05 moveto 58.4499999995 735.375 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 60.3249999995 724.95 moveto 61.7499999995 730.05 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 55.8249999995 723.75 moveto 60.3249999995 724.95 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 54.2499999995 725.1 moveto 55.8249999995 723.75 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 52.1499999995 728.1 moveto 54.2499999995 725.1 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 48.6999999995 726.9 moveto 52.1499999995 728.1 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 48.6249999995 721.8 moveto 48.6999999995 726.9 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 52.2999999995 718.35 moveto 48.6249999995 721.8 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 53.1999999995 714 moveto 52.2999999995 718.35 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 52.4499999995 705.9 moveto 53.1999999995 714 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 52.7499999995 698.925 moveto 52.4499999995 705.9 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 53.1999999995 693.375 moveto 52.7499999995 698.925 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 61.3749999995 698.85 moveto 53.1999999995 693.375 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 66.9249999995 700.05 moveto 61.3749999995 698.85 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 71.1999999995 699.45 moveto 66.9249999995 700.05 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 71.2749999995 696.225 moveto 71.1999999995 699.45 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 68.7249999995 692.925 moveto 71.2749999995 696.225 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 64.2249999995 694.275 moveto 68.7249999995 692.925 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 62.9499999995 696.075 moveto 64.2249999995 694.275 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 65.5749999995 697.5 moveto 62.9499999995 696.075 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 68.8749999995 703.8 moveto 65.5749999995 697.5 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 66.6249999995 707.925 moveto 68.8749999995 703.8 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 62.9499999995 707.85 moveto 66.6249999995 707.925 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 58.7499999995 703.425 moveto 62.9499999995 707.85 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 59.1249999995 698.55 moveto 58.7499999995 703.425 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 61.9749999995 695.85 moveto 59.1249999995 698.55 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 65.3499999995 697.725 moveto 61.9749999995 695.85 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 64.7499999995 702.6 moveto 65.3499999995 697.725 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 61.4499999995 703.5 moveto 64.7499999995 702.6 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 58.7499999995 699 moveto 61.4499999995 703.5 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 61.4499999995 693.3 moveto 58.7499999995 699 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 64.7499999995 694.5 moveto 61.4499999995 693.3 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 64.2999999995 699.15 moveto 64.7499999995 694.5 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 61.6749999995 701.85 moveto 64.2999999995 699.15 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 58.4499999995 698.55 moveto 61.6749999995 701.85 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 58.3749999995 690.225 moveto 58.4499999995 698.55 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 61.1499999995 679.65 moveto 58.3749999995 690.225 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 63.7749999995 674.5500000004 moveto 61.1499999995 679.65 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 67.0749999995 674.8500000004 moveto 63.7749999995 674.5500000004 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 68.7249999995 679.95 moveto 67.0749999995 674.8500000004 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 66.3249999995 682.5 moveto 68.7249999995 679.95 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 62.7249999995 679.65 moveto 66.3249999995 682.5 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 62.4249999995 675.0000000004 moveto 62.7249999995 679.65 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 60.9999999995 668.5500000004 moveto 62.4249999995 675.0000000004 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 60.3999999995 660.4500000004 moveto 60.9999999995 668.5500000004 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 62.3499999995 657.2250000004 moveto 60.3999999995 660.4500000004 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 64.5249999995 658.8750000004 moveto 62.3499999995 657.2250000004 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 64.6749999995 663.7500000004 moveto 64.5249999995 658.8750000004 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 61.5249999995 667.3500000004 moveto 64.6749999995 663.7500000004 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 58.7499999995 666.9000000004 moveto 61.5249999995 667.3500000004 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 59.3499999995 662.4750000004 moveto 58.7499999995 666.9000000004 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 62.3499999995 657.4500000004 moveto 59.3499999995 662.4750000004 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 64.2999999995 652.1250000004 moveto 62.3499999995 657.4500000004 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 63.8499999995 648.6750000004 moveto 64.2999999995 652.1250000004 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 57.5499999995 641.4000000004 moveto 63.8499999995 648.6750000004 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 52.6749999995 632.7750000004 moveto 57.5499999995 641.4000000004 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 51.0249999995 626.7000000004 moveto 52.6749999995 632.7750000004 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 48.3249999995 620.7000000004 moveto 51.0249999995 626.7000000004 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 42.8499999995 618.7500000004 moveto 48.3249999995 620.7000000004 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 39.6999999995 621.2250000004 moveto 42.8499999995 618.7500000004 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 39.4749999995 624.0000000004 moveto 39.6999999995 621.2250000004 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 41.1999999995 624.3000000004 moveto 39.4749999995 624.0000000004 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 42.9999999995 621.9750000004 moveto 41.1999999995 624.3000000004 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 43.3749999995 618.7500000004 moveto 42.9999999995 621.9750000004 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 39.2499999995 615.4500000004 moveto 43.3749999995 618.7500000004 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 36.4749999995 618.2250000004 moveto 39.2499999995 615.4500000004 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 36.9249999995 621.9000000004 moveto 36.4749999995 618.2250000004 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 39.0249999995 621.0000000004 moveto 36.9249999995 621.9000000004 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 37.5249999995 617.2500000004 moveto 39.0249999995 621.0000000004 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 34.0749999995 616.8000000004 moveto 37.5249999995 617.2500000004 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 31.2249999995 621.1500000004 moveto 34.0749999995 616.8000000004 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 33.4749999995 623.0250000004 moveto 31.2249999995 621.1500000004 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 34.6749999995 620.7000000004 moveto 33.4749999995 623.0250000004 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 29.4999999995 619.7250000004 moveto 34.6749999995 620.7000000004 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 28.5999999995 623.4000000004 moveto 29.4999999995 619.7250000004 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 32.2749999995 622.5000000004 moveto 28.5999999995 623.4000000004 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 36.9249999995 621.6750000004 moveto 32.2749999995 622.5000000004 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 40.5249999995 625.6500000004 moveto 36.9249999995 621.6750000004 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 38.5749999995 629.1000000004 moveto 40.5249999995 625.6500000004 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 33.3249999995 631.1250000004 moveto 38.5749999995 629.1000000004 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 30.2499999995 629.1750000004 moveto 33.3249999995 631.1250000004 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 29.4249999995 624.8250000004 moveto 30.2499999995 629.1750000004 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 32.4249999995 621.8250000004 moveto 29.4249999995 624.8250000004 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 35.7249999995 623.7000000004 moveto 32.4249999995 621.8250000004 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 34.7499999995 627.2250000004 moveto 35.7249999995 623.7000000004 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 29.5749999995 630.1500000004 moveto 34.7499999995 627.2250000004 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 25.5999999995 628.2000000004 moveto 29.5749999995 630.1500000004 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 22.3749999995 623.3250000004 moveto 25.5999999995 628.2000000004 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 23.2749999995 620.3250000004 moveto 22.3749999995 623.3250000004 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 26.2749999995 616.6500000004 moveto 23.2749999995 620.3250000004 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 25.2999999995 611.5500000004 moveto 26.2749999995 616.6500000004 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 21.0999999995 607.5750000004 moveto 25.2999999995 611.5500000004 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 19.7499999995 605.2500000004 moveto 21.0999999995 607.5750000004 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 21.4749999995 604.3500000004 moveto 19.7499999995 605.2500000004 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 22.5249999995 602.4750000004 moveto 21.4749999995 604.3500000004 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 18.3249999995 594.0750000004 moveto 22.5249999995 602.4750000004 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 14.7249999995 590.3250000004 moveto 18.3249999995 594.0750000004 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 9.6249999995 588.15000000044 moveto 14.7249999995 590.3250000004 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 7.5999999995 583.27500000044 moveto 9.6249999995 588.15000000044 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 9.6999999995 580.57500000044 moveto 7.5999999995 583.27500000044 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 10.8999999995 582.45000000044 moveto 9.6999999995 580.57500000044 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 8.4249999995 587.47500000044 moveto 10.8999999995 582.45000000044 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 3.5499999995 589.9500000004 moveto 8.4249999995 587.47500000044 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 0.2499999995 589.4250000004 moveto 3.5499999995 589.9500000004 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave -1.4000000005 582.67500000044 moveto 0.2499999995 589.4250000004 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 0.0249999995 581.10000000044 moveto -1.4000000005 582.67500000044 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 0.8499999995 583.42500000044 moveto 0.0249999995 581.10000000044 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave -2.9750000005 586.87500000044 moveto 0.8499999995 583.42500000044 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave -8.4500000005 582.82500000044 moveto -2.9750000005 586.87500000044 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave -8.2250000005 579.600000000442 moveto -8.4500000005 582.82500000044 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave -7.7750000005 582.60000000044 moveto -8.2250000005 579.600000000442 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave -10.9250000005 585.37500000044 moveto -7.7750000005 582.60000000044 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave -17.4500000005 583.87500000044 moveto -10.9250000005 585.37500000044 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave -18.1250000005 579.675000000442 moveto -17.4500000005 583.87500000044 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave -17.0000000005 577.12500000044 moveto -18.1250000005 579.675000000442 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave -15.5000000005 579.975000000442 moveto -17.0000000005 577.12500000044 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave -15.9500000005 583.65000000044 moveto -15.5000000005 579.975000000442 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave -17.0000000005 588.22500000044 moveto -15.9500000005 583.65000000044 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave -22.0250000005 589.5750000004 moveto -17.0000000005 588.22500000044 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave -24.9500000005 586.72500000044 moveto -22.0250000005 589.5750000004 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave -22.8500000005 586.12500000044 moveto -24.9500000005 586.72500000044 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave -23.7500000005 589.3500000004 moveto -22.8500000005 586.12500000044 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave -27.5750000005 589.5000000004 moveto -23.7500000005 589.3500000004 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave -28.4000000005 586.27500000044 moveto -27.5750000005 589.5000000004 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave -27.0500000005 586.95000000044 moveto -28.4000000005 586.27500000044 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave -29.0000000005 589.5000000004 moveto -27.0500000005 586.95000000044 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave -32.3750000005 587.55000000044 moveto -29.0000000005 589.5000000004 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave -32.0000000005 584.10000000044 moveto -32.3750000005 587.55000000044 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave -30.8000000005 586.20000000044 moveto -32.0000000005 584.10000000044 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave -33.9500000005 588.45000000044 moveto -30.8000000005 586.20000000044 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave -38.0750000005 585.37500000044 moveto -33.9500000005 588.45000000044 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave -37.1750000005 582.45000000044 moveto -38.0750000005 585.37500000044 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave -34.9250000005 583.12500000044 moveto -37.1750000005 582.45000000044 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave -36.3500000005 586.35000000044 moveto -34.9250000005 583.12500000044 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave -41.3750000005 586.50000000044 moveto -36.3500000005 586.35000000044 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave -42.0500000005 583.50000000044 moveto -41.3750000005 586.50000000044 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave -40.0250000005 579.375000000442 moveto -42.0500000005 583.50000000044 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave -43.1000000005 575.85000000044 moveto -40.0250000005 579.375000000442 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave -49.0250000005 576.22500000044 moveto -43.1000000005 575.85000000044 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave -54.1250000005 573.82500000044 moveto -49.0250000005 576.22500000044 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave -56.1500000005 569.6250000004 moveto -54.1250000005 573.82500000044 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave -54.7250000005 566.9250000004 moveto -56.1500000005 569.6250000004 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave -53.7500000005 569.2500000004 moveto -54.7250000005 566.9250000004 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave -57.8750000005 570.97500000044 moveto -53.7500000005 569.2500000004 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave -62.1500000005 567.4500000004 moveto -57.8750000005 570.97500000044 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave -61.9250000005 563.5500000004 moveto -62.1500000005 567.4500000004 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave -58.7750000005 561.5250000004 moveto -61.9250000005 563.5500000004 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave -56.6000000005 563.6250000004 moveto -58.7750000005 561.5250000004 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave -59.3750000005 566.6250000004 moveto -56.6000000005 563.6250000004 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave -64.4000000005 566.0250000004 moveto -59.3750000005 566.6250000004 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave -67.6250000005 559.8000000004 moveto -64.4000000005 566.0250000004 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave -65.5250000005 557.4750000004 moveto -67.6250000005 559.8000000004 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave -65.2250000005 561.2250000004 moveto -65.5250000005 557.4750000004 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave -70.9250000005 561.6000000004 moveto -65.2250000005 561.2250000004 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave -73.2500000005 557.6250000004 moveto -70.9250000005 561.6000000004 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave -70.3250000005 556.9500000004 moveto -73.2500000005 557.6250000004 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave -70.3250000005 559.0500000004 moveto -70.3250000005 556.9500000004 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave -74.3750000005 561.5250000004 moveto -70.3250000005 559.0500000004 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave -80.5250000005 557.4750000004 moveto -74.3750000005 561.5250000004 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave -80.6750000005 553.8000000004 moveto -80.5250000005 557.4750000004 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave -78.8750000005 551.7000000004 moveto -80.6750000005 553.8000000004 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave -78.5750000005 555.2250000004 moveto -78.8750000005 551.7000000004 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave -82.1000000005 556.3500000004 moveto -78.5750000005 555.2250000004 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave -83.3750000005 552.3750000004 moveto -82.1000000005 556.3500000004 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave -80.6000000005 551.4750000004 moveto -83.3750000005 552.3750000004 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave -83.6000000005 554.7000000004 moveto -80.6000000005 551.4750000004 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave -87.7250000005 552.7500000004 moveto -83.6000000005 554.7000000004 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave -86.0750000005 549.0750000004 moveto -87.7250000005 552.7500000004 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave -85.7750000005 550.5000000004 moveto -86.0750000005 549.0750000004 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave -88.7750000005 552.7500000004 moveto -85.7750000005 550.5000000004 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave -89.9000000005 549.0000000004 moveto -88.7750000005 552.7500000004 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave -87.8000000005 545.3250000004 moveto -89.9000000005 549.0000000004 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave -85.7750000005 538.8750000004 moveto -87.8000000005 545.3250000004 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave -83.4500000005 532.2000000004 moveto -85.7750000005 538.8750000004 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave -79.7750000005 530.9250000004 moveto -83.4500000005 532.2000000004 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave -80.2250000005 534.6000000004 moveto -79.7750000005 530.9250000004 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave -86.2250000005 535.2000000004 moveto -80.2250000005 534.6000000004 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave -89.6750000005 531.0000000004 moveto -86.2250000005 535.2000000004 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave -87.3500000005 525.4500000004 moveto -89.6750000005 531.0000000004 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave -86.3750000005 518.3250000004 moveto -87.3500000005 525.4500000004 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave -85.7750000005 512.5500000004 moveto -86.3750000005 518.3250000004 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave -83.5250000005 513.5250000004 moveto -85.7750000005 512.5500000004 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave -78.8750000005 514.5000000004 moveto -83.5250000005 513.5250000004 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave -73.3250000005 513.6750000004 moveto -78.8750000005 514.5000000004 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave -71.6000000005 514.1250000004 moveto -73.3250000005 513.6750000004 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave -69.9500000005 516.6750000004 moveto -71.6000000005 514.1250000004 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave -67.7000000005 517.2000000004 moveto -69.9500000005 516.6750000004 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave -62.0000000005 518.4000000004 moveto -67.7000000005 517.2000000004 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave -58.3250000005 514.8000000004 moveto -62.0000000005 518.4000000004 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave -57.3500000005 510.3750000004 moveto -58.3250000005 514.8000000004 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave -54.5750000005 508.3500000004 moveto -57.3500000005 510.3750000004 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave -50.2250000005 506.5500000004 moveto -54.5750000005 508.3500000004 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave -44.0000000005 507.8250000004 moveto -50.2250000005 506.5500000004 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave -42.5000000005 509.9250000004 moveto -44.0000000005 507.8250000004 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave -40.1000000005 513.2250000004 moveto -42.5000000005 509.9250000004 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave -37.1750000005 513.0000000004 moveto -40.1000000005 513.2250000004 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave -34.5500000005 509.7750000004 moveto -37.1750000005 513.0000000004 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave -31.7750000005 510.3000000004 moveto -34.5500000005 509.7750000004 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave -32.7500000005 515.6250000004 moveto -31.7750000005 510.3000000004 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave -35.9000000005 519.0750000004 moveto -32.7500000005 515.6250000004 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave -43.1750000005 518.7000000004 moveto -35.9000000005 519.0750000004 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave -44.8250000005 514.7250000004 moveto -43.1750000005 518.7000000004 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave -42.8750000005 513.8250000004 moveto -44.8250000005 514.7250000004 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave -42.0500000005 515.9250000004 moveto -42.8750000005 513.8250000004 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave -39.8750000005 517.5750000004 moveto -42.0500000005 515.9250000004 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave -38.9750000005 514.5750000004 moveto -39.8750000005 517.5750000004 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave -39.2750000005 512.7750000004 moveto -38.9750000005 514.5750000004 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave -37.4750000005 509.1000000004 moveto -39.2750000005 512.7750000004 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave -40.3250000005 504.1500000004 moveto -37.4750000005 509.1000000004 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave -42.9500000005 507.1500000004 moveto -40.3250000005 504.1500000004 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave -43.4000000005 509.7000000004 moveto -42.9500000005 507.1500000004 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave -41.5250000005 504.3750000004 moveto -43.4000000005 509.7000000004 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave -44.9750000005 502.9500000004 moveto -41.5250000005 504.3750000004 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave -46.2500000005 506.6250000004 moveto -44.9750000005 502.9500000004 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave -45.9500000005 507.3000000004 moveto -46.2500000005 506.6250000004 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave -41.9000000005 506.0250000004 moveto -45.9500000005 507.3000000004 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave -32.7500000005 504.5250000004 moveto -41.9000000005 506.0250000004 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave -22.9250000005 504.6750000004 moveto -32.7500000005 504.5250000004 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave -15.9500000005 500.3250000004 moveto -22.9250000005 504.6750000004 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave -11.7500000005 497.6250000004 moveto -15.9500000005 500.3250000004 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave -3.8750000005 493.1250000004 moveto -11.7500000005 497.6250000004 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 5.8749999995 487.5000000004 moveto -3.8750000005 493.1250000004 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 11.2749999995 486.1500000004 moveto 5.8749999995 487.5000000004 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 13.1499999995 489.2250000004 moveto 11.2749999995 486.1500000004 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 9.9999999995 490.8000000004 moveto 13.1499999995 489.2250000004 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 8.9499999995 488.2500000004 moveto 9.9999999995 490.8000000004 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 10.0749999995 483.3750000004 moveto 8.9499999995 488.2500000004 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 15.9999999995 481.8750000004 moveto 10.0749999995 483.3750000004 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 15.6249999995 484.4250000004 moveto 15.9999999995 481.8750000004 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 11.7999999995 482.0250000004 moveto 15.6249999995 484.4250000004 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 14.1249999995 477.45 moveto 11.7999999995 482.0250000004 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 18.6249999995 476.325 moveto 14.1249999995 477.45 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 19.1499999995 478.875 moveto 18.6249999995 476.325 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 15.1749999995 478.125 moveto 19.1499999995 478.875 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 15.0999999995 473.775 moveto 15.1749999995 478.125 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 18.2499999995 470.55 moveto 15.0999999995 473.775 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 20.2749999995 471.525 moveto 18.2499999995 470.55 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 17.6499999995 473.775 moveto 20.2749999995 471.525 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 15.4749999995 470.475 moveto 17.6499999995 473.775 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 17.9499999995 466.575 moveto 15.4749999995 470.475 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 19.1499999995 468.45 moveto 17.9499999995 466.575 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 19.4499999995 470.55 moveto 19.1499999995 468.45 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 24.1749999995 467.175 moveto 19.4499999995 470.55 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 29.4249999995 462.375 moveto 24.1749999995 467.175 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 32.1999999995 462.45 moveto 29.4249999995 462.375 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 32.4999999995 465.9 moveto 32.1999999995 462.45 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 36.2499999995 465.225 moveto 32.4999999995 465.9 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 37.7499999995 461.55 moveto 36.2499999995 465.225 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 35.1249999995 459.45 moveto 37.7499999995 461.55 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 34.4499999995 461.1 moveto 35.1249999995 459.45 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 38.7999999995 460.65 moveto 34.4499999995 461.1 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 37.4499999995 455.55 moveto 38.7999999995 460.65 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 34.8999999995 456 moveto 37.4499999995 455.55 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 37.5999999995 456 moveto 34.8999999995 456 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 37.3749999995 451.425 moveto 37.5999999995 456 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 35.0499999995 453 moveto 37.3749999995 451.425 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 39.0999999995 452.55 moveto 35.0499999995 453 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 42.3999999995 449.175 moveto 39.0999999995 452.55 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 46.6749999995 442.5 moveto 42.3999999995 449.175 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 49.2999999995 436.5 moveto 46.6749999995 442.5 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 54.1749999995 435.675 moveto 49.2999999995 436.5 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 55.4499999995 432.675 moveto 54.1749999995 435.675 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 52.7499999995 428.25 moveto 55.4499999995 432.675 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 49.0749999995 429.6 moveto 52.7499999995 428.25 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 51.8499999995 430.35 moveto 49.0749999995 429.6 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 54.3249999995 424.125 moveto 51.8499999995 430.35 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 58.6749999995 422.55 moveto 54.3249999995 424.125 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 62.0499999995 419.85 moveto 58.6749999995 422.55 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 60.5499999995 415.875 moveto 62.0499999995 419.85 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 58.4499999995 417.225 moveto 60.5499999995 415.875 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 61.6749999995 417.75 moveto 58.4499999995 417.225 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 64.2249999995 413.175 moveto 61.6749999995 417.75 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 70.2999999995 407.7 moveto 64.2249999995 413.175 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 77.2749999995 406.65 moveto 70.2999999995 407.7 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 80.1999999995 405.75 moveto 77.2749999995 406.65 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 85.6749999995 398.925 moveto 80.1999999995 405.75 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 89.5749999995 393.6 moveto 85.6749999995 398.925 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 92.7249999995 389.025 moveto 89.5749999995 393.6 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 95.9499999995 381 moveto 92.7249999995 389.025 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 101.199999999 375.975 moveto 95.9499999995 381 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 102.324999999 372.975 moveto 101.199999999 375.975 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 103.074999999 367.425 moveto 102.324999999 372.975 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 107.874999999 360.375 moveto 103.074999999 367.425 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 113.799999999 353.925 moveto 107.874999999 360.375 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 121.224999999 354.975 moveto 113.799999999 353.925 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 125.649999999 358.5 moveto 121.224999999 354.975 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 125.949999999 364.05 moveto 125.649999999 358.5 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 124.374999999 364.05 moveto 125.949999999 364.05 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 121.149999999 359.625 moveto 124.374999999 364.05 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 121.749999999 353.85 moveto 121.149999999 359.625 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 127.299999999 353.025 moveto 121.749999999 353.85 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 129.699999999 355.575 moveto 127.299999999 353.025 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 127.899999999 359.475 moveto 129.699999999 355.575 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 124.149999999 357.825 moveto 127.899999999 359.475 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 124.224999999 353.4 moveto 124.149999999 357.825 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 127.824999999 353.025 moveto 124.224999999 353.4 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 127.974999999 357.15 moveto 127.824999999 353.025 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 125.724999999 358.05 moveto 127.974999999 357.15 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 122.649999999 354.075 moveto 125.724999999 358.05 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 126.174999999 351.15 moveto 122.649999999 354.075 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 131.799999999 354 moveto 126.174999999 351.15 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 132.924999999 357.675 moveto 131.799999999 354 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 129.024999999 355.575 moveto 132.924999999 357.675 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 128.574999999 350.025 moveto 129.024999999 355.575 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 133.074999999 348.9 moveto 128.574999999 350.025 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 135.624999999 351.3 moveto 133.074999999 348.9 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 134.574999999 353.325 moveto 135.624999999 351.3 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 130.449999999 351.225 moveto 134.574999999 353.325 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 130.149999999 346.575 moveto 130.449999999 351.225 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 135.699999999 346.875 moveto 130.149999999 346.575 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 135.699999999 349.65 moveto 135.699999999 346.875 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 133.599999999 349.65 moveto 135.699999999 349.65 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 133.299999999 345.675 moveto 133.599999999 349.65 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 136.899999999 346.2 moveto 133.299999999 345.675 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 136.749999999 348.75 moveto 136.899999999 346.2 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 134.799999999 348.225 moveto 136.749999999 348.75 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 133.824999999 344.775 moveto 134.799999999 348.225 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 138.324999999 344.175 moveto 133.824999999 344.775 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 140.199999999 347.175 moveto 138.324999999 344.175 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 137.724999999 348.975 moveto 140.199999999 347.175 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 136.074999999 346.875 moveto 137.724999999 348.975 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 137.649999999 342.075 moveto 136.074999999 346.875 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 141.324999999 343.05 moveto 137.649999999 342.075 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 140.424999999 345.825 moveto 141.324999999 343.05 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 138.174999999 342.975 moveto 140.424999999 345.825 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 140.124999999 339.975 moveto 138.174999999 342.975 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 144.099999999 340.725 moveto 140.124999999 339.975 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 143.874999999 344.025 moveto 144.099999999 340.725 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 140.949999999 342.525 moveto 143.874999999 344.025 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 142.599999999 338.175 moveto 140.949999999 342.525 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 147.099999999 337.575 moveto 142.599999999 338.175 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 147.399999999 340.575 moveto 147.099999999 337.575 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 143.724999999 340.725 moveto 147.399999999 340.575 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 142.749999999 337.5 moveto 143.724999999 340.725 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 147.849999999 335.25 moveto 142.749999999 337.5 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 151.074999999 337.35 moveto 147.849999999 335.25 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 147.924999999 338.025 moveto 151.074999999 337.35 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 149.424999999 333.9 moveto 147.924999999 338.025 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 151.974999999 334.425 moveto 149.424999999 333.9 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 153.474999999 336.525 moveto 151.974999999 334.425 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 150.549999999 336.45 moveto 153.474999999 336.525 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 150.774999999 333.225 moveto 150.549999999 336.45 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 154.974999999 330.3 moveto 150.774999999 333.225 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 156.474999999 332.175 moveto 154.974999999 330.3 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 153.249999999 331.875 moveto 156.474999999 332.175 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 155.349999999 327.3 moveto 153.249999999 331.875 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 159.324999999 326.625 moveto 155.349999999 327.3 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 158.424999999 328.95 moveto 159.324999999 326.625 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 155.049999999 326.55 moveto 158.424999999 328.95 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 157.974999999 324.525 moveto 155.049999999 326.55 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 161.424999999 325.05 moveto 157.974999999 324.525 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 159.024999999 325.5 moveto 161.424999999 325.05 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 158.874999999 322.5 moveto 159.024999999 325.5 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 162.924999999 320.175 moveto 158.874999999 322.5 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 163.899999999 322.05 moveto 162.924999999 320.175 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 160.974999999 320.4 moveto 163.899999999 322.05 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 162.399999999 318.825 moveto 160.974999999 320.4 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 165.699999999 317.925 moveto 162.399999999 318.825 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 163.749999999 319.725 moveto 165.699999999 317.925 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 162.774999999 316.5 moveto 163.749999999 319.725 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 166.599999999 315.15 moveto 162.774999999 316.5 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 167.124999999 317.475 moveto 166.599999999 315.15 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 164.499999999 315.825 moveto 167.124999999 317.475 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 167.349999999 312.675 moveto 164.499999999 315.825 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 169.899999999 313.125 moveto 167.349999999 312.675 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 168.174999999 314.7 moveto 169.899999999 313.125 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 166.824999999 311.025 moveto 168.174999999 314.7 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 169.149999999 308.025 moveto 166.824999999 311.025 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 172.749999999 309.45 moveto 169.149999999 308.025 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 170.649999999 311.55 moveto 172.749999999 309.45 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 167.724999999 309.675 moveto 170.649999999 311.55 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 170.049999999 306.45 moveto 167.724999999 309.675 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 173.649999999 305.1 moveto 170.049999999 306.45 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 174.174999999 308.1 moveto 173.649999999 305.1 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 170.874999999 306.45 moveto 174.174999999 308.1 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 172.524999999 302.775 moveto 170.874999999 306.45 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 176.799999999 303.3 moveto 172.524999999 302.775 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 176.424999999 305.175 moveto 176.799999999 303.3 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 174.249999999 302.55 moveto 176.424999999 305.175 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 177.549999999 300.3 moveto 174.249999999 302.55 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 179.274999999 302.85 moveto 177.549999999 300.3 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 176.799999999 302.85 moveto 179.274999999 302.85 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 175.674999999 299.325 moveto 176.799999999 302.85 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 179.799999999 298.95 moveto 175.674999999 299.325 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 179.424999999 300.825 moveto 179.799999999 298.95 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 176.574999999 298.2 moveto 179.424999999 300.825 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 179.199999999 294.75 moveto 176.574999999 298.2 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 182.799999999 296.475 moveto 179.199999999 294.75 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 181.599999999 296.925 moveto 182.799999999 296.475 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 180.399999999 294.075 moveto 181.599999999 296.925 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 183.549999999 293.7 moveto 180.399999999 294.075 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 183.549999999 295.05 moveto 183.549999999 293.7 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 181.149999999 292.5 moveto 183.549999999 295.05 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 184.824999999 291.15 moveto 181.149999999 292.5 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 184.074999999 290.25 moveto 184.824999999 291.15 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 180.849999999 287.175 moveto 184.074999999 290.25 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 180.024999999 287.175 moveto 180.849999999 287.175 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 171.099999999 292.35 moveto 180.024999999 287.175 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 167.199999999 297.6 moveto 171.099999999 292.35 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 168.699999999 302.25 moveto 167.199999999 297.6 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 171.399999999 306.225 moveto 168.699999999 302.25 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 170.199999999 307.8 moveto 171.399999999 306.225 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 168.474999999 305.475 moveto 170.199999999 307.8 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 167.649999999 303.6 moveto 168.474999999 305.475 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 169.674999999 308.25 moveto 167.649999999 303.6 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 169.449999999 310.125 moveto 169.674999999 308.25 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 167.874999999 312.45 moveto 169.449999999 310.125 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 169.899999999 315.45 moveto 167.874999999 312.45 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 173.274999999 322.425 moveto 169.899999999 315.45 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 178.599999999 333.15 moveto 173.274999999 322.425 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 182.649999999 339.975 moveto 178.599999999 333.15 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 185.874999999 346.2 moveto 182.649999999 339.975 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 185.649999999 349.95 moveto 185.874999999 346.2 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 182.274999999 353.1 moveto 185.649999999 349.95 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 179.199999999 354 moveto 182.274999999 353.1 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 179.499999999 356.1 moveto 179.199999999 354 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 182.349999999 361.2 moveto 179.499999999 356.1 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 185.124999999 363.825 moveto 182.349999999 361.2 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 188.349999999 367.8 moveto 185.124999999 363.825 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 188.124999999 371.25 moveto 188.349999999 367.8 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 191.349999999 373.875 moveto 188.124999999 371.25 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 196.674999999 377.4 moveto 191.349999999 373.875 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 201.999999999 378.9 moveto 196.674999999 377.4 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 201.774999999 381.9 moveto 201.999999999 378.9 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 198.474999999 380.175 moveto 201.774999999 381.9 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 195.474999999 375.75 moveto 198.474999999 380.175 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 191.649999999 375 moveto 195.474999999 375.75 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 191.799999999 376.875 moveto 191.649999999 375 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 197.349999999 378.525 moveto 191.799999999 376.875 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 201.249999999 381.6 moveto 197.349999999 378.525 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 199.824999999 385.05 moveto 201.249999999 381.6 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 197.199999999 386.625 moveto 199.824999999 385.05 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 198.174999999 388.95 moveto 197.199999999 386.625 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 202.449999999 394.8 moveto 198.174999999 388.95 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 205.524999999 397.875 moveto 202.449999999 394.8 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 209.274999999 400.5 moveto 205.524999999 397.875 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 212.349999999 402.6 moveto 209.274999999 400.5 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 215.199999999 406.35 moveto 212.349999999 402.6 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 213.849999999 408.45 moveto 215.199999999 406.35 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 211.824999999 404.025 moveto 213.849999999 408.45 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 208.074999999 401.4 moveto 211.824999999 404.025 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 203.949999999 399.45 moveto 208.074999999 401.4 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 202.674999999 401.325 moveto 203.949999999 399.45 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 206.649999999 402.3 moveto 202.674999999 401.325 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 210.399999999 403.95 moveto 206.649999999 402.3 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 210.924999999 407.25 moveto 210.399999999 403.95 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 206.799999999 403.725 moveto 210.924999999 407.25 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 203.724999999 402.225 moveto 206.799999999 403.725 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 206.274999999 403.2 moveto 203.724999999 402.225 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 206.574999999 406.2 moveto 206.274999999 403.2 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 205.224999999 404.325 moveto 206.574999999 406.2 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 202.524999999 402.675 moveto 205.224999999 404.325 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 201.099999999 403.575 moveto 202.524999999 402.675 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 203.649999999 405 moveto 201.099999999 403.575 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 211.449999999 404.925 moveto 203.649999999 405 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 212.799999999 408.9 moveto 211.449999999 404.925 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 210.999999999 410.025 moveto 212.799999999 408.9 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 207.099999999 408.3 moveto 210.999999999 410.025 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 203.874999999 402.975 moveto 207.099999999 408.3 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 202.149999999 402.675 moveto 203.874999999 402.975 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 204.999999999 406.425 moveto 202.149999999 402.675 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 204.324999999 406.65 moveto 204.999999999 406.425 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 199.824999999 407.775 moveto 204.324999999 406.65 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 199 405 moveto 199.824999999 407.775 lineto 2 setlinewidth 0 setlinecap 1 setlinejoin 0.937 0.604 0.000 setrgbcolor AdjustColor stroke grestore gsave 199 405 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 199 405 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 199.824999999 407.775 moveto 2 0 rlineto 0 -1.99999999999997 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 199.824999999 407.775 moveto 2 0 rlineto 0 -1.99999999999997 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 204.324999999 406.65 moveto 2 0 rlineto 0 -1.99999999999997 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 204.324999999 406.65 moveto 2 0 rlineto 0 -1.99999999999997 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 204.999999999 406.425 moveto 2 0 rlineto 0 -2.00000000000003 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 204.999999999 406.425 moveto 2 0 rlineto 0 -2.00000000000003 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 202.149999999 402.675 moveto 2 0 rlineto 0 -2.00000000000003 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 202.149999999 402.675 moveto 2 0 rlineto 0 -2.00000000000003 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 203.874999999 402.975 moveto 2 0 rlineto 0 -2.00000000000003 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 203.874999999 402.975 moveto 2 0 rlineto 0 -2.00000000000003 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 207.099999999 408.3 moveto 2 0 rlineto 0 -2.00000000000003 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 207.099999999 408.3 moveto 2 0 rlineto 0 -2.00000000000003 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 210.999999999 410.025 moveto 2 0 rlineto 0 -1.99999999999997 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 210.999999999 410.025 moveto 2 0 rlineto 0 -1.99999999999997 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 212.799999999 408.9 moveto 2 0 rlineto 0 -1.99999999999997 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 212.799999999 408.9 moveto 2 0 rlineto 0 -1.99999999999997 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 211.449999999 404.925 moveto 2 0 rlineto 0 -2.00000000000003 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 211.449999999 404.925 moveto 2 0 rlineto 0 -2.00000000000003 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave /Fixed findfont 12 scalefont ISOEncode setfont 0.812 0.412 0.796 setrgbcolor AdjustColor 212.449999999 411.925 [ (10) ] 13 -0.5 0.5 0.5 false DrawText grestore gsave 203.649999999 405 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 203.649999999 405 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 201.099999999 403.575 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 201.099999999 403.575 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 202.524999999 402.675 moveto 2 0 rlineto 0 -2.00000000000003 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 202.524999999 402.675 moveto 2 0 rlineto 0 -2.00000000000003 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 205.224999999 404.325 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 205.224999999 404.325 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 206.574999999 406.2 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 206.574999999 406.2 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 206.274999999 403.2 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 206.274999999 403.2 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 203.724999999 402.225 moveto 2 0 rlineto 0 -2.00000000000003 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 203.724999999 402.225 moveto 2 0 rlineto 0 -2.00000000000003 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 206.799999999 403.725 moveto 2 0 rlineto 0 -2.00000000000003 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 206.799999999 403.725 moveto 2 0 rlineto 0 -2.00000000000003 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 210.924999999 407.25 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 210.924999999 407.25 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 210.399999999 403.95 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 210.399999999 403.95 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave /Fixed findfont 12 scalefont ISOEncode setfont 0.812 0.412 0.796 setrgbcolor AdjustColor 211.399999999 410.95 [ (20) ] 13 -0.5 0.5 0.5 false DrawText grestore gsave 206.649999999 402.3 moveto 2 0 rlineto 0 -2.00000000000003 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 206.649999999 402.3 moveto 2 0 rlineto 0 -2.00000000000003 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 202.674999999 401.325 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 202.674999999 401.325 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 203.949999999 399.45 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 203.949999999 399.45 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 208.074999999 401.4 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 208.074999999 401.4 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 211.824999999 404.025 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 211.824999999 404.025 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 213.849999999 408.45 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 213.849999999 408.45 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 215.199999999 406.35 moveto 2 0 rlineto 0 -2.00000000000003 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 215.199999999 406.35 moveto 2 0 rlineto 0 -2.00000000000003 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 212.349999999 402.6 moveto 2 0 rlineto 0 -2.00000000000003 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 212.349999999 402.6 moveto 2 0 rlineto 0 -2.00000000000003 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 209.274999999 400.5 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 209.274999999 400.5 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 205.524999999 397.875 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 205.524999999 397.875 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave /Fixed findfont 12 scalefont ISOEncode setfont 0.812 0.412 0.796 setrgbcolor AdjustColor 206.524999999 404.875 [ (30) ] 13 -0.5 0.5 0.5 false DrawText grestore gsave 202.449999999 394.8 moveto 2 0 rlineto 0 -2.00000000000003 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 202.449999999 394.8 moveto 2 0 rlineto 0 -2.00000000000003 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 198.174999999 388.95 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 198.174999999 388.95 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 197.199999999 386.625 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 197.199999999 386.625 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 199.824999999 385.05 moveto 2 0 rlineto 0 -2.00000000000003 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 199.824999999 385.05 moveto 2 0 rlineto 0 -2.00000000000003 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 201.249999999 381.6 moveto 2 0 rlineto 0 -2.00000000000003 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 201.249999999 381.6 moveto 2 0 rlineto 0 -2.00000000000003 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 197.349999999 378.525 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 197.349999999 378.525 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 191.799999999 376.875 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 191.799999999 376.875 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 191.649999999 375 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 191.649999999 375 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 195.474999999 375.75 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 195.474999999 375.75 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 198.474999999 380.175 moveto 2 0 rlineto 0 -2.00000000000003 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 198.474999999 380.175 moveto 2 0 rlineto 0 -2.00000000000003 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave /Fixed findfont 12 scalefont ISOEncode setfont 0.812 0.412 0.796 setrgbcolor AdjustColor 199.474999999 387.175 [ (40) ] 13 -0.5 0.5 0.5 false DrawText grestore gsave 201.774999999 381.9 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 201.774999999 381.9 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 201.999999999 378.9 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 201.999999999 378.9 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 196.674999999 377.4 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 196.674999999 377.4 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 191.349999999 373.875 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 191.349999999 373.875 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 188.124999999 371.25 moveto 2.00000000000003 0 rlineto 0 -2 rlineto -2.00000000000003 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 188.124999999 371.25 moveto 2.00000000000003 0 rlineto 0 -2 rlineto -2.00000000000003 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 188.349999999 367.8 moveto 2.00000000000003 0 rlineto 0 -2.00000000000003 rlineto -2.00000000000003 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 188.349999999 367.8 moveto 2.00000000000003 0 rlineto 0 -2.00000000000003 rlineto -2.00000000000003 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 185.124999999 363.825 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 185.124999999 363.825 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 182.349999999 361.2 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 182.349999999 361.2 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 179.499999999 356.1 moveto 2 0 rlineto 0 -2.00000000000003 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 179.499999999 356.1 moveto 2 0 rlineto 0 -2.00000000000003 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 179.199999999 354 moveto 2 0 rlineto 0 -1.99999999999997 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 179.199999999 354 moveto 2 0 rlineto 0 -1.99999999999997 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave /Fixed findfont 12 scalefont ISOEncode setfont 0.812 0.412 0.796 setrgbcolor AdjustColor 180.199999999 361 [ (50) ] 13 -0.5 0.5 0.5 false DrawText grestore gsave 182.274999999 353.1 moveto 2 0 rlineto 0 -2.00000000000003 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 182.274999999 353.1 moveto 2 0 rlineto 0 -2.00000000000003 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 185.649999999 349.95 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 185.649999999 349.95 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 185.874999999 346.2 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 185.874999999 346.2 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 182.649999999 339.975 moveto 2 0 rlineto 0 -2.00000000000003 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 182.649999999 339.975 moveto 2 0 rlineto 0 -2.00000000000003 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 178.599999999 333.15 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 178.599999999 333.15 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 173.274999999 322.425 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 173.274999999 322.425 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 169.899999999 315.45 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 169.899999999 315.45 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 167.874999999 312.45 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 167.874999999 312.45 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 169.449999999 310.125 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 169.449999999 310.125 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 169.674999999 308.25 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 169.674999999 308.25 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave /Fixed findfont 12 scalefont ISOEncode setfont 0.812 0.412 0.796 setrgbcolor AdjustColor 170.674999999 315.25 [ (60) ] 13 -0.5 0.5 0.5 false DrawText grestore gsave 167.649999999 303.6 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 167.649999999 303.6 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 168.474999999 305.475 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 168.474999999 305.475 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 170.199999999 307.8 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 170.199999999 307.8 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 171.399999999 306.225 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 171.399999999 306.225 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 168.699999999 302.25 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 168.699999999 302.25 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 167.199999999 297.6 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 167.199999999 297.6 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 171.099999999 292.35 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 171.099999999 292.35 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 180.024999999 287.175 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 180.024999999 287.175 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 180.849999999 287.175 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 180.849999999 287.175 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 184.074999999 290.25 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 184.074999999 290.25 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave /Fixed findfont 12 scalefont ISOEncode setfont 0.812 0.412 0.796 setrgbcolor AdjustColor 185.074999999 297.25 [ (70) ] 13 -0.5 0.5 0.5 false DrawText grestore gsave 184.824999999 291.15 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 184.824999999 291.15 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 181.149999999 292.5 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 181.149999999 292.5 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 183.549999999 295.05 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 183.549999999 295.05 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 183.549999999 293.7 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 183.549999999 293.7 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 180.399999999 294.075 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 180.399999999 294.075 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 181.599999999 296.925 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 181.599999999 296.925 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 182.799999999 296.475 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 182.799999999 296.475 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 179.199999999 294.75 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 179.199999999 294.75 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 176.574999999 298.2 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 176.574999999 298.2 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 179.424999999 300.825 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 179.424999999 300.825 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave /Fixed findfont 12 scalefont ISOEncode setfont 0.812 0.412 0.796 setrgbcolor AdjustColor 180.424999999 307.825 [ (80) ] 13 -0.5 0.5 0.5 false DrawText grestore gsave 179.799999999 298.95 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 179.799999999 298.95 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 175.674999999 299.325 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 175.674999999 299.325 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 176.799999999 302.85 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 176.799999999 302.85 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 179.274999999 302.85 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 179.274999999 302.85 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 177.549999999 300.3 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 177.549999999 300.3 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 174.249999999 302.55 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 174.249999999 302.55 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 176.424999999 305.175 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 176.424999999 305.175 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 176.799999999 303.3 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 176.799999999 303.3 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 172.524999999 302.775 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 172.524999999 302.775 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 170.874999999 306.45 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 170.874999999 306.45 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave /Fixed findfont 12 scalefont ISOEncode setfont 0.812 0.412 0.796 setrgbcolor AdjustColor 171.874999999 313.45 [ (90) ] 13 -0.5 0.5 0.5 false DrawText grestore gsave 174.174999999 308.1 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 174.174999999 308.1 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 173.649999999 305.1 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 173.649999999 305.1 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 170.049999999 306.45 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 170.049999999 306.45 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 167.724999999 309.675 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 167.724999999 309.675 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 170.649999999 311.55 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 170.649999999 311.55 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 172.749999999 309.45 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 172.749999999 309.45 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 169.149999999 308.025 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 169.149999999 308.025 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 166.824999999 311.025 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 166.824999999 311.025 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 168.174999999 314.7 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 168.174999999 314.7 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 169.899999999 313.125 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 169.899999999 313.125 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave /Fixed findfont 12 scalefont ISOEncode setfont 0.812 0.412 0.796 setrgbcolor AdjustColor 170.899999999 320.125 [ (100) ] 13 -0.5 0.5 0.5 false DrawText grestore gsave 167.349999999 312.675 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 167.349999999 312.675 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 164.499999999 315.825 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 164.499999999 315.825 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 167.124999999 317.475 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 167.124999999 317.475 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 166.599999999 315.15 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 166.599999999 315.15 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 162.774999999 316.5 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 162.774999999 316.5 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 163.749999999 319.725 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 163.749999999 319.725 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 165.699999999 317.925 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 165.699999999 317.925 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 162.399999999 318.825 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 162.399999999 318.825 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 160.974999999 320.4 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 160.974999999 320.4 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 163.899999999 322.05 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 163.899999999 322.05 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave /Fixed findfont 12 scalefont ISOEncode setfont 0.812 0.412 0.796 setrgbcolor AdjustColor 164.899999999 329.05 [ (110) ] 13 -0.5 0.5 0.5 false DrawText grestore gsave 162.924999999 320.175 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 162.924999999 320.175 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 158.874999999 322.5 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 158.874999999 322.5 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 159.024999999 325.5 moveto 2 0 rlineto 0 -1.99999999999997 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 159.024999999 325.5 moveto 2 0 rlineto 0 -1.99999999999997 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 161.424999999 325.05 moveto 2 0 rlineto 0 -2.00000000000003 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 161.424999999 325.05 moveto 2 0 rlineto 0 -2.00000000000003 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 157.974999999 324.525 moveto 2 0 rlineto 0 -2.00000000000006 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 157.974999999 324.525 moveto 2 0 rlineto 0 -2.00000000000006 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 155.049999999 326.55 moveto 2 0 rlineto 0 -2.00000000000003 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 155.049999999 326.55 moveto 2 0 rlineto 0 -2.00000000000003 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 158.424999999 328.95 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 158.424999999 328.95 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 159.324999999 326.625 moveto 2 0 rlineto 0 -1.99999999999997 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 159.324999999 326.625 moveto 2 0 rlineto 0 -1.99999999999997 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 155.349999999 327.3 moveto 2 0 rlineto 0 -2.00000000000003 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 155.349999999 327.3 moveto 2 0 rlineto 0 -2.00000000000003 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 153.249999999 331.875 moveto 2 0 rlineto 0 -1.99999999999997 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 153.249999999 331.875 moveto 2 0 rlineto 0 -1.99999999999997 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave /Fixed findfont 12 scalefont ISOEncode setfont 0.812 0.412 0.796 setrgbcolor AdjustColor 154.249999999 338.875 [ (120) ] 13 -0.5 0.5 0.5 false DrawText grestore gsave 156.474999999 332.175 moveto 2 0 rlineto 0 -2.00000000000003 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 156.474999999 332.175 moveto 2 0 rlineto 0 -2.00000000000003 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 154.974999999 330.3 moveto 2 0 rlineto 0 -2.00000000000003 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 154.974999999 330.3 moveto 2 0 rlineto 0 -2.00000000000003 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 150.774999999 333.225 moveto 2 0 rlineto 0 -2.00000000000003 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 150.774999999 333.225 moveto 2 0 rlineto 0 -2.00000000000003 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 150.549999999 336.45 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 150.549999999 336.45 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 153.474999999 336.525 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 153.474999999 336.525 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 151.974999999 334.425 moveto 2 0 rlineto 0 -2.00000000000003 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 151.974999999 334.425 moveto 2 0 rlineto 0 -2.00000000000003 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 149.424999999 333.9 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 149.424999999 333.9 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 147.924999999 338.025 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 147.924999999 338.025 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 151.074999999 337.35 moveto 2 0 rlineto 0 -2.00000000000003 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 151.074999999 337.35 moveto 2 0 rlineto 0 -2.00000000000003 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 147.849999999 335.25 moveto 2 0 rlineto 0 -1.99999999999997 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 147.849999999 335.25 moveto 2 0 rlineto 0 -1.99999999999997 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave /Fixed findfont 12 scalefont ISOEncode setfont 0.812 0.412 0.796 setrgbcolor AdjustColor 148.849999999 342.25 [ (130) ] 13 -0.5 0.5 0.5 false DrawText grestore gsave 142.749999999 337.5 moveto 2 0 rlineto 0 -1.99999999999997 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 142.749999999 337.5 moveto 2 0 rlineto 0 -1.99999999999997 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 143.724999999 340.725 moveto 2 0 rlineto 0 -2.00000000000003 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 143.724999999 340.725 moveto 2 0 rlineto 0 -2.00000000000003 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 147.399999999 340.575 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 147.399999999 340.575 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 147.099999999 337.575 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 147.099999999 337.575 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 142.599999999 338.175 moveto 2 0 rlineto 0 -2.00000000000003 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 142.599999999 338.175 moveto 2 0 rlineto 0 -2.00000000000003 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 140.949999999 342.525 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 140.949999999 342.525 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 143.874999999 344.025 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 143.874999999 344.025 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 144.099999999 340.725 moveto 2 0 rlineto 0 -2.00000000000003 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 144.099999999 340.725 moveto 2 0 rlineto 0 -2.00000000000003 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 140.124999999 339.975 moveto 2 0 rlineto 0 -2.00000000000003 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 140.124999999 339.975 moveto 2 0 rlineto 0 -2.00000000000003 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 138.174999999 342.975 moveto 2 0 rlineto 0 -2.00000000000003 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 138.174999999 342.975 moveto 2 0 rlineto 0 -2.00000000000003 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave /Fixed findfont 12 scalefont ISOEncode setfont 0.812 0.412 0.796 setrgbcolor AdjustColor 139.174999999 349.975 [ (140) ] 13 -0.5 0.5 0.5 false DrawText grestore gsave 140.424999999 345.825 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 140.424999999 345.825 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 141.324999999 343.05 moveto 2 0 rlineto 0 -2.00000000000003 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 141.324999999 343.05 moveto 2 0 rlineto 0 -2.00000000000003 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 137.649999999 342.075 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 137.649999999 342.075 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 136.074999999 346.875 moveto 2 0 rlineto 0 -1.99999999999997 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 136.074999999 346.875 moveto 2 0 rlineto 0 -1.99999999999997 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 137.724999999 348.975 moveto 2 0 rlineto 0 -2.00000000000003 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 137.724999999 348.975 moveto 2 0 rlineto 0 -2.00000000000003 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 140.199999999 347.175 moveto 2 0 rlineto 0 -2.00000000000003 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 140.199999999 347.175 moveto 2 0 rlineto 0 -2.00000000000003 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 138.324999999 344.175 moveto 2 0 rlineto 0 -2.00000000000003 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 138.324999999 344.175 moveto 2 0 rlineto 0 -2.00000000000003 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 133.824999999 344.775 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 133.824999999 344.775 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 134.799999999 348.225 moveto 2 0 rlineto 0 -2.00000000000003 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 134.799999999 348.225 moveto 2 0 rlineto 0 -2.00000000000003 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 136.749999999 348.75 moveto 2 0 rlineto 0 -1.99999999999997 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 136.749999999 348.75 moveto 2 0 rlineto 0 -1.99999999999997 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave /Fixed findfont 12 scalefont ISOEncode setfont 0.812 0.412 0.796 setrgbcolor AdjustColor 137.749999999 355.75 [ (150) ] 13 -0.5 0.5 0.5 false DrawText grestore gsave 136.899999999 346.2 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 136.899999999 346.2 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 133.299999999 345.675 moveto 2 0 rlineto 0 -2.00000000000003 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 133.299999999 345.675 moveto 2 0 rlineto 0 -2.00000000000003 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 133.599999999 349.65 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 133.599999999 349.65 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 135.699999999 349.65 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 135.699999999 349.65 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 135.699999999 346.875 moveto 2 0 rlineto 0 -1.99999999999997 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 135.699999999 346.875 moveto 2 0 rlineto 0 -1.99999999999997 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 130.149999999 346.575 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 130.149999999 346.575 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 130.449999999 351.225 moveto 2 0 rlineto 0 -2.00000000000003 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 130.449999999 351.225 moveto 2 0 rlineto 0 -2.00000000000003 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 134.574999999 353.325 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 134.574999999 353.325 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 135.624999999 351.3 moveto 2 0 rlineto 0 -2.00000000000003 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 135.624999999 351.3 moveto 2 0 rlineto 0 -2.00000000000003 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 133.074999999 348.9 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 133.074999999 348.9 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave /Fixed findfont 12 scalefont ISOEncode setfont 0.812 0.412 0.796 setrgbcolor AdjustColor 134.074999999 355.9 [ (160) ] 13 -0.5 0.5 0.5 false DrawText grestore gsave 128.574999999 350.025 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 128.574999999 350.025 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 129.024999999 355.575 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 129.024999999 355.575 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 132.924999999 357.675 moveto 2 0 rlineto 0 -2.00000000000003 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 132.924999999 357.675 moveto 2 0 rlineto 0 -2.00000000000003 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 131.799999999 354 moveto 2 0 rlineto 0 -1.99999999999997 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 131.799999999 354 moveto 2 0 rlineto 0 -1.99999999999997 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 126.174999999 351.15 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 126.174999999 351.15 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 122.649999999 354.075 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 122.649999999 354.075 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 125.724999999 358.05 moveto 2 0 rlineto 0 -2.00000000000003 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 125.724999999 358.05 moveto 2 0 rlineto 0 -2.00000000000003 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 127.974999999 357.15 moveto 1.99999999999999 0 rlineto 0 -2 rlineto -1.99999999999999 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 127.974999999 357.15 moveto 1.99999999999999 0 rlineto 0 -2 rlineto -1.99999999999999 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 127.824999999 353.025 moveto 1.99999999999999 0 rlineto 0 -2 rlineto -1.99999999999999 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 127.824999999 353.025 moveto 1.99999999999999 0 rlineto 0 -2 rlineto -1.99999999999999 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 124.224999999 353.4 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 124.224999999 353.4 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave /Fixed findfont 12 scalefont ISOEncode setfont 0.812 0.412 0.796 setrgbcolor AdjustColor 125.224999999 360.4 [ (170) ] 13 -0.5 0.5 0.5 false DrawText grestore gsave 124.149999999 357.825 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 124.149999999 357.825 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 127.899999999 359.475 moveto 2 0 rlineto 0 -2.00000000000003 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 127.899999999 359.475 moveto 2 0 rlineto 0 -2.00000000000003 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 129.699999999 355.575 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 129.699999999 355.575 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 127.299999999 353.025 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 127.299999999 353.025 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 121.749999999 353.85 moveto 2 0 rlineto 0 -2.00000000000003 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 121.749999999 353.85 moveto 2 0 rlineto 0 -2.00000000000003 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 121.149999999 359.625 moveto 2 0 rlineto 0 -1.99999999999997 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 121.149999999 359.625 moveto 2 0 rlineto 0 -1.99999999999997 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 124.374999999 364.05 moveto 2 0 rlineto 0 -2.00000000000003 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 124.374999999 364.05 moveto 2 0 rlineto 0 -2.00000000000003 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 125.949999999 364.05 moveto 2 0 rlineto 0 -2.00000000000003 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 125.949999999 364.05 moveto 2 0 rlineto 0 -2.00000000000003 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 125.649999999 358.5 moveto 2 0 rlineto 0 -1.99999999999997 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 125.649999999 358.5 moveto 2 0 rlineto 0 -1.99999999999997 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 121.224999999 354.975 moveto 2 0 rlineto 0 -2.00000000000003 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 121.224999999 354.975 moveto 2 0 rlineto 0 -2.00000000000003 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave /Fixed findfont 12 scalefont ISOEncode setfont 0.812 0.412 0.796 setrgbcolor AdjustColor 122.224999999 361.975 [ (180) ] 13 -0.5 0.5 0.5 false DrawText grestore gsave 113.799999999 353.925 moveto 2 0 rlineto 0 -2.00000000000003 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 113.799999999 353.925 moveto 2 0 rlineto 0 -2.00000000000003 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 107.874999999 360.375 moveto 2 0 rlineto 0 -1.99999999999997 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 107.874999999 360.375 moveto 2 0 rlineto 0 -1.99999999999997 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 103.074999999 367.425 moveto 2 0 rlineto 0 -2.00000000000003 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 103.074999999 367.425 moveto 2 0 rlineto 0 -2.00000000000003 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 102.324999999 372.975 moveto 2 0 rlineto 0 -2.00000000000003 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 102.324999999 372.975 moveto 2 0 rlineto 0 -2.00000000000003 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 101.199999999 375.975 moveto 2 0 rlineto 0 -2.00000000000003 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 101.199999999 375.975 moveto 2 0 rlineto 0 -2.00000000000003 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 95.9499999995 381 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 95.9499999995 381 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 92.7249999995 389.025 moveto 2.00000000000001 0 rlineto 0 -2 rlineto -2.00000000000001 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 92.7249999995 389.025 moveto 2.00000000000001 0 rlineto 0 -2 rlineto -2.00000000000001 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 89.5749999995 393.6 moveto 2 0 rlineto 0 -2.00000000000003 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 89.5749999995 393.6 moveto 2 0 rlineto 0 -2.00000000000003 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 85.6749999995 398.925 moveto 2 0 rlineto 0 -2.00000000000003 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 85.6749999995 398.925 moveto 2 0 rlineto 0 -2.00000000000003 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 80.1999999995 405.75 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 80.1999999995 405.75 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave /Fixed findfont 12 scalefont ISOEncode setfont 0.812 0.412 0.796 setrgbcolor AdjustColor 81.1999999995 412.75 [ (190) ] 13 -0.5 0.5 0.5 false DrawText grestore gsave 77.2749999995 406.65 moveto 2 0 rlineto 0 -1.99999999999997 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 77.2749999995 406.65 moveto 2 0 rlineto 0 -1.99999999999997 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 70.2999999995 407.7 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 70.2999999995 407.7 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 64.2249999995 413.175 moveto 2 0 rlineto 0 -2.00000000000003 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 64.2249999995 413.175 moveto 2 0 rlineto 0 -2.00000000000003 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 61.6749999995 417.75 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 61.6749999995 417.75 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 58.4499999995 417.225 moveto 2 0 rlineto 0 -2.00000000000003 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 58.4499999995 417.225 moveto 2 0 rlineto 0 -2.00000000000003 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 60.5499999995 415.875 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 60.5499999995 415.875 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 62.0499999995 419.85 moveto 1.99999999999999 0 rlineto 0 -2.00000000000003 rlineto -1.99999999999999 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 62.0499999995 419.85 moveto 1.99999999999999 0 rlineto 0 -2.00000000000003 rlineto -1.99999999999999 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 58.6749999995 422.55 moveto 2 0 rlineto 0 -2.00000000000003 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 58.6749999995 422.55 moveto 2 0 rlineto 0 -2.00000000000003 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 54.3249999995 424.125 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 54.3249999995 424.125 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 51.8499999995 430.35 moveto 2 0 rlineto 0 -2.00000000000003 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 51.8499999995 430.35 moveto 2 0 rlineto 0 -2.00000000000003 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave /Fixed findfont 12 scalefont ISOEncode setfont 0.812 0.412 0.796 setrgbcolor AdjustColor 52.8499999995 437.35 [ (200) ] 13 -0.5 0.5 0.5 false DrawText grestore gsave 49.0749999995 429.6 moveto 2 0 rlineto 0 -2.00000000000003 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 49.0749999995 429.6 moveto 2 0 rlineto 0 -2.00000000000003 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 52.7499999995 428.25 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 52.7499999995 428.25 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 55.4499999995 432.675 moveto 2 0 rlineto 0 -2.00000000000003 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 55.4499999995 432.675 moveto 2 0 rlineto 0 -2.00000000000003 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 54.1749999995 435.675 moveto 2 0 rlineto 0 -2.00000000000003 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 54.1749999995 435.675 moveto 2 0 rlineto 0 -2.00000000000003 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 49.2999999995 436.5 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 49.2999999995 436.5 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 46.6749999995 442.5 moveto 1.99999999999999 0 rlineto 0 -2 rlineto -1.99999999999999 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 46.6749999995 442.5 moveto 1.99999999999999 0 rlineto 0 -2 rlineto -1.99999999999999 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 42.3999999995 449.175 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 42.3999999995 449.175 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 39.0999999995 452.55 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 39.0999999995 452.55 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 35.0499999995 453 moveto 2 0 rlineto 0 -1.99999999999999 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 35.0499999995 453 moveto 2 0 rlineto 0 -1.99999999999999 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 37.3749999995 451.425 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 37.3749999995 451.425 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave /Fixed findfont 12 scalefont ISOEncode setfont 0.812 0.412 0.796 setrgbcolor AdjustColor 38.3749999995 458.425 [ (210) ] 13 -0.5 0.5 0.5 false DrawText grestore gsave 37.5999999995 456 moveto 2 0 rlineto 0 -1.99999999999999 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 37.5999999995 456 moveto 2 0 rlineto 0 -1.99999999999999 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 34.8999999995 456 moveto 2 0 rlineto 0 -1.99999999999999 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 34.8999999995 456 moveto 2 0 rlineto 0 -1.99999999999999 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 37.4499999995 455.55 moveto 2 0 rlineto 0 -2.00000000000001 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 37.4499999995 455.55 moveto 2 0 rlineto 0 -2.00000000000001 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 38.7999999995 460.65 moveto 2 0 rlineto 0 -2.00000000000001 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 38.7999999995 460.65 moveto 2 0 rlineto 0 -2.00000000000001 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 34.4499999995 461.1 moveto 2 0 rlineto 0 -2.00000000000003 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 34.4499999995 461.1 moveto 2 0 rlineto 0 -2.00000000000003 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 35.1249999995 459.45 moveto 2 0 rlineto 0 -2.00000000000003 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 35.1249999995 459.45 moveto 2 0 rlineto 0 -2.00000000000003 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 37.7499999995 461.55 moveto 2 0 rlineto 0 -2.00000000000001 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 37.7499999995 461.55 moveto 2 0 rlineto 0 -2.00000000000001 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 36.2499999995 465.225 moveto 2 0 rlineto 0 -2.00000000000003 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 36.2499999995 465.225 moveto 2 0 rlineto 0 -2.00000000000003 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 32.4999999995 465.9 moveto 2 0 rlineto 0 -2.00000000000001 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 32.4999999995 465.9 moveto 2 0 rlineto 0 -2.00000000000001 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 32.1999999995 462.45 moveto 2 0 rlineto 0 -2.00000000000003 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 32.1999999995 462.45 moveto 2 0 rlineto 0 -2.00000000000003 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave /Fixed findfont 12 scalefont ISOEncode setfont 0.812 0.412 0.796 setrgbcolor AdjustColor 33.1999999995 469.45 [ (220) ] 13 -0.5 0.5 0.5 false DrawText grestore gsave 29.4249999995 462.375 moveto 2 0 rlineto 0 -1.99999999999999 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 29.4249999995 462.375 moveto 2 0 rlineto 0 -1.99999999999999 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 24.1749999995 467.175 moveto 2 0 rlineto 0 -2.00000000000001 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 24.1749999995 467.175 moveto 2 0 rlineto 0 -2.00000000000001 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 19.4499999995 470.55 moveto 2 0 rlineto 0 -2.00000000000001 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 19.4499999995 470.55 moveto 2 0 rlineto 0 -2.00000000000001 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 19.1499999995 468.45 moveto 2 0 rlineto 0 -2.00000000000003 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 19.1499999995 468.45 moveto 2 0 rlineto 0 -2.00000000000003 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 17.9499999995 466.575 moveto 2 0 rlineto 0 -2.00000000000003 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 17.9499999995 466.575 moveto 2 0 rlineto 0 -2.00000000000003 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 15.4749999995 470.475 moveto 2 0 rlineto 0 -2.00000000000003 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 15.4749999995 470.475 moveto 2 0 rlineto 0 -2.00000000000003 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 17.6499999995 473.775 moveto 2 0 rlineto 0 -2.00000000000001 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 17.6499999995 473.775 moveto 2 0 rlineto 0 -2.00000000000001 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 20.2749999995 471.525 moveto 2 0 rlineto 0 -2.00000000000001 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 20.2749999995 471.525 moveto 2 0 rlineto 0 -2.00000000000001 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 18.2499999995 470.55 moveto 2 0 rlineto 0 -2.00000000000001 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 18.2499999995 470.55 moveto 2 0 rlineto 0 -2.00000000000001 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 15.0999999995 473.775 moveto 2 0 rlineto 0 -2.00000000000001 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 15.0999999995 473.775 moveto 2 0 rlineto 0 -2.00000000000001 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave /Fixed findfont 12 scalefont ISOEncode setfont 0.812 0.412 0.796 setrgbcolor AdjustColor 16.0999999995 480.775 [ (230) ] 13 -0.5 0.5 0.5 false DrawText grestore gsave 15.1749999995 478.125 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 15.1749999995 478.125 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 19.1499999995 478.875 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 19.1499999995 478.875 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 18.6249999995 476.325 moveto 2 0 rlineto 0 -2.00000000000003 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 18.6249999995 476.325 moveto 2 0 rlineto 0 -2.00000000000003 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 14.1249999995 477.45 moveto 2 0 rlineto 0 -2.00000000000003 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 14.1249999995 477.45 moveto 2 0 rlineto 0 -2.00000000000003 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 11.7999999995 482.0250000004 moveto 2 0 rlineto 0 -1.99999999999999 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 11.7999999995 482.0250000004 moveto 2 0 rlineto 0 -1.99999999999999 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 15.6249999995 484.4250000004 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 15.6249999995 484.4250000004 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 15.9999999995 481.8750000004 moveto 2 0 rlineto 0 -2.00000000000001 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 15.9999999995 481.8750000004 moveto 2 0 rlineto 0 -2.00000000000001 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 10.0749999995 483.3750000004 moveto 2 0 rlineto 0 -2.00000000000001 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 10.0749999995 483.3750000004 moveto 2 0 rlineto 0 -2.00000000000001 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 8.9499999995 488.2500000004 moveto 2 0 rlineto 0 -2.00000000000001 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 8.9499999995 488.2500000004 moveto 2 0 rlineto 0 -2.00000000000001 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 9.9999999995 490.8000000004 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 9.9999999995 490.8000000004 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave /Fixed findfont 12 scalefont ISOEncode setfont 0.812 0.412 0.796 setrgbcolor AdjustColor 10.9999999995 497.8000000004 [ (240) ] 13 -0.5 0.5 0.5 false DrawText grestore gsave 13.1499999995 489.2250000004 moveto 2 0 rlineto 0 -1.99999999999997 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 13.1499999995 489.2250000004 moveto 2 0 rlineto 0 -1.99999999999997 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 11.2749999995 486.1500000004 moveto 2 0 rlineto 0 -1.99999999999999 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 11.2749999995 486.1500000004 moveto 2 0 rlineto 0 -1.99999999999999 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 5.8749999995 487.5000000004 moveto 2 0 rlineto 0 -2.00000000000001 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 5.8749999995 487.5000000004 moveto 2 0 rlineto 0 -2.00000000000001 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave -3.8750000005 493.1250000004 moveto 2 0 rlineto 0 -2.00000000000001 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill -3.8750000005 493.1250000004 moveto 2 0 rlineto 0 -2.00000000000001 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave -11.7500000005 497.6250000004 moveto 2 0 rlineto 0 -2.00000000000001 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill -11.7500000005 497.6250000004 moveto 2 0 rlineto 0 -2.00000000000001 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave -15.9500000005 500.3250000004 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill -15.9500000005 500.3250000004 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave -22.9250000005 504.6750000004 moveto 2 0 rlineto 0 -2.00000000000001 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill -22.9250000005 504.6750000004 moveto 2 0 rlineto 0 -2.00000000000001 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave -32.7500000005 504.5250000004 moveto 2.00000000000001 0 rlineto 0 -1.99999999999999 rlineto -2.00000000000001 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill -32.7500000005 504.5250000004 moveto 2.00000000000001 0 rlineto 0 -1.99999999999999 rlineto -2.00000000000001 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave -41.9000000005 506.0250000004 moveto 2 0 rlineto 0 -1.99999999999999 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill -41.9000000005 506.0250000004 moveto 2 0 rlineto 0 -1.99999999999999 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave -45.9500000005 507.3000000004 moveto 2 0 rlineto 0 -2.00000000000001 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill -45.9500000005 507.3000000004 moveto 2 0 rlineto 0 -2.00000000000001 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave /Fixed findfont 12 scalefont ISOEncode setfont 0.812 0.412 0.796 setrgbcolor AdjustColor -44.9500000005 514.3000000004 [ (250) ] 13 -0.5 0.5 0.5 false DrawText grestore gsave -46.2500000005 506.6250000004 moveto 2 0 rlineto 0 -2.00000000000001 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill -46.2500000005 506.6250000004 moveto 2 0 rlineto 0 -2.00000000000001 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave -44.9750000005 502.9500000004 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill -44.9750000005 502.9500000004 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave -41.5250000005 504.3750000004 moveto 2 0 rlineto 0 -2.00000000000001 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill -41.5250000005 504.3750000004 moveto 2 0 rlineto 0 -2.00000000000001 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave -43.4000000005 509.7000000004 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill -43.4000000005 509.7000000004 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave -42.9500000005 507.1500000004 moveto 2 0 rlineto 0 -1.99999999999999 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill -42.9500000005 507.1500000004 moveto 2 0 rlineto 0 -1.99999999999999 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave -40.3250000005 504.1500000004 moveto 2 0 rlineto 0 -1.99999999999999 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill -40.3250000005 504.1500000004 moveto 2 0 rlineto 0 -1.99999999999999 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave -37.4750000005 509.1000000004 moveto 2 0 rlineto 0 -1.99999999999997 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill -37.4750000005 509.1000000004 moveto 2 0 rlineto 0 -1.99999999999997 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave -39.2750000005 512.7750000004 moveto 2 0 rlineto 0 -2.00000000000004 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill -39.2750000005 512.7750000004 moveto 2 0 rlineto 0 -2.00000000000004 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave -38.9750000005 514.5750000004 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill -38.9750000005 514.5750000004 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave -39.8750000005 517.5750000004 moveto 2 0 rlineto 0 -1.99999999999999 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill -39.8750000005 517.5750000004 moveto 2 0 rlineto 0 -1.99999999999999 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave /Fixed findfont 12 scalefont ISOEncode setfont 0.812 0.412 0.796 setrgbcolor AdjustColor -38.8750000005 524.5750000004 [ (260) ] 13 -0.5 0.5 0.5 false DrawText grestore gsave -42.0500000005 515.9250000004 moveto 2 0 rlineto 0 -2.00000000000001 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill -42.0500000005 515.9250000004 moveto 2 0 rlineto 0 -2.00000000000001 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave -42.8750000005 513.8250000004 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill -42.8750000005 513.8250000004 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave -44.8250000005 514.7250000004 moveto 2 0 rlineto 0 -1.99999999999997 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill -44.8250000005 514.7250000004 moveto 2 0 rlineto 0 -1.99999999999997 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave -43.1750000005 518.7000000004 moveto 2 0 rlineto 0 -1.99999999999999 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill -43.1750000005 518.7000000004 moveto 2 0 rlineto 0 -1.99999999999999 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave -35.9000000005 519.0750000004 moveto 2 0 rlineto 0 -1.99999999999999 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill -35.9000000005 519.0750000004 moveto 2 0 rlineto 0 -1.99999999999999 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave -32.7500000005 515.6250000004 moveto 2.00000000000001 0 rlineto 0 -1.99999999999996 rlineto -2.00000000000001 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill -32.7500000005 515.6250000004 moveto 2.00000000000001 0 rlineto 0 -1.99999999999996 rlineto -2.00000000000001 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave -31.7750000005 510.3000000004 moveto 2 0 rlineto 0 -2.00000000000001 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill -31.7750000005 510.3000000004 moveto 2 0 rlineto 0 -2.00000000000001 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave -34.5500000005 509.7750000004 moveto 2 0 rlineto 0 -1.99999999999999 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill -34.5500000005 509.7750000004 moveto 2 0 rlineto 0 -1.99999999999999 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave -37.1750000005 513.0000000004 moveto 2 0 rlineto 0 -1.99999999999996 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill -37.1750000005 513.0000000004 moveto 2 0 rlineto 0 -1.99999999999996 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave -40.1000000005 513.2250000004 moveto 2 0 rlineto 0 -1.99999999999997 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill -40.1000000005 513.2250000004 moveto 2 0 rlineto 0 -1.99999999999997 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave /Fixed findfont 12 scalefont ISOEncode setfont 0.812 0.412 0.796 setrgbcolor AdjustColor -39.1000000005 520.2250000004 [ (270) ] 13 -0.5 0.5 0.5 false DrawText grestore gsave -42.5000000005 509.9250000004 moveto 2 0 rlineto 0 -2.00000000000001 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill -42.5000000005 509.9250000004 moveto 2 0 rlineto 0 -2.00000000000001 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave -44.0000000005 507.8250000004 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill -44.0000000005 507.8250000004 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave -50.2250000005 506.5500000004 moveto 2 0 rlineto 0 -2.00000000000001 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill -50.2250000005 506.5500000004 moveto 2 0 rlineto 0 -2.00000000000001 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave -54.5750000005 508.3500000004 moveto 2 0 rlineto 0 -1.99999999999997 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill -54.5750000005 508.3500000004 moveto 2 0 rlineto 0 -1.99999999999997 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave -57.3500000005 510.3750000004 moveto 2 0 rlineto 0 -2.00000000000001 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill -57.3500000005 510.3750000004 moveto 2 0 rlineto 0 -2.00000000000001 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave -58.3250000005 514.8000000004 moveto 2 0 rlineto 0 -2.00000000000001 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill -58.3250000005 514.8000000004 moveto 2 0 rlineto 0 -2.00000000000001 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave -62.0000000005 518.4000000004 moveto 2 0 rlineto 0 -2.00000000000004 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill -62.0000000005 518.4000000004 moveto 2 0 rlineto 0 -2.00000000000004 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave -67.7000000005 517.2000000004 moveto 2 0 rlineto 0 -1.99999999999999 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill -67.7000000005 517.2000000004 moveto 2 0 rlineto 0 -1.99999999999999 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave -69.9500000005 516.6750000004 moveto 2 0 rlineto 0 -2.00000000000001 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill -69.9500000005 516.6750000004 moveto 2 0 rlineto 0 -2.00000000000001 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave -71.6000000005 514.1250000004 moveto 2 0 rlineto 0 -1.99999999999996 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill -71.6000000005 514.1250000004 moveto 2 0 rlineto 0 -1.99999999999996 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave /Fixed findfont 12 scalefont ISOEncode setfont 0.812 0.412 0.796 setrgbcolor AdjustColor -70.6000000005 521.1250000004 [ (280) ] 13 -0.5 0.5 0.5 false DrawText grestore gsave -73.3250000005 513.6750000004 moveto 2 0 rlineto 0 -2.00000000000001 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill -73.3250000005 513.6750000004 moveto 2 0 rlineto 0 -2.00000000000001 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave -78.8750000005 514.5000000004 moveto 2 0 rlineto 0 -1.99999999999996 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill -78.8750000005 514.5000000004 moveto 2 0 rlineto 0 -1.99999999999996 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave -83.5250000005 513.5250000004 moveto 2 0 rlineto 0 -2.00000000000004 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill -83.5250000005 513.5250000004 moveto 2 0 rlineto 0 -2.00000000000004 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave -85.7750000005 512.5500000004 moveto 2 0 rlineto 0 -2.00000000000001 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill -85.7750000005 512.5500000004 moveto 2 0 rlineto 0 -2.00000000000001 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave -86.3750000005 518.3250000004 moveto 2 0 rlineto 0 -1.99999999999999 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill -86.3750000005 518.3250000004 moveto 2 0 rlineto 0 -1.99999999999999 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave -87.3500000005 525.4500000004 moveto 2 0 rlineto 0 -1.99999999999999 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill -87.3500000005 525.4500000004 moveto 2 0 rlineto 0 -1.99999999999999 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave -89.6750000005 531.0000000004 moveto 2 0 rlineto 0 -1.99999999999995 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill -89.6750000005 531.0000000004 moveto 2 0 rlineto 0 -1.99999999999995 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave -86.2250000005 535.2000000004 moveto 2 0 rlineto 0 -1.99999999999999 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill -86.2250000005 535.2000000004 moveto 2 0 rlineto 0 -1.99999999999999 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave -80.2250000005 534.6000000004 moveto 2 0 rlineto 0 -1.99999999999997 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill -80.2250000005 534.6000000004 moveto 2 0 rlineto 0 -1.99999999999997 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave -79.7750000005 530.9250000004 moveto 2 0 rlineto 0 -2.00000000000002 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill -79.7750000005 530.9250000004 moveto 2 0 rlineto 0 -2.00000000000002 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave /Fixed findfont 12 scalefont ISOEncode setfont 0.812 0.412 0.796 setrgbcolor AdjustColor -78.7750000005 537.9250000004 [ (290) ] 13 -0.5 0.5 0.5 false DrawText grestore gsave -83.4500000005 532.2000000004 moveto 2 0 rlineto 0 -1.99999999999999 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill -83.4500000005 532.2000000004 moveto 2 0 rlineto 0 -1.99999999999999 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave -85.7750000005 538.8750000004 moveto 2 0 rlineto 0 -1.99999999999995 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill -85.7750000005 538.8750000004 moveto 2 0 rlineto 0 -1.99999999999995 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave -87.8000000005 545.3250000004 moveto 2 0 rlineto 0 -1.99999999999999 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill -87.8000000005 545.3250000004 moveto 2 0 rlineto 0 -1.99999999999999 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave -89.9000000005 549.0000000004 moveto 2 0 rlineto 0 -1.99999999999995 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill -89.9000000005 549.0000000004 moveto 2 0 rlineto 0 -1.99999999999995 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave -88.7750000005 552.7500000004 moveto 2 0 rlineto 0 -1.99999999999995 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill -88.7750000005 552.7500000004 moveto 2 0 rlineto 0 -1.99999999999995 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave -85.7750000005 550.5000000004 moveto 2 0 rlineto 0 -1.99999999999995 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill -85.7750000005 550.5000000004 moveto 2 0 rlineto 0 -1.99999999999995 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave -86.0750000005 549.0750000004 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill -86.0750000005 549.0750000004 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave -87.7250000005 552.7500000004 moveto 2 0 rlineto 0 -1.99999999999995 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill -87.7250000005 552.7500000004 moveto 2 0 rlineto 0 -1.99999999999995 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave -83.6000000005 554.7000000004 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill -83.6000000005 554.7000000004 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave -80.6000000005 551.4750000004 moveto 2 0 rlineto 0 -1.99999999999997 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill -80.6000000005 551.4750000004 moveto 2 0 rlineto 0 -1.99999999999997 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave /Fixed findfont 12 scalefont ISOEncode setfont 0.812 0.412 0.796 setrgbcolor AdjustColor -79.6000000005 558.4750000004 [ (300) ] 13 -0.5 0.5 0.5 false DrawText grestore gsave -83.3750000005 552.3750000004 moveto 2 0 rlineto 0 -1.99999999999995 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill -83.3750000005 552.3750000004 moveto 2 0 rlineto 0 -1.99999999999995 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave -82.1000000005 556.3500000004 moveto 2 0 rlineto 0 -1.99999999999997 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill -82.1000000005 556.3500000004 moveto 2 0 rlineto 0 -1.99999999999997 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave -78.5750000005 555.2250000004 moveto 2 0 rlineto 0 -1.99999999999997 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill -78.5750000005 555.2250000004 moveto 2 0 rlineto 0 -1.99999999999997 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave -78.8750000005 551.7000000004 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill -78.8750000005 551.7000000004 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave -80.6750000005 553.8000000004 moveto 2 0 rlineto 0 -2.00000000000002 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill -80.6750000005 553.8000000004 moveto 2 0 rlineto 0 -2.00000000000002 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave -80.5250000005 557.4750000004 moveto 2 0 rlineto 0 -1.99999999999997 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill -80.5250000005 557.4750000004 moveto 2 0 rlineto 0 -1.99999999999997 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave -74.3750000005 561.5250000004 moveto 2 0 rlineto 0 -2.00000000000004 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill -74.3750000005 561.5250000004 moveto 2 0 rlineto 0 -2.00000000000004 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave -70.3250000005 559.0500000004 moveto 2 0 rlineto 0 -2.00000000000002 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill -70.3250000005 559.0500000004 moveto 2 0 rlineto 0 -2.00000000000002 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave -70.3250000005 556.9500000004 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill -70.3250000005 556.9500000004 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave -73.2500000005 557.6250000004 moveto 2 0 rlineto 0 -1.99999999999995 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill -73.2500000005 557.6250000004 moveto 2 0 rlineto 0 -1.99999999999995 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave /Fixed findfont 12 scalefont ISOEncode setfont 0.812 0.412 0.796 setrgbcolor AdjustColor -72.2500000005 564.6250000004 [ (310) ] 13 -0.5 0.5 0.5 false DrawText grestore gsave -70.9250000005 561.6000000004 moveto 2 0 rlineto 0 -1.99999999999997 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill -70.9250000005 561.6000000004 moveto 2 0 rlineto 0 -1.99999999999997 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave -65.2250000005 561.2250000004 moveto 1.99999999999999 0 rlineto 0 -1.99999999999997 rlineto -1.99999999999999 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill -65.2250000005 561.2250000004 moveto 1.99999999999999 0 rlineto 0 -1.99999999999997 rlineto -1.99999999999999 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave -65.5250000005 557.4750000004 moveto 2 0 rlineto 0 -1.99999999999997 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill -65.5250000005 557.4750000004 moveto 2 0 rlineto 0 -1.99999999999997 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave -67.6250000005 559.8000000004 moveto 2 0 rlineto 0 -2.00000000000002 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill -67.6250000005 559.8000000004 moveto 2 0 rlineto 0 -2.00000000000002 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave -64.4000000005 566.0250000004 moveto 2 0 rlineto 0 -2.00000000000004 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill -64.4000000005 566.0250000004 moveto 2 0 rlineto 0 -2.00000000000004 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave -59.3750000005 566.6250000004 moveto 2 0 rlineto 0 -1.99999999999995 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill -59.3750000005 566.6250000004 moveto 2 0 rlineto 0 -1.99999999999995 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave -56.6000000005 563.6250000004 moveto 2 0 rlineto 0 -1.99999999999995 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill -56.6000000005 563.6250000004 moveto 2 0 rlineto 0 -1.99999999999995 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave -58.7750000005 561.5250000004 moveto 2 0 rlineto 0 -2.00000000000004 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill -58.7750000005 561.5250000004 moveto 2 0 rlineto 0 -2.00000000000004 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave -61.9250000005 563.5500000004 moveto 2 0 rlineto 0 -2.00000000000002 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill -61.9250000005 563.5500000004 moveto 2 0 rlineto 0 -2.00000000000002 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave -62.1500000005 567.4500000004 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill -62.1500000005 567.4500000004 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave /Fixed findfont 12 scalefont ISOEncode setfont 0.812 0.412 0.796 setrgbcolor AdjustColor -61.1500000005 574.4500000004 [ (320) ] 13 -0.5 0.5 0.5 false DrawText grestore gsave -57.8750000005 570.97500000044 moveto 2 0 rlineto 0 -2.00000000003999 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill -57.8750000005 570.97500000044 moveto 2 0 rlineto 0 -2.00000000003999 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave -53.7500000005 569.2500000004 moveto 2 0 rlineto 0 -1.99999999999995 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill -53.7500000005 569.2500000004 moveto 2 0 rlineto 0 -1.99999999999995 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave -54.7250000005 566.9250000004 moveto 2 0 rlineto 0 -2.00000000000002 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill -54.7250000005 566.9250000004 moveto 2 0 rlineto 0 -2.00000000000002 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave -56.1500000005 569.6250000004 moveto 2 0 rlineto 0 -1.99999999999995 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill -56.1500000005 569.6250000004 moveto 2 0 rlineto 0 -1.99999999999995 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave -54.1250000005 573.82500000044 moveto 2 0 rlineto 0 -2.00000000000001 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill -54.1250000005 573.82500000044 moveto 2 0 rlineto 0 -2.00000000000001 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave -49.0250000005 576.22500000044 moveto 2.00000000000001 0 rlineto 0 -1.99999999999999 rlineto -2.00000000000001 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill -49.0250000005 576.22500000044 moveto 2.00000000000001 0 rlineto 0 -1.99999999999999 rlineto -2.00000000000001 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave -43.1000000005 575.85000000044 moveto 2 0 rlineto 0 -1.99999999999999 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill -43.1000000005 575.85000000044 moveto 2 0 rlineto 0 -1.99999999999999 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave -40.0250000005 579.375000000442 moveto 2 0 rlineto 0 -2.00000000000201 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill -40.0250000005 579.375000000442 moveto 2 0 rlineto 0 -2.00000000000201 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave -42.0500000005 583.50000000044 moveto 2 0 rlineto 0 -1.99999999999997 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill -42.0500000005 583.50000000044 moveto 2 0 rlineto 0 -1.99999999999997 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave -41.3750000005 586.50000000044 moveto 2 0 rlineto 0 -1.99999999999997 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill -41.3750000005 586.50000000044 moveto 2 0 rlineto 0 -1.99999999999997 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave /Fixed findfont 12 scalefont ISOEncode setfont 0.812 0.412 0.796 setrgbcolor AdjustColor -40.3750000005 593.5000000004 [ (330) ] 13 -0.5 0.5 0.5 false DrawText grestore gsave -36.3500000005 586.35000000044 moveto 2 0 rlineto 0 -1.99999999999999 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill -36.3500000005 586.35000000044 moveto 2 0 rlineto 0 -1.99999999999999 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave -34.9250000005 583.12500000044 moveto 2 0 rlineto 0 -1.99999999999997 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill -34.9250000005 583.12500000044 moveto 2 0 rlineto 0 -1.99999999999997 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave -37.1750000005 582.45000000044 moveto 2 0 rlineto 0 -2.00000000000001 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill -37.1750000005 582.45000000044 moveto 2 0 rlineto 0 -2.00000000000001 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave -38.0750000005 585.37500000044 moveto 2 0 rlineto 0 -1.99999999999997 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill -38.0750000005 585.37500000044 moveto 2 0 rlineto 0 -1.99999999999997 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave -33.9500000005 588.45000000044 moveto 1.99999999999999 0 rlineto 0 -2.00000000000001 rlineto -1.99999999999999 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill -33.9500000005 588.45000000044 moveto 1.99999999999999 0 rlineto 0 -2.00000000000001 rlineto -1.99999999999999 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave -30.8000000005 586.20000000044 moveto 2 0 rlineto 0 -2.00000000000001 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill -30.8000000005 586.20000000044 moveto 2 0 rlineto 0 -2.00000000000001 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave -32.0000000005 584.10000000044 moveto 2.00000000000001 0 rlineto 0 -1.99999999999999 rlineto -2.00000000000001 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill -32.0000000005 584.10000000044 moveto 2.00000000000001 0 rlineto 0 -1.99999999999999 rlineto -2.00000000000001 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave -32.3750000005 587.55000000044 moveto 2.00000000000001 0 rlineto 0 -2.00000000000004 rlineto -2.00000000000001 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill -32.3750000005 587.55000000044 moveto 2.00000000000001 0 rlineto 0 -2.00000000000004 rlineto -2.00000000000001 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave -29.0000000005 589.5000000004 moveto 2 0 rlineto 0 -1.99999999995995 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill -29.0000000005 589.5000000004 moveto 2 0 rlineto 0 -1.99999999995995 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave -27.0500000005 586.95000000044 moveto 2 0 rlineto 0 -2.00000000000001 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill -27.0500000005 586.95000000044 moveto 2 0 rlineto 0 -2.00000000000001 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave /Fixed findfont 12 scalefont ISOEncode setfont 0.812 0.412 0.796 setrgbcolor AdjustColor -26.0500000005 593.9500000004 [ (340) ] 13 -0.5 0.5 0.5 false DrawText grestore gsave -28.4000000005 586.27500000044 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill -28.4000000005 586.27500000044 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave -27.5750000005 589.5000000004 moveto 2 0 rlineto 0 -1.99999999995995 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill -27.5750000005 589.5000000004 moveto 2 0 rlineto 0 -1.99999999995995 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave -23.7500000005 589.3500000004 moveto 2 0 rlineto 0 -1.99999999995997 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill -23.7500000005 589.3500000004 moveto 2 0 rlineto 0 -1.99999999995997 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave -22.8500000005 586.12500000044 moveto 2 0 rlineto 0 -1.99999999999997 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill -22.8500000005 586.12500000044 moveto 2 0 rlineto 0 -1.99999999999997 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave -24.9500000005 586.72500000044 moveto 2 0 rlineto 0 -1.99999999999999 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill -24.9500000005 586.72500000044 moveto 2 0 rlineto 0 -1.99999999999999 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave -22.0250000005 589.5750000004 moveto 2 0 rlineto 0 -1.99999999996 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill -22.0250000005 589.5750000004 moveto 2 0 rlineto 0 -1.99999999996 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave -17.0000000005 588.22500000044 moveto 2 0 rlineto 0 -1.99999999999999 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill -17.0000000005 588.22500000044 moveto 2 0 rlineto 0 -1.99999999999999 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave -15.9500000005 583.65000000044 moveto 2 0 rlineto 0 -1.99999999999995 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill -15.9500000005 583.65000000044 moveto 2 0 rlineto 0 -1.99999999999995 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave -15.5000000005 579.975000000442 moveto 2 0 rlineto 0 -2.00000000000204 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill -15.5000000005 579.975000000442 moveto 2 0 rlineto 0 -2.00000000000204 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave -17.0000000005 577.12500000044 moveto 2 0 rlineto 0 -1.99999999999997 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill -17.0000000005 577.12500000044 moveto 2 0 rlineto 0 -1.99999999999997 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave /Fixed findfont 12 scalefont ISOEncode setfont 0.812 0.412 0.796 setrgbcolor AdjustColor -16.0000000005 584.12500000044 [ (350) ] 13 -0.5 0.5 0.5 false DrawText grestore gsave -18.1250000005 579.675000000442 moveto 2 0 rlineto 0 -2.00000000000197 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill -18.1250000005 579.675000000442 moveto 2 0 rlineto 0 -2.00000000000197 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave -17.4500000005 583.87500000044 moveto 2 0 rlineto 0 -1.99999999999997 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill -17.4500000005 583.87500000044 moveto 2 0 rlineto 0 -1.99999999999997 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave -10.9250000005 585.37500000044 moveto 2 0 rlineto 0 -1.99999999999997 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill -10.9250000005 585.37500000044 moveto 2 0 rlineto 0 -1.99999999999997 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave -7.7750000005 582.60000000044 moveto 2 0 rlineto 0 -1.99999999999999 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill -7.7750000005 582.60000000044 moveto 2 0 rlineto 0 -1.99999999999999 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave -8.2250000005 579.600000000442 moveto 2 0 rlineto 0 -2.00000000000204 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill -8.2250000005 579.600000000442 moveto 2 0 rlineto 0 -2.00000000000204 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave -8.4500000005 582.82500000044 moveto 2 0 rlineto 0 -2.00000000000001 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill -8.4500000005 582.82500000044 moveto 2 0 rlineto 0 -2.00000000000001 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave -2.9750000005 586.87500000044 moveto 2 0 rlineto 0 -1.99999999999997 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill -2.9750000005 586.87500000044 moveto 2 0 rlineto 0 -1.99999999999997 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 0.8499999995 583.42500000044 moveto 2 0 rlineto 0 -2.00000000000004 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 0.8499999995 583.42500000044 moveto 2 0 rlineto 0 -2.00000000000004 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 0.0249999995 581.10000000044 moveto 2 0 rlineto 0 -1.99999999999999 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 0.0249999995 581.10000000044 moveto 2 0 rlineto 0 -1.99999999999999 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave -1.4000000005 582.67500000044 moveto 1.999999999999 0 rlineto 0 -2.00000000000004 rlineto -1.999999999999 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill -1.4000000005 582.67500000044 moveto 1.999999999999 0 rlineto 0 -2.00000000000004 rlineto -1.999999999999 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave /Fixed findfont 12 scalefont ISOEncode setfont 0.812 0.412 0.796 setrgbcolor AdjustColor -0.400000000501 589.6750000004 [ (360) ] 13 -0.5 0.5 0.5 false DrawText grestore gsave 0.2499999995 589.4250000004 moveto 2 0 rlineto 0 -1.99999999996002 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 0.2499999995 589.4250000004 moveto 2 0 rlineto 0 -1.99999999996002 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 3.5499999995 589.9500000004 moveto 2 0 rlineto 0 -1.99999999996 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 3.5499999995 589.9500000004 moveto 2 0 rlineto 0 -1.99999999996 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 8.4249999995 587.47500000044 moveto 2 0 rlineto 0 -1.99999999999999 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 8.4249999995 587.47500000044 moveto 2 0 rlineto 0 -1.99999999999999 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 10.8999999995 582.45000000044 moveto 2 0 rlineto 0 -2.00000000000001 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 10.8999999995 582.45000000044 moveto 2 0 rlineto 0 -2.00000000000001 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 9.6999999995 580.57500000044 moveto 2 0 rlineto 0 -1.99999999999801 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 9.6999999995 580.57500000044 moveto 2 0 rlineto 0 -1.99999999999801 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 7.5999999995 583.27500000044 moveto 2 0 rlineto 0 -1.99999999999995 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 7.5999999995 583.27500000044 moveto 2 0 rlineto 0 -1.99999999999995 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 9.6249999995 588.15000000044 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 9.6249999995 588.15000000044 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 14.7249999995 590.3250000004 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 14.7249999995 590.3250000004 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 18.3249999995 594.0750000004 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 18.3249999995 594.0750000004 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 22.5249999995 602.4750000004 moveto 2 0 rlineto 0 -1.99999999999997 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 22.5249999995 602.4750000004 moveto 2 0 rlineto 0 -1.99999999999997 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave /Fixed findfont 12 scalefont ISOEncode setfont 0.812 0.412 0.796 setrgbcolor AdjustColor 23.5249999995 609.4750000004 [ (370) ] 13 -0.5 0.5 0.5 false DrawText grestore gsave 21.4749999995 604.3500000004 moveto 2 0 rlineto 0 -1.99999999999997 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 21.4749999995 604.3500000004 moveto 2 0 rlineto 0 -1.99999999999997 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 19.7499999995 605.2500000004 moveto 2 0 rlineto 0 -1.99999999999995 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 19.7499999995 605.2500000004 moveto 2 0 rlineto 0 -1.99999999999995 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 21.0999999995 607.5750000004 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 21.0999999995 607.5750000004 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 25.2999999995 611.5500000004 moveto 2 0 rlineto 0 -2.00000000000002 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 25.2999999995 611.5500000004 moveto 2 0 rlineto 0 -2.00000000000002 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 26.2749999995 616.6500000004 moveto 2 0 rlineto 0 -2.00000000000005 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 26.2749999995 616.6500000004 moveto 2 0 rlineto 0 -2.00000000000005 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 23.2749999995 620.3250000004 moveto 2 0 rlineto 0 -1.99999999999999 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 23.2749999995 620.3250000004 moveto 2 0 rlineto 0 -1.99999999999999 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 22.3749999995 623.3250000004 moveto 2 0 rlineto 0 -1.99999999999999 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 22.3749999995 623.3250000004 moveto 2 0 rlineto 0 -1.99999999999999 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 25.5999999995 628.2000000004 moveto 2 0 rlineto 0 -1.99999999999999 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 25.5999999995 628.2000000004 moveto 2 0 rlineto 0 -1.99999999999999 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 29.5749999995 630.1500000004 moveto 2 0 rlineto 0 -2.00000000000005 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 29.5749999995 630.1500000004 moveto 2 0 rlineto 0 -2.00000000000005 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 34.7499999995 627.2250000004 moveto 2 0 rlineto 0 -1.99999999999997 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 34.7499999995 627.2250000004 moveto 2 0 rlineto 0 -1.99999999999997 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave /Fixed findfont 12 scalefont ISOEncode setfont 0.812 0.412 0.796 setrgbcolor AdjustColor 35.7499999995 634.2250000004 [ (380) ] 13 -0.5 0.5 0.5 false DrawText grestore gsave 35.7249999995 623.7000000004 moveto 2 0 rlineto 0 -1.99999999999999 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 35.7249999995 623.7000000004 moveto 2 0 rlineto 0 -1.99999999999999 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 32.4249999995 621.8250000004 moveto 2 0 rlineto 0 -1.99999999999999 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 32.4249999995 621.8250000004 moveto 2 0 rlineto 0 -1.99999999999999 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 29.4249999995 624.8250000004 moveto 2 0 rlineto 0 -1.99999999999999 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 29.4249999995 624.8250000004 moveto 2 0 rlineto 0 -1.99999999999999 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 30.2499999995 629.1750000004 moveto 2 0 rlineto 0 -2.00000000000003 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 30.2499999995 629.1750000004 moveto 2 0 rlineto 0 -2.00000000000003 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 33.3249999995 631.1250000004 moveto 2 0 rlineto 0 -1.99999999999996 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 33.3249999995 631.1250000004 moveto 2 0 rlineto 0 -1.99999999999996 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 38.5749999995 629.1000000004 moveto 2 0 rlineto 0 -1.99999999999997 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 38.5749999995 629.1000000004 moveto 2 0 rlineto 0 -1.99999999999997 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 40.5249999995 625.6500000004 moveto 1.99999999999999 0 rlineto 0 -2.00000000000005 rlineto -1.99999999999999 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 40.5249999995 625.6500000004 moveto 1.99999999999999 0 rlineto 0 -2.00000000000005 rlineto -1.99999999999999 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 36.9249999995 621.6750000004 moveto 2 0 rlineto 0 -2.00000000000003 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 36.9249999995 621.6750000004 moveto 2 0 rlineto 0 -2.00000000000003 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 32.2749999995 622.5000000004 moveto 2 0 rlineto 0 -1.99999999999995 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 32.2749999995 622.5000000004 moveto 2 0 rlineto 0 -1.99999999999995 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 28.5999999995 623.4000000004 moveto 2 0 rlineto 0 -2.00000000000005 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 28.5999999995 623.4000000004 moveto 2 0 rlineto 0 -2.00000000000005 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave /Fixed findfont 12 scalefont ISOEncode setfont 0.812 0.412 0.796 setrgbcolor AdjustColor 29.5999999995 630.4000000004 [ (390) ] 13 -0.5 0.5 0.5 false DrawText grestore gsave 29.4999999995 619.7250000004 moveto 2 0 rlineto 0 -1.99999999999997 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 29.4999999995 619.7250000004 moveto 2 0 rlineto 0 -1.99999999999997 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 34.6749999995 620.7000000004 moveto 2 0 rlineto 0 -1.99999999999999 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 34.6749999995 620.7000000004 moveto 2 0 rlineto 0 -1.99999999999999 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 33.4749999995 623.0250000004 moveto 2 0 rlineto 0 -2.00000000000005 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 33.4749999995 623.0250000004 moveto 2 0 rlineto 0 -2.00000000000005 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 31.2249999995 621.1500000004 moveto 2 0 rlineto 0 -2.00000000000005 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 31.2249999995 621.1500000004 moveto 2 0 rlineto 0 -2.00000000000005 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 34.0749999995 616.8000000004 moveto 2 0 rlineto 0 -2.00000000000003 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 34.0749999995 616.8000000004 moveto 2 0 rlineto 0 -2.00000000000003 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 37.5249999995 617.2500000004 moveto 2 0 rlineto 0 -1.99999999999995 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 37.5249999995 617.2500000004 moveto 2 0 rlineto 0 -1.99999999999995 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 39.0249999995 621.0000000004 moveto 2 0 rlineto 0 -1.99999999999995 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 39.0249999995 621.0000000004 moveto 2 0 rlineto 0 -1.99999999999995 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 36.9249999995 621.9000000004 moveto 2 0 rlineto 0 -2.00000000000005 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 36.9249999995 621.9000000004 moveto 2 0 rlineto 0 -2.00000000000005 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 36.4749999995 618.2250000004 moveto 2 0 rlineto 0 -1.99999999999997 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 36.4749999995 618.2250000004 moveto 2 0 rlineto 0 -1.99999999999997 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 39.2499999995 615.4500000004 moveto 2 0 rlineto 0 -1.99999999999999 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 39.2499999995 615.4500000004 moveto 2 0 rlineto 0 -1.99999999999999 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave /Fixed findfont 12 scalefont ISOEncode setfont 0.812 0.412 0.796 setrgbcolor AdjustColor 40.2499999995 622.4500000004 [ (400) ] 13 -0.5 0.5 0.5 false DrawText grestore gsave 43.3749999995 618.7500000004 moveto 2 0 rlineto 0 -1.99999999999995 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 43.3749999995 618.7500000004 moveto 2 0 rlineto 0 -1.99999999999995 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 42.9999999995 621.9750000004 moveto 2 0 rlineto 0 -1.99999999999997 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 42.9999999995 621.9750000004 moveto 2 0 rlineto 0 -1.99999999999997 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 41.1999999995 624.3000000004 moveto 2 0 rlineto 0 -2.00000000000003 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 41.1999999995 624.3000000004 moveto 2 0 rlineto 0 -2.00000000000003 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 39.4749999995 624.0000000004 moveto 2 0 rlineto 0 -1.99999999999995 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 39.4749999995 624.0000000004 moveto 2 0 rlineto 0 -1.99999999999995 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 39.6999999995 621.2250000004 moveto 2 0 rlineto 0 -1.99999999999997 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 39.6999999995 621.2250000004 moveto 2 0 rlineto 0 -1.99999999999997 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 42.8499999995 618.7500000004 moveto 2 0 rlineto 0 -1.99999999999995 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 42.8499999995 618.7500000004 moveto 2 0 rlineto 0 -1.99999999999995 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 48.3249999995 620.7000000004 moveto 2 0 rlineto 0 -1.99999999999999 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 48.3249999995 620.7000000004 moveto 2 0 rlineto 0 -1.99999999999999 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 51.0249999995 626.7000000004 moveto 2 0 rlineto 0 -1.99999999999999 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 51.0249999995 626.7000000004 moveto 2 0 rlineto 0 -1.99999999999999 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 52.6749999995 632.7750000004 moveto 2 0 rlineto 0 -2.00000000000005 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 52.6749999995 632.7750000004 moveto 2 0 rlineto 0 -2.00000000000005 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 57.5499999995 641.4000000004 moveto 2 0 rlineto 0 -2.00000000000005 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 57.5499999995 641.4000000004 moveto 2 0 rlineto 0 -2.00000000000005 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave /Fixed findfont 12 scalefont ISOEncode setfont 0.812 0.412 0.796 setrgbcolor AdjustColor 58.5499999995 648.4000000004 [ (410) ] 13 -0.5 0.5 0.5 false DrawText grestore gsave 63.8499999995 648.6750000004 moveto 1.99999999999999 0 rlineto 0 -2.00000000000001 rlineto -1.99999999999999 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 63.8499999995 648.6750000004 moveto 1.99999999999999 0 rlineto 0 -2.00000000000001 rlineto -1.99999999999999 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 64.2999999995 652.1250000004 moveto 2 0 rlineto 0 -1.99999999999997 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 64.2999999995 652.1250000004 moveto 2 0 rlineto 0 -1.99999999999997 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 62.3499999995 657.4500000004 moveto 1.99999999999999 0 rlineto 0 -2.00000000000001 rlineto -1.99999999999999 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 62.3499999995 657.4500000004 moveto 1.99999999999999 0 rlineto 0 -2.00000000000001 rlineto -1.99999999999999 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 59.3499999995 662.4750000004 moveto 2 0 rlineto 0 -1.99999999999997 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 59.3499999995 662.4750000004 moveto 2 0 rlineto 0 -1.99999999999997 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 58.7499999995 666.9000000004 moveto 2 0 rlineto 0 -2.00000000000004 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 58.7499999995 666.9000000004 moveto 2 0 rlineto 0 -2.00000000000004 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 61.5249999995 667.3500000004 moveto 2 0 rlineto 0 -1.99999999999997 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 61.5249999995 667.3500000004 moveto 2 0 rlineto 0 -1.99999999999997 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 64.6749999995 663.7500000004 moveto 2 0 rlineto 0 -1.99999999999997 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 64.6749999995 663.7500000004 moveto 2 0 rlineto 0 -1.99999999999997 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 64.5249999995 658.8750000004 moveto 2 0 rlineto 0 -1.99999999999997 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 64.5249999995 658.8750000004 moveto 2 0 rlineto 0 -1.99999999999997 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 62.3499999995 657.2250000004 moveto 1.99999999999999 0 rlineto 0 -1.99999999999997 rlineto -1.99999999999999 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 62.3499999995 657.2250000004 moveto 1.99999999999999 0 rlineto 0 -1.99999999999997 rlineto -1.99999999999999 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 60.3999999995 660.4500000004 moveto 2 0 rlineto 0 -2.00000000000001 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 60.3999999995 660.4500000004 moveto 2 0 rlineto 0 -2.00000000000001 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave /Fixed findfont 12 scalefont ISOEncode setfont 0.812 0.412 0.796 setrgbcolor AdjustColor 61.3999999995 667.4500000004 [ (420) ] 13 -0.5 0.5 0.5 false DrawText grestore gsave 60.9999999995 668.5500000004 moveto 2 0 rlineto 0 -2.00000000000001 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 60.9999999995 668.5500000004 moveto 2 0 rlineto 0 -2.00000000000001 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 62.4249999995 675.0000000004 moveto 1.99999999999999 0 rlineto 0 -1.99999999999997 rlineto -1.99999999999999 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 62.4249999995 675.0000000004 moveto 1.99999999999999 0 rlineto 0 -1.99999999999997 rlineto -1.99999999999999 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 62.7249999995 679.65 moveto 1.99999999999999 0 rlineto 0 -1.99999999959999 rlineto -1.99999999999999 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 62.7249999995 679.65 moveto 1.99999999999999 0 rlineto 0 -1.99999999959999 rlineto -1.99999999999999 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 66.3249999995 682.5 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 66.3249999995 682.5 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 68.7249999995 679.95 moveto 2 0 rlineto 0 -1.99999999960006 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 68.7249999995 679.95 moveto 2 0 rlineto 0 -1.99999999960006 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 67.0749999995 674.8500000004 moveto 2 0 rlineto 0 -1.99999999999997 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 67.0749999995 674.8500000004 moveto 2 0 rlineto 0 -1.99999999999997 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 63.7749999995 674.5500000004 moveto 2 0 rlineto 0 -2.00000000000001 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 63.7749999995 674.5500000004 moveto 2 0 rlineto 0 -2.00000000000001 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 61.1499999995 679.65 moveto 2 0 rlineto 0 -1.99999999959999 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 61.1499999995 679.65 moveto 2 0 rlineto 0 -1.99999999959999 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 58.3749999995 690.225 moveto 2 0 rlineto 0 -2.00000000000004 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 58.3749999995 690.225 moveto 2 0 rlineto 0 -2.00000000000004 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 58.4499999995 698.55 moveto 2 0 rlineto 0 -1.99999999999997 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 58.4499999995 698.55 moveto 2 0 rlineto 0 -1.99999999999997 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave /Fixed findfont 12 scalefont ISOEncode setfont 0.812 0.412 0.796 setrgbcolor AdjustColor 59.4499999995 705.55 [ (430) ] 13 -0.5 0.5 0.5 false DrawText grestore gsave 61.6749999995 701.85 moveto 2 0 rlineto 0 -2.00000000000004 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 61.6749999995 701.85 moveto 2 0 rlineto 0 -2.00000000000004 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 64.2999999995 699.15 moveto 2 0 rlineto 0 -1.99999999999997 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 64.2999999995 699.15 moveto 2 0 rlineto 0 -1.99999999999997 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 64.7499999995 694.5 moveto 2 0 rlineto 0 -2.00000000000001 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 64.7499999995 694.5 moveto 2 0 rlineto 0 -2.00000000000001 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 61.4499999995 693.3 moveto 2 0 rlineto 0 -1.99999999999997 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 61.4499999995 693.3 moveto 2 0 rlineto 0 -1.99999999999997 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 58.7499999995 699 moveto 2 0 rlineto 0 -2.00000000000001 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 58.7499999995 699 moveto 2 0 rlineto 0 -2.00000000000001 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 61.4499999995 703.5 moveto 2 0 rlineto 0 -2.00000000000001 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 61.4499999995 703.5 moveto 2 0 rlineto 0 -2.00000000000001 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 64.7499999995 702.6 moveto 2 0 rlineto 0 -2.00000000000004 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 64.7499999995 702.6 moveto 2 0 rlineto 0 -2.00000000000004 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 65.3499999995 697.725 moveto 2 0 rlineto 0 -2.00000000000004 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 65.3499999995 697.725 moveto 2 0 rlineto 0 -2.00000000000004 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 61.9749999995 695.85 moveto 2 0 rlineto 0 -2.00000000000004 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 61.9749999995 695.85 moveto 2 0 rlineto 0 -2.00000000000004 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 59.1249999995 698.55 moveto 2 0 rlineto 0 -1.99999999999997 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 59.1249999995 698.55 moveto 2 0 rlineto 0 -1.99999999999997 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave /Fixed findfont 12 scalefont ISOEncode setfont 0.812 0.412 0.796 setrgbcolor AdjustColor 60.1249999995 705.55 [ (440) ] 13 -0.5 0.5 0.5 false DrawText grestore gsave 58.7499999995 703.425 moveto 2 0 rlineto 0 -1.99999999999997 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 58.7499999995 703.425 moveto 2 0 rlineto 0 -1.99999999999997 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 62.9499999995 707.85 moveto 2 0 rlineto 0 -2.00000000000004 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 62.9499999995 707.85 moveto 2 0 rlineto 0 -2.00000000000004 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 66.6249999995 707.925 moveto 2 0 rlineto 0 -1.99999999999997 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 66.6249999995 707.925 moveto 2 0 rlineto 0 -1.99999999999997 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 68.8749999995 703.8 moveto 2 0 rlineto 0 -1.99999999999997 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 68.8749999995 703.8 moveto 2 0 rlineto 0 -1.99999999999997 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 65.5749999995 697.5 moveto 2 0 rlineto 0 -2.00000000000001 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 65.5749999995 697.5 moveto 2 0 rlineto 0 -2.00000000000001 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 62.9499999995 696.075 moveto 2 0 rlineto 0 -2.00000000000004 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 62.9499999995 696.075 moveto 2 0 rlineto 0 -2.00000000000004 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 64.2249999995 694.275 moveto 2 0 rlineto 0 -1.99999999999997 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 64.2249999995 694.275 moveto 2 0 rlineto 0 -1.99999999999997 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 68.7249999995 692.925 moveto 2 0 rlineto 0 -1.99999999999997 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 68.7249999995 692.925 moveto 2 0 rlineto 0 -1.99999999999997 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 71.2749999995 696.225 moveto 2 0 rlineto 0 -2.00000000000004 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 71.2749999995 696.225 moveto 2 0 rlineto 0 -2.00000000000004 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 71.1999999995 699.45 moveto 2 0 rlineto 0 -2.00000000000004 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 71.1999999995 699.45 moveto 2 0 rlineto 0 -2.00000000000004 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave /Fixed findfont 12 scalefont ISOEncode setfont 0.812 0.412 0.796 setrgbcolor AdjustColor 72.1999999995 706.45 [ (450) ] 13 -0.5 0.5 0.5 false DrawText grestore gsave 66.9249999995 700.05 moveto 2 0 rlineto 0 -1.99999999999997 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 66.9249999995 700.05 moveto 2 0 rlineto 0 -1.99999999999997 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 61.3749999995 698.85 moveto 2 0 rlineto 0 -2.00000000000004 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 61.3749999995 698.85 moveto 2 0 rlineto 0 -2.00000000000004 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 53.1999999995 693.375 moveto 2 0 rlineto 0 -2.00000000000001 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 53.1999999995 693.375 moveto 2 0 rlineto 0 -2.00000000000001 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 52.7499999995 698.925 moveto 2 0 rlineto 0 -1.99999999999997 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 52.7499999995 698.925 moveto 2 0 rlineto 0 -1.99999999999997 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 52.4499999995 705.9 moveto 2 0 rlineto 0 -1.99999999999997 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 52.4499999995 705.9 moveto 2 0 rlineto 0 -1.99999999999997 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 53.1999999995 714 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 53.1999999995 714 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 52.2999999995 718.35 moveto 2 0 rlineto 0 -2.00000000000003 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 52.2999999995 718.35 moveto 2 0 rlineto 0 -2.00000000000003 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 48.6249999995 721.8 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 48.6249999995 721.8 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 48.6999999995 726.9 moveto 2 0 rlineto 0 -1.99999999999997 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 48.6999999995 726.9 moveto 2 0 rlineto 0 -1.99999999999997 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 52.1499999995 728.1 moveto 2 0 rlineto 0 -2.00000000000003 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 52.1499999995 728.1 moveto 2 0 rlineto 0 -2.00000000000003 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave /Fixed findfont 12 scalefont ISOEncode setfont 0.812 0.412 0.796 setrgbcolor AdjustColor 53.1499999995 735.1 [ (460) ] 13 -0.5 0.5 0.5 false DrawText grestore gsave 54.2499999995 725.1 moveto 2 0 rlineto 0 -2.00000000000003 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 54.2499999995 725.1 moveto 2 0 rlineto 0 -2.00000000000003 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 55.8249999995 723.75 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 55.8249999995 723.75 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 60.3249999995 724.95 moveto 2 0 rlineto 0 -1.99999999999997 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 60.3249999995 724.95 moveto 2 0 rlineto 0 -1.99999999999997 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 61.7499999995 730.05 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 61.7499999995 730.05 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 58.4499999995 735.375 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 58.4499999995 735.375 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 56.6499999995 739.05 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 56.6499999995 739.05 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 51.3999999995 744.3 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 51.3999999995 744.3 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 46.8249999995 749.55 moveto 1.99999999999999 0 rlineto 0 -1.99999999999994 rlineto -1.99999999999999 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 46.8249999995 749.55 moveto 1.99999999999999 0 rlineto 0 -1.99999999999994 rlineto -1.99999999999999 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 40.3749999995 752.925 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 40.3749999995 752.925 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 30.8499999995 753.9 moveto 2 0 rlineto 0 -1.99999999999997 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 30.8499999995 753.9 moveto 2 0 rlineto 0 -1.99999999999997 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave /Fixed findfont 12 scalefont ISOEncode setfont 0.812 0.412 0.796 setrgbcolor AdjustColor 31.8499999995 760.9 [ (470) ] 13 -0.5 0.5 0.5 false DrawText grestore gsave 24.7749999995 756.15 moveto 2 0 rlineto 0 -1.99999999999997 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 24.7749999995 756.15 moveto 2 0 rlineto 0 -1.99999999999997 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 20.3499999995 753.75 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 20.3499999995 753.75 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 21.6999999995 751.5 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 21.6999999995 751.5 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 20.6499999995 752.4 moveto 2 0 rlineto 0 -1.99999999999997 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 20.6499999995 752.4 moveto 2 0 rlineto 0 -1.99999999999997 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 31.8249999995 747.9 moveto 2 0 rlineto 0 -1.99999999999997 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 31.8249999995 747.9 moveto 2 0 rlineto 0 -1.99999999999997 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 30.1749999995 743.475 moveto 2 0 rlineto 0 -2.00000000000003 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 30.1749999995 743.475 moveto 2 0 rlineto 0 -2.00000000000003 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 27.4749999995 739.05 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 27.4749999995 739.05 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 28.5249999995 736.275 moveto 2 0 rlineto 0 -1.99999999999997 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 28.5249999995 736.275 moveto 2 0 rlineto 0 -1.99999999999997 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 32.6499999995 736.125 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 32.6499999995 736.125 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 36.3249999995 735.225 moveto 2 0 rlineto 0 -2.00000000000003 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 36.3249999995 735.225 moveto 2 0 rlineto 0 -2.00000000000003 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave /Fixed findfont 12 scalefont ISOEncode setfont 0.812 0.412 0.796 setrgbcolor AdjustColor 37.3249999995 742.225 [ (480) ] 13 -0.5 0.5 0.5 false DrawText grestore gsave 35.3499999995 732.45 moveto 2 0 rlineto 0 -1.99999999999997 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 35.3499999995 732.45 moveto 2 0 rlineto 0 -1.99999999999997 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 33.6249999995 729.675 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 33.6249999995 729.675 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 30.5499999995 728.25 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 30.5499999995 728.25 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 28.0749999995 731.925 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 28.0749999995 731.925 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 24.0999999995 740.625 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 24.0999999995 740.625 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 20.1999999995 750.3 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 20.1999999995 750.3 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 15.7749999995 756.675 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 15.7749999995 756.675 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 11.4249999995 760.575 moveto 2 0 rlineto 0 -1.99999999999997 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 11.4249999995 760.575 moveto 2 0 rlineto 0 -1.99999999999997 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 5.4249999995 765.825 moveto 2 0 rlineto 0 -1.99999999999997 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 5.4249999995 765.825 moveto 2 0 rlineto 0 -1.99999999999997 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 0.3249999995 773.625 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 0.3249999995 773.625 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave /Fixed findfont 12 scalefont ISOEncode setfont 0.812 0.412 0.796 setrgbcolor AdjustColor 1.3249999995 780.625 [ (490) ] 13 -0.5 0.5 0.5 false DrawText grestore gsave -1.1000000005 779.4 moveto 1.999999999999 0 rlineto 0 -1.99999999999997 rlineto -1.999999999999 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill -1.1000000005 779.4 moveto 1.999999999999 0 rlineto 0 -1.99999999999997 rlineto -1.999999999999 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave -0.350000000501 786.525 moveto 2.000000000001 0 rlineto 0 -1.99999999999997 rlineto -2.000000000001 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill -0.350000000501 786.525 moveto 2.000000000001 0 rlineto 0 -1.99999999999997 rlineto -2.000000000001 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 2.4999999995 792.375 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 2.4999999995 792.375 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 3.9249999995 798.675 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 3.9249999995 798.675 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 6.3999999995 809.55 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 6.3999999995 809.55 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 4.5249999995 817.425 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 4.5249999995 817.425 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 3.3999999995 822.675 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 3.3999999995 822.675 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 7.2999999995 828.3 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 7.2999999995 828.3 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 8.4249999995 835.5 moveto 2 0 rlineto 0 -2.00000000000003 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 8.4249999995 835.5 moveto 2 0 rlineto 0 -2.00000000000003 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 11.2749999995 850.125 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 11.2749999995 850.125 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave /Fixed findfont 12 scalefont ISOEncode setfont 0.812 0.412 0.796 setrgbcolor AdjustColor 12.2749999995 857.125 [ (500) ] 13 -0.5 0.5 0.5 false DrawText grestore gsave 13.1499999995 854.775 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 13.1499999995 854.775 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 16.5999999995 853.2 moveto 2 0 rlineto 0 -2.00000000000006 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 16.5999999995 853.2 moveto 2 0 rlineto 0 -2.00000000000006 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 16.1499999995 849.525 moveto 2 0 rlineto 0 -1.99999999999989 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 16.1499999995 849.525 moveto 2 0 rlineto 0 -1.99999999999989 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 12.9999999995 851.55 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 12.9999999995 851.55 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 13.2999999995 857.55 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 13.2999999995 857.55 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 16.5249999995 861.525 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 16.5249999995 861.525 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 17.6499999995 867.75 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 17.6499999995 867.75 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 21.6249999995 879.45 moveto 2 0 rlineto 0 -2.00000000000006 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 21.6249999995 879.45 moveto 2 0 rlineto 0 -2.00000000000006 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 24.0249999995 891.45 moveto 2 0 rlineto 0 -2.00000000000006 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 24.0249999995 891.45 moveto 2 0 rlineto 0 -2.00000000000006 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 27.3249999995 910.725 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 27.3249999995 910.725 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave /Fixed findfont 12 scalefont ISOEncode setfont 0.812 0.412 0.796 setrgbcolor AdjustColor 28.3249999995 917.725 [ (510) ] 13 -0.5 0.5 0.5 false DrawText grestore gsave 27.5499999995 921.825 moveto 2 0 rlineto 0 -2.00000000000006 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 27.5499999995 921.825 moveto 2 0 rlineto 0 -2.00000000000006 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 24.9999999995 932.25 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 24.9999999995 932.25 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 21.9999999995 934.05 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 21.9999999995 934.05 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 15.3249999995 942 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 15.3249999995 942 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 13.3749999995 947.1 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 13.3749999995 947.1 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 9.6999999995 957.9 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 9.6999999995 957.9 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 6.0249999995 965.475 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 6.0249999995 965.475 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 4.6749999995 971.025 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 4.6749999995 971.025 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 4.5249999995 984.675 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 4.5249999995 984.675 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 10.2999999995 989.175 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 10.2999999995 989.175 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave /Fixed findfont 12 scalefont ISOEncode setfont 0.812 0.412 0.796 setrgbcolor AdjustColor 11.2999999995 996.175 [ (520) ] 13 -0.5 0.5 0.5 false DrawText grestore gsave 14.7999999995 991.5 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 14.7999999995 991.5 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 16.8249999995 994.8 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 16.8249999995 994.8 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 18.7749999995 999.45 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 18.7749999995 999.45 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 21.1749999995 1003.425 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 21.1749999995 1003.425 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 17.7999999995 1007.1 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 17.7999999995 1007.1 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 17.4249999995 1011.9 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 17.4249999995 1011.9 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 17.3499999995 1015.65 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 17.3499999995 1015.65 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 19.5999999995 1016.325 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 19.5999999995 1016.325 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 21.9249999995 1011.975 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 21.9249999995 1011.975 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 20.5749999995 1007.55 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 20.5749999995 1007.55 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave /Fixed findfont 12 scalefont ISOEncode setfont 0.812 0.412 0.796 setrgbcolor AdjustColor 21.5749999995 1014.55 [ (530) ] 13 -0.5 0.5 0.5 false DrawText grestore gsave 17.9499999995 1007.775 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 17.9499999995 1007.775 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 17.5749999995 1010.775 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 17.5749999995 1010.775 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 20.1999999995 1010.775 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 20.1999999995 1010.775 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 21.8499999995 1003.875 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 21.8499999995 1003.875 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 19.5999999995 1002 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 19.5999999995 1002 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 16.5249999995 1003.575 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 16.5249999995 1003.575 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 18.0249999995 1006.875 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 18.0249999995 1006.875 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 21.6249999995 1004.85 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 21.6249999995 1004.85 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 23.6499999995 1000.2 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 23.6499999995 1000.2 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 20.9499999995 996.45 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 20.9499999995 996.45 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave /Fixed findfont 12 scalefont ISOEncode setfont 0.812 0.412 0.796 setrgbcolor AdjustColor 21.9499999995 1003.45 [ (540) ] 13 -0.5 0.5 0.5 false DrawText grestore gsave 17.9499999995 997.575 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 17.9499999995 997.575 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 18.7749999995 1000.875 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 18.7749999995 1000.875 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 23.9499999995 999.975 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 23.9499999995 999.975 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 25.5999999995 994.95 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 25.5999999995 994.95 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 24.2499999995 991.875 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 24.2499999995 991.875 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 20.9499999995 993.9 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 20.9499999995 993.9 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 21.9249999995 996.75 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 21.9249999995 996.75 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 25.7499999995 996.75 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 25.7499999995 996.75 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 28.7499999995 991.95 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 28.7499999995 991.95 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 25.6749999995 987.525 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 25.6749999995 987.525 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave /Fixed findfont 12 scalefont ISOEncode setfont 0.812 0.412 0.796 setrgbcolor AdjustColor 26.6749999995 994.525 [ (550) ] 13 -0.5 0.5 0.5 false DrawText grestore gsave 23.1249999995 988.875 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 23.1249999995 988.875 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 23.1999999995 993 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 23.1999999995 993 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 26.6499999995 993.525 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 26.6499999995 993.525 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 28.2999999995 988.05 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 28.2999999995 988.05 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 25.2249999995 985.2 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 25.2249999995 985.2 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 23.5749999995 989.55 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 23.5749999995 989.55 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 24.6249999995 993.075 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 24.6249999995 993.075 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 27.2499999995 990.75 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 27.2499999995 990.75 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 23.0499999995 982.425 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 23.0499999995 982.425 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 21.7749999995 984.9 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 21.7749999995 984.9 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave /Fixed findfont 12 scalefont ISOEncode setfont 0.812 0.412 0.796 setrgbcolor AdjustColor 22.7749999995 991.9 [ (560) ] 13 -0.5 0.5 0.5 false DrawText grestore gsave 19.7499999995 991.35 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 19.7499999995 991.35 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 23.1999999995 993 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 23.1999999995 993 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 25.6749999995 987.975 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 25.6749999995 987.975 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 24.0249999995 983.55 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 24.0249999995 983.55 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 20.7249999995 987.225 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 20.7249999995 987.225 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 22.5249999995 990.225 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 22.5249999995 990.225 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 26.8749999995 989.4 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 26.8749999995 989.4 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 27.3249999995 983.4 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 27.3249999995 983.4 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 24.4749999995 979.425 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 24.4749999995 979.425 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 19.5999999995 980.475 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 19.5999999995 980.475 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave /Fixed findfont 12 scalefont ISOEncode setfont 0.812 0.412 0.796 setrgbcolor AdjustColor 20.5999999995 987.475 [ (570) ] 13 -0.5 0.5 0.5 false DrawText grestore gsave 16.4499999995 982.725 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 16.4499999995 982.725 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 14.5749999995 992.25 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 14.5749999995 992.25 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 15.9249999995 995.925 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 15.9249999995 995.925 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 17.1999999995 1000.35 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 17.1999999995 1000.35 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 16.5999999995 1005.9 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 16.5999999995 1005.9 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 21.4749999995 1006.875 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 21.4749999995 1006.875 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 25.7499999995 1006.275 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 25.7499999995 1006.275 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 29.4249999995 1006.8 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 29.4249999995 1006.8 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 33.9249999995 1006.125 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 33.9249999995 1006.125 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 35.7999999995 1005.45 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 35.7999999995 1005.45 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave /Fixed findfont 12 scalefont ISOEncode setfont 0.812 0.412 0.796 setrgbcolor AdjustColor 36.7999999995 1012.45 [ (580) ] 13 -0.5 0.5 0.5 false DrawText grestore gsave 34.6749999995 999.675 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 34.6749999995 999.675 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 31.0749999995 1000.35 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 31.0749999995 1000.35 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 28.8999999995 1005.6 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 28.8999999995 1005.6 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 29.5749999995 1007.025 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 29.5749999995 1007.025 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 33.3999999995 1005.9 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 33.3999999995 1005.9 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 36.1749999995 1003.875 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 36.1749999995 1003.875 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 36.3249999995 1007.325 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 36.3249999995 1007.325 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 38.6499999995 1011.075 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 38.6499999995 1011.075 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 40.5249999995 1014.825 moveto 1.99999999999999 0 rlineto 0 -2 rlineto -1.99999999999999 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 40.5249999995 1014.825 moveto 1.99999999999999 0 rlineto 0 -2 rlineto -1.99999999999999 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 44.1249999995 1016.7 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 44.1249999995 1016.7 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave /Fixed findfont 12 scalefont ISOEncode setfont 0.812 0.412 0.796 setrgbcolor AdjustColor 45.1249999995 1023.7 [ (590) ] 13 -0.5 0.5 0.5 false DrawText grestore gsave 48.3999999995 1018.65 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 48.3999999995 1018.65 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 50.5749999995 1021.65 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 50.5749999995 1021.65 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 55.1499999995 1018.95 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 55.1499999995 1018.95 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 56.1249999995 1011.825 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 56.1249999995 1011.825 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 53.3499999995 1009.425 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 53.3499999995 1009.425 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 50.1999999995 1013.1 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 50.1999999995 1013.1 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 52.4499999995 1015.2 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 52.4499999995 1015.2 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 55.7499999995 1012.5 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 55.7499999995 1012.5 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 55.6749999995 1006.95 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 55.6749999995 1006.95 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 58.1499999995 1002.6 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 58.1499999995 1002.6 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave /Fixed findfont 12 scalefont ISOEncode setfont 0.812 0.412 0.796 setrgbcolor AdjustColor 59.1499999995 1009.6 [ (600) ] 13 -0.5 0.5 0.5 false DrawText grestore gsave 64.3749999995 998.475 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 64.3749999995 998.475 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 66.8499999995 997.35 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 66.8499999995 997.35 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 73.0749999995 995.4 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 73.0749999995 995.4 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 74.2749999995 998.175 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 74.2749999995 998.175 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 76.5249999995 996.825 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 76.5249999995 996.825 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 78.6999999995 990.825 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 78.6999999995 990.825 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 82.7499999995 984.9 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 82.7499999995 984.9 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 86.4999999995 985.425 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 86.4999999995 985.425 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 89.7999999995 984.075 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 89.7999999995 984.075 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 91.6749999995 978.075 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 91.6749999995 978.075 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave /Fixed findfont 12 scalefont ISOEncode setfont 0.812 0.412 0.796 setrgbcolor AdjustColor 92.6749999995 985.075 [ (610) ] 13 -0.5 0.5 0.5 false DrawText grestore gsave 93.6249999995 974.175 moveto 2.00000000000001 0 rlineto 0 -1.99999999999994 rlineto -2.00000000000001 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 93.6249999995 974.175 moveto 2.00000000000001 0 rlineto 0 -1.99999999999994 rlineto -2.00000000000001 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 96.6249999995 970.5 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 96.6249999995 970.5 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 102.174999999 967.35 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 102.174999999 967.35 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 107.874999999 968.625 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 107.874999999 968.625 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 108.849999999 973.725 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 108.849999999 973.725 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 111.174999999 976.5 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 111.174999999 976.5 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 115.524999999 976.35 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 115.524999999 976.35 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 121.224999999 975.525 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 121.224999999 975.525 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 125.049999999 975.6 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 125.049999999 975.6 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 129.849999999 977.025 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 129.849999999 977.025 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave /Fixed findfont 12 scalefont ISOEncode setfont 0.812 0.412 0.796 setrgbcolor AdjustColor 130.849999999 984.025 [ (620) ] 13 -0.5 0.5 0.5 false DrawText grestore gsave 135.024999999 976.65 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 135.024999999 976.65 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 144.174999999 975.15 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 144.174999999 975.15 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 159.624999999 973.8 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 159.624999999 973.8 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 170.499999999 970.95 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 170.499999999 970.95 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 180.924999999 970.35 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 180.924999999 970.35 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 190.674999999 972.375 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 190.674999999 972.375 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 190.974999999 978.6 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 190.974999999 978.6 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 188.799999999 984.15 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 188.799999999 984.15 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 187.449999999 983.7 moveto 2.00000000000003 0 rlineto 0 -2 rlineto -2.00000000000003 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 187.449999999 983.7 moveto 2.00000000000003 0 rlineto 0 -2 rlineto -2.00000000000003 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 189.474999999 984.375 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 189.474999999 984.375 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave /Fixed findfont 12 scalefont ISOEncode setfont 0.812 0.412 0.796 setrgbcolor AdjustColor 190.474999999 991.375 [ (630) ] 13 -0.5 0.5 0.5 false DrawText grestore gsave 191.274999999 990.675 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 191.274999999 990.675 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 192.924999999 995.55 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 192.924999999 995.55 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 198.699999999 993.75 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 198.699999999 993.75 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 202.674999999 990.825 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 202.674999999 990.825 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 209.724999999 984.225 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 209.724999999 984.225 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 214.074999999 978.3 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 214.074999999 978.3 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 223.899999999 968.7 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 223.899999999 968.7 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 226.524999999 967.125 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 226.524999999 967.125 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 226.974999999 970.8 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 226.974999999 970.8 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 224.499999999 976.35 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 224.499999999 976.35 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave /Fixed findfont 12 scalefont ISOEncode setfont 0.812 0.412 0.796 setrgbcolor AdjustColor 225.499999999 983.35 [ (640) ] 13 -0.5 0.5 0.5 false DrawText grestore gsave 217.524999999 978.525 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 217.524999999 978.525 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 213.174999999 983.1 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 213.174999999 983.1 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 209.649999999 988.875 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 209.649999999 988.875 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 211.674999999 989.55 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 211.674999999 989.55 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 218.949999999 988.5 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 218.949999999 988.5 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 225.849999999 987.675 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 225.849999999 987.675 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 226.899999999 991.2 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 226.899999999 991.2 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 224.574999999 995.1 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 224.574999999 995.1 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 220.749999999 994.575 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 220.749999999 994.575 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 216.099999999 995.175 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 216.099999999 995.175 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave /Fixed findfont 12 scalefont ISOEncode setfont 0.812 0.412 0.796 setrgbcolor AdjustColor 217.099999999 1002.175 [ (650) ] 13 -0.5 0.5 0.5 false DrawText grestore gsave 213.849999999 997.725 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 213.849999999 997.725 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 215.424999999 1003.5 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 215.424999999 1003.5 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 216.249999999 1007.925 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 216.249999999 1007.925 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 216.924999999 1011.375 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 216.924999999 1011.375 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 219.624999999 1011 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 219.624999999 1011 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 220.224999999 1009.125 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 220.224999999 1009.125 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 216.624999999 1005.6 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 216.624999999 1005.6 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 213.849999999 1008.375 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 213.849999999 1008.375 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 216.249999999 1009.35 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 216.249999999 1009.35 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 217.974999999 1007.475 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 217.974999999 1007.475 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave /Fixed findfont 12 scalefont ISOEncode setfont 0.812 0.412 0.796 setrgbcolor AdjustColor 218.974999999 1014.475 [ (660) ] 13 -0.5 0.5 0.5 false DrawText grestore gsave 214.449999999 1003.5 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 214.449999999 1003.5 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 213.174999999 1004.85 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 213.174999999 1004.85 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 214.899999999 1006.95 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 214.899999999 1006.95 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 216.099999999 1004.7 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 216.099999999 1004.7 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 213.099999999 1000.95 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 213.099999999 1000.95 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 209.724999999 1003.425 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 209.724999999 1003.425 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 211.599999999 1005.975 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 211.599999999 1005.975 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 213.174999999 1003.725 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 213.174999999 1003.725 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 210.774999999 1002.525 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 210.774999999 1002.525 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 207.324999999 1003.2 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 207.324999999 1003.2 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave /Fixed findfont 12 scalefont ISOEncode setfont 0.812 0.412 0.796 setrgbcolor AdjustColor 208.324999999 1010.2 [ (670) ] 13 -0.5 0.5 0.5 false DrawText grestore gsave 208.299999999 1006.2 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 208.299999999 1006.2 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 210.924999999 1004.4 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 210.924999999 1004.4 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 208.599999999 999.45 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 208.599999999 999.45 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 203.274999999 999.6 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 203.274999999 999.6 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 202.524999999 1002.825 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 202.524999999 1002.825 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 205.224999999 1006.125 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 205.224999999 1006.125 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 206.574999999 1005.9 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 206.574999999 1005.9 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 207.024999999 1002 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 207.024999999 1002 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 204.324999999 999.45 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 204.324999999 999.45 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 199.974999999 999.825 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 199.974999999 999.825 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave /Fixed findfont 12 scalefont ISOEncode setfont 0.812 0.412 0.796 setrgbcolor AdjustColor 200.974999999 1006.825 [ (680) ] 13 -0.5 0.5 0.5 false DrawText grestore gsave 197.349999999 1002.075 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 197.349999999 1002.075 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 197.949999999 1009.725 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 197.949999999 1009.725 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 201.324999999 1012.35 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 201.324999999 1012.35 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 203.799999999 1011.45 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 203.799999999 1011.45 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 204.249999999 1013.1 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 204.249999999 1013.1 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 199.899999999 1014.6 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 199.899999999 1014.6 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 197.049999999 1011.075 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 197.049999999 1011.075 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 197.799999999 1007.625 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 197.799999999 1007.625 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 201.624999999 1006.05 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 201.624999999 1006.05 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 202.974999999 1007.25 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 202.974999999 1007.25 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave /Fixed findfont 12 scalefont ISOEncode setfont 0.812 0.412 0.796 setrgbcolor AdjustColor 203.974999999 1014.25 [ (690) ] 13 -0.5 0.5 0.5 false DrawText grestore gsave 199.674999999 1009.5 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 199.674999999 1009.5 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 194.349999999 1005.975 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 194.349999999 1005.975 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 194.349999999 1003.425 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 194.349999999 1003.425 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 197.499999999 1004.625 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 197.499999999 1004.625 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 197.124999999 1007.4 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 197.124999999 1007.4 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 192.099999999 1005.975 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 192.099999999 1005.975 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 191.274999999 1003.125 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 191.274999999 1003.125 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 194.199999999 1003.2 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 194.199999999 1003.2 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 194.349999999 1007.1 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 194.349999999 1007.1 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 195.624999999 1010.4 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 195.624999999 1010.4 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave /Fixed findfont 12 scalefont ISOEncode setfont 0.812 0.412 0.796 setrgbcolor AdjustColor 196.624999999 1017.4 [ (700) ] 13 -0.5 0.5 0.5 false DrawText grestore gsave 196.599999999 1007.175 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 196.599999999 1007.175 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 193.299999999 1004.55 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 193.299999999 1004.55 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 193.449999999 1008.75 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 193.449999999 1008.75 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 195.174999999 1008.075 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 195.174999999 1008.075 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 193.524999999 1004.1 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 193.524999999 1004.1 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 189.549999999 1003.35 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 189.549999999 1003.35 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 187.749999999 1006.575 moveto 2.00000000000003 0 rlineto 0 -2 rlineto -2.00000000000003 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 187.749999999 1006.575 moveto 2.00000000000003 0 rlineto 0 -2 rlineto -2.00000000000003 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 189.849999999 1008 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 189.849999999 1008 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 191.274999999 1005 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 191.274999999 1005 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 187.824999999 1002.375 moveto 2.00000000000003 0 rlineto 0 -2 rlineto -2.00000000000003 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 187.824999999 1002.375 moveto 2.00000000000003 0 rlineto 0 -2 rlineto -2.00000000000003 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave /Fixed findfont 12 scalefont ISOEncode setfont 0.812 0.412 0.796 setrgbcolor AdjustColor 188.824999999 1009.375 [ (710) ] 13 -0.5 0.5 0.5 false DrawText grestore gsave 184.899999999 1003.95 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 184.899999999 1003.95 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 186.924999999 1006.125 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 186.924999999 1006.125 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 187.449999999 1002.9 moveto 2.00000000000003 0 rlineto 0 -1.99999999999994 rlineto -2.00000000000003 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 187.449999999 1002.9 moveto 2.00000000000003 0 rlineto 0 -1.99999999999994 rlineto -2.00000000000003 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 184.599999999 1001.175 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 184.599999999 1001.175 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 180.924999999 1003.725 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 180.924999999 1003.725 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 181.524999999 1006.725 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 181.524999999 1006.725 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 184.149999999 1005.15 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 184.149999999 1005.15 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 182.499999999 1001.85 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 182.499999999 1001.85 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 178.524999999 1002.075 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 178.524999999 1002.075 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 176.574999999 1005.975 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 176.574999999 1005.975 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave /Fixed findfont 12 scalefont ISOEncode setfont 0.812 0.412 0.796 setrgbcolor AdjustColor 177.574999999 1012.975 [ (720) ] 13 -0.5 0.5 0.5 false DrawText grestore gsave 179.649999999 1006.95 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 179.649999999 1006.95 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 182.124999999 1005.075 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 182.124999999 1005.075 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 183.324999999 1004.925 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 183.324999999 1004.925 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 180.624999999 1008.75 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 180.624999999 1008.75 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 180.624999999 1010.85 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 180.624999999 1010.85 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 180.774999999 1014.6 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 180.774999999 1014.6 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 182.949999999 1018.8 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 182.949999999 1018.8 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 187.449999999 1018.8 moveto 2.00000000000003 0 rlineto 0 -1.99999999999994 rlineto -2.00000000000003 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 187.449999999 1018.8 moveto 2.00000000000003 0 rlineto 0 -1.99999999999994 rlineto -2.00000000000003 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 190.299999999 1020.3 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 190.299999999 1020.3 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 191.574999999 1015.65 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 191.574999999 1015.65 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave /Fixed findfont 12 scalefont ISOEncode setfont 0.812 0.412 0.796 setrgbcolor AdjustColor 192.574999999 1022.65 [ (730) ] 13 -0.5 0.5 0.5 false DrawText grestore gsave 191.874999999 1007.325 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 191.874999999 1007.325 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 190.299999999 998.55 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 190.299999999 998.55 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 188.799999999 993.9 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 188.799999999 993.9 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 186.174999999 987.15 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 186.174999999 987.15 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 187.449999999 983.175 moveto 2.00000000000003 0 rlineto 0 -1.99999999999994 rlineto -2.00000000000003 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 187.449999999 983.175 moveto 2.00000000000003 0 rlineto 0 -1.99999999999994 rlineto -2.00000000000003 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 191.424999999 980.025 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 191.424999999 980.025 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 192.099999999 981.675 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 192.099999999 981.675 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 192.774999999 983.25 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 192.774999999 983.25 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 196.224999999 985.425 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 0.812 0.412 0.796 setrgbcolor AdjustColor fill 196.224999999 985.425 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave 186.249999999 955.875 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.541 0.000 0.000 setrgbcolor AdjustColor fill 186.249999999 955.875 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave /Fixed findfont 12 scalefont ISOEncode setfont 0.541 0.000 0.000 setrgbcolor AdjustColor 187.249999999 962.875 [ (BALTAR) ] 13 -0.5 0.5 0.5 false DrawText grestore gsave -14.6750000005 760.875 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.541 0.000 0.000 setrgbcolor AdjustColor fill -14.6750000005 760.875 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave /Fixed findfont 12 scalefont ISOEncode setfont 0.541 0.000 0.000 setrgbcolor AdjustColor -13.6750000005 767.875 [ (BOULSA) ] 13 -0.5 0.5 0.5 false DrawText grestore gsave 216.099999999 708.75 moveto 2 0 rlineto 0 -2.00000000000001 rlineto -2 0 rlineto closepath 0.541 0.000 0.000 setrgbcolor AdjustColor fill 216.099999999 708.75 moveto 2 0 rlineto 0 -2.00000000000001 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave /Fixed findfont 12 scalefont ISOEncode setfont 0.541 0.000 0.000 setrgbcolor AdjustColor 217.099999999 715.75 [ (LARC-N) ] 13 -0.5 0.5 0.5 false DrawText grestore gsave 194.574999999 400.725 moveto 2 0 rlineto 0 -2.00000000000003 rlineto -2 0 rlineto closepath 0.541 0.000 0.000 setrgbcolor AdjustColor fill 194.574999999 400.725 moveto 2 0 rlineto 0 -2.00000000000003 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave /Fixed findfont 12 scalefont ISOEncode setfont 0.541 0.000 0.000 setrgbcolor AdjustColor 195.574999999 407.725 [ (LARC-S) ] 13 -0.5 0.5 0.5 false DrawText grestore gsave 305.649999999 145.575 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.541 0.000 0.000 setrgbcolor AdjustColor fill 305.649999999 145.575 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave /Fixed findfont 12 scalefont ISOEncode setfont 0.541 0.000 0.000 setrgbcolor AdjustColor 306.649999999 152.575 [ (GRALHS) ] 13 -0.5 0.5 0.5 false DrawText grestore gsave -7.1000000005 240.45 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.541 0.000 0.000 setrgbcolor AdjustColor fill -7.1000000005 240.45 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave /Fixed findfont 12 scalefont ISOEncode setfont 0.541 0.000 0.000 setrgbcolor AdjustColor -6.1000000005 247.45 [ (PDRNLS) ] 13 -0.5 0.5 0.5 false DrawText grestore gsave 88.5999999995 903.525 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 0.541 0.000 0.000 setrgbcolor AdjustColor fill 88.5999999995 903.525 moveto 2 0 rlineto 0 -1.99999999999994 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave /Fixed findfont 12 scalefont ISOEncode setfont 0.541 0.000 0.000 setrgbcolor AdjustColor 89.5999999995 910.525 [ (SANTNN) ] 13 -0.5 0.5 0.5 false DrawText grestore gsave -83.3000000005 484.5750000004 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 0.541 0.000 0.000 setrgbcolor AdjustColor fill -83.3000000005 484.5750000004 moveto 2 0 rlineto 0 -2 rlineto -2 0 rlineto closepath 1 setlinewidth 0 setlinejoin 2 setlinecap 0.000 0.000 0.000 setrgbcolor AdjustColor stroke grestore gsave /Fixed findfont 12 scalefont ISOEncode setfont 0.541 0.000 0.000 setrgbcolor AdjustColor -82.3000000005 491.5750000004 [ (SENDIM) ] 13 -0.5 0.5 0.5 false DrawText grestore gsave -32.1425305626964 83.0000000000001 moveto 258.142530562696 83.0000000000001 lineto 1 setlinewidth 0 setlinecap 1 setlinejoin 0.973 0.078 0.251 setrgbcolor AdjustColor stroke -37 83.0000000000001 moveto -26.999 79.4990000000001 lineto -28.7133673236218 82.5000000000001 lineto -28.7133673236218 83.5000000000001 lineto -26.999 86.5010000000001 lineto -37 83.0000000000001 lineto fill 263 83.0000000000001 moveto 252.999 86.501 lineto 254.713367323622 83.5000000000001 lineto 254.713367323622 82.5000000000001 lineto 252.999 79.499 lineto 263 83.0000000000001 lineto fill grestore gsave /Fixed findfont 12 scalefont ISOEncode setfont 0.973 0.078 0.251 setrgbcolor AdjustColor 113 91.0000000000001 [ (4 km) ] 13 -0.5 0.5 0 false DrawText grestore gsave /Fixed findfont 12 scalefont ISOEncode setfont 0.541 0.000 0.000 setrgbcolor AdjustColor 113 55.5 [ (F 343) ] 13 -0.5 0.5 0 false DrawText grestore restore showpage %%Trailer end %%EOF gpsman-6.4.4.2/manual/html/info/instupdate.md5sum0000644000175000017500000000006110006267657017762 0ustar migmiga62dbfebfe1332a06d2127fa614e7d3d instupdate.tcl gpsman-6.4.4.2/manual/html/info/lowrance.doc.txt0000644000175000017500000000365707315332012017566 0ustar migmig Lowrance supplement to the GPSMan Documentation. *********************************************** 1) GPS receiver setup. Follow the instructions given in your Lowrance manual. Set the Com Port to 19200 bps, 8 data bits and no parity. Use the correct Lowrance accessory data cable for your particular unit. 2) Getting Waypoints from the GPS unit. The Lowrance GlobalNav 212 receiver stores up to 999 Waypoints internally. GPSMan downloads all 999 whether valid or not. The indices of invalid (Unallocated) Waypoints are listed by GPSMan and unused index numbers allocated when new Routes are made or new Waypoints are created by GPSMan. For this reason all Waypoints and Routes are read into buffers on initialisation of the serial interface. This read operation can take nearly two minutes at 19200 baud, please be patient. The buffer mentioned above is not read into GPSMan memory until the "Get WPoint" and "Get Route" buttons in the GPSMan "GPS Receiver" window are clicked. This should be done before creating any Waypoints or Routes with GPSMan, all Waypoints and/or Routes should then be saved to the receiver before exiting GPSMan. 3) Waypoint Names. GPSMan is now able to handle Waypoint names containing spaces, so spaces are no longer automatically deleted. Note that the ASCII characters ".", "'", "(", "/", ")" and "-" can also occur in Lowrance along with " ". 4) Lowrance Trails. The terms "trail" and "track" are used interchangeably by GPSMan. 5) Time Offset. GPSMan for Lowrance does not use the "Time Offset" setting under the options menu. However it is recommended that this variable be correctly set, for compatibility reasons. All times are displayed in local time, not UTC. This program uses the Lowrance LSI 100 interface protocol rev 1.1. Copies of this protocol are available from www.lowrance.com. (c) 1999, 2000 Brian Baulch (baulchb@hotkey.net.au) Feedback welcomed. gpsman-6.4.4.2/manual/html/info/sample.txt0000644000175000017500000010113706541176005016471 0ustar migmig% Written by GPSManager 04-Apr-1998 13:41:07 !Format: DMS 1 WGS 84 !Creation: no !T: F 343 ^905 1:20 !NB: Larouco S 17-Mar-1998 14:38:23 41 52 50.8 -7 43 11.4 17-Mar-1998 14:39:42 41 52 52.0 -7 43 10.9 17-Mar-1998 14:39:50 41 52 51.5 -7 43 08.3 17-Mar-1998 14:39:55 41 52 51.4 -7 43 07.9 17-Mar-1998 14:40:04 41 52 49.8 -7 43 09.6 17-Mar-1998 14:40:08 41 52 49.9 -7 43 08.6 17-Mar-1998 14:40:15 41 52 52.2 -7 43 06.7 17-Mar-1998 14:40:23 41 52 52.9 -7 43 04.4 17-Mar-1998 14:40:30 41 52 52.4 -7 43 03.4 17-Mar-1998 14:40:35 41 52 50.7 -7 43 04.2 17-Mar-1998 14:40:43 41 52 50.8 -7 43 08.7 17-Mar-1998 14:40:47 41 52 50.2 -7 43 10.2 17-Mar-1998 14:40:52 41 52 49.8 -7 43 09.4 17-Mar-1998 14:40:57 41 52 50.5 -7 43 07.8 17-Mar-1998 14:41:02 41 52 51.3 -7 43 07.0 17-Mar-1998 14:41:06 41 52 50.0 -7 43 07.2 17-Mar-1998 14:41:12 41 52 49.6 -7 43 08.7 17-Mar-1998 14:41:17 41 52 50.2 -7 43 06.9 17-Mar-1998 14:41:26 41 52 51.7 -7 43 04.5 17-Mar-1998 14:41:30 41 52 50.3 -7 43 04.8 17-Mar-1998 14:41:35 41 52 49.6 -7 43 07.0 17-Mar-1998 14:41:41 41 52 49.2 -7 43 09.3 17-Mar-1998 14:41:48 41 52 48.4 -7 43 08.6 17-Mar-1998 14:41:54 41 52 49.2 -7 43 06.2 17-Mar-1998 14:42:02 41 52 50.3 -7 43 04.0 17-Mar-1998 14:42:10 41 52 52.2 -7 43 02.8 17-Mar-1998 14:42:16 41 52 51.3 -7 43 02.0 17-Mar-1998 14:42:23 41 52 49.7 -7 43 03.7 17-Mar-1998 14:42:29 41 52 48.8 -7 43 05.5 17-Mar-1998 14:42:37 41 52 47.7 -7 43 07.7 17-Mar-1998 14:42:45 41 52 46.4 -7 43 09.5 17-Mar-1998 14:42:57 41 52 43.9 -7 43 12.0 17-Mar-1998 14:43:04 41 52 42.9 -7 43 12.6 17-Mar-1998 14:43:10 41 52 42.2 -7 43 11.1 17-Mar-1998 14:43:16 41 52 40.7 -7 43 10.3 17-Mar-1998 14:43:22 41 52 39.4 -7 43 12.6 17-Mar-1998 14:43:29 41 52 38.7 -7 43 15.8 17-Mar-1998 14:43:34 41 52 37.9 -7 43 15.9 17-Mar-1998 14:43:40 41 52 38.2 -7 43 13.7 17-Mar-1998 14:43:50 41 52 40.1 -7 43 11.9 17-Mar-1998 14:43:57 41 52 40.8 -7 43 10.0 17-Mar-1998 14:44:04 41 52 39.5 -7 43 09.9 17-Mar-1998 14:44:11 41 52 38.9 -7 43 13.0 17-Mar-1998 14:44:19 41 52 37.4 -7 43 16.1 17-Mar-1998 14:44:25 41 52 36.3 -7 43 18.0 17-Mar-1998 14:44:32 41 52 34.8 -7 43 17.9 17-Mar-1998 14:44:40 41 52 33.1 -7 43 19.8 17-Mar-1998 14:44:47 41 52 32.0 -7 43 21.4 17-Mar-1998 14:44:55 41 52 29.8 -7 43 23.1 17-Mar-1998 14:45:00 41 52 28.9 -7 43 23.3 17-Mar-1998 14:45:06 41 52 28.5 -7 43 21.5 17-Mar-1998 14:45:15 41 52 27.1 -7 43 19.6 17-Mar-1998 14:45:22 41 52 25.5 -7 43 19.5 17-Mar-1998 14:45:33 41 52 22.8 -7 43 21.4 17-Mar-1998 14:45:43 41 52 19.9 -7 43 23.8 17-Mar-1998 14:46:00 41 52 15.3 -7 43 27.0 17-Mar-1998 14:46:10 41 52 12.3 -7 43 29.0 17-Mar-1998 14:46:16 41 52 11.0 -7 43 30.2 17-Mar-1998 14:46:23 41 52 10.0 -7 43 29.3 17-Mar-1998 14:46:27 41 52 09.2 -7 43 29.2 17-Mar-1998 14:46:35 41 52 07.2 -7 43 30.4 17-Mar-1998 14:46:40 41 52 08.0 -7 43 29.9 17-Mar-1998 14:46:45 41 52 09.0 -7 43 28.9 17-Mar-1998 14:46:51 41 52 08.3 -7 43 28.2 17-Mar-1998 14:46:57 41 52 06.6 -7 43 29.8 17-Mar-1998 14:47:04 41 52 04.6 -7 43 30.7 17-Mar-1998 14:47:13 41 52 02.3 -7 43 28.5 17-Mar-1998 14:47:24 41 52 00.0 -7 43 23.4 17-Mar-1998 14:47:29 41 52 00.0 -7 43 22.9 17-Mar-1998 14:47:38 41 52 01.3 -7 43 21.0 17-Mar-1998 14:47:45 41 52 01.7 -7 43 20.6 17-Mar-1998 14:47:50 41 52 02.3 -7 43 22.7 17-Mar-1998 14:47:55 41 52 03.4 -7 43 21.3 17-Mar-1998 14:47:58 41 52 02.8 -7 43 21.3 17-Mar-1998 14:48:03 41 52 03.0 -7 43 23.1 17-Mar-1998 14:48:08 41 52 04.2 -7 43 22.4 17-Mar-1998 14:48:12 41 52 04.0 -7 43 21.7 17-Mar-1998 14:48:17 41 52 03.3 -7 43 23.8 17-Mar-1998 14:48:23 41 52 04.8 -7 43 25.3 17-Mar-1998 14:48:28 41 52 05.9 -7 43 23.6 17-Mar-1998 14:48:34 41 52 05.1 -7 43 23.4 17-Mar-1998 14:48:39 41 52 05.3 -7 43 25.8 17-Mar-1998 14:48:44 41 52 06.8 -7 43 25.1 17-Mar-1998 14:48:48 41 52 06.8 -7 43 23.7 17-Mar-1998 14:48:53 41 52 05.7 -7 43 24.7 17-Mar-1998 14:48:58 41 52 06.7 -7 43 26.6 17-Mar-1998 14:49:03 41 52 07.8 -7 43 25.3 17-Mar-1998 14:49:08 41 52 07.0 -7 43 25.1 17-Mar-1998 14:49:14 41 52 06.8 -7 43 27.6 17-Mar-1998 14:49:20 41 52 08.4 -7 43 28.5 17-Mar-1998 14:49:25 41 52 09.1 -7 43 26.6 17-Mar-1998 14:49:31 41 52 07.8 -7 43 26.9 17-Mar-1998 14:49:35 41 52 08.4 -7 43 29.0 17-Mar-1998 14:49:40 41 52 09.8 -7 43 30.3 17-Mar-1998 14:49:45 41 52 10.6 -7 43 28.6 17-Mar-1998 14:49:51 41 52 09.7 -7 43 27.4 17-Mar-1998 14:49:58 41 52 09.1 -7 43 29.5 17-Mar-1998 14:50:02 41 52 10.4 -7 43 30.8 17-Mar-1998 14:50:08 41 52 12.0 -7 43 30.0 17-Mar-1998 14:50:14 41 52 11.3 -7 43 29.0 17-Mar-1998 14:50:18 41 52 11.1 -7 43 30.5 17-Mar-1998 14:50:23 41 52 12.5 -7 43 32.1 17-Mar-1998 14:50:28 41 52 13.2 -7 43 30.6 17-Mar-1998 14:50:33 41 52 12.2 -7 43 30.9 17-Mar-1998 14:50:37 41 52 12.8 -7 43 33.1 17-Mar-1998 14:50:42 41 52 14.2 -7 43 32.5 17-Mar-1998 14:50:47 41 52 13.4 -7 43 31.4 17-Mar-1998 14:50:52 41 52 13.8 -7 43 33.3 17-Mar-1998 14:50:55 41 52 14.5 -7 43 34.1 17-Mar-1998 14:51:00 41 52 15.2 -7 43 32.4 17-Mar-1998 14:51:04 41 52 14.4 -7 43 33.0 17-Mar-1998 14:51:09 41 52 15.4 -7 43 35.3 17-Mar-1998 14:51:14 41 52 16.7 -7 43 35.2 17-Mar-1998 14:51:19 41 52 16.5 -7 43 33.8 17-Mar-1998 14:51:25 41 52 16.3 -7 43 35.8 17-Mar-1998 14:51:29 41 52 17.2 -7 43 37.5 17-Mar-1998 14:51:34 41 52 18.2 -7 43 35.5 17-Mar-1998 14:51:39 41 52 17.2 -7 43 35.0 17-Mar-1998 14:51:44 41 52 17.5 -7 43 37.3 17-Mar-1998 14:51:51 41 52 19.5 -7 43 38.5 17-Mar-1998 14:51:55 41 52 19.6 -7 43 36.6 17-Mar-1998 14:52:00 41 52 18.8 -7 43 37.5 17-Mar-1998 14:52:06 41 52 20.1 -7 43 39.9 17-Mar-1998 14:52:12 41 52 21.5 -7 43 40.0 17-Mar-1998 14:52:17 41 52 21.5 -7 43 38.3 17-Mar-1998 14:52:22 41 52 20.6 -7 43 39.2 17-Mar-1998 14:52:27 41 52 20.4 -7 43 40.7 17-Mar-1998 14:52:33 41 52 22.2 -7 43 41.5 17-Mar-1998 14:52:39 41 52 21.9 -7 43 39.7 17-Mar-1998 14:52:46 41 52 21.0 -7 43 41.6 17-Mar-1998 14:52:52 41 52 22.0 -7 43 44.5 17-Mar-1998 14:52:57 41 52 23.4 -7 43 43.9 17-Mar-1998 14:53:03 41 52 23.3 -7 43 41.8 17-Mar-1998 14:53:08 41 52 22.0 -7 43 42.0 17-Mar-1998 14:53:13 41 52 22.3 -7 43 44.6 17-Mar-1998 14:53:19 41 52 24.2 -7 43 45.5 17-Mar-1998 14:53:25 41 52 24.8 -7 43 43.8 17-Mar-1998 14:53:30 41 52 23.4 -7 43 43.7 17-Mar-1998 14:53:35 41 52 23.1 -7 43 46.0 17-Mar-1998 14:53:39 41 52 24.4 -7 43 47.1 17-Mar-1998 14:53:44 41 52 25.6 -7 43 45.8 17-Mar-1998 14:53:49 41 52 24.4 -7 43 45.3 17-Mar-1998 14:53:54 41 52 24.0 -7 43 47.4 17-Mar-1998 14:54:00 41 52 26.1 -7 43 48.3 17-Mar-1998 14:54:05 41 52 27.0 -7 43 47.3 17-Mar-1998 14:54:11 41 52 26.2 -7 43 45.9 17-Mar-1998 14:54:16 41 52 24.9 -7 43 47.0 17-Mar-1998 14:54:21 41 52 25.2 -7 43 49.6 17-Mar-1998 14:54:24 41 52 26.7 -7 43 49.0 17-Mar-1998 14:54:29 41 52 26.9 -7 43 47.9 17-Mar-1998 14:54:33 41 52 25.8 -7 43 47.8 17-Mar-1998 14:54:38 41 52 25.6 -7 43 49.9 17-Mar-1998 14:54:43 41 52 27.3 -7 43 49.7 17-Mar-1998 14:54:49 41 52 27.3 -7 43 48.5 17-Mar-1998 14:54:54 41 52 26.1 -7 43 48.5 17-Mar-1998 14:55:00 41 52 26.0 -7 43 51.7 17-Mar-1998 14:55:05 41 52 28.0 -7 43 51.5 17-Mar-1998 14:55:12 41 52 28.9 -7 43 49.1 17-Mar-1998 14:55:18 41 52 28.0 -7 43 48.5 17-Mar-1998 14:55:24 41 52 27.0 -7 43 50.0 17-Mar-1998 14:55:31 41 52 27.5 -7 43 52.6 17-Mar-1998 14:55:37 41 52 29.9 -7 43 52.3 17-Mar-1998 14:55:44 41 52 30.8 -7 43 50.0 17-Mar-1998 14:55:49 41 52 29.2 -7 43 50.7 17-Mar-1998 14:55:58 41 52 28.0 -7 43 54.0 17-Mar-1998 14:56:04 41 52 29.3 -7 43 56.0 17-Mar-1998 14:56:10 41 52 31.0 -7 43 54.2 17-Mar-1998 14:56:16 41 52 30.6 -7 43 52.9 17-Mar-1998 14:56:23 41 52 28.8 -7 43 53.0 17-Mar-1998 14:56:29 41 52 29.0 -7 43 55.1 17-Mar-1998 14:56:35 41 52 30.9 -7 43 55.1 17-Mar-1998 14:56:40 41 52 31.6 -7 43 52.9 17-Mar-1998 14:56:46 41 52 29.9 -7 43 51.9 17-Mar-1998 14:56:51 41 52 28.8 -7 43 53.3 17-Mar-1998 14:56:58 41 52 29.2 -7 43 56.5 17-Mar-1998 14:57:04 41 52 31.7 -7 43 56.8 17-Mar-1998 14:57:10 41 52 33.6 -7 43 54.9 17-Mar-1998 14:57:15 41 52 33.6 -7 43 54.0 17-Mar-1998 14:57:22 41 52 31.2 -7 43 54.2 17-Mar-1998 14:57:28 41 52 29.7 -7 43 56.8 17-Mar-1998 14:57:38 41 52 29.3 -7 44 01.1 17-Mar-1998 14:57:47 41 52 32.1 -7 44 04.5 17-Mar-1998 14:57:57 41 52 35.2 -7 44 07.2 17-Mar-1998 14:58:05 41 52 37.6 -7 44 07.6 17-Mar-1998 14:58:11 41 52 38.9 -7 44 08.2 17-Mar-1998 14:58:19 41 52 41.1 -7 44 11.2 17-Mar-1998 14:58:30 41 52 44.6 -7 44 13.0 17-Mar-1998 14:58:38 41 52 46.6 -7 44 14.8 17-Mar-1998 14:58:46 41 52 48.9 -7 44 17.0 17-Mar-1998 14:58:56 41 52 51.9 -7 44 20.1 17-Mar-1998 14:59:02 41 52 52.3 -7 44 21.8 17-Mar-1998 14:59:10 41 52 52.8 -7 44 25.8 17-Mar-1998 14:59:19 41 52 55.2 -7 44 29.3 17-Mar-1998 14:59:26 41 52 57.2 -7 44 30.7 17-Mar-1998 14:59:30 41 52 57.0 -7 44 32.6 17-Mar-1998 14:59:36 41 52 56.4 -7 44 31.4 17-Mar-1998 14:59:42 41 52 58.1 -7 44 30.5 17-Mar-1998 14:59:46 41 52 59.3 -7 44 32.4 17-Mar-1998 14:59:52 41 53 00.0 -7 44 34.9 17-Mar-1998 14:59:59 41 53 02.7 -7 44 36.3 17-Mar-1998 15:00:03 41 53 02.4 -7 44 37.9 17-Mar-1998 15:00:10 41 53 01.8 -7 44 35.8 17-Mar-1998 15:00:15 41 53 03.7 -7 44 34.2 17-Mar-1998 15:00:19 41 53 05.0 -7 44 34.9 17-Mar-1998 15:00:26 41 53 05.4 -7 44 37.7 17-Mar-1998 15:00:32 41 53 08.0 -7 44 39.2 17-Mar-1998 15:00:41 41 53 10.9 -7 44 41.6 17-Mar-1998 15:00:48 41 53 12.4 -7 44 43.5 17-Mar-1998 15:00:54 41 53 12.6 -7 44 45.8 17-Mar-1998 15:00:59 41 53 11.9 -7 44 44.5 17-Mar-1998 15:01:04 41 53 13.9 -7 44 44.3 17-Mar-1998 15:01:08 41 53 13.9 -7 44 45.9 17-Mar-1998 15:01:13 41 53 13.7 -7 44 44.4 17-Mar-1998 15:01:18 41 53 15.9 -7 44 43.6 17-Mar-1998 15:01:23 41 53 16.1 -7 44 46.1 17-Mar-1998 15:01:27 41 53 15.4 -7 44 45.7 17-Mar-1998 15:01:31 41 53 16.3 -7 44 44.2 17-Mar-1998 15:01:35 41 53 17.9 -7 44 45.0 17-Mar-1998 15:01:41 41 53 18.2 -7 44 47.2 17-Mar-1998 15:01:48 41 53 16.7 -7 44 47.4 17-Mar-1998 15:01:53 41 53 16.7 -7 44 49.0 17-Mar-1998 15:02:01 41 53 18.8 -7 44 52.0 17-Mar-1998 15:02:09 41 53 20.3 -7 44 54.7 17-Mar-1998 15:02:13 41 53 19.4 -7 44 54.9 17-Mar-1998 15:02:18 41 53 18.6 -7 44 55.6 17-Mar-1998 15:02:24 41 53 20.3 -7 44 57.0 17-Mar-1998 15:02:29 41 53 21.7 -7 44 55.7 17-Mar-1998 15:02:36 41 53 20.7 -7 44 54.2 17-Mar-1998 15:02:40 41 53 20.3 -7 44 55.4 17-Mar-1998 15:02:46 41 53 21.7 -7 44 57.2 17-Mar-1998 15:02:52 41 53 23.6 -7 44 57.1 17-Mar-1998 15:02:58 41 53 23.9 -7 44 54.8 17-Mar-1998 15:03:04 41 53 22.8 -7 44 55.1 17-Mar-1998 15:03:10 41 53 23.3 -7 44 57.7 17-Mar-1998 15:03:16 41 53 25.3 -7 44 59.0 17-Mar-1998 15:03:21 41 53 26.3 -7 44 56.8 17-Mar-1998 15:03:26 41 53 25.2 -7 44 56.6 17-Mar-1998 15:03:33 41 53 25.9 -7 45 00.0 17-Mar-1998 15:03:38 41 53 28.0 -7 45 00.6 17-Mar-1998 15:03:44 41 53 29.1 -7 45 00.0 17-Mar-1998 15:03:48 41 53 28.4 -7 44 58.2 17-Mar-1998 15:03:55 41 53 27.1 -7 44 59.3 17-Mar-1998 15:04:01 41 53 27.7 -7 45 02.4 17-Mar-1998 15:04:14 41 53 30.2 -7 45 08.0 17-Mar-1998 15:04:26 41 53 32.2 -7 45 12.5 17-Mar-1998 15:04:34 41 53 33.4 -7 45 14.9 17-Mar-1998 15:04:51 41 53 35.3 -7 45 18.9 17-Mar-1998 15:05:04 41 53 35.3 -7 45 24.6 17-Mar-1998 15:05:24 41 53 36.0 -7 45 29.9 17-Mar-1998 15:05:32 41 53 36.6 -7 45 32.2 17-Mar-1998 15:05:37 41 53 36.3 -7 45 32.4 17-Mar-1998 15:05:42 41 53 34.7 -7 45 31.7 17-Mar-1998 15:05:47 41 53 35.3 -7 45 29.7 17-Mar-1998 15:05:53 41 53 37.6 -7 45 30.7 17-Mar-1998 15:05:59 41 53 36.5 -7 45 30.5 17-Mar-1998 15:06:04 41 53 35.2 -7 45 29.0 17-Mar-1998 15:06:11 41 53 37.3 -7 45 27.3 17-Mar-1998 15:06:17 41 53 38.9 -7 45 28.3 17-Mar-1998 15:06:21 41 53 39.7 -7 45 28.1 17-Mar-1998 15:06:26 41 53 41.0 -7 45 28.6 17-Mar-1998 15:06:33 41 53 40.3 -7 45 29.9 17-Mar-1998 15:06:38 41 53 39.4 -7 45 30.4 17-Mar-1998 15:06:43 41 53 39.8 -7 45 31.5 17-Mar-1998 15:06:50 41 53 41.5 -7 45 30.5 17-Mar-1998 15:06:57 41 53 41.6 -7 45 26.3 17-Mar-1998 15:07:03 41 53 40.1 -7 45 24.5 17-Mar-1998 15:07:11 41 53 37.8 -7 45 24.0 17-Mar-1998 15:07:15 41 53 37.6 -7 45 25.6 17-Mar-1998 15:07:21 41 53 39.0 -7 45 27.1 17-Mar-1998 15:07:28 41 53 39.1 -7 45 28.8 17-Mar-1998 15:07:36 41 53 37.7 -7 45 30.2 17-Mar-1998 15:07:42 41 53 36.8 -7 45 31.1 17-Mar-1998 15:07:58 41 53 36.3 -7 45 34.7 17-Mar-1998 15:08:11 41 53 37.1 -7 45 37.2 17-Mar-1998 15:08:23 41 53 38.0 -7 45 38.8 17-Mar-1998 15:08:34 41 53 39.9 -7 45 39.3 17-Mar-1998 15:08:46 41 53 41.5 -7 45 41.4 17-Mar-1998 15:08:54 41 53 41.0 -7 45 44.7 17-Mar-1998 15:08:59 41 53 40.8 -7 45 46.0 17-Mar-1998 15:09:05 41 53 39.7 -7 45 47.0 17-Mar-1998 15:09:10 41 53 39.5 -7 45 48.0 17-Mar-1998 15:09:19 41 53 39.9 -7 45 51.2 17-Mar-1998 15:09:26 41 53 39.5 -7 45 53.9 17-Mar-1998 15:09:32 41 53 39.1 -7 45 55.2 17-Mar-1998 15:09:40 41 53 41.6 -7 45 55.5 17-Mar-1998 15:09:48 41 53 44.7 -7 45 56.0 17-Mar-1998 15:09:58 41 53 47.1 -7 45 57.3 17-Mar-1998 15:10:04 41 53 48.9 -7 45 55.3 17-Mar-1998 15:10:11 41 53 48.6 -7 45 51.8 17-Mar-1998 15:10:17 41 53 47.0 -7 45 51.6 17-Mar-1998 15:10:23 41 53 47.6 -7 45 53.7 17-Mar-1998 15:10:33 41 53 50.5 -7 45 55.0 17-Mar-1998 15:10:41 41 53 53.3 -7 45 56.1 17-Mar-1998 15:10:47 41 53 54.9 -7 45 57.3 17-Mar-1998 15:10:52 41 53 56.5 -7 45 56.6 17-Mar-1998 15:10:56 41 53 55.5 -7 45 54.9 17-Mar-1998 15:11:01 41 53 54.9 -7 45 55.1 17-Mar-1998 15:11:07 41 53 56.5 -7 45 56.0 17-Mar-1998 15:11:12 41 53 57.3 -7 45 53.6 17-Mar-1998 15:11:19 41 53 55.9 -7 45 51.9 17-Mar-1998 15:11:25 41 53 56.3 -7 45 53.5 17-Mar-1998 15:11:30 41 53 58.0 -7 45 52.7 17-Mar-1998 15:11:34 41 53 57.5 -7 45 50.7 17-Mar-1998 15:11:39 41 53 56.0 -7 45 50.9 17-Mar-1998 15:11:45 41 53 56.9 -7 45 51.9 17-Mar-1998 15:11:50 41 53 58.5 -7 45 51.8 17-Mar-1998 15:11:57 41 54 00.2 -7 45 48.2 17-Mar-1998 15:12:03 41 53 59.1 -7 45 45.9 17-Mar-1998 15:12:08 41 53 58.2 -7 45 45.9 17-Mar-1998 15:12:15 41 53 58.5 -7 45 47.6 17-Mar-1998 15:12:20 41 54 00.2 -7 45 46.2 17-Mar-1998 15:12:26 41 54 00.0 -7 45 42.9 17-Mar-1998 15:12:31 41 53 58.4 -7 45 43.1 17-Mar-1998 15:12:37 41 53 59.4 -7 45 44.3 17-Mar-1998 15:12:45 41 54 02.1 -7 45 42.4 17-Mar-1998 15:12:50 41 54 02.3 -7 45 39.5 17-Mar-1998 15:12:56 41 54 01.0 -7 45 37.9 17-Mar-1998 15:13:01 41 54 00.1 -7 45 39.2 17-Mar-1998 15:13:08 41 54 01.0 -7 45 41.0 17-Mar-1998 15:13:13 41 54 02.7 -7 45 41.1 17-Mar-1998 15:13:19 41 54 04.2 -7 45 38.6 17-Mar-1998 15:13:24 41 54 03.4 -7 45 36.2 17-Mar-1998 15:13:29 41 54 02.4 -7 45 36.8 17-Mar-1998 15:13:34 41 54 03.6 -7 45 37.6 17-Mar-1998 15:13:40 41 54 05.4 -7 45 36.4 17-Mar-1998 15:13:46 41 54 06.4 -7 45 33.4 17-Mar-1998 15:13:52 41 54 06.2 -7 45 30.0 17-Mar-1998 15:13:58 41 54 07.7 -7 45 28.2 17-Mar-1998 15:14:06 41 54 09.5 -7 45 29.3 17-Mar-1998 15:14:11 41 54 10.8 -7 45 28.9 17-Mar-1998 15:14:17 41 54 10.7 -7 45 26.0 17-Mar-1998 15:14:22 41 54 09.3 -7 45 25.2 17-Mar-1998 15:14:28 41 54 09.0 -7 45 26.5 17-Mar-1998 15:14:33 41 54 10.3 -7 45 27.0 17-Mar-1998 15:14:39 41 54 11.6 -7 45 24.6 17-Mar-1998 15:14:44 41 54 10.6 -7 45 22.8 17-Mar-1998 15:14:49 41 54 09.7 -7 45 23.5 17-Mar-1998 15:14:55 41 54 11.2 -7 45 23.7 17-Mar-1998 15:14:59 41 54 12.0 -7 45 21.7 17-Mar-1998 15:15:03 41 54 10.9 -7 45 20.6 17-Mar-1998 15:15:07 41 54 10.6 -7 45 21.4 17-Mar-1998 15:15:12 41 54 12.0 -7 45 20.9 17-Mar-1998 15:15:16 41 54 11.9 -7 45 18.7 17-Mar-1998 15:15:21 41 54 10.5 -7 45 18.2 17-Mar-1998 15:15:26 41 54 10.8 -7 45 19.4 17-Mar-1998 15:15:31 41 54 12.0 -7 45 17.7 17-Mar-1998 15:15:37 41 54 11.4 -7 45 14.8 17-Mar-1998 15:15:43 41 54 09.4 -7 45 14.2 17-Mar-1998 15:15:48 41 54 07.8 -7 45 14.0 17-Mar-1998 15:15:56 41 54 06.6 -7 45 14.9 17-Mar-1998 15:16:01 41 54 07.7 -7 45 15.5 17-Mar-1998 15:16:08 41 54 09.5 -7 45 15.1 17-Mar-1998 15:16:15 41 54 10.1 -7 45 11.3 17-Mar-1998 15:16:20 41 54 08.9 -7 45 09.5 17-Mar-1998 15:16:26 41 54 07.6 -7 45 09.8 17-Mar-1998 15:16:31 41 54 09.0 -7 45 09.9 17-Mar-1998 15:16:38 41 54 10.7 -7 45 06.7 17-Mar-1998 15:16:44 41 54 09.2 -7 45 04.5 17-Mar-1998 15:16:49 41 54 08.2 -7 45 05.0 17-Mar-1998 15:16:54 41 54 08.9 -7 45 05.8 17-Mar-1998 15:17:03 41 54 11.8 -7 45 04.8 17-Mar-1998 15:17:07 41 54 12.0 -7 45 02.9 17-Mar-1998 15:17:12 41 54 10.9 -7 45 00.1 17-Mar-1998 15:17:19 41 54 08.7 -7 44 58.7 17-Mar-1998 15:17:26 41 54 07.9 -7 44 59.4 17-Mar-1998 15:17:32 41 54 09.1 -7 45 00.6 17-Mar-1998 15:17:38 41 54 11.2 -7 44 59.4 17-Mar-1998 15:17:45 41 54 12.1 -7 44 56.4 17-Mar-1998 15:17:51 41 54 13.7 -7 44 54.3 17-Mar-1998 15:18:06 41 54 17.3 -7 44 51.8 17-Mar-1998 15:18:11 41 54 18.1 -7 44 52.4 17-Mar-1998 15:18:17 41 54 18.5 -7 44 53.4 17-Mar-1998 15:18:23 41 54 19.5 -7 44 52.6 17-Mar-1998 15:18:31 41 54 21.2 -7 44 50.1 17-Mar-1998 15:18:39 41 54 23.4 -7 44 49.5 17-Mar-1998 15:18:48 41 54 25.0 -7 44 51.2 17-Mar-1998 15:18:54 41 54 26.3 -7 44 51.7 17-Mar-1998 15:19:02 41 54 28.4 -7 44 49.8 17-Mar-1998 15:19:08 41 54 29.2 -7 44 47.5 17-Mar-1998 15:19:15 41 54 27.9 -7 44 44.5 17-Mar-1998 15:19:20 41 54 26.4 -7 44 44.0 17-Mar-1998 15:19:27 41 54 25.6 -7 44 45.9 17-Mar-1998 15:19:34 41 54 26.9 -7 44 47.6 17-Mar-1998 15:19:41 41 54 28.8 -7 44 47.1 17-Mar-1998 15:19:46 41 54 29.6 -7 44 45.3 17-Mar-1998 15:19:52 41 54 28.7 -7 44 42.3 17-Mar-1998 15:19:58 41 54 27.2 -7 44 41.2 17-Mar-1998 15:20:05 41 54 25.5 -7 44 43.3 17-Mar-1998 15:20:12 41 54 25.9 -7 44 46.0 17-Mar-1998 15:20:20 41 54 26.3 -7 44 48.1 17-Mar-1998 15:20:25 41 54 24.7 -7 44 47.6 17-Mar-1998 15:20:31 41 54 25.1 -7 44 44.6 17-Mar-1998 15:20:35 41 54 26.1 -7 44 45.3 17-Mar-1998 15:20:40 41 54 25.3 -7 44 46.6 17-Mar-1998 15:20:46 41 54 23.4 -7 44 45.0 17-Mar-1998 15:20:51 41 54 23.6 -7 44 43.0 17-Mar-1998 15:20:57 41 54 25.2 -7 44 42.1 17-Mar-1998 15:21:02 41 54 25.6 -7 44 43.3 17-Mar-1998 15:21:07 41 54 24.0 -7 44 43.6 17-Mar-1998 15:21:11 41 54 22.8 -7 44 42.0 17-Mar-1998 15:21:17 41 54 24.2 -7 44 39.6 17-Mar-1998 15:21:22 41 54 25.6 -7 44 39.8 17-Mar-1998 15:21:29 41 54 26.6 -7 44 40.8 17-Mar-1998 15:21:33 41 54 26.5 -7 44 41.8 17-Mar-1998 15:21:39 41 54 25.3 -7 44 41.7 17-Mar-1998 15:21:44 41 54 24.2 -7 44 39.9 17-Mar-1998 15:21:50 41 54 25.0 -7 44 36.7 17-Mar-1998 15:21:58 41 54 27.6 -7 44 35.1 17-Mar-1998 15:22:06 41 54 30.2 -7 44 34.1 17-Mar-1998 15:22:19 41 54 33.9 -7 44 31.2 17-Mar-1998 15:22:32 41 54 37.0 -7 44 27.5 17-Mar-1998 15:22:38 41 54 38.5 -7 44 27.2 17-Mar-1998 15:22:48 41 54 40.8 -7 44 28.3 17-Mar-1998 15:22:57 41 54 43.0 -7 44 30.0 17-Mar-1998 15:23:03 41 54 44.9 -7 44 30.3 17-Mar-1998 15:23:08 41 54 45.1 -7 44 28.7 17-Mar-1998 15:23:14 41 54 43.5 -7 44 26.9 17-Mar-1998 15:23:19 41 54 41.4 -7 44 27.0 17-Mar-1998 15:23:25 41 54 40.7 -7 44 28.3 17-Mar-1998 15:23:31 41 54 42.1 -7 44 29.4 17-Mar-1998 15:23:41 41 54 45.6 -7 44 29.0 17-Mar-1998 15:23:49 41 54 48.4 -7 44 28.1 17-Mar-1998 15:23:57 41 54 50.4 -7 44 27.9 17-Mar-1998 15:24:02 41 54 51.6 -7 44 25.8 17-Mar-1998 15:24:08 41 54 50.5 -7 44 24.4 17-Mar-1998 15:24:14 41 54 48.3 -7 44 25.4 17-Mar-1998 15:24:20 41 54 48.2 -7 44 27.3 17-Mar-1998 15:24:28 41 54 50.4 -7 44 28.8 17-Mar-1998 15:24:43 41 54 55.0 -7 44 30.3 17-Mar-1998 15:24:53 41 54 58.6 -7 44 30.2 17-Mar-1998 15:24:58 41 55 00.0 -7 44 28.3 17-Mar-1998 15:25:03 41 54 58.8 -7 44 26.8 17-Mar-1998 15:25:09 41 54 56.8 -7 44 26.6 17-Mar-1998 15:25:15 41 54 56.3 -7 44 28.5 17-Mar-1998 15:25:22 41 54 58.8 -7 44 30.0 17-Mar-1998 15:25:28 41 55 00.7 -7 44 28.4 17-Mar-1998 15:25:33 41 55 00.3 -7 44 26.5 17-Mar-1998 15:25:40 41 54 58.2 -7 44 26.2 17-Mar-1998 15:25:46 41 54 57.4 -7 44 28.2 17-Mar-1998 15:25:51 41 54 58.6 -7 44 29.8 17-Mar-1998 15:25:56 41 55 00.7 -7 44 30.0 17-Mar-1998 15:26:03 41 55 02.6 -7 44 27.5 17-Mar-1998 15:26:08 41 55 02.6 -7 44 25.4 17-Mar-1998 15:26:15 41 55 00.8 -7 44 24.1 17-Mar-1998 15:26:22 41 54 58.1 -7 44 26.1 17-Mar-1998 15:26:29 41 54 57.5 -7 44 27.6 17-Mar-1998 15:26:34 41 54 56.7 -7 44 26.9 17-Mar-1998 15:26:41 41 54 56.1 -7 44 24.3 17-Mar-1998 15:26:47 41 54 57.5 -7 44 22.8 17-Mar-1998 15:26:53 41 54 58.9 -7 44 22.8 17-Mar-1998 15:27:00 41 54 59.2 -7 44 25.3 17-Mar-1998 15:27:09 41 54 58.7 -7 44 28.5 17-Mar-1998 15:27:17 41 54 56.4 -7 44 33.3 17-Mar-1998 15:27:23 41 54 58.8 -7 44 33.5 17-Mar-1998 15:27:30 41 55 01.8 -7 44 33.6 17-Mar-1998 15:27:38 41 55 05.3 -7 44 33.1 17-Mar-1998 15:27:44 41 55 07.2 -7 44 33.6 17-Mar-1998 15:27:51 41 55 08.7 -7 44 35.7 17-Mar-1998 15:27:57 41 55 10.9 -7 44 35.6 17-Mar-1998 15:28:03 41 55 11.4 -7 44 33.6 17-Mar-1998 15:28:10 41 55 10.1 -7 44 32.4 17-Mar-1998 15:28:15 41 55 09.5 -7 44 31.5 17-Mar-1998 15:28:20 41 55 10.0 -7 44 28.9 17-Mar-1998 15:28:26 41 55 12.2 -7 44 28.0 17-Mar-1998 15:28:33 41 55 14.5 -7 44 29.9 17-Mar-1998 15:28:39 41 55 16.1 -7 44 30.9 17-Mar-1998 15:28:49 41 55 18.4 -7 44 33.9 17-Mar-1998 15:28:58 41 55 20.7 -7 44 36.5 17-Mar-1998 15:29:07 41 55 22.2 -7 44 40.2 17-Mar-1998 15:29:17 41 55 22.7 -7 44 45.7 17-Mar-1998 15:29:26 41 55 23.7 -7 44 49.2 17-Mar-1998 15:29:32 41 55 22.7 -7 44 51.8 17-Mar-1998 15:29:38 41 55 21.7 -7 44 51.0 17-Mar-1998 15:29:45 41 55 22.1 -7 44 51.6 17-Mar-1998 15:30:00 41 55 20.1 -7 44 45.2 17-Mar-1998 15:30:06 41 55 18.2 -7 44 46.2 17-Mar-1998 15:30:15 41 55 16.3 -7 44 47.8 17-Mar-1998 15:30:23 41 55 15.1 -7 44 47.2 17-Mar-1998 15:30:30 41 55 15.0 -7 44 44.8 17-Mar-1998 15:30:37 41 55 14.6 -7 44 42.7 17-Mar-1998 15:30:44 41 55 13.4 -7 44 43.3 17-Mar-1998 15:30:53 41 55 12.2 -7 44 44.3 17-Mar-1998 15:31:00 41 55 11.6 -7 44 46.1 17-Mar-1998 15:31:05 41 55 13.2 -7 44 47.5 17-Mar-1998 15:31:15 41 55 17.0 -7 44 49.7 17-Mar-1998 15:31:26 41 55 21.2 -7 44 51.9 17-Mar-1998 15:31:36 41 55 24.0 -7 44 54.4 17-Mar-1998 15:31:44 41 55 25.7 -7 44 56.9 17-Mar-1998 15:31:54 41 55 28.0 -7 45 00.3 17-Mar-1998 15:32:07 41 55 31.4 -7 45 03.2 17-Mar-1998 15:32:17 41 55 33.9 -7 45 04.0 17-Mar-1998 15:32:31 41 55 37.0 -7 45 03.5 17-Mar-1998 15:32:42 41 55 39.5 -7 45 01.8 17-Mar-1998 15:32:53 41 55 42.2 -7 45 00.9 17-Mar-1998 15:33:11 41 55 46.9 -7 44 59.4 17-Mar-1998 15:33:20 41 55 50.3 -7 45 00.4 17-Mar-1998 15:33:29 41 55 52.6 -7 45 01.0 17-Mar-1998 15:33:39 41 55 55.0 -7 44 58.7 17-Mar-1998 15:33:48 41 55 58.1 -7 44 58.0 17-Mar-1998 15:34:08 41 56 04.4 -7 44 56.2 17-Mar-1998 15:34:13 41 56 06.4 -7 44 55.1 17-Mar-1998 15:34:18 41 56 05.7 -7 44 53.1 17-Mar-1998 15:34:24 41 56 04.1 -7 44 53.4 17-Mar-1998 15:34:30 41 56 05.0 -7 44 55.2 17-Mar-1998 15:34:36 41 56 07.6 -7 44 55.0 17-Mar-1998 15:34:43 41 56 09.3 -7 44 53.1 17-Mar-1998 15:34:51 41 56 12.0 -7 44 52.4 17-Mar-1998 15:35:06 41 56 17.0 -7 44 50.0 17-Mar-1998 15:35:21 41 56 22.2 -7 44 48.5 17-Mar-1998 15:35:45 41 56 30.5 -7 44 46.4 17-Mar-1998 15:36:02 41 56 35.3 -7 44 46.2 17-Mar-1998 15:36:21 41 56 39.8 -7 44 47.6 17-Mar-1998 15:36:29 41 56 40.6 -7 44 49.3 17-Mar-1998 15:36:46 41 56 44.1 -7 44 53.1 17-Mar-1998 15:36:54 41 56 46.3 -7 44 54.2 17-Mar-1998 15:37:10 41 56 51.0 -7 44 56.2 17-Mar-1998 15:37:24 41 56 54.3 -7 44 58.3 17-Mar-1998 15:37:34 41 56 56.7 -7 44 59.0 17-Mar-1998 15:37:56 41 57 02.6 -7 44 59.0 17-Mar-1998 15:38:06 41 57 04.5 -7 44 55.6 17-Mar-1998 15:38:16 41 57 05.5 -7 44 53.0 17-Mar-1998 15:38:24 41 57 06.9 -7 44 51.8 17-Mar-1998 15:38:32 41 57 08.9 -7 44 50.6 17-Mar-1998 15:38:44 41 57 10.6 -7 44 49.2 17-Mar-1998 15:38:52 41 57 12.2 -7 44 51.1 17-Mar-1998 15:39:02 41 57 14.3 -7 44 51.3 17-Mar-1998 15:39:11 41 57 15.9 -7 44 51.3 17-Mar-1998 15:39:18 41 57 16.2 -7 44 50.0 17-Mar-1998 15:39:23 41 57 14.3 -7 44 48.7 17-Mar-1998 15:39:28 41 57 12.4 -7 44 49.5 17-Mar-1998 15:39:32 41 57 12.5 -7 44 51.0 17-Mar-1998 15:39:38 41 57 13.8 -7 44 51.2 17-Mar-1998 15:39:42 41 57 13.8 -7 44 49.7 17-Mar-1998 15:39:48 41 57 10.8 -7 44 48.8 17-Mar-1998 15:39:52 41 57 10.0 -7 44 50.1 17-Mar-1998 15:39:57 41 57 10.7 -7 44 51.9 17-Mar-1998 15:40:03 41 57 12.1 -7 44 51.0 17-Mar-1998 15:40:08 41 57 11.2 -7 44 48.9 17-Mar-1998 15:40:13 41 57 09.2 -7 44 47.8 17-Mar-1998 15:40:18 41 57 07.6 -7 44 49.4 17-Mar-1998 15:40:23 41 57 08.1 -7 44 51.1 17-Mar-1998 15:40:30 41 57 09.5 -7 44 50.6 17-Mar-1998 15:40:37 41 57 09.1 -7 44 47.6 17-Mar-1998 15:40:42 41 57 06.9 -7 44 46.7 17-Mar-1998 15:40:46 41 57 05.6 -7 44 47.5 17-Mar-1998 15:40:51 41 57 06.5 -7 44 49.4 17-Mar-1998 15:40:57 41 57 07.7 -7 44 48.8 17-Mar-1998 15:41:02 41 57 07.7 -7 44 46.6 17-Mar-1998 15:41:07 41 57 05.6 -7 44 44.9 17-Mar-1998 15:41:12 41 57 03.7 -7 44 46.7 17-Mar-1998 15:41:17 41 57 04.3 -7 44 48.2 17-Mar-1998 15:41:23 41 57 06.1 -7 44 48.1 17-Mar-1998 15:41:29 41 57 06.3 -7 44 46.1 17-Mar-1998 15:41:36 41 57 03.9 -7 44 45.2 17-Mar-1998 15:41:40 41 57 02.7 -7 44 47.0 17-Mar-1998 15:41:46 41 57 04.6 -7 44 47.9 17-Mar-1998 15:41:53 41 57 06.1 -7 44 47.3 17-Mar-1998 15:41:58 41 57 05.1 -7 44 45.8 17-Mar-1998 15:42:04 41 57 01.5 -7 44 48.3 17-Mar-1998 15:42:08 41 57 02.6 -7 44 49.0 17-Mar-1998 15:42:15 41 57 05.4 -7 44 50.1 17-Mar-1998 15:42:20 41 57 06.1 -7 44 48.1 17-Mar-1998 15:42:25 41 57 03.9 -7 44 46.7 17-Mar-1998 15:42:33 41 57 02.0 -7 44 47.7 17-Mar-1998 15:42:39 41 57 03.6 -7 44 49.6 17-Mar-1998 15:42:45 41 57 04.9 -7 44 48.5 17-Mar-1998 15:42:53 41 57 04.5 -7 44 46.0 17-Mar-1998 15:42:59 41 57 01.9 -7 44 45.8 17-Mar-1998 15:43:04 41 57 00.2 -7 44 47.5 17-Mar-1998 15:43:11 41 57 00.7 -7 44 50.3 17-Mar-1998 15:43:19 41 57 01.7 -7 44 52.1 17-Mar-1998 15:43:29 41 57 05.8 -7 44 53.1 17-Mar-1998 15:43:38 41 57 07.4 -7 44 52.3 17-Mar-1998 15:43:48 41 57 09.3 -7 44 51.5 17-Mar-1998 15:43:55 41 57 11.7 -7 44 51.8 17-Mar-1998 15:44:09 41 57 12.1 -7 44 49.0 17-Mar-1998 15:44:20 41 57 11.8 -7 44 46.5 17-Mar-1998 15:44:30 41 57 12.0 -7 44 44.4 17-Mar-1998 15:44:38 41 57 11.7 -7 44 41.8 17-Mar-1998 15:44:43 41 57 11.4 -7 44 40.7 17-Mar-1998 15:44:48 41 57 08.9 -7 44 41.4 17-Mar-1998 15:44:53 41 57 09.2 -7 44 43.5 17-Mar-1998 15:44:58 41 57 11.5 -7 44 44.7 17-Mar-1998 15:45:02 41 57 12.1 -7 44 44.3 17-Mar-1998 15:45:09 41 57 11.6 -7 44 42.1 17-Mar-1998 15:45:15 41 57 10.7 -7 44 40.5 17-Mar-1998 15:45:21 41 57 12.2 -7 44 40.4 17-Mar-1998 15:45:29 41 57 13.8 -7 44 39.0 17-Mar-1998 15:45:38 41 57 15.4 -7 44 37.9 17-Mar-1998 15:45:47 41 57 16.2 -7 44 35.8 17-Mar-1998 15:45:55 41 57 17.0 -7 44 33.3 17-Mar-1998 15:46:05 41 57 18.3 -7 44 32.0 17-Mar-1998 15:46:11 41 57 17.1 -7 44 29.4 17-Mar-1998 15:46:18 41 57 14.0 -7 44 28.9 17-Mar-1998 15:46:22 41 57 13.0 -7 44 30.5 17-Mar-1998 15:46:29 41 57 14.6 -7 44 32.3 17-Mar-1998 15:46:37 41 57 15.5 -7 44 31.0 17-Mar-1998 15:46:43 41 57 14.3 -7 44 29.1 17-Mar-1998 15:46:49 41 57 11.9 -7 44 29.2 17-Mar-1998 15:46:56 41 57 10.0 -7 44 27.8 17-Mar-1998 15:47:08 41 57 08.2 -7 44 24.2 17-Mar-1998 15:47:16 41 57 07.7 -7 44 22.8 17-Mar-1998 15:47:26 41 57 06.8 -7 44 19.2 17-Mar-1998 15:47:31 41 57 08.0 -7 44 18.5 17-Mar-1998 15:47:35 41 57 07.4 -7 44 17.2 17-Mar-1998 15:47:42 41 57 04.8 -7 44 16.0 17-Mar-1998 15:47:51 41 57 02.2 -7 44 13.7 17-Mar-1998 15:47:58 41 57 02.4 -7 44 11.5 17-Mar-1998 15:48:04 41 57 01.8 -7 44 09.6 17-Mar-1998 15:48:10 41 56 59.2 -7 44 08.6 17-Mar-1998 15:48:15 41 56 57.5 -7 44 07.5 17-Mar-1998 15:48:21 41 56 55.9 -7 44 05.8 17-Mar-1998 15:48:29 41 56 54.5 -7 44 02.6 17-Mar-1998 15:48:40 41 56 55.0 -7 43 59.3 17-Mar-1998 15:48:48 41 56 57.2 -7 43 58.7 17-Mar-1998 15:48:58 41 56 58.4 -7 43 57.3 17-Mar-1998 15:49:04 41 56 58.3 -7 43 54.8 17-Mar-1998 15:49:13 41 56 57.9 -7 43 51.5 17-Mar-1998 15:49:21 41 56 57.9 -7 43 49.3 17-Mar-1998 15:49:29 41 56 58.5 -7 43 46.5 17-Mar-1998 15:49:36 41 56 58.3 -7 43 43.5 17-Mar-1998 15:49:50 41 56 57.6 -7 43 38.2 17-Mar-1998 15:50:15 41 56 56.9 -7 43 29.3 17-Mar-1998 15:50:33 41 56 55.6 -7 43 23.0 17-Mar-1998 15:50:52 41 56 55.3 -7 43 17.0 17-Mar-1998 15:51:11 41 56 56.1 -7 43 11.3 17-Mar-1998 15:51:16 41 56 58.8 -7 43 11.1 17-Mar-1998 15:51:21 41 57 01.2 -7 43 12.3 17-Mar-1998 15:51:26 41 57 01.0 -7 43 13.1 17-Mar-1998 15:51:33 41 57 01.3 -7 43 11.9 17-Mar-1998 15:51:46 41 57 04.0 -7 43 10.8 17-Mar-1998 15:51:59 41 57 06.1 -7 43 09.8 17-Mar-1998 15:52:07 41 57 05.3 -7 43 06.5 17-Mar-1998 15:52:15 41 57 04.0 -7 43 04.2 17-Mar-1998 15:52:30 41 57 01.1 -7 43 00.2 17-Mar-1998 15:52:43 41 56 58.5 -7 42 57.7 17-Mar-1998 15:53:03 41 56 54.3 -7 42 52.1 17-Mar-1998 15:53:12 41 56 53.6 -7 42 50.6 17-Mar-1998 15:53:21 41 56 55.2 -7 42 50.3 17-Mar-1998 15:53:28 41 56 57.6 -7 42 51.7 17-Mar-1998 15:53:37 41 56 58.6 -7 42 55.7 17-Mar-1998 15:53:48 41 57 00.6 -7 42 58.2 17-Mar-1998 15:54:01 41 57 03.1 -7 43 00.2 17-Mar-1998 15:54:07 41 57 03.4 -7 42 59.0 17-Mar-1998 15:54:22 41 57 02.9 -7 42 54.8 17-Mar-1998 15:54:34 41 57 02.5 -7 42 50.8 17-Mar-1998 15:54:39 41 57 04.0 -7 42 50.2 17-Mar-1998 15:54:45 41 57 05.7 -7 42 51.5 17-Mar-1998 15:54:50 41 57 05.5 -7 42 53.7 17-Mar-1998 15:54:56 41 57 05.8 -7 42 56.4 17-Mar-1998 15:55:05 41 57 06.9 -7 42 57.7 17-Mar-1998 15:55:16 41 57 09.4 -7 42 56.7 17-Mar-1998 15:55:23 41 57 11.3 -7 42 56.2 17-Mar-1998 15:55:29 41 57 12.8 -7 42 55.8 17-Mar-1998 15:55:34 41 57 12.6 -7 42 54.2 17-Mar-1998 15:55:38 41 57 11.8 -7 42 53.9 17-Mar-1998 15:55:43 41 57 10.3 -7 42 56.0 17-Mar-1998 15:55:48 41 57 11.5 -7 42 57.6 17-Mar-1998 15:55:54 41 57 11.9 -7 42 56.2 17-Mar-1998 15:55:59 41 57 11.1 -7 42 55.2 17-Mar-1998 15:56:05 41 57 09.4 -7 42 57.3 17-Mar-1998 15:56:08 41 57 10.0 -7 42 58.0 17-Mar-1998 15:56:13 41 57 10.9 -7 42 57.0 17-Mar-1998 15:56:17 41 57 09.9 -7 42 56.3 17-Mar-1998 15:56:22 41 57 08.3 -7 42 58.1 17-Mar-1998 15:56:28 41 57 09.4 -7 43 00.0 17-Mar-1998 15:56:33 41 57 10.5 -7 42 58.9 17-Mar-1998 15:56:37 41 57 09.5 -7 42 58.0 17-Mar-1998 15:56:41 41 57 09.0 -7 42 59.4 17-Mar-1998 15:56:47 41 57 09.3 -7 43 01.4 17-Mar-1998 15:56:52 41 57 10.6 -7 43 00.8 17-Mar-1998 15:56:59 41 57 09.8 -7 42 59.3 17-Mar-1998 15:57:06 41 57 07.7 -7 43 00.7 17-Mar-1998 15:57:13 41 57 07.8 -7 43 03.8 17-Mar-1998 15:57:18 41 57 09.2 -7 43 04.2 17-Mar-1998 15:57:25 41 57 10.6 -7 43 02.6 17-Mar-1998 15:57:30 41 57 10.5 -7 43 01.8 17-Mar-1998 15:57:36 41 57 08.8 -7 43 01.6 17-Mar-1998 15:57:40 41 57 07.7 -7 43 03.2 17-Mar-1998 15:57:46 41 57 07.9 -7 43 05.7 17-Mar-1998 15:57:53 41 57 08.9 -7 43 07.2 17-Mar-1998 15:58:04 41 57 12.2 -7 43 06.8 17-Mar-1998 15:58:12 41 57 13.3 -7 43 04.8 17-Mar-1998 15:58:19 41 57 12.9 -7 43 03.4 17-Mar-1998 15:58:24 41 57 13.6 -7 43 03.1 17-Mar-1998 15:58:30 41 57 14.3 -7 43 05.6 17-Mar-1998 15:58:35 41 57 12.8 -7 43 07.3 17-Mar-1998 15:58:42 41 57 11.3 -7 43 06.9 17-Mar-1998 15:58:50 41 57 10.6 -7 43 04.7 17-Mar-1998 15:58:56 41 57 11.1 -7 43 03.9 17-Mar-1998 15:59:01 41 57 12.1 -7 43 05.8 17-Mar-1998 15:59:08 41 57 10.6 -7 43 08.9 17-Mar-1998 15:59:13 41 57 09.5 -7 43 08.9 17-Mar-1998 15:59:19 41 57 10.0 -7 43 07.1 17-Mar-1998 15:59:24 41 57 11.2 -7 43 07.3 17-Mar-1998 15:59:30 41 57 10.6 -7 43 10.2 17-Mar-1998 15:59:35 41 57 09.4 -7 43 10.7 17-Mar-1998 15:59:40 41 57 09.4 -7 43 09.0 17-Mar-1998 15:59:47 41 57 11.1 -7 43 08.9 17-Mar-1998 15:59:53 41 57 12.5 -7 43 08.1 17-Mar-1998 15:59:58 41 57 11.1 -7 43 07.6 17-Mar-1998 16:00:03 41 57 10.0 -7 43 09.5 17-Mar-1998 16:00:08 41 57 11.8 -7 43 09.4 17-Mar-1998 16:00:13 41 57 11.5 -7 43 08.4 17-Mar-1998 16:00:18 41 57 09.8 -7 43 09.4 17-Mar-1998 16:00:23 41 57 09.5 -7 43 11.7 17-Mar-1998 16:00:27 41 57 10.9 -7 43 12.7 17-Mar-1998 16:00:32 41 57 11.5 -7 43 11.5 17-Mar-1998 16:00:36 41 57 10.2 -7 43 10.7 17-Mar-1998 16:00:42 41 57 09.1 -7 43 12.7 17-Mar-1998 16:00:47 41 57 09.8 -7 43 14.4 17-Mar-1998 16:00:52 41 57 10.7 -7 43 13.2 17-Mar-1998 16:00:56 41 57 09.3 -7 43 12.9 17-Mar-1998 16:01:00 41 57 08.6 -7 43 14.6 17-Mar-1998 16:01:07 41 57 09.7 -7 43 16.7 17-Mar-1998 16:01:12 41 57 11.0 -7 43 16.3 17-Mar-1998 16:01:17 41 57 10.3 -7 43 14.8 17-Mar-1998 16:01:21 41 57 08.9 -7 43 15.8 17-Mar-1998 16:01:25 41 57 09.0 -7 43 18.1 17-Mar-1998 16:01:30 41 57 10.7 -7 43 19.2 17-Mar-1998 16:01:37 41 57 11.1 -7 43 17.4 17-Mar-1998 16:01:44 41 57 10.3 -7 43 16.0 17-Mar-1998 16:01:48 41 57 10.2 -7 43 15.3 17-Mar-1998 16:01:53 41 57 11.9 -7 43 16.8 17-Mar-1998 16:01:59 41 57 12.8 -7 43 16.8 17-Mar-1998 16:02:07 41 57 14.4 -7 43 16.7 17-Mar-1998 16:02:18 41 57 16.2 -7 43 15.4 17-Mar-1998 16:02:27 41 57 16.2 -7 43 12.8 17-Mar-1998 16:02:38 41 57 16.8 -7 43 11.1 17-Mar-1998 16:02:45 41 57 14.8 -7 43 10.4 17-Mar-1998 16:02:57 41 57 11.2 -7 43 10.3 17-Mar-1998 16:03:10 41 57 07.4 -7 43 11.3 17-Mar-1998 16:03:18 41 57 05.4 -7 43 12.2 17-Mar-1998 16:03:29 41 57 02.5 -7 43 13.8 17-Mar-1998 16:03:37 41 57 00.8 -7 43 13.1 17-Mar-1998 16:03:49 41 56 59.4 -7 43 10.8 17-Mar-1998 16:03:55 41 57 00.1 -7 43 10.4 17-Mar-1998 16:04:00 41 57 00.8 -7 43 10.0 17-Mar-1998 16:04:10 41 57 01.7 -7 43 08.0 gpsman-6.4.4.2/manual/html/info/instupdate.tcl.md5sum0000644000175000017500000000006110023601152020520 0ustar migmiga62dbfebfe1332a06d2127fa614e7d3d instupdate.tcl gpsman-6.4.4.2/manual/html/info/instupdate.tcl.sig0000644000175000017500000000010110006267677020110 0ustar migmig?@oj^ @wUpxU ٪gpsman-6.4.4.2/manual/html/info/samplemap.gif0000644000175000017500000000672606541176075017134 0ustar migmigGIF87a;IIIiA,;0I8ͻ`(dihlp,tmx|pH,Ȥrl:ШtJZجvzxL.zn|N~5![U\T`Z_?ڻֳ4ҢPѽ3٢0oElf#j[5F^9K 0DDhs3RŬd$7#F%M|`g}v B5EAu&"lVVj%mԬ%2uc-/ئT] V5̘(h:*PN dx+/!^o9C4zر4?}=NakQKwh̻G3tȭznj"g-'gH̕Jv o@5g6G?,m:,^~P(VavQe7rZJ}BHB$M|zH\=X `2: a '¸ׄ TG/WcO@cs%Ox7\KB;&*bxBb@go iFE4YU^6x@hLybA*Zٟ}z3a<Áe6nqz]%qTݷf@o։%h0v_FWeф*稗n#$%Emk'Bõw[; m @J.른^K/govn ;f˯+wmƐ̱ @ $Oqʊ2".|2m͍Ќ3!1>tЁLtG/BnyLt!>MRatzZoMG^[UFu,ui„qTPpvKb\7Ws /z޷'//ӛ#Kڟ7~G?ϟ8G?Yyf%>i51}z`fT? ΂œw |\]րj& SA.b8H7^mC"ذ#!QW!F X!21O()R*K,rqN(FM"̰#G# \7qD-q#m)DH^&G̜,7t Cr| ɼY);9Hjo{WS@3y-ã\xfCSK9!F).+LKY@z8hj25CБPiUjͤJX֤?mHǐ# C1SLD}sDGu\T/EnHmPI2mS,¾RI k BJ!.lv0 4A'3W1nk7{)LcáT32%0$5CGXU;!EH|iI4[z,9U76E*UNj 6wU_-YtN$mJİ*{*lbDZe fٗr9U~)UHm\B͎Yͺ-nk˳vMm)e8\#FVRj5œb&G|tssYGVEgv\pRִ珎 ĈЂ1jZsQ\ [רU}hC4V;,+G{%8٭f 7ܡ#hhOg an]!D(h]fk&nB"JAfxOHWD_Uxb7dytޙ"i orіC1z0bD)/7SCE]ξF*T/kqi6N,v EDM k[Y{{ˣoɤm 2ZݛG2w7j 푠1/ Z8vgaU6l=δxɫrZH]&4I|qGaFw7:jίsRjSB17ez±Y,iU6>/i+;K3 )r@Gfz` KY2,. R 7Qo,x Ԁ,: ƽRE5ɤlN鼍!vyàD}{6> ՍWwt9fkO9u:c2[,w"ޢua|1?mKsh2nUGׇ#U?Oh>}W[9^տs.5es?=yk8LOZm?0S.7FD8.@ϣvJ0T0h<#T/DK<6`q{#"F>"fR,f~#JIs- ~BÄ~q&!'=ڶU>VO[> t#)c"~mJ8?7~Cgc`=h@P{ȇt0hH45GClh%=$Lc"p= ҀKd@g6'p8D'kxb(Ayu(7DB{c3(s\t!k4ăeddRWTr؈vQ|:@φU f+'VT) 5n/csUdFA=$58 7SU@HQy#XykGzy8~5AesPh]8o*PwyFz~a5+ʹhqA${v\Dw$voŒ̸n|\ٕ^`b9dYfyhjlٖ%p1cwwv7u9`gwyuzu閆y&٘9Yyٙ9Yyٚ9Y \e0D|wLEx$9 JTnG1#Щ?yؙڹٝ9Yy虞깞pYYt RIyɞ0a I :Zz z yZ&z(*,j)XE圄D`$dS-@B:DZFzHJLڤNPR:TZL;gpsman-6.4.4.2/manual/html/info/sampletrrt.gif0000644000175000017500000006462607305761653017356 0ustar migmigGIF89apo "Zvޒ~NNN*R>fff⒆zrrrv궺zzzҊrʪޒڞҊvξ枂צꮾ,,,~~~RRRvzϓ666ʂVVVꦆβš▚nZ.ֶ^^^ڂ²枎͛~Ǝrjjjz:::►⺺ʖʆʶ⾞j梞ꪪVZ޾梪jFf>>>v򾞞nʃvvvҪƖ޲ތr^jvnnnN겢ڂ~▪EEE檺ގʢ֞ʒކƢbbbޖnƒnZZZڢn‚v~ƚB.*⚦JJJ겮΃֓ꪚޫފڮ^>Ɩvbފ222ªvŽfF6"ޖꮚ▒⚶ήҒs_BҚ###vڊiƶ梲,poH*\ȰÇ#JHŋ3jȱǏ CIɓ(S\ɲ˗0cʜI͛8sɳϟ@ JѣH*]ʴӧPJJիXjʵHf`ÊKٳhӪ]˶۷kKݻx˷߿La+^mƐ#K~,e”/kl73ϠzM4ѦSsFue֮c3-vaڶsŭ]޾.x܄Ɠ%9bΣe.]9Ưc}uo{WC?~&`l.a5Han^a}{"_&҇bȢ~[2Ecùؚ0r7A Y1דLd;8CJ+$э3%_Y FYA$Hf j0ማpIgݙ瞮izyV->P4M\c+3T8VL^-";酛~jM * +޲ 0a#E!݀6ـF3dP&3bO1ڣikxL_x@ Abf [H@ iv0 +d`_\q !\U \PE0 TX" ddA j![0Xa _rafp`C(A B0| i(;d+!MCbc(^rpghsC,0Qx8щn.qzdL%M&h3GX CNt`K2p r =(R젆.~aJ z(lL<`[.{``AaA5UP6El؁Hb@M`)+؀ehv# a@  ႈ-d ²*n@S v% S+[ WծaW%aE@կ40ٷ [sGtU`Rv3Kٵv AAËaT-f^e`pƙwC)*p&"mB\`xV@@dZPuebe ԰ԡ .]PN3 d̰3$0[2T;uiRu.il V!0p 1Y`M~2\A*ߘ1 L`bШ@fLV`\x3 fTf V AE3pR!(;ZPXD&9æ]yW,/3 4NY^֌#c ͐x\ V$p!ޡݚDh3A$d,7RA9>~ E$a 0ta~gA`Gi ZB*+Bk`p7\=pw=`[`G(;Fu'.UfK\up0fk %@Sy0xc0Q`;XL1r[YЁ"H'WqGh1  gp0 !Qp P xHi _0 gS4XV߆ddj;k'XmtC'u1,``|  ynaaAD&h̀iaZXxwù O='#Xe+x B@~m p   0b QW `!&waZ`dWeqe+p̘Y'c`9y8=P ~;`o=ud Y*c(I+m-O5i9!i8uZ*ɒ. G`Wpeb :@p@  _ 1 `g!) K0@ V.@_g(Pvau8$ Hq9f &  &{w|P21*q9y*@` X8Bf`Z؛pCh1^-I# Pz` 0Tp Q 09P ` 30 ] T3XuV V߉i `J`.pw[@j -v[pKrYANf` V 5pwРopL ̐r+*0%z.pQ`.ڣIP8&:YFHj2X eҲuK;@a ,:0 o >P xy 3p Q  5n  AWGE z1Q$k}GEX2!ڀ[\f{XP1]bkKjfJ$U:᪰*jj`m PڦIGUjΚ;0̰(v=00js`0N3 { @dv1^ p xz@ ` %0bNP9a'uC@tG$o1`J 7Pn˂ (CYxv1Иzx1W7;=$X7@QyJд1&9ױ8vq@[~a`э8\Ba[E=-m/3Crn1US-CxՎοG_a= l4n*g 94|ЊD%aa 2 ۣ H`,P0 Ӱ؀g1UhQ60?͜A:x$9LXm1A.Bofgm=Ԅ0qb8Khhh 8ąʍ-ܓ ݺ=로׼;Pǝܲ ޵=A(plV #0  b cQtEP N ,P0ch0NU &7,ܐةrAP`ޡlb1ͬ[Ix458@䰝ZK0M~iq 'BjKpʥ ic> q qP 50 |q4>I TPdyZAZ>`CP]8WՕuՄv vxI0Y<~Pa|ad0Ѐ}!v@켕#dWp6+侀[P烱.Q 5@i4p _h2 S/+x[Z o[X`f7K"K&(*p~ *pԚY_ `UP+A07=s ÍcP; ۜ2CD!*Yd犑qfhj B?kZj@qt .G pB,`)B@B%αuA=q!*z|O]E[/B` αO? [BP7fNOBP1 /pp` m#2(P> ɡqBo/1@lo@@ DPB PDbQAl2B%!MDY#-f(R̖+Ҝ NmLPEhdvtS Fin!#ĿO}i ,?4l8-T xҁ,j ozQ`B8?z_fQDN҃ | عAe.`Z<ѱ1+bB*A 8:#)"JaZv@01 RfuB0,I+\"]B.Zd2J|bjXŲ! !N8cϊh Ȓ䑌q9@,H2R$_pzxqJ5Dω$M0%<.x@%!/S%XX7q#Li0R @KB$ 1ӶX̍ 9,{gB{eyKf "ILTjEV+㢞0\zvB2.f73F`iDdeAQNIڳ+ m'=I(B ʒ)'#O^.6UH-zОt}"gRHcԡiXY>L!4LTd Z O!@kTn43X66S&̄|զ$eYlfFkm(ZRb GMBCդl)_ҳr>JY eƪGd*Xhv~e`Fi/ # Ǣ%j&{v)[]V TWZDBs!+f;-}qDDsV°5m\@(B6]EG mA{̪D/^К҆.bcRHjx҄nP:E0{<,م bah5Kj߲.bbfVVM J8el) ?DcH5(&2,b;`j.duP(x̓,@ BNXnj.# sK?qgZuQb.(ȭƪe7{V5Bmf;Kplxb1<8m)V,'홯 y;־ V][k.LlBpjwjzipw+gFc v r-u l{㸊rx0أ >鋠D"蝢(%` @ 86 @? @`KI@A lo;+b &p$ x0pؿ $  $B-B+,\Y

R /'(@TH${P0 9Cx+4HlA?_`ˊ]FDgh[ܗ\XCCk?XÞ hŅ CC -.ʎ?j@n3hG@, HDŽG GfcĬBr}$‡$iY<-H㽸 h EpCljPkʌ?PDR ,[xI IAF|Ht%PAd DWdC LG*tdG@(")<ˮ9sBh˚DdHt08XKF4F£@(ԀlPɂ艻}B$<\,$t-0ˤ XxT4M ͬ} G@)Eu $#`4 ftb+x #u  (R%Rh\lц]3r8,httELm5PѸ@,!RJHM SӅPExMtύ`EmCHR\LLE=@N=ٔLb‰= !U6,HgGeR#@TF-DY 8U/'B];IMP=hϝMVW8BT?@HH4Ea AQa( % VPeuS}|҅` ;&ciY@4dҸaOS}]k}F(hBՈۅUoasH9vHRƚu#v L$`Qvep[ddX_7d_UQE ȿg$uUch6WRPM?^DeL)⋠ t8n&~݂Z(yם S & aj۽␠} - %GAFmgdމ[o:tI S抈+\ u6]0+Ĝbe3on \v Ѕ:i;ht[ lb,IP ]V\6p oNf/7CW:5‰T}G+0Pl$O"@s[@B+n<^ި)XZ [6q0ha ds:0a/ec Ms-HJ!vce%PfpPnm<רDf&`VܠEYٷU[H ջ9f1"kl"."[x'@9H{X~D8 <l`žWP h*3(ETc=\PD,np\[4ALDYI=uOUoWXC[( un GAeא tHB%:AMfwKl11A6\aeWhbz KUM".S>jh1_s'{EPA)%VbvJ3= ,nA.0nA ;_?sҧ=@ =pQAzP0} ۗ5<~zD`$$UfһI=r a`8Dx} Wd Ё^Őp$!NܰWH%C;5dF,] P  pXX̢F~8&Vz-R gaH1=@ PC̓XKb,:}c 6H$2Z#vm@ HP"Kr.zHL2p)K9}CA3f#" lہ@ KfS9015( Dls HuM ?)AAK&3NKS7Z-Uoxz`F\LfbH u m`TOl j( W( DoЦkN4Gڈ05.@ f <$jݍ mxd:o] 9"pSrtPҤqQPoԒvtCv[VҩNp*ҐS-aMEJ.]aytjvVfԕFT ԊsfU$\4LNyZP,=_'Xzaf٢FR+ATь3S wX6&-ki+֜wM,p+ xDupf)n8'ӳ9!wDd\) [lً"u zw* /I[yFn$%& l t^8~p  A/[᩹޺bE |qU\]9fs'3Dr @?qy76ʰ QKHWgZ沑\d+ A[1pN3hd,QH":x)=fL NUg;V I5@ZҔ^3۵i Q[t/捎XwH`L M5*uA `2*iscg8bv fsf]?rg$i1)G6jv(DEpl@A2Zb \/;eX7$q[ȡ^ @|d#hB4Q\\ٞZ`4MYȳ3gkLq>^sgghA-}KCv74⁁^CAXhE=;QzYBr,< WX҃] 4]Q.|ςw}F;cFqE@C~M y6Џ^L;n`g_{wFL)bS7=v8|{Ab@"I}[Y׾_Qd 0~_>EH`W ꋂ~Zf`]xc%(%lHH ^%@Alx1CE 11`Q3‡_(Aq@^uߘ*O=?t|( ԁ\ecdHL!'NdEdnSUE7l:pcA,FPH dXeLfQxOce%Vj$G>E @ | %!\H~= 4^%HlHea$wX@OB3C"b.Qc9feb@<&L %cZhzec\^,t0dfQJ9#T gd/ffcpNMS>j" l6xZAfvNnnfA`^Oy~fzbc"ŧJFPjClw`qNq6g(Y (`cAA4O$xj:'vͅjAn(%|hg\hVh(SP9AfA (h]A@[59 >v &QMHYQYN\ej Yo` vhcUhܩ#㘌&Bj^>%P*~Z^e!O d*^d-@j}E\n6LQ bj֬}Uj*Bʮn꾀M|!jC,tB+H3L#3`L+r- xtgZJ^kn+|+6h*J&A*iL L4"t@$BJ欥 ;ᶭ$DgrrziPeelmmHd9)D3C@0kU4 JnTfv/bY/`oh/NQhFL`j%<6NmFdC&0CP&:hl."B-L@ TƁK& t,cY+gTgl /P%3#XL67$2iŊ-NuDA._3~Y`DB-vd@S1H'#HîL[B!8+ A ;L~"e&Kl@{k# #/A$O2c\23d&S@KxXr"āV+‘4W1Ph'˯A<h"j/OpL0p *s'{g  A@,2!*U54g`N4 SE9_9+O:#:CE;s<_<=4'{0h@B/ ya?K3BDCk 2ULXE0B30+,4@:@ $87 8B-8B']v|tE^_zLh<{dO@ɟ<3ӖwLJ<͓<{ss`-HX#< dlE7QD a3ؙ0C8t(tA83@ fo=5@Tdd@*l{}'}8 [#c3E|Ƶ2, t{/Hx 4q XCSA5L;B3L'ݏ OxQAysD/5< ̟"HG>3\?R8?QtO{) GwnT܀8z@`AJtq%>,VUs 1fԸcGA0dɐ cQ&"^dM7q~,@N)W|sOGri2iA,1L&CMfŹd-njS ^Ak[9x}(o<`ogREWYccE!GfHċ?2eÈ3si,3^l6V!Fƭgt*۵#߮(A1ԱdU*?9tԙY>ܟG^|ArO⑉ WŻo R[F馗k*Oh2PXB'u0 % CQƂT9^tIś&Z"%k#\2&9zI%ʍ\ 2K,B)$1e,3#-ЄB91N<`m f]&갃6>3޸C45cf@V3bZ@ ٴ-#+xa9g춌a2P’/Hy͚~:Ųh6iK9 5B4c!x1GlX x` -7-gqΚ.saGH-sd!|.Z:Ԅ_̀y{֝wߏ:Y,oY)gao}# %k|;Gu9Z}_#̀C G~j'#i 8z,O"~Y#8%S6VC7%AL(JVB>AfBݰ9 @ 'Q ubkx-@WD0@!ы"CGAKx)2I;q04BD#q#T԰BĐT"CtFԱ P@=KQB4ddܤ:Y` .C%-IUH@%3T]җ7R ܂LyJ*u`1.p/iVٌ%5`,D3d*1t08\`l^(B5\?:ЂFt{f0|hD'JQ`- &Q38|l Ӄ J0I%.hVJjHNgRI+v ll Xw|jA U2JP7 x5nvzvH6D\a"!|(o# zǮ5 $</03`Ovc 2H;Ѵ.'mV`9g5BF( &J :p0.*-V 3!c sp L E@ / 1 ~p g 2"0B"v#>" b @'Ba^`h pi( a5Z"  R}eVj=1*zP4iq# nА "xZ$`!Arހ "2B,uXdQm/Q 1(bvq<@a 3[8X !T8p+F>6"\CnT|Pe@ DR#H$/%Ef%\$#&%2c ljt2@ Z`A$.@,31)1 nR. c A(02S2p1mίD"s3 }4B/3+vK@mD+#8 ` cQPa!O!DE+8S׮*' qJ O( .U !$:.U]4FL@&%XXO=:~``C@nC!- jb@W:5# \YG3%]ݕF#VN4-b`-_"!D`@Q\GZᒬ0 *1sV?B 0!4c=v @V%E(@\Xde`eeq+mLC3&. ` {>\15NZ#\%>Y:`ZfV+aj>6'Iz@ V@$tlqlW)2m vkK@!!NB &iAb ♲i `Slq6'w#q۵m- V)N #&s?wLB#R@aOi3m+eIt LAv9" l]rww-oMCztw%u%wyw"ށh&~pw#Ɗ=x3Ʒ#||kB(W~YA| &@ {I~%89BISkW?P 8'.8xk':xJ686nd#L`苁:5cX/W0\QBCvke0Pa6SjxDvYu"Ѭ+=8^~xiZW'^aGQ륍k$ ւ89#Ygt4M,+֎m]eXk#"xR لx#w<:!֏ccl8GDX\tđqX+{9߂N t8C!p߂ 6`eD)|X'.NU4Y| 9K&|t.q'5o-s'Tn8":kԞmPzY yy]&H,#WR9#& 1bmBLKǃ|-\UA2&)|#!|4$<ܴ|A v4XcٔI\# \A IzAbЙЏ9bA #|<$ܴZD;" bǁ@;?Q]oq"6b<=0P  XA׃}ػ7NfYYύ&, Uxo Bh``SD=o:lCˌc/ϋ%c~N}A<& 9=-0XAnx4bH(X}#.؝bg48:V`;=bcK&P&b{ (M]2j^3w2>$P!!^[H  d5bQQ]>=2X5m߶? ;> ~=EW`@nEnо&~9U @f&!STA#a Lyx fMz0L!{)ǃ]OcI=K&>#t9C_?"P@ @n3q"0i8 qaPg0쀞 c.-?#: 0B :|1ĈbX11Ɓ8p΅ )< ʕ,V2 6bQI e1U@c.B[/*y&, G =PUEVhӔYfZY[~ sڹ*&@7b[`: X]rJܿdㆬ lX箸pw0۲b FXUc6*(+iʩc ݙ1h`D6jD=VY"㭭+IlF^Qba d=m`[{jmF,Й0tBSẤD%ОcBˮ,rD6`Cck?4pu@ƲZa0+89 j@WXo-aI+,1!33rɓ2XC>2i^4293sym2 ~+}My)b ]qxa &Yu_e3}"'brtiҥ 6{3 6VD50Py{|ZyMp#6`'zm933%ŹOYMp #+:J H+`‰NgX =;m=`sᮓu~]z4nh\W8E A`-پB6XB ఴ9W (@Ӵ`<sfa(2AbD$p{"3A@Fs]01܌.=0%-8<d7Due 8a9W4"n$HG%("hD8pcH%HЁAwܸ.Y׈"t7L8ֵ%\e˞!ss! o]AZ@ ӈl$#< ;|k%!4h4ьw#C3P0J Z l,!hv7U)|8?З Ez}=Ǿ{F PA>uMu;b|.PfagWYH6}a p'#}h M @D Q`P ۵` ` 1'qW'VOvIK M2hpeT08X1ȅ3F l?xyvD U֐ nh}u3a&)zoH}X( AnUq{jgbV|Fwu BkMUC8Z :]u!h\[8ch 78TЋv?z'/x@@ÊP"7=BJy&2h1"WrWDR$8ȏ(@ P `ZBpivUP`e>L/8*"#i(<, ;A * _<0 4@q t}d!" e4Y0/ɅQY} @VIX Yr;2!9fh))3OwP"J <`'89% utBٌYic)}(.$7qP#h\C0 ۈW5XY&}jy(A}B`~Y;蛵I~gXЛi c9f YY= aF ̨YItyW+ɞȖC)ivv 4m t| PA)YY J *}39ڠup pܖX p‘|¢)7Z֣j%ZJ&`H``&z @;j^a:w{q[A ;P0*g8 +@)aၴBD[rcD R i 6P $P".Kfjrg<;ZQ겐1  d :$2踐+;;{`uq+q@ٹjDP Pq뻴{uP6Pg T P$KVhk拾ꋽ>6㻴}N Л<b0 WP GPI{  ɺW @ ;; %|+d#K0\{8ùÒ:Ě:(\>|ȚHM,RRFP 'A F@mG&Ty2V =BAr.p X.o6s\wƃdzQ/tLv췁'< 2@2p m`2/C0 Z*HV#6g&@n"lbʓa'˯(LrC˱\! B̤C͝19S͓q/͎!ƹ;K[.{οr:RZϝyC ϣg8\X2x߷г%6Vѫvѕ}MҎ44TtǓҺҮ҇{r3NSSI|ؼGE!Ss MO Q-SMUmWY[]_ a-cMemgikmo q-sMumwy{} ؁-؃M؅m؇؉؋؍؏ ّ-ٓMٕmٟٗٙٛٝ;gpsman-6.4.4.2/manual/html/info/GPL.txt0000644000175000017500000010451311576110057015632 0ustar migmig GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . gpsman-6.4.4.2/manual/html/info/instupdate.tcl0000644000175000017500000002175210006267371017335 0ustar migmig#!/bin/sh # This is a Tcl/Tk script to be interpreted by tclsh (>=8.3): \ exec tclsh "$0" "$@" # instupdate - install GPSMan updates in a Unix/Linux system # # Copyright (c) 2004 Miguel Filgueiras (mig@ncc.up.pt) / Universidade do Porto # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. # # Last change: 29 January 2004 # after unpacking the update archive: # cd util # instupdate.tcl [-n] ############# NO CONFIGURATION NEEDED if { $tcl_platform(platform) != "unix" } { puts "This script needs utilities only available on Unix/Linux" exit 1 } if { $argv == "-n" } { set DEBUG 1 } elseif { $argv != "" } { puts stderr "Usage: instupdate.tcl [-n]" puts stderr " option -n prevents any change in the installed files" exit 1 } else { set DEBUG 0 } if { $env(USER) == "root" } { set rexec 1 } else { set rexec 0 } proc FindValues {vars file} { # find out values in first "set ... ..." instruction in $file for # each variable in $vars # the order in the list must be the order in the file # return list of values aligned with $vars # could not use grep because of space being taken as argument separator set f [open $file r] set var [lindex $vars 0] ; set vars [lreplace $vars 0 0] set vals "" while { ! [eof $f] } { gets $f line if { [regexp "^(\\t| )*set $var (.+)\$" $line m m val] } { lappend vals [string trim $val " \t"] if { $vars == "" } { close $f return $vals } set var [lindex $vars 0] ; set vars [lreplace $vars 0 0] } } puts stderr "No definition of $var in $file" exit 1 } proc SetValues {vars vals file tmp} { # change value in first "set" instruction in $file for each variable # in $vars # $vals is list of values aligned with $vars # $tmp is path to directory to use for temporary files # the order in the list must be the order in the file # not using sed because of problems with repeated replacements global DEBUG set f [open $file r] set tf $tmp/TMPgiup-[clock seconds] set out [open $tf w] set var [lindex $vars 0] ; set vars [lreplace $vars 0 0] set val [lindex $vals 0] ; set vals [lreplace $vals 0 0] while { ! [eof $f] } { gets $f line if { $var != "" && \ [regexp "^(\\t| )*set $var (.+)\$" $line m prefix m] } { puts $out "${prefix}set $var $val" set var [lindex $vars 0] ; set vars [lreplace $vars 0 0] set val [lindex $vals 0] ; set vals [lreplace $vals 0 0] } else { puts $out $line } } close $f close $out if { $var != "" } { puts stderr "No definition of $var in $file" file delete -force $tf exit 1 } if { ! $DEBUG } { file rename -force $tf $file } else { puts "DEBUG: file rename -force $tf $file" } return } # start set wd [pwd] if { [set bwd [file tail $wd]] != "util" } { puts stderr "After unpacking the update archive, cd to the util directory" puts stderr "Usage: inst_update" exit 1 } set ugd "../gmsrc" if { ! [file isdirectory $ugd] } { puts stderr "gmsrc directory from update archive not found" puts stderr "After unpacking the update archive, cd to the util directory" exit 1 } ## check versions # find update version in line "Update to GPSMan version VERSION" if { [catch {set uv [exec grep "GPSMan version" $ugd/UPDATE]}] } { puts stderr "Cannot execute grep $ugd/UPDATE" exit 1 } if { ! [regexp {GPSMan version (.+)$} $uv x uv] } { puts stderr "Bad format of UPDATE file" exit 1 } if { [catch {set iv [exec gpsman show version]}] } { if { $rexec } { puts "Will not compare installed version with that of update" set iv $uv set rexec 0 } else { puts stderr "GPSMan not installed (or very old version)" exit 1 } } else { set rexec 1 } if { $uv != $iv } { puts stderr "GPSMan installed version ($iv) not that of the update ($uv)" exit 1 } ## find installed executable to find out path to installed source directory set iex "" if { [catch {set iex [exec which gpsman]}] && \ ! [catch {set exs [exec whereis gpsman]}] } { foreach f $exs { if { ! [file isdirectory $f] && [file executable $f] } { set iex $f break } } } if { $rexec } { if { $iex == "" || [catch {set v [exec $iex show version]}] || \ $v != $iv } { puts -nonewline "Absolute path to gpsman executable? " flush stdout gets stdin iex if { [file pathtype $iex] != "absolute" || \ [catch {set v [exec $iex show version]}] || $v != $iv } { puts stderr "Bad path" exit 1 } } elseif { $DEBUG } { puts "DEBUG: using $iex as GPSMan executable" } } elseif { $iex == "" } { puts -nonewline "Absolute path to gpsman executable? " flush stdout gets stdin iex if { [file pathtype $iex] != "absolute" } { puts stderr "Bad path" exit 1 } } elseif { $DEBUG } { puts "DEBUG: using $iex as GPSMan executable" } set isd [FindValues SRCDIR $iex] if { ! [file isdirectory $isd] || ! [file exists $isd/wrtdials.tcl] } { puts -nonewline "Absolute path to the GPSMan source directory?" flush stdout gets stdin isd if { [file pathtype $isd] != "absolute" || \ ! [file isdirectory $isd] || ! [file exists $isd/wrtdials.tcl] } { puts stderr "Bad path" exit 1 } } elseif { $DEBUG } { puts "DEBUG: using $isd as installed source directory" } if { [file exists [set uex $ugd/gpsman.tcl]] } { ## editing updated executable (if any) to set crucial variables to # the values in the installed executable # assume each set instruction still has a single line with single spaces # surrounding the variable name # assume the order of in which these variables are set is as follows: # DEFSPORT, USERDIR, USEROPTIONS, PRINTCMD, SRCDIR # and that the values for Unix-like systems appear before than those # for other systems puts "Making backup copy of $iex to $isd/gpsman.tcl-old" # take care of links set fiex $iex while { [file type $fiex] == "link" } { if { [file pathtype [set tgt [file link $fiex]]] == "relative" } { set fiex [file join [file dirname $fiex] $tgt] } else { set fiex $tgt } } if { ! $DEBUG } { file copy -force $fiex $isd/gpsman.tcl-old } else { puts "DEBUG: file copy -force $fiex $isd/gpsman.tcl-old" } puts "The following variables in $iex will be preserved:" puts "\tSRCDIR \t$isd" set vars "DEFSPORT USERDIR USEROPTIONS PRINTCMD" set vals [FindValues $vars $iex] foreach v $vars val $vals { puts "\t$v \t$val" } puts "Preserving any other change to $iex must be made by hand!" if { ! $DEBUG } { file copy -force $ugd/gpsman.tcl $fiex } else { puts "DEBUG: file copy -force $ugd/gpsman.tcl $fiex" } lappend vars SRCDIR ; lappend vals $isd SetValues $vars $vals $fiex . if { ! $DEBUG } { file attributes $fiex -permissions 0755 } else { puts "DEBUG: file attributes $fiex -permissions 0755" } } # other source files and icons puts "Copying updated files to $isd..." foreach f [glob $ugd/*.tcl] { if { $f != "$ugd/gpsman.tcl" } { if { ! $DEBUG } { file copy -force $f $isd file attributes $isd/[file tail $f] -permissions 0644 } else { puts "DEBUG: file copy -force $f $isd" puts "DEBUG: file attributes $isd/[file tail $f] -permissions 0644" } } } if { [file exists $ugd/gmicons] } { foreach f [glob $ugd/gmicons/*] { if { ! $DEBUG } { file copy -force $f $isd/gmicons file attributes $isd/gmicons/[file tail $f] -permissions 0644 } else { puts "DEBUG: file copy -force $f $isd/gmicons" puts \ "DEBUG: file attributes $isd/gmicons/[file tail $f] -permissions 0644" } } } # utilities set uud $ugd/util if { [file exists $uud] } { set iud "" foreach d "$isd $isd/util" { if { [file exists $d] && [file isdirectory $d] && \ [file exists $d/exerciser.tcl] } { set iud $d break } } if { $iud == "" } { puts -nonewline "Absolute path to util directory? " flush stdout gets stdin iud if { [file pathtype $iud] != "absolute" || \ ! [file isdirectory $iud] } { puts stderr "Bad path" exit 1 } } puts "Copying updated utilities to $iud..." foreach f [glob $uud/*] { if { ! $DEBUG } { file copy -force $f $iud file attributes $iud/[file tail $f] -permissions 0755 } else { puts "DEBUG: file copy -force $f $iud" puts "DEBUG: file attributes $iud/[file tail $f] -permissions 0755" } } puts "The utility programs may also require configuration by hand!" } puts "Finished" exit 0 gpsman-6.4.4.2/manual/html/info/gpl-3_0.txt0000644000175000017500000010451311576110057016351 0ustar migmig GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . gpsman-6.4.4.2/manual/html/info/WPs.txt0000644000175000017500000005550407511116166015727 0ustar migmig% Written by GPSManager 04-Jul-2002 19:03:58 (GMT) % Edit at your own risk! !Format: DMS 0 Lisboa !Creation: no !W: !Datum: WGS 84 XINZO LARC PISCINAS 42 03 28 -7 43 43 symbol=swimming !NB: Xinzo de Limia (piscinas) Baliza 16 Larouco 97 !Position: UTM/UPS !Datum: European 1950 BORFUT BRNES M CAV FUT 29 T 669620 4600220 symbol=stadium !NB: Macedo de Cavaleiros, campo de futebol G2 Bornes 99 !Position: DMS !Datum: WGS 84 XIROND LAROUCO 41 54 0 -7 38 16 symbol=church !NB: Xironda (igreja) Baliza 6 Larouco 97 !Position: UTM/UPS !Datum: European 1950 BORGRJ BRNES GRIJO BAL 29 T 669100 4596250 symbol=house !NB: Grij, telhado vermelho B18 Bornes 99 !Position: DMS !Datum: WGS 84 -AVE- IC1 RIO AVE N41 21 59.7 W8 43 23.8 symbol=bridge !NB: Ponte sobre o Ave IC1 !Position: UTM/UPS !Datum: European 1950 BORIZD BRNES IZEDA PRS 29 T 689540 4604120 symbol=monument !NB: Izeda, priso G3 Bornes 99 !Position: DMS !Datum: WGS 84 -CAVD- IC1 CAVADO N41 30 47.2 W8 45 14.9 symbol=bridge !NB: Ponte sobre o Cvado IC1 !Position: UTM/UPS !Datum: European 1950 BORMCV BRNES M CAV ARM 29 T 669790 4599540 symbol=factory !NB: Macedo de Cavaleiros, armazm B5 Bornes 99 !Position: DMS !Datum: WGS 84 CSTQJO CAST QUEIJO PRT N41 10 01.4 W8 41 21.2 symbol=castle !NB: Castelo do Queijo Porto !Position: UTM/UPS !Datum: European 1950 BORMIR BRNS MIRDLA AERO 29 T 648100 4592520 symbol=airport !NB: Mirandela, aerdromo G6 Bornes 99 BORMRS BRNES MORAIS 29 T 685640 4595820 symbol=church !NB: Morais, igreja B15 Bornes 99 !Position: DMS !Datum: WGS 84 BORNES DESCOLAGEM NW 41 27 50.2 -6 57 50.7 symbol=take_off !NB: Serra de Bornes !Position: UTM/UPS !Datum: European 1950 BORPVG BORNES P VIGIA 29 T 671530 4593380 symbol=short_tower !NB: S Bornes, posto de vigia B1 Bornes 99 BORQCM BRNES Q CRUZ MOS 29 T 682580 4620440 symbol=house !NB: Quinta do Cruzamento de Ms B11 Bornes 99 BORRSS BRNES ROSSAS FUT 29 T 680680 4615060 symbol=stadium !NB: Rossas, campo de futebol G4 Bornes 99 BORSAM BRNES S AMBROSIO 29 T 677150 4599680 symbol=chapel !NB: Santurio do Santo Ambrsio B16 Bornes 99 BORSND BRNES SENDAS 29 T 678680 4607120 symbol=beach !NB: Sendas, areal B14 Bornes 99 BORVBF BRNS VBFEITO BAL 29 T 667086 4593620 symbol=house !NB: Vale Benfeito, casa em construo B4 Bornes 99 !Position: DMS !Datum: WGS 84 BOTICA BOTICAS 41 41 42.4 -7 40 02.7 symbol=small_city BRGNAE BRAGANCA AERODR N41 51 18.0 W6 42 23.0 symbol=airport BOULSA LARC BOULLOSA 41 55 26 -7 45 12 symbol=church !NB: Boullosa (igreja) Baliza 7 Larouco 97 !Position: UTM/UPS !Datum: European 1950 BRGNCT BRAGANCA CASTELO 29 T 687108 4630748 symbol=castle !NB: B10 Bornes 99 BRGNNB BRAGANCA NERBA 29 T 684544 4628530 !NB: Nerba de Bragana B11 Bornes 99 !Position: DMS !Datum: WGS 84 CABSTO CABECEIRAS BASTO 41 30 58.0 -7 59 29.1 symbol=small_city CASTNH CASTANHEIRA N41 47 41.9 W7 49 08.5 symbol=take_off !NB: Castanheira Larouco CEBOLA ESTR SERRA DA 40 10 50 -7 48 35 symbol=elevation !NB: Serra da Cebola Baliza 1 Linhares 97 CHA LARC IGREJA N41 47 06.0 W7 47 08.0 symbol=church CHAVES B7 LR FPVL 97 41 43 0 -7 27 0 symbol=airport !NB: Chaves (aerdromo) Baliza 7 Enc FPVL Larouco 97 COVLHA ESTR AERODROMO 40 15 55 -7 28 50 symbol=airport !NB: Covilh (aerdromo) Baliza 4 Linhares 97 CPFIGR CTRL PEDRA FIGRA 40 17 00 -7 35 20 symbol=dam !NB: Central da Pedra da Figueira Baliza 5 Linhares 97 COVLHS ESTR SANATORIO 40 17 30 -7 31 0 symbol=1st_aid !NB: Covilh (sanatrio) Baliza 9 Linhares 97 !Position: UTM/UPS CRANDN CALVOS RANDIN 29 T 591533 4644374 symbol=stadium !NB: Calvos de Randn (pav desportos) !Position: DMS CRVLHH CARVALHELHOS 41 41 17.0 -7 43 43.9 symbol=small_city !NB: (no local) CUALDR LARC CUALEDRO 41 59 28 -7 35 32 symbol=church !NB: Cualedro (igreja) Baliza 11 Larouco 97 ERADA ESTRELA 40 13 30 -7 38 55 symbol=small_city !NB: Baliza 2 Linhares 97 FLGSNH ESTR FOLGOSINHO 40 30 40 -7 30 40 symbol=small_city !NB: Baliza 12 Linhares 97 FRSTRS LARC FRIESTRAS 42 0 23 -7 40 35 symbol=factory !NB: Friestras (pocilgas) Baliza 12 Larouco 97 GOUVAE ALVAO GOUVAES 41 28 46.9 -7 43 54.2 symbol=small_city !NB: Gouves (Alvo) GRALHS LARC GRALHAS 41 50 58 -7 42 12 symbol=church !NB: Gralhas (igreja) Baliza 6 Enc FPVL Larouco 97 GUDINA A GUDINA 42 03 53.3 -7 08 19.6 symbol=small_city !NB: A Gudia (no local) GRIJO BORNES 41 29 56.7 -6 58 17.1 symbol=small_city !NB: Grij Serra de Bornes LAMA-O ALVAO LAMAS OLO 41 22 20.1 -7 47 37.0 symbol=small_city !NB: Lamas de Olo (Alvo) QUIAIO QUIAIOS N40 12 08.6 W8 53 33.6 symbol=take_off !NB: Quiaios LAMAS ALVAO LAMAS 41 27 11.0 -7 46 05.4 symbol=small_city RABACA SICO RABACAL N40 02 57.0 W8 27 50.6 symbol=take_off !NB: ZC LAR-AN LAROUCO ATR N N41 55 59.5 W7 43 02.6 symbol=landing !NB: Larouco - aterragem Norte REDNHA SICO REDINHA 39 58 30.3 -8 33 11.0 symbol=take_off LAR-AS LAROUCO ATR S N41 51 29.6 W7 42 44.9 symbol=landing !NB: Larouco - aterragem Sul RIOS LARC VERIN 41 58 08.8 -7 16 31.9 symbol=small_city !NB: Rios (prox Verin) !Position: UTM/UPS LARC-C LAROUCO CASETA 29 T 609500 4643500 symbol=house !Position: DMS S-GRCA ALVAO SRA GRACA 41 25 00.0 -7 55 00.4 symbol=take_off !NB: Sra da Graa (Mondim de Basto) LARC-N LAROUCO NORTE N41 55 02.0 W7 42 58.9 symbol=take_off !NB: Larouco - descolagem N SAMARD ALVAO SAMARDAES 41 24 27.0 -7 43 16.2 symbol=small_city !NB: Samardes (Alvo) LARC-S LAROUCO SUL 41 52 49.0 -7 43 14.0 symbol=take_off !NB: Larouco - descolagem S SANABR PUEBLA SANABRIA 42 07 17.1 -6 42 53.8 symbol=small_city !NB: Puebla de Sanabria LARC-W LAROUCO OESTE 41 53 04.2 -7 43 35.7 symbol=take_off SANDRE LARC STO ANDRE 41 51 55 -7 40 1 symbol=small_city !NB: Baliza 8(2) Larouco 97 LGCOMP LAGOA COMPRIDA 40 21 45 -7 39 0 symbol=buoy_blue !NB: Lagoa Comprida Baliza 8 Linhares 97 LAROA LARC S PEDRO 42 01 31 -7 41 51 symbol=church !NB: S. Pedro de Laroa (igreja) Baliza 27 Enc FPVL Larouco 97 SANTNN LARC S ANTONINO 41 56 27 -7 44 11 symbol=small_city !NB: Baliza 17(2) Larouco 97 LINDOS LINDOSO 41 52 16.1 -8 11 38.3 symbol=small_city !NB: Lindoso -ESPSD ESPOSENDE B RED N41 32 57.2 W8 47 12.3 symbol=house !NB: Boua da Redonda Esposende SEIA DESCOLAGEM 40 25 15.3 -7 38 11.2 symbol=take_off SARAUS LARC SARREAUS 42 05 22 -7 36 10 symbol=swimming !NB: Sarreaus (piscinas) Baliza 24(2) Larouco 97 LINHRS ESTR LINHARES 40 31 59.2 -7 26 45.9 symbol=take_off !NB: Linhares (descolagem) -PORTO 01-AUG-97 1235 41 08 59.4 -8 39 27.7 symbol=house SEIA-A AERODROMO 40 27 10 -7 41 0 symbol=airport !NB: Baliza 10 Linhares 97 LODSLO LARC LODOSELO 42 4 18 -7 35 36 symbol=church !NB: Lodoselo (igreja) Baliza 23(2) Larouco 97 ALBARE ALBARELLOS-MONTE 41 57 19.9 -7 29 45.0 symbol=small_city !NB: Albarellos de Monterey (no local) SEIA-G BOMBAS GASOLINA 40 24 45 -7 40 30 symbol=fuel !NB: Baliza 11 Linhares 97 LOUSA 05-MAY-01 1243 N40 06 16.9 W8 12 30.8 symbol=take_off ALGODR FORNOS ALGODRES N40 39 02.6 W7 30 38.6 symbol=take_off !NB: ZC SENDIM LAROUCO 41 53 27 -7 45 54 symbol=small_city !NB: Baliza 4 Larouco 97 LOUSAA 05-MAY-01 1512 N40 07 29.8 W8 13 10.8 symbol=landing ALIJO 09-SEP-97 1613 41 16 42.2 -7 28 22.6 symbol=small_city SHELEN TAROUCA N41 00 37.6 W7 48 26.8 symbol=take_off LUBIAN LAROUCO 42 02 06.4 -6 54 40.8 symbol=small_city !Position: UTM/UPS ALLRIZ ALLARIZ MOSTEIRO 29 T 599300 4671200 symbol=church SLVEIR SOLVEIRA IGREJA 29 T 610500 4633500 symbol=church !Position: DMS LUCNZA LARC LUCENZA 41 57 13 -7 37 24 symbol=small_city !NB: Baliza 20(2) Larouco 97 ALVADI ALVAO ALVADIA 41 26 06.6 -7 46 49.7 symbol=small_city !NB: Alvadia (Alvo) !Position: UTM/UPS SNDIAS SANDIAS ESCOLAS 29 T 603200 4663500 symbol=school !Position: DMS MANZAN MANZANEDA 42 15 35.5 -7 17 53.1 symbol=small_city !NB: Manzaneda ALVADO COSTA DE ALVADOS N39 32 36.3 W8 47 15.0 symbol=take_off !NB: ZC TEIXRA CRUZMT TEIXEIRA 40 14 55 -7 43 30 symbol=street_int !NB: Cruzamento da Teixeira Baliza 3 Linhares 97 MONTLG MONTALEGRE CAST 41 49 30.0 -7 47 25.0 symbol=castle !NB: Montalegre (castelo) Baliza 3 Larouco 97 MEIXDO LARC MEIXEDO 41 50 1 -7 44 20 symbol=small_city !NB: Meixedo Baliza 11(2) Larouco 97 AMARAN AMARANTE 41 16 00.9 -8 05 38.4 symbol=medium_city TORRE ESTRELA 40 19 20 -7 38 10 symbol=short_tower !NB: Baliza 7 Linhares 97 MURCA 09-SEP-97 1615 41 24 15.4 -7 27 28.9 symbol=small_city -A1LH7 04-AUG-97 1450 40 27 32.6 -7 38 32.7 !NB: Aterragem Manga 1 Linhares 97 ARGANI ARGANIL N40 13 30.6 W7 58 27.9 symbol=take_off !NB: ZC ATAIJA SICO N39 32 58.8 W8 52 04.5 symbol=take_off !NB: ZC TRSMIR LARC TRASMIRAS 42 1 25 -7 36 56 symbol=church !NB: Trasmiras (igreja) Baliza 15 Larouco 97 TRPENA LARC TORRE PENA 42 5 21 -7 40 36 symbol=small_city !NB: Torre de Pena Baliza 19 Larouco 97 NINOAG NINO D AGUIA 41 57 14 -7 40 44 symbol=church !NB: Nio d'Aguia (igreja) Baliza 9 Larouco 97 -A2LH7 05-AUG-97 1312 40 25 58.2 -7 38 32.4 !NB: Aterragem Manga 2 Linhares 97 BAGEIX BORNES BAGUEIXE 41 34 03.3 -6 46 21.2 symbol=small_city !NB: Serra de Bornes UNHAIS DESCOLAGEM 40 18 27.0 -7 36 27.5 symbol=take_off !NB: Unhais (descolagem) PDONOE LARC PTE DONOES 41 49 32 -7 48 43 symbol=bridge !NB: Ponte de Dones Baliza 13(2) Larouco 97 -A2LRF 23-AUG-97 0923 41 55 32.2 -7 46 06.7 !NB: Aterragem Manga 2 Encontro FPVL Larouco 97 BAIONA DESCOLAGEM NE 42 04 24.7 -8 49 39.8 symbol=take_off !NB: Baiona (descolagem NE) (no local) V-SECA LARC AERODROMO 42 03 04 -7 35 58 symbol=ultralight !NB: Vila Seca (campo ultralights) Baliza 25(2) Larouco 97 PDRNLS LARC PADORNELOS 41 51 41 -7 45 12 symbol=small_city !NB: Baliza 7(2) Larouco 97 EIRNHS 25-AUG-97 1304 41 03 42.0 -8 15 52.2 !NB: Eirinhas, Castelo de Paiva BALTAR LARC CTR MEDICO 41 56 49 -7 43 14 symbol=1st_aid !NB: Baltar (centro mdico) Baliza 18 Enc FPVL Larouco 97 VBARRI VILAR DE BARRIO 42 9 40 -7 36 38 symbol=small_city !NB: Baliza 22 Larouco 97 PEGAS VALE DE PEGAS N40 04 45.6 W8 27 46.6 symbol=take_off !NB: ZC TZC000 BORNES TERMICA 41 31 55.1 -6 49 38.6 !NB: Base de trmica ZC 980628 Serra de Bornes BILHO ALVAO 41 24 31.6 -7 50 26.8 symbol=small_city !NB: Bilh (Alvo) VBFEIT VALE BENFEITO 41 28 59.2 -6 58 59.2 symbol=small_city !NB: Serra de Bornes PINHAO 09-SEP-97 1618 41 11 21.3 -7 32 47.6 symbol=small_city TZC001 BORNES TERMICA 41 31 26.5 -6 50 41.5 !NB: Base de trmica ZC 980628 Serra de Bornes !Position: UTM/UPS BLNCOS LARC OS BLANCOS 29 T 603600 4650800 symbol=small_city !Position: DMS VDNOVA VENDA NOVA 41 40 13.8 -7 57 19.9 symbol=dam !NB: Venda Nova (barragem) PISOES LARC BARRAGEM 41 44 28 -7 51 20 symbol=dam !NB: Pises (torre N barragem) Baliza 2 Enc FPVL Larouco 97 TZC002 BORNES TERMICA 41 30 07.7 -6 53 57.0 !NB: Base de trmica ZC 980628 Serra de Bornes !Position: UTM/UPS !Datum: European 1950 BORAFB BRNES A FE BARR 29 T 671900 4582130 symbol=dam !NB: Alfndefa da F, barragem G5 Bornes 99 !Position: DMS !Datum: WGS 84 VERIN 09-SEP-97 2337 41 56 40.2 -7 26 42.3 symbol=small_city PITOES LARC DAS JUNIAS 41 50 23.5 -7 56 46.0 symbol=small_city !NB: Pites das Jnias (no local) TZC003 BORNES TERMICA 41 29 56.1 -6 54 25.2 !NB: Base de trmica ZC 980628 Serra de Bornes !Position: UTM/UPS !Datum: European 1950 BORAFE BRNES ALFANDG FE 29 T 670600 4579050 symbol=store !NB: Alfndega da F, mercado B17 Bornes 99 !Datum: WGS 84 VERINA VERIN ANTENA 29 T 636573 4655616 symbol=short_tower !Position: DMS PNHDRD PENHAS DOURADAS 40 24 15 -7 33 55 symbol=elevation !NB: Baliza 13 Linhares 97 !Position: UTM/UPS !Datum: European 1950 BORANT BRNES ANTENAS 29 T 666700 4588900 symbol=short_tower !NB: S Bornes, antenas B2 Bornes 99 !Datum: WGS 84 VIDFRR VIDEFERRE IGREJA 29 T 617500 4634200 symbol=church !NB: Videferre (igreja) !Datum: European 1950 BORBAZ BRNES BARR AZIBO 29 T 675250 4605830 symbol=dam !NB: Barragem do Azibo B8 Bornes 99 BORBLS BRNES BALSEMAO 29 T 679180 4593860 symbol=chapel !NB: Santurio de Balsemo B9 Bornes 99 !Position: DMS !Datum: WGS 84 VINHAI VINHAIS 41 50 19.6 -7 00 50.7 symbol=small_city VILDEV VILAR DEVOS 41 54 25.1 -7 20 14.9 symbol=small_city !NB: Vilar Devos (prox Verin) !Position: UTM/UPS !Datum: European 1950 BORCGR BRNES C GUARDA 29 T 674330 4596740 symbol=house !NB: S Bornes, casa do guarda B6 Bornes 99 !Position: DMS !Datum: WGS 84 VPERDZ VILAR PERDIZES N41 51 21.0 W7 38 05.0 symbol=church !NB: Vilar de Perdizes (igreja) !Position: UTM/UPS !Datum: European 1950 BORCHA BRNES CHAO CAPL 29 T 679540 4610770 symbol=chapel !NB: Chos, capela B13 Bornes 99 !Position: DMS !Datum: WGS 84 VPOUCA V POUCA AGUIAR 41 29 48.2 -7 38 51.1 symbol=small_city !NB: Vila Pouca de Aguiar !Position: UTM/UPS !Datum: European 1950 BORCRZ BRNES CRZ SAMBD 29 T 665670 4590420 symbol=street_int !NB: S Bornes, cruzamento para Sambade B3 Bornes 99 !Position: DMS !Datum: WGS 84 VREAL VILA REAL 41 17 58.9 -7 44 49.8 symbol=medium_city !Position: UTM/UPS !Datum: European 1950 BORFAB BRNES FABRICA M 29 T 674350 4599110 symbol=factory !NB: Fbrica Mitalco B7 Bornes 99 !Position: DMS !Datum: Lisboa !W: !Datum: WGS 84 XINZO LARC PISCINAS 42 03 28 -7 43 43 symbol=swimming !NB: Xinzo de Limia (piscinas) Baliza 16 Larouco 97 !Position: UTM/UPS !Datum: European 1950 BORFUT BRNES M CAV FUT 29 T 669620 4600220 symbol=stadium !NB: Macedo de Cavaleiros, campo de futebol G2 Bornes 99 !Position: DMS !Datum: WGS 84 XIROND LAROUCO 41 54 0 -7 38 16 symbol=church !NB: Xironda (igreja) Baliza 6 Larouco 97 !Position: UTM/UPS !Datum: European 1950 BORGRJ BRNES GRIJO BAL 29 T 669100 4596250 symbol=house !NB: Grij, telhado vermelho B18 Bornes 99 BORIZD BRNES IZEDA PRS 29 T 689540 4604120 symbol=monument !NB: Izeda, priso G3 Bornes 99 BORMCV BRNES M CAV ARM 29 T 669790 4599540 symbol=factory !NB: Macedo de Cavaleiros, armazm B5 Bornes 99 BORMIR BRNS MIRDLA AERO 29 T 648100 4592520 symbol=airport !NB: Mirandela, aerdromo G6 Bornes 99 BORMRS BRNES MORAIS 29 T 685640 4595820 symbol=church !NB: Morais, igreja B15 Bornes 99 !Position: DMS !Datum: WGS 84 BORNES DESCOLAGEM NW 41 27 50.2 -6 57 50.7 symbol=take_off !NB: Serra de Bornes !Position: UTM/UPS !Datum: European 1950 BORPVG BORNES P VIGIA 29 T 671530 4593380 symbol=short_tower !NB: S Bornes, posto de vigia B1 Bornes 99 BORQCM BRNES Q CRUZ MOS 29 T 682580 4620440 symbol=house !NB: Quinta do Cruzamento de Ms B11 Bornes 99 BORRSS BRNES ROSSAS FUT 29 T 680680 4615060 symbol=stadium !NB: Rossas, campo de futebol G4 Bornes 99 BORSAM BRNES S AMBROSIO 29 T 677150 4599680 symbol=chapel !NB: Santurio do Santo Ambrsio B16 Bornes 99 BORSND BRNES SENDAS 29 T 678680 4607120 symbol=beach !NB: Sendas, areal B14 Bornes 99 BORVBF BRNS VBFEITO BAL 29 T 667086 4593620 symbol=house !NB: Vale Benfeito, casa em construo B4 Bornes 99 !Position: DMS !Datum: WGS 84 BOULSA LARC BOULLOSA 41 55 26 -7 45 12 symbol=church !NB: Boullosa (igreja) Baliza 7 Larouco 97 BRGNAE BRAGANCA AERODR N41 51 18.0 W6 42 23.0 symbol=airport !Position: UTM/UPS !Datum: European 1950 BRGNCT BRAGANCA CASTELO 29 T 687108 4630748 symbol=castle !NB: B10 Bornes 99 BRGNNB BRAGANCA NERBA 29 T 684544 4628530 !NB: Nerba de Bragana B11 Bornes 99 !Position: DMS !Datum: WGS 84 CABSTO CABECEIRAS BASTO 41 30 58.0 -7 59 29.1 symbol=small_city CASTNH CASTANHEIRA N41 47 41.9 W7 49 08.5 symbol=take_off !NB: Castanheira Larouco CEBOLA ESTR SERRA DA 40 10 50 -7 48 35 symbol=elevation !NB: Serra da Cebola Baliza 1 Linhares 97 CHA LARC IGREJA N41 47 06.0 W7 47 08.0 symbol=church CHAVES B7 LR FPVL 97 41 43 0 -7 27 0 symbol=airport !NB: Chaves (aerdromo) Baliza 7 Enc FPVL Larouco 97 COVLHA ESTR AERODROMO 40 15 55 -7 28 50 symbol=airport !NB: Covilh (aerdromo) Baliza 4 Linhares 97 COVLHS ESTR SANATORIO 40 17 30 -7 31 0 symbol=1st_aid !NB: Covilh (sanatrio) Baliza 9 Linhares 97 CPFIGR CTRL PEDRA FIGRA 40 17 00 -7 35 20 symbol=dam !NB: Central da Pedra da Figueira Baliza 5 Linhares 97 !Position: UTM/UPS CRANDN CALVOS RANDIN 29 T 591533 4644374 symbol=stadium !NB: Calvos de Randn (pav desportos) !Position: DMS CRVLHH CARVALHELHOS 41 41 17.0 -7 43 43.9 symbol=small_city !NB: (no local) CUALDR LARC CUALEDRO 41 59 28 -7 35 32 symbol=church !NB: Cualedro (igreja) Baliza 11 Larouco 97 ERADA ESTRELA 40 13 30 -7 38 55 symbol=small_city !NB: Baliza 2 Linhares 97 FLGSNH ESTR FOLGOSINHO 40 30 40 -7 30 40 symbol=small_city !NB: Baliza 12 Linhares 97 FRSTRS LARC FRIESTRAS 42 0 23 -7 40 35 symbol=factory !NB: Friestras (pocilgas) Baliza 12 Larouco 97 GOUVAE ALVAO GOUVAES 41 28 46.9 -7 43 54.2 symbol=small_city !NB: Gouves (Alvo) GRALHS LARC GRALHAS 41 50 58 -7 42 12 symbol=church !NB: Gralhas (igreja) Baliza 6 Enc FPVL Larouco 97 GRIJO BORNES 41 29 56.7 -6 58 17.1 symbol=small_city !NB: Grij Serra de Bornes LAMA-O ALVAO LAMAS OLO 41 22 20.1 -7 47 37.0 symbol=small_city !NB: Lamas de Olo (Alvo) LAMAS ALVAO LAMAS 41 27 11.0 -7 46 05.4 symbol=small_city LAR-AN LAROUCO ATR N N41 55 59.5 W7 43 02.6 symbol=landing !NB: Larouco - aterragem Norte LAR-AS LAROUCO ATR S N41 51 29.6 W7 42 44.9 symbol=landing !NB: Larouco - aterragem Sul !Position: UTM/UPS LARC-C LAROUCO CASETA 29 T 609500 4643500 symbol=house !Position: DMS LARC-N LAROUCO NORTE N41 55 02.0 W7 42 58.9 symbol=take_off !NB: Larouco - descolagem N S-GRCA ALVAO SRA GRACA 41 25 00.0 -7 55 00.4 symbol=take_off !NB: Sra da Graa (Mondim de Basto) LARC-S LAROUCO SUL 41 52 49.0 -7 43 14.0 symbol=take_off !NB: Larouco - descolagem S SAMARD ALVAO SAMARDAES 41 24 27.0 -7 43 16.2 symbol=small_city !NB: Samardes (Alvo) LARC-W LAROUCO OESTE 41 53 04.2 -7 43 35.7 symbol=take_off SANDRE LARC STO ANDRE 41 51 55 -7 40 1 symbol=small_city !NB: Baliza 8(2) Larouco 97 LAROA LARC S PEDRO 42 01 31 -7 41 51 symbol=church !NB: S. Pedro de Laroa (igreja) Baliza 27 Enc FPVL Larouco 97 LGCOMP LAGOA COMPRIDA 40 21 45 -7 39 0 symbol=buoy_blue !NB: Lagoa Comprida Baliza 8 Linhares 97 SANTNN LARC S ANTONINO 41 56 27 -7 44 11 symbol=small_city !NB: Baliza 17(2) Larouco 97 SARAUS LARC SARREAUS 42 05 22 -7 36 10 symbol=swimming !NB: Sarreaus (piscinas) Baliza 24(2) Larouco 97 LINHRS ESTR LINHARES 40 31 59.2 -7 26 45.9 symbol=take_off !NB: Linhares (descolagem) SEIA DESCOLAGEM 40 25 15.3 -7 38 11.2 symbol=take_off ALBARE ALBARELLOS-MONTE 41 57 19.9 -7 29 45.0 symbol=small_city !NB: Albarellos de Monterey (no local) LODSLO LARC LODOSELO 42 4 18 -7 35 36 symbol=church !NB: Lodoselo (igreja) Baliza 23(2) Larouco 97 SEIA-A AERODROMO 40 27 10 -7 41 0 symbol=airport !NB: Baliza 10 Linhares 97 SEIA-G BOMBAS GASOLINA 40 24 45 -7 40 30 symbol=fuel !NB: Baliza 11 Linhares 97 SENDIM LAROUCO 41 53 27 -7 45 54 symbol=small_city !NB: Baliza 4 Larouco 97 !Position: UTM/UPS ALLRIZ ALLARIZ MOSTEIRO 29 T 599300 4671200 symbol=church SLVEIR SOLVEIRA IGREJA 29 T 610500 4633500 symbol=church !Position: DMS LUCNZA LARC LUCENZA 41 57 13 -7 37 24 symbol=small_city !NB: Baliza 20(2) Larouco 97 ALVADI ALVAO ALVADIA 41 26 06.6 -7 46 49.7 symbol=small_city !NB: Alvadia (Alvo) !Position: UTM/UPS SNDIAS SANDIAS ESCOLAS 29 T 603200 4663500 symbol=school !Position: DMS MONTLG MONTALEGRE CAST 41 49 30.0 -7 47 25.0 symbol=castle !NB: Montalegre (castelo) Baliza 3 Larouco 97 MEIXDO LARC MEIXEDO 41 50 1 -7 44 20 symbol=small_city !NB: Meixedo Baliza 11(2) Larouco 97 TEIXRA CRUZMT TEIXEIRA 40 14 55 -7 43 30 symbol=street_int !NB: Cruzamento da Teixeira Baliza 3 Linhares 97 AMARAN AMARANTE 41 16 00.9 -8 05 38.4 symbol=medium_city TORRE ESTRELA 40 19 20 -7 38 10 symbol=short_tower !NB: Baliza 7 Linhares 97 TRSMIR LARC TRASMIRAS 42 1 25 -7 36 56 symbol=church !NB: Trasmiras (igreja) Baliza 15 Larouco 97 TRPENA LARC TORRE PENA 42 5 21 -7 40 36 symbol=small_city !NB: Torre de Pena Baliza 19 Larouco 97 NINOAG NINO D AGUIA 41 57 14 -7 40 44 symbol=church !NB: Nio d'Aguia (igreja) Baliza 9 Larouco 97 BAGEIX BORNES BAGUEIXE 41 34 03.3 -6 46 21.2 symbol=small_city !NB: Serra de Bornes PDONOE LARC PTE DONOES 41 49 32 -7 48 43 symbol=bridge !NB: Ponte de Dones Baliza 13(2) Larouco 97 UNHAIS DESCOLAGEM 40 18 27.0 -7 36 27.5 symbol=take_off !NB: Unhais (descolagem) V-SECA LARC AERODROMO 42 03 04 -7 35 58 symbol=ultralight !NB: Vila Seca (campo ultralights) Baliza 25(2) Larouco 97 PDRNLS LARC PADORNELOS 41 51 41 -7 45 12 symbol=small_city !NB: Baliza 7(2) Larouco 97 BALTAR LARC CTR MEDICO 41 56 49 -7 43 14 symbol=1st_aid !NB: Baltar (centro mdico) Baliza 18 Enc FPVL Larouco 97 VBARRI VILAR DE BARRIO 42 9 40 -7 36 38 symbol=small_city !NB: Baliza 22 Larouco 97 BILHO ALVAO 41 24 31.6 -7 50 26.8 symbol=small_city !NB: Bilh (Alvo) !Position: UTM/UPS BLNCOS LARC OS BLANCOS 29 T 603600 4650800 symbol=small_city !Position: DMS VBFEIT VALE BENFEITO 41 28 59.2 -6 58 59.2 symbol=small_city !NB: Serra de Bornes PISOES LARC BARRAGEM 41 44 28 -7 51 20 symbol=dam !NB: Pises (torre N barragem) Baliza 2 Enc FPVL Larouco 97 !Position: UTM/UPS !Datum: European 1950 BORAFB BRNES A FE BARR 29 T 671900 4582130 symbol=dam !NB: Alfndefa da F, barragem G5 Bornes 99 !Position: DMS !Datum: WGS 84 PITOES LARC DAS JUNIAS 41 50 23.5 -7 56 46.0 symbol=small_city !NB: Pites das Jnias (no local) VERIN 09-SEP-97 2337 41 56 40.2 -7 26 42.3 symbol=small_city !Position: UTM/UPS !Datum: European 1950 BORAFE BRNES ALFANDG FE 29 T 670600 4579050 symbol=store !NB: Alfndega da F, mercado B17 Bornes 99 !Datum: WGS 84 VERINA VERIN ANTENA 29 T 636573 4655616 symbol=short_tower !Datum: European 1950 BORANT BRNES ANTENAS 29 T 666700 4588900 symbol=short_tower !NB: S Bornes, antenas B2 Bornes 99 !Position: DMS !Datum: WGS 84 PNHDRD PENHAS DOURADAS 40 24 15 -7 33 55 symbol=elevation !NB: Baliza 13 Linhares 97 !Position: UTM/UPS !Datum: European 1950 BORBAZ BRNES BARR AZIBO 29 T 675250 4605830 symbol=dam !NB: Barragem do Azibo B8 Bornes 99 BORBLS BRNES BALSEMAO 29 T 679180 4593860 symbol=chapel !NB: Santurio de Balsemo B9 Bornes 99 BORCGR BRNES C GUARDA 29 T 674330 4596740 symbol=house !NB: S Bornes, casa do guarda B6 Bornes 99 !Position: DMS !Datum: WGS 84 VPERDZ VILAR PERDIZES N41 51 21.0 W7 38 05.0 symbol=church !NB: Vilar de Perdizes (igreja) !Position: UTM/UPS !Datum: European 1950 BORCHA BRNES CHAO CAPL 29 T 679540 4610770 symbol=chapel !NB: Chos, capela B13 Bornes 99 !Position: DMS !Datum: WGS 84 VPOUCA V POUCA AGUIAR 41 29 48.2 -7 38 51.1 symbol=small_city !NB: Vila Pouca de Aguiar !Position: UTM/UPS !Datum: European 1950 BORCRZ BRNES CRZ SAMBD 29 T 665670 4590420 symbol=street_int !NB: S Bornes, cruzamento para Sambade B3 Bornes 99 BORFAB BRNES FABRICA M 29 T 674350 4599110 symbol=factory !NB: Fbrica Mitalco B7 Bornes 99 !G: S Alvo !GW: ALVADI AMARAN BILHO CABSTO GOUVAE LAMA-O LAMAS S-GRCA SAMARD VPOUCA !G: S Bornes !GW: BORNES GRIJO VBFEIT BAGEIX BORAFB BORAFE BORANT BORBAZ BORBLS BORCGR BORCHA BORCRZ BORFAB BORFUT BORGRJ BORIZD BORMCV BORMIR BORMRS BORPVG BORQCM BORRSS BORSAM BORSND BORVBF BRGNAE BRGNCT BRGNNB !G: S Estrela !GW: CEBOLA COVLHA COVLHS CPFIGR ERADA FLGSNH LGCOMP LINHRS PNHDRD SEIA SEIA-A SEIA-G TEIXRA TORRE UNHAIS !G: S Larouco !GW: BALTAR BOULSA CASTNH CHAVES CRVLHH CUALDR FRSTRS GRALHS LARC-N LARC-S LARC-W LAR-AN LAR-AS LAROA LODSLO LUCNZA MEIXDO MONTLG NINOAG PDONOE PDRNLS PISOES SANDRE SANTNN SARAUS SENDIM TRPENA TRSMIR V-SECA VBARRI XINZO XIROND CRANDN LARC-C SLVEIR VERIN VERINA VPERDZ ALBARE ALLRIZ PITOES CHA SNDIAS BLNCOS gpsman-6.4.4.2/manual/html/info/coords.gif0000644000175000017500000002434606541176152016440 0ustar migmigGIF87a@p0@@`@((V@(V@]^dШ] @6]L]@D(?V (V@#6d]n@G ? + @@( V@ (V d Vi@@(V(+V@ L( V|@ @`(\]iL(V@@Ld@( V([V`\dL `(\VTpPD҅H\M] ,(ILd"( V(tV(d"@/r ж"Ptt(V(Vt@(V ^"נ]䏤^tD?] ,(@ XȰaCJHŋ3jȱႏ :qI!O\Œ.[ 3!˛8sRgƒ>; Jt#M4xbӢPJJՓO+f0։_K٫a&U`׃]ʍ wݻx˷߿ LÈU-`ƈ#KL˘3υ۶CMӨS^ͺץ?'<۸sͻ Nȓ+_μpKNسk.Oy3_Ͼuw[ Ͽ(h& 6~ VX[zv ($ !Tp0h6.pW(\2)D&wb= gE6PFHTR@Tw+Q)}!]Hrr&osiw⹧ufX`bL'qvڦ&)Vzۥ梿)稚'AHijnji۠Vi(>*f@oj배Z+Kzi '̮)>,vknnZYJ-znr+.͂k.~*;.nF- Zn$:pn/q OL&}&/*, j2S+s2o/3q;ks5K~Jˍsȓ6Zcs?4S]u̻a-6\awzB-(lwfSNM*⁏ܸ͏'qx=ލ}s^>󜱻y_9ȧϚ:R.p3WzqX@j:8pngV8<;p|p;Nqwۖ8{̓)Ϣз>O떣?◿`@BMJX`Կ֥|35@+T`Bnu[~g.a =p$!uxwmBЈ2aHCЉ7TT$!jXEyZb'/Ό#33nc8UZ"G6qd 2 E"ґS@6JJE̤&7Nz (GIRL*i7QғT,gIZ̥.7y7%.xđIbL2f:Ќ4IMjpqv%3Ynz 8Irs,@Tg;IOHy=Oܨ@OӠ@ZPԡ BP>ԢD+ыv4ըHCJRԤ%)JWҖ")FeQ^S7̛>OҘt?iPyJS5EEQYT.@PjT*ժEg[`@` XJֲؤ MUp\K*Vsm^׾? iYMb۠󎙺͗ZO`O6klfGKҖձ[ ̠&ZӺ fߙVfMUlwhRSȽlZۮKMtKZ3M%.u̢T-àWeaq`պjͯlį5/ ;$[w5p{\VkL"X`?ΰ),ֳwZH,{XIc,&0ضM6_=,bxA2ܠv)ud Eɐ\cWCb/gXfFs0e27Y N،B+3m E9|Li׮s}; K#jI- Hš!Y SgyյiO?֚5+\6w=lX԰ b+;Ĝ1jשE[V3r'e>Gx>7zܒV1mK6x{rwwe' gŭ:>Af#> cqo_#e~CMk[x]=_\-w9ϱtl'9:9[]D3}ګ{=SG寛=Y(^y"nzbϠR;YsՊgc><`kE9| ̇^7k5Oy$'׳機kW%{O~9W]?a߫<l'>}cyˏzZ=V~7nG|w;7v9]3)C]]xU=ɔ啔 ɓI%XiYɑ]I@ %iuȕjXh mnŖ[I=eȗ" i}% ɘeI%񈙘=4W XzYZ~Ii Yو Yc9~'V٘9隯v(¹%)ٜis)IW9i5pu9$)艚ٝ)f2*IhjfU`E9)ڟJ٠:":VIzw #Z"!j'!+U)/cSHuB9sҢ9 ƣwI4چvH_zM S *Wi%Z[XF_z Ujc a:gJ] krioO5ʛ9R"|hqJnuw:Z?v|: JR˱#K ڱ[9`{ba!~Jg7˴G;];?oyۛ@K:d˶{ze{+S k_fc+ ${.m]z_ٲJ+[r붡[s{k۸k˸ڻJ:+k{+S۹h\i֋ ɻ۽QZ+k+kg+ k}|f&]=GoDŽs2cl|ŽUvovRKln\S En<ɎkT{D[|ֽ[}~=m;|kkLs~ƈ2z~j^#JNX+טZUNzNH>͇sB{::ZJj.{z]S>nXlƁ8@RW[L~bZ>>Pd5;˯o\ +MJ]>oN*蚾 7]/\f>E(CoIM&ONa@\TξL5?Mj'ڷ}cܯ`ͫW.?+7l:b9KZhu^Ƥ] ke3]}ؽ}j͹=G\ىYM]|խ_(pwczswL]zp޹٩ߗLr]s/N ?ḛ d(K2nS80C掂? u0DM<4COFdŋ Z]1ljJ<ͪ u$RC^Cފd2Dk;7%#Q?r@/IZLO3MLHB [L7LM\O?3&ܳ>Dt4Ե@ 14SRK5U't1TU4MKtUYUP_UqYw-qEUW^VJ U3We(= fXnPj-JHi%IB=\w=zX|^],]:m^+h`P~ fV6ֆFT]vbc5.|+cX^O>Y;^S.9fvb{iVW[۠]8uPg{$ib>㪭b֚kr1H]͚ 2mfi>:b]MYmf{z\ӿ9qn uqI͘61r|WD;t^!Gvڶ6ѧl}ؼSU}+IwDsZUg7r[Y7LˁGy<8p|^1qMԓl3Ͽ|Xُ4AM⑮}״bo ȥm;V7?0rmPu! B<B"o4lNhP@{[SCPJA|$o1v[b?EqDqd'vP""B]ˋ1H P%Pd#X7z1+lbfYG@,# DDkJ$kzH z _H^kBP:h'Ky,q:mg -ߤIuFp+.T.ƃ/b ɝJRggґie۴2'BytIJs'IY"yΕtHLo%wrC, |yU>T\Z'h7"c "@3+]"H3ʙ~m;澭z?F<9K~=bXo+GD꬟=;xd׍bg̸^xë]lߎO=U{OwO{;5tYO=IVz'o葲ۮW_uOvw>|GN&[vˋwOo z);}b'xԧ? g?㫟cw| ?ǿ_>?룖0@8@@SL|@1L@!: @9?Y I?DA^1A|@\<@A ۖ &A ??b9A,tB=!\+dBB @"|64B6C2\5t7d>ñ)C$BD>CATA7EICD?q0LMDDGL6[ ]B`@dPBcLFf9(\ ZB3t OFpr} mlf!m|;+Fm,sĎ 7|s|}~ȀHx&GȄTȅdȆtHr;Hr}ҶׂEظHj$Ȉ `Fd[tJISJi*?KsK,V)lLZCK\ޫ8["˽3˃D[Lk2o>TM>KLäI+̾MzˍM͸LLCь]VjnpmVu]rU SaSv%doT;M+NeOHW3aWlXYO@QPRQTXUuX`WGىue:eԃPѶQ ֣׀YEP P[O!}ڬ}.=5vQDT t]tMQٮ]PJ~A۴NOM05}W$[;H͟ _L\Ɓ\a6a^ah~aafab&b >b!Fb#f"v%~b%bb $&b$>x`@`3F4V5f6v789:F GPS Manager User Manual -- Notation for Events
Map: Mouse and Keyboard ShortcutsBy EventNotation for Events

Notation for Events

Mouse
<Button-n>     mouse button: 1=left, 2=middle, 3=right
n > 3 used for wheel-mouses
<Bn-Motion> mouse button n and mouse motion
<Double-n> double click with mouse button n
Mouse and keyboard
<Shift-n> mouse button and shift key
<Control-n> mouse button and control key
<Control-Shift-n> mouse button, control and shift keys
<Alt-n> mouse button and alt key
<Control-Motion> control key and mouse motion
Keyboard
<Key-Up> up-arrow key
<Shift-Up> shift and up-arrow keys
<Key-Down> down-arrow key
<Shift-Down> shift and down-arrow keys
<Key-Left> left-arrow key
<Shift-Left> shift and left-arrow keys
<Key-Right> right-arrow key
<Shift-Right> shift and right-arrow keys
<Key-Delete> delete (or backspace) key
<Key-space> space key
<Return> return (or enter) key


GPSMan User Manual
Copyright 1998-2013 Miguel Filgueiras,

Creative Commons License
GPSMan User Manual and the GPSMan logo images by Miguel Filgueiras are licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.

Get gpsman at SourceForge.net. Fast,
secure and Free Open Source software downloads


Map: Mouse and Keyboard ShortcutsBy EventNotation for Events
gpsman-6.4.4.2/manual/html/GPSMandoc_12.html0000644000175000017500000003310312170753404016453 0ustar migmig GPS Manager User Manual -- Configuration
Using GPSMan in graphical modeTopProgramsConfiguration

Configuration

A few crucial parameters should be configured in the GPSMan main file gpsman.tcl. Default values for user options are set in the file config.tcl but as they are overwritten by the values in the preferences file they are more conveniently changed when running the program.

GPSMan needs a user directory that will contain the users preferences file and other data, and a user temporary directory. The paths to these directories and the name of the preferences file are given at the beginning of gpsman.tcl. When GPSMan is launched and does not find the user or the temporary directories, it attempts to create them and if this fails asks for them to be created and leaves. If the preferences file does not exist, it forces it to be created.

All the temporary directory files will be deleted when GPSMan starts up. This means that problems may occur if GPSMan is launched when it is already running and using temporary files.

Users wanting to load their own Tcl/Tk code (at their own risk!) can do so by putting it in a file named patch.tcl in the GPSMan user directory. This file will be loaded immediately after all the GPSMan source files.

If GPSMan has been installed from the Debian or other Linux/Unix distribution packages no changes are mandatory. Otherwise, on Unix systems the information on the program source files directory, user directory and default preferences file must be correctly set. A default serial port device can be defined and will be used if no argument is passed to the main program.

On other systems the same applies to the information on the serial port.

Parameters that should be configured in gpsman.tcl are:

  • for non-Unix systems: serial or USB device to which the receiver will be connected; users of GPSMan must have read/write permission.

  • path to the directory containing the program source files.

  • path to the user GPSMan directory that will contain the preferences file and other files for user definitions (like user-defined projections); this directory is normally not to be used explicitly by the user. In MS-Windows for users not logged in as administrator it may be useful to have this directory under the user's "Application Data" directory, what is obtained by the following Tcl instruction:
    set USERDIR $::env(APPDATA)\\gpmandir

  • name of the preferences file; the user directory is searched for it only if there is not a file under the same name in the current directory.

  • user temporary files directory; it defaults to .tmp under the user directory.

The following list gives a description of all the options that can be configured in the file config.tcl:

  • the language to be used by GPSMan; new languages can be included by translating the lang*.tcl files that contain the text and messages in Dutch, English, French, German, Indonesian, Italian, Russian, Spanish and Portuguese (help here will be acknowledged) and inserting new abbreviations for month names in the ALLMONTH array.

  • use of character composition (accents, cedilla) using Western European (isolatin1) mode, and of Delete key to delete last character.

  • choice of main window: there are three permanent windows for the map, lists, and receiver connection; either the map or the lists window can be selected as being the main window.

  • GPS receiver dependent values: GPS brand, baud rate of serial communication, default receiver protocol (only for Garmin receivers), whether all characters should be accepted in names and comments, length of names, comments, maximum numbers of waypoints, routes, waypoints in routes, and track points, use of creation dates and of lowercase letters in strings. In the distribution, the values are set for use with a Garmin Quest.

  • (for Garmin receivers only) whether or not routes should be automatically numbered when they are sent to the receiver (default is no).

  • (for Garmin receivers only) enabling support for laps (default is no).

  • (for Lowrance receivers only) sampling interval, in seconds, when acquiring tracks.

  • default symbol and default display option to use with waypoints; correct names for symbols and display options can be found in file symbols.tcl.

  • default for whether items read from a file should be displayed on the map.

  • default line widths for representing routes, tracks and polylines on the map.

  • when displaying a track, count of track points before showing point number or date; 0 means no numbers, 1 means all points numbered, 2 every other point numbered, and so on.

  • what to show when pointer goes over a track point on the map: either its number or its date.

  • whether polylines on the map should react to mouse events; they should not if they are considered as background information.

  • behaviour when reading a data item with the same name as another item of the same type in the data-base: either overwrite the existing one, or create under a new name.

  • behaviour when a data item with hidden information is changed: remove the hidden information, keep it, or ask the user.

  • distance unit to be used.

  • altitude unit to be used in data items; this option has no effect in altitude values displayed in real-time log or navigation windows of the Garmin variant.

  • altitude threshold in user units needed when computing cumulative ascent/descent: any altitude change below this value is discarded; it should be set to around 11m (the default) for normal GPS receivers, and to around 2m for receivers having a barometric altimeter. Computed values will not be displayed if inconsistent with this value.

  • format of positions, default datum and time offset (1 meaning 1 hour less than UTC), date format.

  • default map projection and cursor position format when starting with an empty map.

  • accurate formulas for computing distances and bearings; they should be selected except on very slow computers.

  • whether to ask for confirmation of projection parameters.

  • whether to use a window to control slow operations, and help balloons.

  • MapGuide text format default version.

  • operating system command to print or to further process a Postscript file generated by GPSMan (in the user GPSMan temporary directory), or empty if unavailable; the file path will be appended to the command.
  • operating system command to display the image in a file, or empty if unavailable; the file path will be appended to the command.

  • operating system command to open a terminal (command-line) window, or empty if unavailable.

  • map dimensions, length of line for displaying a scale, and initial map scale given as the distance corresponding to the given line length. The possible values for this distance depend on the choice of unit made before.

  • default font, fixed (monospaced) font, map font, travel window font and elevation graph font; the possible values are:
    • default for the default Tcl/Tk font (not recommended for the fixed font)
    • fixed or a list or string with fixed followed by a size in points
    • a Tcl/Tk font description that can include the font family and parameters for the size, weight, slant, underline and overstrike.
    The fonts for the map, the elevation graphs and travel window can be changed while running the program.

  • size of icons used for the waypoint symbols: either 15x15 or 30x30 (in pixels); GPSMan logos are adjusted to the selected size.

  • interface appearance: number of maximum elements per menu, initial positions of windows, dimensions, colours.

  • saving the program state on exit and deleting the saved state files after restoring.

  • permission of created files (in Unix numeric notation).

  • default paper size and usable paper dimensions.

  • abbreviated names for months in all known languages.

  • paper sizes and dimensions, used when saving plots or maps as Postscript files. The dimensions are floating-point numbers followed by c for centimetres, i for inches, m for millimetres, or p or nothing for printer's points (1/72 inch).

  • output formats for floating-point coordinates in seconds, minutes, degrees, and grades; obviously changes in these formats will not increase the data accuracy!

  • whether GPSMan data can be appended to an existing file when saving; this should be used with care as a file with conflicting time offsets may result that will not be loaded by GPSMan.

  • choice of echo in password-style entry boxes: none or a character.

  • options used when importing Kismet .network files: which Kismet network types should be converted to waypoints, symbols to use for each encryption under each type, default symbol for encryption values not described in the previous option, which prefix to use for names if the ssid is missing or name repeated, initial number to add to the prefix when forming name.


GPSMan User Manual
Copyright 1998-2013 Miguel Filgueiras,

Creative Commons License
GPSMan User Manual and the GPSMan logo images by Miguel Filgueiras are licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.

Get gpsman at SourceForge.net. Fast,
secure and Free Open Source software downloads


Using GPSMan in graphical modeTopProgramsConfiguration
gpsman-6.4.4.2/manual/html/GPSMandoc_4.html0000644000175000017500000000761512170753404016405 0ustar migmig GPS Manager User Manual -- Programs
ConfigurationTopIntroductionPrograms

Programs


GPSMan User Manual
Copyright 1998-2013 Miguel Filgueiras,

Creative Commons License
GPSMan User Manual and the GPSMan logo images by Miguel Filgueiras are licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.

Get gpsman at SourceForge.net. Fast,
secure and Free Open Source software downloads


ConfigurationTopIntroductionPrograms
gpsman-6.4.4.2/manual/html/GPSMandoc_74.html0000644000175000017500000001734112170753404016471 0ustar migmig GPS Manager User Manual -- Version 6.4 -- October 2008
Version 6.3.2 - June 2007Recent ChangesVersion 6.4.1 - 30 December 2009Version 6.4 -- October 2008

Version 6.4 -- October 2008

  • support for the Russian language, kindly contributed by Nikolai Kosyakoff (priroda.net_at_gmail.com).

  • new option for default on displaying items on map when reading a file; asked by Valère Robin.

  • changes in the edit/show windows for routes, tracks and polylines: new way of selecting points, affecting the way some edit operations work, and new Split operation that creates new items of the same type by cutting the original item at certain points; in answer to suggestions by Zvi Grauer (zvi.grauer_at_gmail.com).

  • side-view elevation graphs now answer to Control key and mouse left-button showing the number of the nearest point, its altitude and cumulative distance or time; contributed by Benoit Steiner (benetsteph_at_free.fr). There is a new button for displaying/hiding vertical grid lines; asked by Rudolf Martin (rudolf.martin_at_gmx.de). Distances in the horizontal axis are now shown and gaps between segments are displayed as interrupted lines.

  • new values in computation of track parameters:
    • cummulative ascent (height of climbing); contributed by Benoit Steiner.
    • cummulative descent, maximum and minimum altitudes; asked by Rudolf Martin.
    • total distance and time not considering gaps between segments.
    • the average speed is now computed not considering gaps between segments.
    Altitude related parameters only shown if there is altitude information, and total distance and time not considering gaps only shown if different from totals including gaps.

  • enhanced support for the least squares fit geo-referencing method that can now be used with the affine, affine conformal and affine conformal with no rotation transformations, and produce information on the deviations of control points after a least squares fit; with the kind assistance of J. B. Mehl who provided the formulas and helped with tests.

  • support for the EOV (Hungarian National) projection and grid, kindly contributed by Sándor Laky (laky.sandor_at_freemail.hu); asked by Attila Berenyi (berenyi.attila_at_gmail.com) with thanks for his help.

  • the time offset (defining a time zone) in GPSMan files is now taken into account when loading them; this may affect waypoint creation dates, track points time-stamps and lap start times; in answer to a question by Stephen Berryman (berrymansj_at_optusnet.com.au).

  • data items can now be opened from the Data sub-menus and the list menus.

  • a single type of items (apart from "Group") must be chosen when putting to or getting from the receiver; this is avoids synchronization problems that may occur if the connection is slow.

  • the translate command accepts parameters for overrriding the time offsets in GPSMan files.

  • the geopicts command can now use EXIF files (as produced, for instance, by exif or metacam) instead of picture files, and can deal with different time-zones for track and pictures time-stamps.

  • importation and exportation of KML format; contributed by Valère Robin, asked by Zvi Grauer.

  • better support for GPX files, concerning the treatment of waypoint names and of character encoding.

  • importation of OziExplorer waypoint files.

  • examples of some commands in the section about the command-line mode in the user manual.

  • Garmin support:
    • when getting waypoints not defined by the user from the receiver, those with the same name but different positions will be renamed instead of overwritten;
    • experimental support for changing the baud rate of a serial communication with some receivers. GPSMan now uses the option for the default baud rate in a different way. With thanks to Andy Walls (cwalls_at_radix.net) who found out a specification of the corresponding protocol, and to Klaus Ethgen for his help with tests;
    • explicit support for some new receivers; with thanks to all those who sent protocol lists: Wouter Amsterdam, Facundo Ariel Perez, David W. Capella, Hiroshi Iwamoto, András Veres-Szentkirályi, Steven Winikoff, Stefan Heller, Greg McQuat, Andy Walls, Jeff Hanson, Gerry Creager, Paul B. Hoch, Johann Spies, Bruce Dawson, Bogdan Hlevca, Ralf Kleineisel, David Antliff, Slaven Rezic, Matthias Wenzel, Lovro Palaversa, Adrian Lawrence, Oliver Hegner, David P. Brown, M. Gutman, Jean-Yves Sage, Damien Porquet, Vincent Arkesteijn, Patrice Arnal, Zvi Grauer, James B. Mehl.


GPSMan User Manual
Copyright 1998-2013 Miguel Filgueiras,

Creative Commons License
GPSMan User Manual and the GPSMan logo images by Miguel Filgueiras are licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.

Get gpsman at SourceForge.net. Fast,
secure and Free Open Source software downloads


Version 6.3.2 - June 2007Recent ChangesVersion 6.4.1 - 30 December 2009Version 6.4 -- October 2008
gpsman-6.4.4.2/manual/html/GPSMandoc_76.html0000644000175000017500000001000412170753404016460 0ustar migmig GPS Manager User Manual -- Version 6.3.1 -- July 2006
Version 6.3 - May 2006Recent ChangesVersion 6.3.2 - June 2007Version 6.3.1 -- July 2006

Version 6.3.1 -- July 2006

  • importation of waypoints from Kismet .network files with location information, asked by Bernd Stuht; some new options on this should be configured by editing config.tcl.

  • map window can now be resized.

  • WARNING: Garmin USB support for some recent Garmin receivers will need at least version 0.28 of the garmin_gps Linux kernel driver.

  • updates to Garmin support following the specifications made available in May 2006, but not (yet) covering some new protocols for fitness-oriented receivers.

  • explicit support for several Garmin receivers or their new firmware versions, including: GPSMAP 60CSX and 76CSX, EDGE 205 and 305, GPS 18USB, eTrex Legend Cx, Forerunner 205, and GPS 60; with thanks to all those who sent protocol lists: Doug Larrick, Thomas Zumbrunn, Jiri Dvorak, Daniel Dorau, Nenad, Elric Milon Beltran, Michel Equeter, Dominic Hargreaves, Sébastien Roy, Nicolas Brouard, Reinhold Pschierer, Sven Anders, Jon Stockill.


GPSMan User Manual
Copyright 1998-2013 Miguel Filgueiras,

Creative Commons License
GPSMan User Manual and the GPSMan logo images by Miguel Filgueiras are licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.

Get gpsman at SourceForge.net. Fast,
secure and Free Open Source software downloads


Version 6.3 - May 2006Recent ChangesVersion 6.3.2 - June 2007Version 6.3.1 -- July 2006
gpsman-6.4.4.2/manual/html/GPSMandoc_52.html0000644000175000017500000001014012170753404016453 0ustar migmig GPS Manager User Manual -- The exec Command
Using GPSMan in Command-line ModeThe source CommandThe exec Command

The exec Command

The exec command executes the GPSMan commands in the file whose path is given as argument:

exec PATH
Blank lines and lines whose first non-blank is "#" are discarded without further analysis. A "\" before the end of a line is taken as continuation line marker, but this may cause an error if there is an unmatched quote """.

The following commands are available for use in GPSMan scripts:

read FORMAT [PARAMS] [TYPES] PATH
read data from a file; when used from the command line this command reads a data file and launches the graphical interface;
write FORMAT [PARAMS] [TYPES] PATH
write data to a file;
get TYPES
read data from receiver;
put TYPES
write data to receiver.

Example: the following GPSMan script

  # WPs from the receiver to file in GPSMan format
getwrite WP GPSMan myWPs.gpsman
  # save them also in Shapefile format
write Shapefile dim=3 pformat=UTM datum="Datum 73" \
      shape/myWPs
downloads the waypoints from the GPS receiver and writes them both to a GPSMan file and to a Shapefile.


GPSMan User Manual
Copyright 1998-2013 Miguel Filgueiras,

Creative Commons License
GPSMan User Manual and the GPSMan logo images by Miguel Filgueiras are licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.

Get gpsman at SourceForge.net. Fast,
secure and Free Open Source software downloads


Using GPSMan in Command-line ModeThe source CommandThe exec Command
gpsman-6.4.4.2/manual/html/backgr.gif0000644000175000017500000000060007310716747015435 0ustar migmigGIF87a,@ڋ޼H扦ʶ L ĢL*̦ JԪjܮ N (8HXhx)9IYiy *:JZjz +;K[k{ ,N^n~/?O_o0 <0… :|1ĉ+Z1`;z2ȑ$K<2ʕ,[| 3̙4kڼ3Ν<{ 4СD=4ҥL:} 5ԩTZ5֭\z 6رd˚=6ڵl+;gpsman-6.4.4.2/manual/html/GPSMandoc_65.html0000644000175000017500000002211512170753404016464 0ustar migmig GPS Manager User Manual -- By Operation
By EventMap: Mouse and Keyboard ShortcutsBy Operation

By Operation

scroll up (move map down) slowly     <Key-Up>
scroll up (move map down) <Button-4>
scroll up (move map down) fast <Key-Delete>, <Shift-4>
scroll down (move map up) slowly <Key-Down>
scroll down (move map up) <Button-5>
scroll down (move map up) fast <Key-space>, <Shift-5>
scroll left (move map right) slowly <Key-Left>
scroll left (move map right) <Alt-4>
scroll left (move map right) fast <Control-4>
scroll right (move map left) slowly <Key-Right>
scroll right (move map left) <Alt-5>
scroll right (move map left) fast <Control-5>
scroll NE (move map SW) slowly <Shift-Up>
scroll SE (move map NW) slowly <Shift-Right>
scroll SW (move map NE) slowly <Shift-Down>
scroll NW (move map SE) slowly <Shift-Left>
panning slowly <Control-Motion>
panning fast <B2-Motion>
create waypoint <Button-1>, <Return>
stop motion of waypoint (if one moving) <Button-3>
open item (if over item) <Double-1>
measure distance and azimuth <Shift-3> (in two positions)
open waypoint menu (if over waypoint) Unix: <Control-1>
non-Unix: <Button-3>
add waypoint to route being edited on map (if any)     <Button-1>
delete waypoint from route being edited on map (if any) <Shift-1>
edit previous stage of route being edited on map (if any) <Control-3>
edit next stage of route being edited on map (if any) <Control-Shift-3>
open route menu if editing it on the map Unix: <Control-1>
non-Unix: <Button-3>

finish edition of route on map

Unix: <Button-3>
non-Unix: <Control-1>
cancel edition of route on map <Shift-2>


GPSMan User Manual
Copyright 1998-2013 Miguel Filgueiras,

Creative Commons License
GPSMan User Manual and the GPSMan logo images by Miguel Filgueiras are licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.

Get gpsman at SourceForge.net. Fast,
secure and Free Open Source software downloads


By EventMap: Mouse and Keyboard ShortcutsBy Operation
gpsman-6.4.4.2/manual/html/GPSMandoc_68.html0000644000175000017500000000714612170753404016476 0ustar migmig GPS Manager User Manual -- Recent Changes
IndexTopMap: Mouse and Keyboard ShortcutsRecent Changes

Recent Changes

The following is a summary of the more important changes made recently, no mention being made of bug corrections.


GPSMan User Manual
Copyright 1998-2013 Miguel Filgueiras,

Creative Commons License
GPSMan User Manual and the GPSMan logo images by Miguel Filgueiras are licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.

Get gpsman at SourceForge.net. Fast,
secure and Free Open Source software downloads


IndexTopMap: Mouse and Keyboard ShortcutsRecent Changes
gpsman-6.4.4.2/manual/html/GPSMandoc_2.html0000644000175000017500000001526312170753404016401 0ustar migmig GPS Manager User Manual -- Contributors
Main featuresIntroductionContributors

Contributors

GPSMan incorporates code contributed by

  • Brian Baulch (baulchb_at_hotkey.net.au): communication with Lowrance receivers, support for the wheelmouse, real-time logging (variant for the Lowrance);

  • Rogério Reis (Universidade do Porto): Debian Linux package and the utilities to configure and lock the serial port;

  • Andreas Lange (Andreas.C.Lange_at_GMX.de): support for German (versions before 6.0);

  • Alessandro Palmas (alpalmas_at_tin.it): implementation of elevation graphs for tracks and routes, both in 2 and 3 dimensions, support for Italian, and exportation of data in OziExplorer format;

  • Niki Hammler (http://www.nobaq.net): Perl script for reading waypoint data in Fugawi export format which was translated into Tcl and incorporated in GPSMan;

  • Martin Ostermann (Aachen University of Technology): conversion of waypoints listed in HTML pages of the MapBlast site into GPSMan data;

  • Valère Robin (valere.robin_at_wanadoo.fr): support for French, importation of EasyGPS export format, and importation and exportation of GPX and KML formats;

  • David Wolfskill (david_at_catwhisker.org): FreeBSD package;

  • Rob Buitenhuis (geo_at_btnhs.nl): support for Dutch;

  • Frank Kujawski (Frank_at_Kujawski.org): conversion of routes listed in HTML pages of the MapsOnUS site into GPSMan data;

  • Tri Agus Prayitno (acuss_at_bk.or.id): support for Indonesian;

  • Matt Martin (matt.martin_at_ieee.org): communication with Magellan receivers;

  • Stefan Heinen (Stefan.Heinen_at_synopsys.com): new data structures for datums, the procedure to access them and changes to improve the focus policy and bindings under MS-Windows;

  • Heiko Thede (Heiko.Thede_at_gmx.de): shell- and Tcl-scripts that convert export files from Map&Guide and related software (Falk, Power Route) to files in GPSMan format and which were incorporated in GPSMan;

  • Sabine Broda (sbb_at_dcc.fc.up.pt): support for German (since version 6.0);

  • Alberto Morales (amd77_at_gulic.org): support for Spanish;

  • Martin Buck (m_at_rtin-buck.de): resizing of 2D graphs, change in track edit window;

  • David Kaplan (dmkaplan_at_ucdavis.edu): RPM packages (2003-2004);

  • Jean H. Theoret (ve2za_at_rac.ca): code for changing the symbol of each waypoint in a group;

  • Paul Scorer (p.scorer_at_leedsmet.ac.uk): a Tcl-script implementing importation of British Gliding Association turnpoint (DOS) files;

  • Nigel Orr (gps_at_river-view.freeserve.co.uk): conversion of routes listed in HTML pages of the GreenFlag site into GPSMan data;

  • David Gardner (djgardner_at_users.sourceforge.net): creating a group from (un)displayed items, and automatically numbering routes when sending to the receiver;

  • Nikolai Kosyakoff (priroda.net_at_gmail.com): support for Russian (2007);

  • Benoit Steiner (benetsteph_at_free.fr): displaying information on points of 2D elevation graphs, and computation of cummulative ascent (height of climbing) for tracks;

  • Sándor Laky (laky.sandor_at_freemail.hu): support for the EOV (Hungarian National) projection and grid;

  • Alexander B. Preobrazhenskiy (modul_at_ihome.ru): support for Russian (since October 2009);

  • Rudolf Martin (rudolf.martin_at_gmx.de): plug-ins for creating plots of tracks using gnuplot and for other computations related with tracks.

Kind help from many other people should be mentioned and is acknowledged below.


GPSMan User Manual
Copyright 1998-2013 Miguel Filgueiras,

Creative Commons License
GPSMan User Manual and the GPSMan logo images by Miguel Filgueiras are licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.

Get gpsman at SourceForge.net. Fast,
secure and Free Open Source software downloads


Main featuresIntroductionContributors
gpsman-6.4.4.2/manual/html/GPSMandoc_47.html0000644000175000017500000001521712170753404016471 0ustar migmig GPS Manager User Manual -- The translate Command
The project CommandUsing GPSMan in Command-line ModeThe start travel CommandThe translate Command

The translate Command

The translate command reads information from a file in a given format and writes it to another file in another given format:
translate IN-FORMAT [IN-PARAMS] [IN-TYPES] IN-PATH [HOW-PARAMS] \
OUT-FORMAT [OUT-PARAMS] [OUT-TYPES] OUT-PATH
where:

  • IN-FORMAT [IN-PARAMS] and OUT-FORMAT [OUT-PARAMS] are the input file format and the output file format and their parameters (if any); use show formats for a list of the currently accepted formats;
  • IN-TYPES are the data types to read; the possible types depend on the input format and some formats impose that there is a single data type per file; they may be absent if the format requires a unique data type or if the files can have items of different types; all can be used as an abbreviation of WP RT TR LN;
  • IN-PATH is the path to the file to read from, or, in the case of the Shapefile format, the path to the Shapefiles basename (file extensions will be discarded). If the IN-PATH is stdin input will be from the standard input unless the format is the Shapefile format (in which case the command fails);
  • HOW-PARAMS specify how to translate the file; for the time being they are only used for overriding the time offset of GPSMan files and take the form:
    • itoffset=DHOUR time offset (1 meaning 1 hour less than UTC) to use in input file in GPSMan format; defaults to time offset given in file;
    • otoffset=DHOUR time offset to use in output file in GPSMan format; defaults to time offset selected in the options;
  • OUT-TYPES may be absent in which case they are taken to be IN-TYPES what is valid only when they are all valid for the selected output format; if RT occurs in IN-TYPES then WP can appear in OUT-TYPES but no other type "conversions" are allowed; some file formats impose that there is a single data type per file; all can be used as an abbreviation of WP RT TR LN;
  • OUT-PATH is the path to the output file, or, in the case of the Shapefile format, the path to the Shapefiles basename (file extensions will be discarded). If the OUT-PATH is stdout output will be to the standard output unless the format is the Shapefile format (in which case the command fails). Existing files will be silently overwritten.

Examples: the following command

translate gpsman data/myWPRTs Shapefile dim=2 pformat=UTM datum="WGS 84" \
    RT sroutes
reads the data in the GPSMan file data/myWPRTs and writes the routes in it to Shapefiles with basename sroutes, with no altitude information (2 dimensions) and using UTM coordinates for the WGS84 datum (note that a Shapefile set can only have items of a single type). The command
translate gpsman data/myWPRTs gpsman WP data/myWPs
creates from the same input file a GPSMan file data/myWPs that only has the waypoints. With
translate gpsman data/myData itoffset=1 gpsman TR data/myTRs
does a similar thing with tracks but assumes the time offset of the input file is 1 (1 hour less than UTC), overriding the value given in the file.


GPSMan User Manual
Copyright 1998-2013 Miguel Filgueiras,

Creative Commons License
GPSMan User Manual and the GPSMan logo images by Miguel Filgueiras are licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.

Get gpsman at SourceForge.net. Fast,
secure and Free Open Source software downloads


The project CommandUsing GPSMan in Command-line ModeThe start travel CommandThe translate Command
gpsman-6.4.4.2/manual/html/GPSMandoc_5.html0000644000175000017500000000601412170753404016376 0ustar migmig GPS Manager User Manual -- Current version
Downloading GPSManProgramsCurrent version

Current version

The current version is: GPSMan version 6.4.4.1, a stand-alone Tcl/Tk program that communicates directly with the GPS receiver. See below for a list of new features.


GPSMan User Manual
Copyright 1998-2013 Miguel Filgueiras,

Creative Commons License
GPSMan User Manual and the GPSMan logo images by Miguel Filgueiras are licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.

Get gpsman at SourceForge.net. Fast,
secure and Free Open Source software downloads


Downloading GPSManProgramsCurrent version
gpsman-6.4.4.2/manual/GPSMandoc.pdf0000644000175000017500000157327112224351117015025 0ustar migmig%PDF-1.5 % 3 0 obj << /Length 213 /Filter /FlateDecode >> stream xuKk0 ::k+έ  t04vH4Uc'=pЃUϩxZR)TN9*TI ӬKu;}w#vbP~WU aO@HB`X7a6s[A|j3>֡k;e{M endstream endobj 12 0 obj << /Length 851 /Filter /FlateDecode >> stream xMS0 ]I,X dhaLLgSNQwm)th8wE4FuNXe$)"E/h#t?Y'Pv >B6K$%ӮO1OaUw<GJ`+X8>o#f0[FOv8a~$vcblU^~ lH]ѕGeq,eN2ZXWu_!96D9_%xsb#) sfrQBOK A y*Rd"6 iu\=A5q`c oEœH]zdcù{?׀sxb<"ө7uI4GΝ/+]Õ[x ]./;ټ}EtZ jJ9lT5͏Y物3\ fb}&,{e,j.wש nv)@'/avôavM9à͞W5l-7ag*ia֟h,&yjݏZ B#z'}!ou_s+me#s^Ogi(׿FW6X|zNS^x n&&t(Ino^M¼<3®͔QR6.̈́6wDmUu)Io~l/ޜAY"Q>U5|:u4$\}~}wjN rjzp⹰1X5~F6Cڎ%L#&G^cOB?өǃ_ endstream endobj 18 0 obj << /Length 954 /Filter /FlateDecode >> stream xr0} /免ufC,pKFv,94MK)\VR$NuQ `r9C,,1LͫY0Ӧ@/슦?M_˜ln_ Y? F1OS7Im޶EL.._ (j7k*2YUAИ>3F<9>4$ $0W'rYg!=yAF4I!Bl z?AĨs8yd[daԙZte)KR -h_JgVzH&NI<3Is#?[ELGSO}h|[Z0Ac4&0|逝yoeg̓ 3Zkه_ xᑱ1[%ޔˢwKtT>b=/Ez |uؘn;bP=p_*o$F(|ևWt$c$D+iׇ A:l#|͍ dQ\ʡ{0m&l J(ۙg'LS_F]VxtTJd6.ӳP,FYV8rUy2hE:(<[r[ܧ1FꀾQRh;%XT+祃t#FߴU=E{)Ѹ.&RW[tOܻh̵h3Z5KXQ& _Kiaw^vKIE qhas&kOO~4 endstream endobj 21 0 obj << /Length 944 /Filter /FlateDecode >> stream xMo@>:/ - *8lmjv {uR%^[ $xXϼ;Y8><9ԑAFR"BBGR1Dѧ#b%u棄1YQmy`gLxQb(7eY)!TX0J!|]0ۙ|¡~hbkun9|ei  Cꎷƭ*êo|dr+m¾zSR'Clґ;| Z#YY/MQH)nI-ؙC^|ϮsR2$HFVE)*g wc/za{Q簱,]9.H)|%F&3qdx؊ >6>w% \b_NDll"%Z,/X)ܜ ӎ -]'EI{wA ΋-􏯞}j6dacc7 )S:HaA<w35'J#ld7b@ f^uOq`WْޝFBxʗN/.GK_J޲$4iӹˊYb|'W3XgzǾ@x3,6v@ݢ~[Hzsj{ncc&^y'gMD}֚=G5wȃTH2r@Pն.e"49pΫuYjh4K,ɾ ߼%A]% tgF'h1(餮ìA,\,'n`0no8pq%_-M o}/NC, endstream endobj 25 0 obj << /Length 1044 /Filter /FlateDecode >> stream xMo8:J@S$iд 6F/T8iPC;+hvAH_MQ@⯇o LbR U< 0bdx|[b(暇'gYGKJlG1 :PZFO_KHAXb - cal7ʦ Z"b:mu xxYVn:~&Ty.T0 y*``|)KGuo&bPÑaRf˜'Fsi7E.XC6aef.X'GOAs_NE4W7$gkB M@eU j~(#b`_ỳld''a$rol~Z fR >rrc\0׽:sS>.T'|{Ң{nuε(j!.#h >C[d ߎo?SR,7orⴥ)׀ybl^x KԕzlKC^ f6qmBӄf]anc$՚*L:}OhQ~&D)h_g!/ aS`tx!V洩Yxkk-ۻ/81W(.nz{V<af)o+U*j_,{9A^f||/xeĞC}0p8GsmhQ+Q7 o'T^zZT7E߲bd-TYG=GJc^`C3>8~6/Zu -Pj堅(>|ǗTlrw~tbem"pWh,-~ oUh)@q8Gf@ @ Y $ /촶WnsKT%Pukg[_t[ i 'x큶v#ƉyOKky,o_x'LZ Ya )0wެ)BSoIWhޗPtU9.ohslQ<\) ;잝bho"Z6/(mgˤ&)8#~gү endstream endobj 28 0 obj << /Length 2146 /Filter /FlateDecode >> stream xڭXo6~_G귴6] IW ^=0b%C}l9JCQ}ۅZ|y0_O0YZ$yEXoz;}n c,ZRgY6(%/0uf }vGqFo"?3"?cR"ZMLUyagJ]t/% 4AjY<.ܫz+}oʭDU^UE"D#&g88$L_mF:y-O m>2/CVJzУ?6yWg{JzkVgι!#?{2ɷ=Ԧ %sӳ{YzD8⎧%WD\F\37o=ؑq}Gw'lEc&]݅E|6?BIo>#FI-$;eEe@$PVi-L9EUA1Y[|U{:7uģ?cg T8M_U8A>Ln9O"],y< 3Ɩhh3spe}{9?+䮅J$'N(: P?EPiG9 H}5~C#(ԻIYCJ''n2"~XBk@O[! U߯3O>9` uUߜ%.%-nZ'S=^&e˚Zlt 9%nBϓ UKB8x7 J&JY5\ fn,L?"e+3W. 4Qj#e6ē!5e lGh4% AV ;JxwHcAaŵ pT*I}/ݶH,7 ZJǎfOgⷨ48tCE Z\{\ J/lIk̮ܷ'pKdg} '01u.R sc=勱@#cB'HuΞ:*5-]䬬c*Dw'd`}Z5*9PT*ŒQiExIHd*ng3}NֵPSY.VĊUXal*؉XjPc!V\D!c[lXsokYĺr{NC ǏPi2&'*1SlKx](̣'ƯyV;%(3MG%,,fӢ8s˕G252hZ0/N 'Z5S8k(gBzګ_A` K \ ~bO?l-+~ M.tlD J(Fܑ`#!#ISBZ sY8D! ~ɞxBI}IPs֖>L`1l3d43D( *G< SdWpB3 < 3'пZTs-'ꋎA@X<.'6 endstream endobj 32 0 obj << /Length 2811 /Filter /FlateDecode >> stream xڵZY6~UeaqbOL6@ E*<,O~vAI*?@_79 sx{yH%۹xNG+w>oۥ'S?ݼpn 4ڴUcҥ^Nɧ۟/^{g~Qk|wg]E?UWؔ6{ly˽ݦ< 3=m#`pJDU4>,*-?}uP 5Ӗ{ ^mm"2ͺU6=—P0.y)Q%X[2$K|!YJ t,A\.DJ"]Ue?OvgM#nU`=y{$l6lSy#:Vb;}__ثj)μ`+F3Dp| *Sij98A}umU7xnŴrº̪zmӶW2][d7?%gG"U|9Bkmʅ{vil]ꎠffO|Z9ga($U{g~> u0AVȑY8w7{SMZeJݠYmu推!^9h]~aM puvv'e;#m:<ۿ/c.m]^[XUЎlUZH6e5Kle!U֪Z[ja]n1FcPeC$ |¯,cc>ӨYj'neЯ)Vry]H5KQ1qі"ZVb{F^\}*ɆԾAs7%Tي}t/P  M H9ЂpJ!VU3#,p];LXmF:lHj@mY$g盭A|i4ABB"[*6{KFdfO1 0tfqQH`GS&Oa1}}< s?pUثwlWo|WXgmgƯ;];HdR0a0>7 0VaN0Cȫ&@^1$ Y K wk vܙda3 ҘGXdj3"{ف+MtK!:BOrtfؼqHq('WfMK>$9ke]Kw$ii;З?EmR؉R"-d~τdIib <01ȷbFȑ4&/$_wH=Pd|&| S !+hk;"hao1"[ˉ4lhޖB Xo06D٢h]M`Je4c٤k,1P=HIo!PL"݁0TbRUL,>qswH@xL!̤)F8L㘁;I&l 69XBIڷsձTJxQְoG2#> x߾i c>96 Ƙ>K |y'#EʃNoA60|#Qz@/us߰ZY\ W#߶nEUfjp]WӾNp3w&Ci}K!2 Z,6 R]hn@ye`|U֙:\ПraveN9Z PzHX1&x{T"nG u<1!C~IC[E0ć^)n2%PEX7)S T-NlBJLPvV}z'J`\u#΂Z"h9"&3\ p$[YSQq{Jx{V~{X(68U[[d_^K.~q)\A7fv䭔'҉={<dCd@/26XfvcJ~~%6NK @$yJ;{~ JU(:|C!s}ԳRzÄ r4}r:!țy,?LTvX &&C(:a <;)Gq l Oo?ً-knQaZR=e=AEۧ-[RBmVDf(f' J' 0LV9 endstream endobj 37 0 obj << /Length 2625 /Filter /FlateDecode >> stream xYK6ϯБ`39.'!MB3|-AFɟn4H,55M_|^ݸ'7^ro8vb[d<QofHܬ}Ez#t~N2q6Uwk?pH[t{o+gvww䛕dfiF?C;;I3:=RƒRf lߒ$`IrI+7🇯p⁅6p0&d(tK5çTөx{<&Ǚ|{<{lI_s80^.5vI+<']oӬ7"t2E6Y8pyQ$wv>T8 ^fKO{w$:jE=VXdp9B.Xyo9H`a2M=L`81(.zbx(NWND|T*ӕew>4MˍNwQԠJ]ESQ]zg]ƀUϺ܂UYdDn b -pBg^'4J@By!tdls02ҏ]sqlIeX0W7}h P{Ҫ#F65wF<x;_c .}O#rBf~5=_߾jas5ƾ|\!2 NZ,NXH5$#vY'O JƈIN܊$"D37xH8lAP8q|%n.UrjՏ j vN2]P y258m9䛢d[Sکoekh$:s=h:pr"u=`,Ӕ 7ܤ(W鑫BvR},NH D]1bTSekʎ;TIM, nPM[twPڝ,ԫhj5QeaϏ ;#Kj[6c2쥈VuƜRz.|)hCقNiG<Ç v>. SL# 3X50ekHR O H0AT,4Sѫ"IK>/^anB{<9PvhHZF0!傱Qqھ\",4SJ +e2@&"cDYJ~3t}쌩AH\D[ؐnCO l  jgRetM۩;~)m4p&xv^\$`',O1'<) .DQ#N$X#O.Uywl]\4X] b@äDA f"q@ m>Zl$5lt'^L:E2 5p\i8^DO#a Xz3_3 hMe95oh0`yy܎}ږEV}&Pe|,w_$0p# biqB7sl=Q3,o~cpѷ3)"dǘSǘLD=%1⟘hDyRs /^YfkK9g1F/7X-3Szu3xJH} ;%΍)*?3 2Cf:eS$P"s!Bi9N!j)h <(~pnihq7>f$ ˊ 3!zRS"<8/.Llq4Y+-M-IJYX V<@} לEl> stream xڽYYo8~ϯ :[mI0 6>͍ZH*:ڊc2/ǜoohe ˓$  .KYbtӉ/Ǝ{Pt-?8%LheR>4 L7x6:逮V3ћ3-am6;_ĒrF+2K0-jNe bN]:tQ~JOCG?8gNpuoLba$ yHE!7{LF!)Vd%4NVܻ'%EQJh+(U N3LFOWkv+J6t#'Wshk}q*Zpd&bDōk]Z (Qe)vHT&y\_( 53 fRjrnNFjhb!p E+`,'-Oɰ`KG9UǓĒ1fa)zo>m=|J1.DX6{`ς Y]FE D 4 tR0]BR7 gr R/_فЩ]/ 7c>_{*믩̯R{%hX#sf@S- /Cyj|S׾gԩ4_oK&{Lq<$cŹ{hŷ}mhq]l{ PRW|ddTT/"Σ~0Ϟ=Q{ckW}#Kϝt:|4Ҹѿ~/'яPS!*b%Y˃>k8MP`[-y:{&z@ ] #@aʛY-ap8PI#p*5`ME#SFۇ+ʻGh׶i`ǹ(C`2:K`Ҹ8@.ēh+c֭trb+ib7)ͽ*V7 lKI}>۞/8@eT ƤӗU<ա$| 7B W*J 0At5`앯Cc}1drhb(9N tNx|="kFhOР}Y\r|81']STOrHA# xJxY9qo|gu቙ݟ9t^q́J7Ia2Ζ1FPq6 cb(X,h~{j, endstream endobj 43 0 obj << /Length 846 /Filter /FlateDecode >> stream xڽVK0RɆ@VTR'q f36V 3 ,cCVDբڬ6ebQEl :[fwPN|>~uIZ۸*Y񓬅!,>(2+ Oi: mH؞I'mE=F eUcG,#5$_4}#  Y־HL6]cnxQpZ,\yl5X{hËymwOY7ne]MjJ . c(m,f_piߩ˵+3Np<"@hrC@ .$4XQԁ5 F|Zt%셎J k/5MUZN^nHRW↍C<-;l))mBZ6@r1fSws0<\X-YQJ緕!|=3Qzf~emonFx|wk[31J[iI4(+E\EދE,)- endstream endobj 46 0 obj << /Length 1614 /Filter /FlateDecode >> stream xڵWKo8W(76mvQ4.z^ ͋IJ"VIܬhe_m0yA_dE㌥YL%MX8ɃweNKwxڬ@ =*WL E\I5I8A:)Q*qe^ U|rY_H,%*D4VM(ڡmbs8mbؽCסCjaCcV9Y(-k>]i+SZ$T:Th@,˃keߌ# }tInMwA?28 QzyO)AK~,eUOAL|/ }Qa&1*p6z*щb/@Ӱv|uqM'zf%xq.םu^yՊm̸$2m@`9]! Rs EEA3S3f"ɭ=d_uO 1DCw 0A4'Y#ρBYf5s\!0νèm33HP^ %iDf@#.%){@ +EPm+ß(Ipxp [e*)ĩdTDtj%"(@qETt5b&Qm{t^i1V%s@jw΂pʧ [<,8isי@H=KU'bzEP%W0?ŠGv_}< koFjȏG-=Ja `!Qvu鮝[ xtߩ`&>d ʒKj.<ە)YsOGƵֳ0qYOZ[&P4SsX4gUYνKq f?`q#HjbQbcv`Ou̹GEZ.[6дycf-Hқ Eß/hTPs0GР`wK5=$: Б>n~ØD+!<&(^b[(^d5lo=i{i'k_by>!\>vrɮӀI`0ߤ_us+$i݊ċc񢺱t=k/%49|[ګ& ȳ<`p*NY 2{qM`(?/ÝSV$/M*RP!/ / `u[BFBſ1` endstream endobj 49 0 obj << /Length 2221 /Filter /FlateDecode >> stream xڥXKs6W氥Js$z%O얝[X_Ւv$A> wWz{-S/BXz{/ 8Q"Lb>R6 eh67[D4Vu5Vf|ue"e"oHRp{0B)uM8}s D|BJd(ZIndٴb]H0UE.gT7Pdq!qq:[ Ck#:xx za0cR8Ŏ<+s$[%QE%!phr0j]bA$>>G@{!W[E6B҆bW}!\-Hݤʧh+-?"zvjl @-ٳir4da'@xBN +@Y{[? #/];7?C7Ņ0gsX3OMAj?p;E`K 'rX>7K).)>|hi4%\rYf\&e܎vy=xrD"* f)g+Ç̜6YYy Gy:\[8oap[1 m I¿l\x0߽}*^)ړQ B;횫IPYB zui1I\KI GTuy"B2sO2| Ł_va[O I{{G.oxN!._.K7Ӯ16& ^:d pT !]i6Ɖ Ń][7,XvA=mF m7#\[흭 [i >T!Jov;wS4H](B)2FC}ޅ) *bw78-nӛyyKā/j{Ҏ&dN<ݛaGb?UuMy=,pKUOjnlZc=*=Ѩq:כ0h@a}ZK!qM#>2  ֥?ҟE H>vX9S~;+)Y)Hдz 䳚pI~ 12v3@ < z#.xSi""Ԃ׏Q`Q A,b+H_M endstream endobj 52 0 obj << /Length 2551 /Filter /FlateDecode >> stream xڵYoH_aܓ}J4Emn(K%F\#}Y) K<(?o[x oz}ԋD$ BzZ$Z/2Ro7nyM^_@`r`yS4_ԕoAO&*^I XXȿvz'\^{tǫK-=޿guU>Cz46mTuY )PŊZHZFek7W+d3Α:5v[;TݔN =81x!H@Yg(? +BvZKpx5x7О .Ki͌_$:!}F(I87u;izQTJ-̞weՎM7Ea4p b#~YK|Yٓ4~GZ;F8D돖Tnxģ0Ʋn`WMl-BRQt,Bjs[d$\/-axcO,r~Kۙ-PH[D(-G;n搷"݈vLifhisŮҊqɁMs9~#י>NN:8I&혣>˩h1Lm0:NMA岻/+!tX}A0ٳ6Mr=f%<ϿӗՖ({"-) ֔:^!CUA\E}[V5-pc[yyv +H`|~": \n8 `2o[6]V !U13"Q64fp[V iy M{)09akK/SB5=qJ&`@dG!VB3Kl+ 3 ID( 7 w1 HO6!gP^Sje,jgy!PNIPh:qK ,9l޶.H1o,cv" )@vD%ȓ4<L v!PoWOѸ`lp Q?/-vM}:.K3 ֓C^Qu>5x?OK1_싌*8Yqx^mWX́FRGZl& t]7f.^{bnG4CLԪw{{G۵{k%;󖓁OgņeB_ܥA"lvh^ ZA2/:cAd ;dt6KȘX#q>Nϋ&)͓0-bێjpG/cu4QѬu<9{q̷{RnOL endstream endobj 56 0 obj << /Length 2423 /Filter /FlateDecode >> stream xڵXYo8~ϯh̓Huͳ;y Z%H[* WXWE&ؼ7W7"߄ũ?n`ff ?P$?]%l+"7y&~]$,'& {욦ۊ;6{qq N[{d8Cw$NON]e~u3iE[,#avf~@"sqW(s0ݜKMB[JrF f SQ8gEieщv,/?ykK5uݑA!R4fDXbڞN Y^O?,vn y\&$Xr1]ֿܲ;XKcc Spo9 * ({گ{\+m)ZĆasOF^'_bN@<fGM D6iH}<רBx(Ė";@ jVq_6WO4KB}(4 :r?l¨n? i~#-h d #6@H3԰Q{!D{+Z+pg$8ZA{qNncbZi YΞ8VHݸE- G0g6uifsqrFZӊ m cHFf i kUp4< b90iC7D3(R+^?:)3%kPVƎ%$qŹ8ъx?. 2[1)17gcc 瘳lA= 9*ls@_[JYc0NqÂRqLU,R *Ws3@ʎmRq hqB5ζgɥG $ !#1퍍_˿uM!AVUml= \i" \A 5ǡS`Aآ ׻7u\4әia" $2Qu`Y'q:12QuS:lr9JCʮܠrV[1ڰS黱(C{ @mC MÉk c^)3/'rV^+Nr|+$EU@RLҘCMFSe3TXI9dΏ ?q*!͙ےW,*7*!0V m޿# ScT7VH2Q,C]^50QtxR\VܻHpf5Xa ;Z~Ǿn8TSB.RZ HBV6%bpo pM;?a8C ق3NJ#!܌˜(Pwc %:vC769A4apA[O| ᑚۮe~f.A_~t{ן~:| )(c@PGYJ[LSOVs96l7u|9ǩ[ҌUoYC6 0+ZFR\8ʧ)uԌ#aC̦74PQhu\? cxQ \`Od&+Od!.TM)ilHqkҳIJ<6Vvus,DSʅ0r$G-C"5~@\%.göhƯ-`-N]e:[|t,Žr+Ώ؀ʰa|nhyY#VK7>QꧡpySt_8w"\Bp"J=.Eu^ hiEBPLg5X' ߞg1oOP~P2~4DIYP̔>Pzd¥d%l wfwv5U_uy9TBӡ\.ճ,W6uNySD_6zHK,K2Z?0ZB endstream endobj 59 0 obj << /Length 2193 /Filter /FlateDecode >> stream xڥX[o~ϯh,˖viQ`G1Ⱨl6%E#'NAHhQ2EۋDCm<D""O'JH;=:J0W=˺p9dTէ6oU ۣע;{X,FƲҩJ4x"IgWq<6I# +LUNWg"8JIo-AXϔ틅ű`wG[bC Bp#H -@|uã1;뙲/?/zܙSc~;p45~ 6eGLt֡Y R;&enYfWtG5-N"hj >(@I7ep; 3FBƸۂөP: ~@9>XT|nH)%l!v>NNDjwstZ }g>EQBbT@"gB%i`;$۸ҳbe. >Ǧe:_N텁/ ta$-'<-pA33jP|)(E bǑZR0~"ᰎ޾->WiM\~_~hpru$t$j;3cƢ~j8Ek铔,eہ587Kp v 9l[`o\M]=r$FPXHXA5%a0$؀I*3a(2֊g Lu\X$Ǐ@:,Fq@'yX9̀Eҩ5,#q&x5z$fx$ )eTU jP̓6}%J4I'PԐ.#`gz߳MO^Z4SO Z&wP3ߛIڼq^7{zs1GCnxBs̅E;XlK4hC#v3Pm2Eܖ)1.x'OFYX멄kԅP[E҈LkAQӡ e( MCM\1wR4ө*p)˜jmC3ʸn{DžQ'=@gBW/>~ lmR=hT ʻ/uV#<) ط~AB_x2!/oW)7 iAAk8>E\He6o֐/͠ɦW[߸`׵)sϠԤx[@O ҽkXrz@ޡsynC /FWg'"؉&%cl;Ns ،;âԱhH >h<۰{[\sFDIc۴eVv;kXSHNc#ؼd6"DB9h_> stream x}WK60r DZe[`h[-q-u%%Mw^^7sqH{渉7wnSGu&(MYenI{zh5,8h6z0mue`x7'3o`jcL^i$LNZ}Fq?eiDq$Uv^ZS05f"7I"/A$h6x&L*d&ITbqQ"`2Nh31Ѫ@7^ -řQ YL.چeR:|G/fZ|2i&~wr5xa:ZS>y=nha<4~IS88>e>bU<(h0TMM}uKLZnGgE\}glrBL-> stream xڵXݏ ߿"- T.ْOsݻ=6{A+:cf/)R,}BQDRԏ값_HqX%2ʲ$]mR"t_Gslި<j?h"q\m2y 擌aچV2*$ Ig)?7:޾ Q]7ip^tdכX= v+y\o\X^<n+u GK_0dh: mURDNAkܟL k$RRh\{3J6#&2eY_ip{0Xy_tloQH饏hRٽl˔I ( OmǓ`+JY?j^4\rT76kAycZITƚTqhz" &|B D&-|Вwis85\5j*"Zد#2 O F.[O=l;C`agɴBJ-^))8^.uxR4/`Al!vI((oA,{n $JeS%8B$QڌCHgZR%vm 33q|%Y"/1Jf ` #q|i'w5Cr~WSfL)0 -[UWDm a=ރݞa83B 4?JϮ~ ;&Air^}XQBj!\?E1|:m= ov08{Mt21[>`i^ڞPV2 (wjH~"rz"?(3,e1+>d|QKa^*Wޕ_*) F!@I[5s*1!vWmޑW*KO2[rZ18d?c{27̝49ИyG G<^W7R~ b(?=)ftW9(T\]0+q; ޣaX"{2ʕ)8Wz |=,qDht&&+lChE5%D eX>:L)!:~ظī:!~Keu-֡b, Շ)saoЋ-§Z: j]{2+H =UrO =]ƭqNTO/f $G ^s/sH/0'EL]5oM34g||@|/=4>W+Zfx%8UM?,x2ԫ}W Nq,{v!,L8JNF5~R[KgHhpaE^23gIx(3}%C_AdTzjrvRcml cή ÏDLtS1vlPt'@k>ކC6 |˲0Uyz%/^,\pYb,CIw'R7N˱z=5hrj|s]_3=B3tz!YtY_NP [ӖWe>IdA72ż!M4 v[B܀oثQ+0 b!1-;}Akb9H/_ }r( r. cr*2!֯6b'yrM1?8Q=7}I_T'P(F^)!1ݸ8r?(6"0 Oz=ΏM忁W}~o`LuEh#ـCعV_$}[!FB7kc?4m1l޿}XD[w8c1o,N.sI]i endstream endobj 68 0 obj << /Length 2530 /Filter /FlateDecode >> stream xYKWB:eIQJvxrs`f=݃Rdbϯ{q]{]|m0Ż*&a$]&(rmsa˷l wkYF仠}ow⁳QʨPܤRכ$eUZ6ZH]۬XJyhyF*ӴZNAFMy$)0 -/A`ih`di/p!ԙ&6$M8zEdU5ƈWKDf6wmhmW t֭~tN!y W E۠lAi̎Ol!MDG:1ZiW5'"2{"(dshntt@%MP~/?=OFfdK:GjwF6:©ҿ|?T4v_'d_xM b.}H# fQԡ, KYCIe%濐e\>Mo39m0O[G@n)mM JʢgUN]k@$a6GdJ=!ڕyeei(^Y#+Z] X.7o[JW ݖbn6s\% 7Q$ ;<Sى)f?#$  9I̺UQ`_?("X#ͬ"^:A `Ζ H1ތlIϚ~AC=ƃy%UWZ)d ``p%iٯ:a‚D%v(eEc5^7pxG[z#v)d-3r㢭h읇[hvqv<`KQBpF!){jh@Lv$7$%o!cT R^'[L-5 yw5v~ϡ8G,3Mwx 4va Mq2%'ԽWȂg ->WY+9')?З9RiemxKy;0zȃ̀"1xI CpT8W'sܰ4R2#2M=8GBﻶ|rdy'zZ LJܔf|oZW[1dF03Q'f]F$KΕ-\L3CL4@Lta/!L-Zc4IEDf՞LRv;$Dr gV^gO,"ȋ'YaF;ġt#b"s##򘶞枬= 5 OQ2T vu]4blwZ:1{!;$ ,g1Q?kB8c?f;x\cr |R׹V6$ FEhB6s?|518!SH 웞wڙG!ARfꉣTg8 xP$O/Ν&wd[_5_\Ds:&GD:K#\B ]!Qw5]ÃG/Ѱ2u܎G&"Cdk"j1 ee\R X]Yp+,^.Bczauɹ.#+V x|^D*U'\Uf\iAPszs 'L+@/LXXdx]gk3". ..t@E$!;h_ •F9أ&AXw\Q <7zk0MqiZ']!$oJsT+z"VZE)bZoWԀ:=om1+`ݼ$> stream xˎ>_[d[,0HzOmsGCgO3;'EXwqm޿}|'nʰa4,tϓP7 ~Tߧso*gpf6]4w*/ 2x365?l|mwMեEpih?H.ҮT6dv/@ lMr7ྒྷ2<0MgᳬO, \[WyׁؑdGL1 CdR-~h<]9K3L^=8Z@AvUF8)H~=x(n6 cN~by<֌lU0ږ~*wDa@?޿~ߏ0Irp,8Ύh~EQ䋧HX`*xݑq@59A°_Du|5_LxDx?O'A,3z T. LI b+f'0 fA5-8=LDݕǠvIrn``q 12YMnPӽnм杲`4Y9-Gy&^ r=&]y2'>cB8i')ꆨJ* ZD- PB>^QO]=s6}(|C@a={!LsfГn Rw/Y>IdxWG@xǷӧ%(:1U!Gn9,$ resR7>NAn͟~z7jatH` d?w+(^X&G˭3Qͺw9/S(^i)f@o4cmSc%L| 3' s.Z|Iu  }0I1+ ' QX^ a`[}Î?+~gp}~vH*`֣]<%Q_=ZVp]c;CN\'$")[R||_KleQOQ0)o䃚gWL0) \9v(A*+?Bxuk&y]gSs" ْ"g#l#zA_mCw,M R&C:AQ:CI{ovḱT[8CPg`ҙI9~3xơ$|zT02@~4u׿]ܸu_z8E.f8hJST2Tc9qmT ($ U,϶Mf2FM 9'"]7^y?_,ׇ"Qʦ/wn E0 Z ؇6g;| vR3ȼ+pSk}—HDQA=P_ڵֹu`ܮ\Ӛ,IKgu~n/hwm)Xg}u^ UXuqzJ;x߾`>Y=ⷛ;uxr5;6.$[}d\|F:c828Є{AMVMON(2R,-W|ؒϙx&:uf8Dfc)7\`x"t^G2t pA߈=}唟o 'ŷpH!WmB8!Mu+vRCՕEeHs<1уwSH]%Lez+F (nPj_iF} endstream endobj 75 0 obj << /Length 1009 /Filter /FlateDecode >> stream xڝVQ4 ~0o%;q30ǾzHb;G.{0CcIe$d'V]jqYWth.fM[~~+y۹3HU v %ѺIckҪ`E|&,Ag+l_85@{G5}AĠ"[W{`8';HHX?pCJBeNgJjUm$ES$UBt t)c_܉69J^ ^$<^]e(a_ty2Z6Ofez&)DT Kz@Vb|0vzL֤&hV$o!Oa]Ɓh۷(х p>Rr(Q~lձf,Q~y`tRuH&'ͮ81UX H"3Z5?[\ߊ2SܵAsXBUhM*ntHȳcaMƥ 'Yh5$.s*س`MhЮxc?m!kD&Ls:4~0~Pnz#bbQU_E`\Iŋ\{h7 SMHAEzƠb-GAYRUSLx?G[q@_'TI9%vp h2`c_c>7MW@!lǷʉ|-JK@S͂" ޙtF NǁF =|Τ~!.7ͿYM:3Ƿ"w36yd2 ` &$ al!"I&&0lruلTFm\W8uE ֊b JLƻ/2q endstream endobj 78 0 obj << /Length 1585 /Filter /FlateDecode >> stream xڵWK6 W(Z^6IIv6NsHrʴŮ,"_ e뤝$HrrXapl,zZ{UcNbNf]5T!3ڦvgr/ |^]~xmT@34|z}WrD]Y)g^ %X/?q lE}c-+@̬e,|ihD" -~AڈڽO8ItC!Yp!WoŰ xYKuo1b?4G$kBl0{q{0sD%=|#R-ܻӭSќq@S%Kt F},bEL^QݙkiE;A0 0 썟TQ^fG/% A /[Ǟ (S|-P}֐+<߮7$}L6blH8RH#SBJBi/Q֣g$iT_,y}L<\#\s=Sn)I{99ЪzN-Fw,*Ͷ;I8mof戰n=Vރ7:Q4rf~^TR>>Ɔ!дIki"y ؟qJE' (vV:+bd>4-<־? 볤{c.Dj1I_hϕjjFQ~'ڡUx,noHa<i8L/>Åk$kqmu2p2=)?Аbk%D{ZMfԍUK'4{E>r/0=&aِLV3غ? ZuPI'Baj1^ endstream endobj 81 0 obj << /Length 2772 /Filter /FlateDecode >> stream xڕYK8Wj+zYSfwڭTjҷ=-VEN/>ԫUSK"$v]&ߟ޼} HttڅaAK3*w:{lҖ8 (xX|YDkQNfZ7c*aU=4:8W_:Qxھ1xqEH^M߇_`7#h&+T;H -t?֫Xˑ:`"}\r4јz{NX (/!xrSU_z#JўevBvvx)WֈLȯ~aZA-2>z, }&3cӽ7{يgn-i:*26H!>2Pʁޢ1@XhWb/$sgpU]mJEc]Mv޽1 Я~*Pk; G &{ceC'ʽ/?wЙwK/8 Ρwe_U2qR?(>xȌ :{#ƃ: &%!箽t'q(˦=}hpR95/ ~cH*ڀS^0B Ah*`Smdf-چe30Uز)[ WHslAM nuummb[ 7Ro]-Hn3Q$1(_OTQ$0S?w )49 /K4HG,4Sa112৓À:|g! ;0->  8 [F l^Iq`nz%AAU,rIӹg"|(|mЙ7tm!OǍs̱|y 1]du[|'Q0cu GNT͗~A >COf 8a 牬(6 ٦fl/2,`dDA0uSi0xrX 3A]PqڨC ':oy#9`1Uȫ1+`TeiWVo!ouCU)9Ξ7"DC`"(MeڎV^`sGAX{3o,$ BܴO䔈#v{zD^pr$6/DIɎZ8)ɮ$BOŒKRDϏ:HFh4D6yrU͖H9,|?->gGV$v>~sӵ[ 5'=+}zXޟD\z 'UͳY~X_ʲ^ǐ t #ˇ4X)čѩؖ˽跷(C1tM6!=u)/!GOkCa|k'DQGZu kk,<]Qb_یѳݬ"$-b<@*Ĥe oe)wWeYB Kt$j iG%,};4_h){ڰuR_X61y.ֽ5E+ʪJό6hvY$~jЧ$8 g@z{Fa+9~vWy&EV8Տ7,!)WfqpSx bm-(WR2HwL6CMX"9KHs"[H5P5\UkӴB([\aipVmȱP@M2%`=R_)SШidQMHe1`<ߠ_*9aɦav٨'AוC"Ix.Lx,I]f][/c1BZQn?V| *췱ԏXɐ{$6,6~46 h g-vq)[Vfww]ijI )qfrޟvaxĎ]:2*5-5=v?]ᠱ: _+L=G$&sJp+J!8A^pCil _6E ɱ3Un]T0q'dKh.yV7tE|0XbC1 ]{&nwP i#0܏ ׵u06OHq6leY>a%Y>uJ.C8rz&gY{;+5[ԒfNJ-!''x!GCiS6q:jqxL_Uՙ8aV9.keJ:vb#<}pha}yl6f)֬1L?\؂f92q; LIBw&Fr:tϯM [J?^H /2 I-&DjVs(E4^XNvWxt`Xp_R%1+G]\EY> stream xڵYKc7(99vvNd8[Zcg'>"Ѵ9]$ůxwŻb݇OUQ|w]^QRfe>ss>e%UhTZ׏Tolz}=boyv:Yzt]pL ,,}d> 0loqED$LayʾT/9tpL#H|Dv&Q.UQ>ŋ=iFG%{ OSY:7VQ|Gi\U[}dPZd [XE9 G;MR(OH-$(_ 6=o@ #@ro!pֶz )Ԏ<_a#;뛑, p7Viep=7}*J\l0BH!I)Het=&T0њ\08jr}m^62"?;iSC۹8?$vht~ϩGrm}†U׷gIlNaRڟi$^U5!(wV`0#!$:OZ?3h{|`Wb*4@T6GtcTI=|՚ݿh' endstream endobj 87 0 obj << /Length 2468 /Filter /FlateDecode >> stream xڵɎ6 hڗ db#HzCĮX+Z鿟QK6̥H=o_X|ބ7߼}*8??0 4=EDïoaT|rug ixG?I:ƥ|=0C෺ !) պǛ޾O5UIEZA{2GIV]0}i#?ʋ / TA?IlpCw5f^AFH|♐LϽ;W"2u3Yy|w_TwUwA0<~YY25=&1p ?4azuu?0 E#P=jvpT tV5=iRyF j؎GRNz5=ެgT_1?^t GQPe>χ@LwN1\ɤZx?RD:M,:u4ݙ?=Sp#Wƣ!"4~X/)2Dc#p <4 gNhT&G^_|k]JA ANrӓi٨AvqW񱪅xaECO`juoN.pka =oN9dEokoG6+LS3J@hV ͠')*чʊoOlZ y[#ېXT̓Ms!$v~ keNj,ntFj&u͍7'`8C,Z=o_.&01 B9jQt=q =p_t3psxk=kjBNApE5V3p$#NtCNmCP0?I㤆?ACM!as JNv+x[;8 bo3ҋh'Wyf\, 8I@ySg<ȋq8K |aEZq/3j9bH VWt0tCx.kݍe.j!,l) Q.]̇І9׭wÞon4j$5Bq-;GK*z;=O*l'$zů 8+uA<#q69zv )Y2v0LӺ=D142PUR /{~b1䴹&.Q-[2W2Jʛk?; _MQnxDXk P(I\fE:1yN7JB#'Xvmcp: X0t+Ӆo`vG/Чqn'jbjfb@y֝,n)ٴ|=fd/E}ѵz#QEM8:5/+~Lř!p'LsJi>p D''dAf/aO?Dl ETaH8^_u8m\YŰ(^Rao(Hjb|{Cb/(u@z^ckQr8' ]JnY 8a.ph]#ʍDURa]ymfEx;$Gu{-IZvg\RiqȅniK߀ ɮ[HcqCXZS 4>?ȥׂ}<-H;M)S"w:=6Wˠ;.`Wmt>&x_nU,]\ Oo< 41J*gb7[9g8]ugp9Bp֖7ܷ<6=b"qyeMص%l/hyffk+=]P6;>/P`RG|\wAs5BKM5ljX;$|X}Qr$C\&oCmm"o8*Ȝ![pvD {qԈk`aP0|$.o)j_x1u/fuu OϴJVȽήHK~\`#%N^;UL=L2t/\ [Kb/Fw5y/z.ߔ~qYTQQg8lR endstream endobj 90 0 obj << /Length 3017 /Filter /FlateDecode >> stream xڍZK8ϯH{,+9%.0b ,겪Jˮt:~v{")HNwo?$ÏwxWN%ybUAWsGx_gQVl;{pkȓ=Nv*҇ cXEL#&30m/XYb+䮐h~? 1.t7;i qA͋*:PIڥTqY@]@/tnQopPݎg% 3QygM:|G?$w|aegn8m"KfxX(gs#3}2*φv7Š*~4k:8/d~Y& wy.l@V"=|}QRveeF~hHJy$љgy "dIhMH6 3QYD]勇R2ٶ-]CB bo ײ~A~&æ(tn[O|֟EPPnAֹdqG \X;fv^ZKqҎ_4?;th{sg5٣ Xr1n? vJ:q3 |I'Gd OD NS[ۡ媊)P{fDsȮ ;z14?T;Ha f<EtxHsS+|+I鸡 0û#nɱ< Z]̓s-tSycS_7fvqjM"3Z-G2}?@`%ܩ%ր,.|å(1$*W&4 ]`baDj='_c}8oG>, [&8c]Y:`Xd܃yF(3_X@$0ìo- VV`O͏yM9Y{y#YHXm"YRƪGF{vKYm@06U@$EBX%dw|4n k]ckSth| ˲kɹ!\F #}. 1'虬Ar_F{$nt@"K%x9db.-"|paR 2:L($Ϸ2Ԑ rd}0{fڏv>m8tUflre}׾1j9W,#%&ur]= s-5+|͹)R񡵗p\ϹJp/[sYw+YwKM8a{W$`lhC~9s޵>fmq' /LKUnb1WKv2Gѫte=4 4[)_^BMh1⍕J~ jO"ZEƧ/~oO p `^El[]Y Rdc.4YǍ3N];_RkU}%ηh,Y^JxI*jUj ~_\ Wi$dž7)|gL·pdžC\ 3+ߤs#;pbڤ1PԊԆU\|awI0ôՕ%nZeq^ 6.Y\\+k X]~AeV֝.Vb+X)$ܔ?&Ҹ.WaI‘*g4 X֩oyqVUsM(*γpŷKU\BueCEf~!R~@' XW %Sz~Ӄ3+bhXCy'Vz>*TuU5 Jt$N޷ B)0'?sZ,UH8gJ%ܴ'7q/fű_cVtT>zq-ug%`YP=Xw Qk=cv-Gɵ4zdޟq aÛe@UtVNkaq=?`)843jޝ1{RYlU>  !ބ A{F{frXSTKVɶaSe?Ω/]3wKJ&WRh] $ɵ6w8> stream xXK6W(+-)QR4 Zl^@[\[,M}g8Cٲm"@/5 ̓J^?bUFeg**ZeyHM>ca$AOՇ`}"O>x蚦[ǣ}~w+t0QQt[! sq{>tkù<:M "_Ǭ,oTc̑NmU^z;~-)Sp5IdQrZs*gT"R`6Sb!$"aǫ`.=?;;LUg%'IZT?qBX{1'?T7 ZڒRFIAdTw"Tpx, &${&nӥ%Ae|9b~Z붚 lfƛP pWKTzu61C8K>T) :Ͱ?gSkw[mY 52|ch(Oq 0+T.'>V)st%8Gk“3*q- v&RQ8OAHȾs򃳐 m>,,'Kfw0' ƥ2]JeZgy%ֳ𩽐bWO&c†"ֶ}aGJnltOT uC=B-"N",-r5F-ia1k. uI..\녒R#%ewڝNɁ, =ZP73-N/ʂF1!@h9OL]L|qD-Q1DB3ǁyTFW|u/Gyy!f\]x} _/tgZ9|Üʞ7ix\MCQJ(QYf SC(rEz*5zIȹ${s? /KT7K'd2+8 PWx^kf)*P ]x 2ak Aö| `#qCGv?nnye{cK@uSƝ>TIu و^ڮf1Q XhC=" a ٘G9hg'W endstream endobj 97 0 obj << /Length 2895 /Filter /FlateDecode >> stream xڕYKQq |UN;lj* XC Ix} 9l4@n06[gImm&wv? A9tV!1~$ߺl띁YMbk}׾2,Z<^& v=SD"-0Ccy OMW ȔZ&Wb,oLP$ T ۦ~@?Q^ú5٭T\if'M]c] K|ڵֱ IȊa6_dT2E\Ȗ,eHo:gl/q#kjH\-fQg3#lx#%1_ @=Ud4t>$J+0rHx̠B{y0ezۑ\"s2\~.3d7 MNe5?'8NԵ"hHGDD<2BHPBnd)dˆ He*Q }Y @t:2-/W:O3H4L6͛fޏ}t<yl q_J t\`+E`4 ]- .A!U$9P^,p>L,)W03Maa.'t_&[7e.aRQ85{/wR5|<{Pɳ\1B?2ǿE72G2p3c1cXd.G>p'/*d&Ms!i,Q*DdF[G՜JN'\Lj\_5% 4x֜aLGQ~]XAb E&Xvhc@ endstream endobj 100 0 obj << /Length 1739 /Filter /FlateDecode >> stream xڵXK6W(+E[) }$hinC-2=\Q3,{m 1}AbqiJbǵc''=TG" hUU=EFv:,]U)MF!AaM;r<,OKC&u?9b&0ǜX 8 B3A^j y`C(Vݐztj-j9I#FY9+DQPy 4igmST@Gͽy d } 4зLCkhJLV ΂`=Y4j[RCv@w1 fѰl[Z19*{iy ͤXCn)PliQL`N̎ vuzO8ypdVߏDAZF{*`^9$= HX8s0( HY'bD9TԌ' fFmUhhp j~oh}> xG3Kx-wg5>PbbY0i}hE~uhG0eYQo - c^ܟ뭤h]zmȲ\ǔ^-q $Io}`T[5*@>:+'3[*}+/@`/HFUC_@q9Qɓe"/QUYųM!kinNK}FnobvG}Oqqu D3 S(fqU?9DaZ2Va;}`-{mlIB0Q?t7~`wQaV"% &G1Rm1^b vFO?Q8S+t1$FUsL&T\UnT3pM\mx,p1%\rl|]+nPa$D"B:!DIi p:ʏE|T>/Ζ3cV74.Rj 4'D]*΁<)Xr'(APcd"14~.13[>>_~AM ]8%KŐЃvW8.Q U!lA}JlqUX-JW1ض%u &Vjlɣ1Hм]7ќ;%i B s7y0e+Cz|Hb_#WiP&%ުo=)? ǧ^kCϋ7`96Zg7#As&w cygf-9\7K01*ܥK \d"DeȶKh(~Yu,=*ăĈ_pwT~^ؚֈF5Z@2p8Eqzs-03,dGIwi =VSޕAAx"4Z6>'7`qmu<$bHQDɼm]ՌeL5C)E,> stream xڽY[o:~0Γ ԬDR)$Ib8d)䓓)K8f_̋p.d5''o|~\ywI҈G$'Q,X(;D{7pj6Jj ;hv{Gi8+ ZպSc~Lڏ=G.g(jVuRd5VJ֖ @&b"4`NE\Z<ZfY쨨[Z}aAϫ5C`$Hrt"cD{A 4%y,&)Xs?'ȣj}SE!B) ev,H?HD, KIKRRIʀ%p=IN|"MX|lYvAgA(@0g(%Q4L0014 H hb pyݐap w޾1WgxɁ@I +8Od[%g$ w ! "N< H\ƥ| , G^@YzP":82b~& s4F3?{](B|!/QH\;Ks<φг~ФCݫ`y@v[rl??ܺZǎ1 8a2VcƷ}\zAg0~q_>~[gY/5'ߏF v { aתp3T(oU*n`ؖz3ڽ%_ w?X)C)W#71L0|6oafݓiR VkX󡱩BcUqvͿ>Z?H_⨸잟B(UX1^ @XMg3\=jxIa KbaI,c q0 endstream endobj 106 0 obj << /Length 2487 /Filter /FlateDecode >> stream xڽYIW9 (Es/r|JA`qbI4 =o+.j3҇fիm{lN`]pQ)" t?_m\cW >ϊMq2yi.c],7.sXA۪N⵲z8LmE')} }Xa3^^k$KD"O(ږ9 ݁zh;ZbJ $A <,dI0=2%ȭkodֶ^ztO_lsb 04e>@=p xAꐄӥmFg-,*һK㞢WSԶAE_ANHH=+9Z-5Hy \D>rh޸Z=iVHs8oCxݾ!C&dcּvL >j=ȢuǸƬqlnQh}ԏgWb[γpeǞ@*H X NIFCd#/ ua<~ORM#MW/m[8{=5 hrKSC^ >(>1I(wVqŜ+w1FE,\3=<|4fxp8&Ӕd4m3o~0 _Xb%(z+,' TǙŗ#=/61VH iT8'+ jiT-(3XR}}!ockFE_>kYuR@#uwN G? /HIqMyIw.rn r`u`Ć;ә#?czG'0ӦV`Ұ>aZeN_IwSӄmϡq$^k&W{ 9:X(GF%(M 8\VgQ Ջ0#XYf1i14G}|ۦhOW 9{Y@J9da b"ibEF^(]疊RͰg4n(k8@<"v%g[KI9#˱8>!w% \^T Z= @Jb! =UL*%0oEf)!5kO37Jv%HfI y+I$3k$l0.MFrRY3t[E82&xX:#DgoEE`l1fT1ͅg,ĉAkN7Z~\LKJrW5lgCPgAWt2 t1oW~t/sE2jnqY!̫=}EȁI _eTlp!|Qq/+22m f?> stream xڝY6=@蠮S7_E ,6cѶ߿\XN}5$gș v]M ߼{]i], F}= Aőםz= 4\Z_޽0 <[7z4%RXW^T_°n "?HqG Md7Cxcq4 Sf,E": vC;)c>kc`wS?VB~5~CCvVgJّR8DLn"E^p<ЧS7-] SgYhO?S_?r~VWzݿ~'WUOӼX߇ntဧy UɳHyPhczs( TC3 "#gldWUԗaC{qQ7-'q R0\DbpTݼe[>wmg{aRoZ.ͩjt͓ r{lx,_e+yK=N _ G@p'Y21^pki^0"Ws\s->\1eE6:^y,TgaR9.~8WDl#i[1\бA %&~.V˰<0<Ҡ7i0viz[2f~K01:9*$vM_E47[2=v%! gPnQ_pQ6vmHvu=ў!\CF T+&* o7f#b,g|>zpp7z{( YWn`l1y珽Hl{ڒȲ4Ҍo* VqJ VP}؋ImMaYĥfie̞[% C[ $ܞ!BSvgNQ˂ć+%@pu7eޚꞣ:[/ROj u\ $sގ\d^MвNuEg%494jsi T t)4k ܝ20t|*dg0՘xDsi-ngh ()&>A[1&$x4zS|dY=Z`CYwMoB N/]ԥ qcn(PR>0(0wcQ2~3&wPv2$[KA%Eγ} tiyŝ_gSb‡#Yu+ `hNv0TLdcQ XR я8Z*4LTi(-1+:G^x/{;2۬-Xe)w@gFtDi Ji`N9G0%xC00HK\T ;C#n&IR a+JX tػ"vW ֑7 NhϺ3͈{ |$ڃS^|5V>rgyf3%6BSMUC!CeMGbk9^OU98K[Gu =j_Y*1v5mWmg8`ˮ*K`\5)!q_]iJw9{VyKH[)/D<3{ٚtqY:$˜o`}`SM@ִ8kD(sɻJaSqİ1*dM" ٖ kiSБ 6z`3Ť8UM2ϧ T&Rn$,Jjva !L/Xun% Xb!<mT KCѬPRЭ0w̷R6L]? oE ƪ\Q*{BYsnF=:Zo{룡hIA܏XCΤAoFW WrÓВK66d,+I¿ 1Ë/<@=8p|ݵK4}oT0٠?%ƒш3 7v|4$z#Y?+fӣӟH#D ,nѱ\aYzi|^S(T68szo 0G6yMGNxXy1J]wd]g^hePbtڙ|VaY}GJ"0$MxU-4cUN٘i|D+ iCdiƚ#e%iUE{#V#A[]^ڋfknN;Ffc `ĥʬh* Uf6KEazPxc RR,7u>gd[FҚ2 0EҀr4>n>=MP:WLJE[F{}\ @d>Z &ZӕjAqK8v)j;^ART65Y-32fx92<2~'U5-޲wDb@vEŤlOc=ư}U/BUU۝dšXL:2}>;@9ڧ}{]kksɔwOlj@owT#3[<%@(0p`֊}ctyrę{-ݺD_FɟoJwW(AcЖ*F7]bKxOϚx&I+(Kz{Va5^x2~BbӧwI3 endstream endobj 117 0 obj << /Length 2736 /Filter /FlateDecode >> stream xڝYKϯdGJ& Hl9$9-m= QSU_Qܞ`U,b_>D7?=~96̓Gf_>.U=s(.~bC)eaݥiy&~>Cf܈׺i=mwtif<딷|(VJXo:+p]LA.೫YoޭX4S?vn>Y4;8 ׷+alu*v 9M? ~9)WNHQK!pG>(K,F;6gf6M]ǨFC2dH&;\uj2-Էio *LL] y13쪪Ǻ<'[5o)\x_)If ϗ=j OX4B_ 5GL"H*3ѾvJSyuz"7obfL N^]N"d~cZ`}-ӵW"YLՑ78fbak=m~TrNCާ;6o*p{`Ic6>|p~+z2iQ9Xym&>篖KS]47xw&?mwyZ2ވ.7c}ij,ca s9Y{!SNI"7C+B̓SrFcˍ "낮麵xG #w_ ~ftܑ<# P'$"[Ƴ`ʁ7H['=ݳ'sv3hU`=rU9{>vFӘ~/A"7C>.dG  $ͯgׅ]brLBȉ5b魖x{xokE;c1Yo Iỷ&s`-7$ HqJD-wT!$w3i#Zw^:)MI AF|bO _+]7L7zIMq#c8M_(LV}ؼG6?ۺHH2p~s؇`ެԒyNk P%ɾZ1DrIZ)3j!H ^'6?s? [Ѕd:U^fDսk4mwĺn-Em!.j%oF)UV9db8 jzLɹqlG@պTG 7<‘SU,e$Ti,sՄE;[+דUcA؁E%y鶂5s~'%Cl5x] $D$* I73$" LVLd1kE oL/Kl.;J 1vipR4Tj6amt KPĭ""U);|Ν$OJjsTkT{?m s9̞ɀ=[G )ĆIR6̾ )}?nKJſophc싢F,ieNڝƕ OI

|`0# y`bs}S?< &δJzaiGd6:}qX.=DG⌶M3n3u OC w>loxEH hҽ1 [7On/!M^ek%g&}az&DG<-W,twxbkH vDp`BWw7MR$CS M0ag!f+ᡤ>nP372yC2-qyD2Ody%U uh GkT(&BҶ͢iQHoS(+ Gf )za8 j.pS?+ ýN΍JjYc![E 0y?Ǣҕ~32}?aX_k1kF֐.92̍cI\P*Tun"MJO@3Cld+7mQloܴ0n.uYB-a>˝D+ʻ<-!}be]iZN endstream endobj 120 0 obj << /Length 2748 /Filter /FlateDecode >> stream xڽYɒ+:5"DB3BaO=@ f/p/3W̬.@-YUY7/wonin68ޤY2:n~~ln" z.]lwWݟ,1yc_a}.3-FFl鄣POǪ= . VLmѵeopQ.E8y":1v&rdJvV4fx"A Fwxa`v]P04@YPYL`qXrVEe.ۣ4.u Q`C:[(9khf%r%Th*~hxєċ1/0?BU?Pm{̔yz )O)оצ=BI"ż{=ꮯ7`9mQ |1놗i|Ŕ37t|W>FxT`9&֖' ġwх޴.u6 2`Tf0F:#xL+KV̤/ExQx_r!Ohe2p#cd]"=>\'s'ğ?.2S.Lsݞtlfm1k`h2[䴵 | ?Gk>1>]1CG EPA`m]P_kHmB6EŢνy\!Vy!`{J aj1WZZBd+3a fs@1!w(řhpLOWH{ `RmӐ'ANVQY2Fk: Gpz Eg;nZ郳i~s,NU[Td4!?!16\f瀠DNj*0pY)Q hqǂ KK+9> C{o-{6LqA `f91VL]{"AY)x!kD(-'ɋ;1~Xdd30 cN0Iw[KHDn9"v7r൫i%a7kܨ T;iqUfw/Cj^AXvKdT_$f!?|BnYProA,Ɗ4Nq>J*1BL'){lg< (Ԣ+I*VqcM\o*FWʓ&+.$(GɵhA .ٱ̝ j*C׽S(2ռ]zh:M!bB^]bGSW\:4R~ LM@` K(1 Ǜ_z^s̳]P&lx/KP?wƵ%pBJh%b3zp%k`N5oGCQH,7S0yji4 0}9HEfCRߏ%#W@8FK]sU4@ABRX kݮR+띙AR!~ ZT.(fO{9Ha m*2qV_E8GY {KE>nSЩ//H }TaD)+i9mea Kݍ%bB*b4 0=Vxޡ/V&J`aA7R$QβXǫL(>J>PZBHm}ziF EJ>UFNϺi: "!%| 䁀ia5]`'ltCd#դd@cyxRGZZQ+9 c<00y;4*#6dHPW4cݨJBDz\tcӳe&YJ!l {$>tҚ ,ZbYF[O:~e˓k\RK`aeR R;A~9U$aln`fN,(- ]-xPc+s>>L 3lwE_\"yu|kjdіnFڨzv Hȷ4ƞi`N#Ä(' t}7b5u\L/Ek{t>c Z\a 3bo\ 4eOO |5p 44 &_}bIH)rVP!GHSUXD7]KU]K[Oc6Sb?P|mlp}1#"gz)j[GVsn:hS_NgZ[kŔ$O}oܪ9], \EL+JJ{xXJ-z=RBƟC&$ C0-,X\gCya&&3,iV%FGHǹ F  6HO`z d5A1yXB. F2QS1Q<7o)RL:eFB p̀V~>AeܖhEݛ\ endstream endobj 123 0 obj << /Length 3148 /Filter /FlateDecode >> stream xڍZr# WXص/iO& sŗZ1ύ\?̼@{qM#$@ޓR**B=oaZVY$YOڱq.2Gϑ`{!ulEGŵǍ~2ȉ]K+ӆag >Wb~L$LvY L[+faۍcϗMx(Xn\̾Z.IIKH~qEe+A!X ٛf$fch:h\˲ BKASRmXȁSFKO&3:wdش8DK`ɩPז7^JJ7范t|#ZE2Aݸ}1iH8hFr`6g걛q*b}!Pm5z]b=ו?q@YoM+ZdԙOfCk?)=¤ْљ-Xx*ɍr[:N~9yD:I$Ȳ^;|+7nWOƕ="q#_ي^<`؜Θ<85sq"*6a`h!$Lf: X[˸Zx6g~rHh5=+ Q #3tR*F-071 $=?W0G̛F="J-i:5n(Qh6.n5/rJ+i ۲F!M54%č9b%\W9{˘2ȯhKLBlk6ʁ#]4s$ҧ[Lˮ$gl\%!T>L: Gy|Bh=wr_zR$&Zƽf-ۿ>r&/7SҀK=aucY$@/R/(Mެ^  pRvq{zBUuuSD_8v#/VRQ%&fXJ|HzCPuā#0~}WurSJfZn8LK "x7/A=_o}O^qUȧ͇.!+(>Ǚ5/5$*YsnUN)/T FAU!yxRNft̉3PFb+ϟ2itRKPtg2ڃ)Ao$tdF}ZIYh.E2!e,\Tr K)oޥy)K:h\`uZ?.REddh*&:x~En??N:EF0eQR~?MqF endstream endobj 126 0 obj << /Length 2901 /Filter /FlateDecode >> stream xڍɎܺȒd' ĀZbw #=OmVt"YU]!x&Oo} H_C)?T=| tny:'#N"2?pjrxAH~[G>Dʓ͓јN\?In=Y=>~F$s-Cf1 "VA?AwUݝpz%ԥnxy̽frFlؼ6ugF{Zwoa|~ $0^U<&+,/0͡[4Po@B4So'q[jӠ_ub(j.M+!"FKHO%M%Ӎt8f?-_[c$QoVz Cj8 FOfxc|ݻmQu`+>:^˓LpݧVl!44}[fW& ̋<6jb/ҏrբl~d$5p?+g=íR)Fg@(oZxۀ ;`|AaWG@fpuG̔#6Ck2QMJ]/tBrGiT5+(\-nN(2Ʒ nLo= =JS둈 3ǔm#{ԭUJ9S*>C |' >xrF-KaG41DEayH"٠Fbgeӏ;\<}g'm"c}Fr=k?Aƍ!_P\G70BYs{z{=")J`0*x:uy tR'dh LijNg>“7u3;́¹~PٺxTQ e-ƺ45.Y@J*;Xգ;d[/`!*AЀ5B@[5.1UNjuxa6M]jOG=/G8'ru |S#0Gq|ΐa2 Tfޚ.Tz lE- Hhظ 40]/#J rڃX$ DTFpvTwxjx˝9y=1qJ8u6[0*=*XZ?eU)?Wb|NSCāU\PNU^9qSmQxZ\`*[VQ& @01 AhҼ%x8Z˩dÔ3r͞| (%̯Ϥ`?Tܨ[B yӔxyaf-8a8 -Jw_vyQQI ?R*RXO̘=s2"O0i֒).auWvJ8NۀIUCJ +Ĺzf< PW-=nnɽ%7#!k7`Hާ:_}k;ӹ vKe`kU(SԷt &TKr6+.w=39e: V\p:ỶЬ-)ցc͌o.K3>nT,W'6FKQR5 QʞjeFEfU<I婸"K(PEWT<}1T6!w I?(ul Yʒx $b镶P==sbs#+b@M F^A!$/>dPK  1.:3R*IE0IY ʞ4>חˌou$T̋@(7Ri8!wDpբSXKu2lPc~O`~Zͯu\>!} /ge&$J$Jn H#PvXExP:.SmybJK/ʧR6w(.r3+[-cvee\^gR ;&0W4N57ݖ0Y?q9/XT2G`eeDTPbqJ0ϰzAb;܋S{ k$*?# j㗶o0} ,";Q "\E6Sga\/ռYI$ixw7ٞ c4=S svY{-AeEگBlƘJDQDܽ@@]BdH4A]?mfn3A0]D-q_h>(McF,k{H+xHb9p|P rg9oVHlc1[1X K{|tޝcG;Ɗm\\6[M&2k/uE$ ]hiFuͼfJyӏ}g)OM$(0f5ꓴ1ߩT¥aj 4e*H͕أVFP~}^Rb W^:*Yu0``e1K  @MQn>{i/\a(ͼ/f;'nPM~W8mX3R:W I猉o74ԢNyuB@0~{\y%HP/7d}Xkyl30۠ ELNT[5C鉷-{IAfֈ7Yv~3^|Y<IpIC~FL@W OoP8 endstream endobj 129 0 obj << /Length 2239 /Filter /FlateDecode >> stream xڽɮF|اL< 0C?%5LS[s Y]U^.WWo?!w$HOEnE$ ]?Ty~ vMUUu?rehi1ʹ>SSKv7{~V1 M -F{+r#`mK. D*/IpE8^kPUw~bI q}!vV0\6Щ -4 k7t!ke o)c$OӾ!JST[*!.YkhjDB3k^ <,gS2cZ0ӗfL1v߬ >y`PFGu55]JBywKBKK /Mw=%7uGΓE[jz:xNU)RĎuj{!Ao0(sfwT͓xwl$897~1(M^!bIi-% :2Ac< KК˕szLkcyZ^Tí-[M"qJ07 =,a!Zo1\Χ*vtޡ:DF:ߑw(,qc)&dqK?gt/< {Xld;0{::_F aD Y] ~ы-kH;PT‰SvܞnOnXʽ|H\tlEp`raJ2_)8hѤq6s*YH@LPf'cHdbcȡ {YNRpdC{" Nn <fOTC!ޭʰeƥ),x^QB!+ǯ=fda1;lx# L]T`wv"7Pnwf a{ITΣlm"VVBҲǜXf3&7~CP'fɇUAT,(o#}${bɚY;E`~TwbF",YۤƳS_qzg5,iOr@E!~ ɉ[ ߳#~$cJxd!"y~.!^ʽ+lq'ÿ6|O t`R^LUffmmQeLrg.@s) Wz/o˒z-œ%33fۂND,+~[ 2#pnp饜Ze3Qz٤= !P\8#l[+.y4G(dc#[nZa>-e+y-G _1oL[J饛AHM">"wuؙPr; BZ[o湗dG?wFHz#Sܘ@y*?S<`]l*]9E!4gS.7,ssNC!$,v`A<[~a#*''6,%PW˸qu._+!X_;=a t>U3PIIC<+ROV;ILLB qfi.yqi<Vb^&ՍK5]cb]Xj 0]H7M^#AǶc$mKkzYiJ:! P3~tK ڌ.)uz_'ng[J$h9ܓwāݍv͝/pkqRuwP??,y_,w|I endstream endobj 133 0 obj << /Length 2372 /Filter /FlateDecode >> stream xڽYKϯQnI,99% AY{Hr`Kl=F#>L9IbXUAv9o͗Os^obC9nP}V6v,O8s9f}U37TyLd`pHqޙudi:NEO8o[4鿧eڏ3Էmvd0  "y=V6KDf&CCѶ,˒s0z;և#836)W=x)R'3i+,Ghr%'(dz='W, mIS: i뎇)CcYݍ53f@5=/C|nIJFgQ'k/%n$jЃ#&@|6'!GHLs^7-p8}؈lu8nmyI#rrbo3YbJ;?k<`Ui8&sVN8'IN.3bg {Iw qRѱ(61+G(~:Y^/#BVv",_ of):"ʔi:{7;@mo\R~J @2u :a 9h`(48=J0dkd BlTA:Q(~e3HaziX=-a_fP<ӧ endstream endobj 136 0 obj << /Length 2532 /Filter /FlateDecode >> stream xڍɮ_ 5DmsIҍ 0H~@dF IF-^w.YU,Uڬv}ˇ>*$߽vZ2fi w6iG8"^szA7fG^\yQ=3wl[k žjo?/4u\erKIӈ&:v1>4C<~*.$I~,X`Lnyb\;t'~{ę_IO*6t+op?ǑytxcOM$&6A\iLuqQcD"#djI:?2!l۶LfTDf4 $Vs&:I4LNi0*,a 4F !Vy%eEQz$ b=#H=ڑ֩udzw VR-wpzκC,۫IGLhGM >^7DQSF}⳺Xc%삶-OEZ4o<9٦Qׇn9"{]; Sf|ݎ(u/yRQ׸ɹ\x&%#jGP71YOG$xx-H͔% m=% =niZ Kt0Xf' P h7! ݅=G3r< BHBr~x'؊JeNLx-8?1XbB\Vr` h[JsJ( 6gȓJ 99l„,|ײG.'B0p)3JL<$>HZ8ӄ9f#dt.m@umfY ;b1ǡMpip.}҈8o} FY@‹m<9I; m!0J뜘}Vꔈf$]%LSҫBiFA_MA'[1t i/8Sك;Rdܔ#%?gbSֆn+e\h0cvlXl  䠴9Q]8]x`W-H,I2$dafjhӆ@IV~OE:Vy1eŞ5D̶ZkќF{rn"~G:KxdQՏdQewdQe:D p[*1znȡW!" ܇~G8+TKCjBN_}X($z|t7&nQf ?&|H}$B$+Yboe( x7I]u\#w74 &ÈŠ,\-d0!9]\~hAS^+V&Lo/=Yɵt*pDq@P *$^B:?@Yg*aBl]o̔ Eεjl嫦+attTLۗ`f({Yى,9+Di7˟ ?<;pbA8[I8\{+W2U4[e8a%3\IJxB:1K+ m̤Sz%%d݂L ͙3|[\D8MtDh4]8cu{it\CP]6t5)D214ް+gUe2 - 8K fAzm|5J3TQH90pE[?ST,UpzEexb^]FL"Ts-Ue-UGY{ehߜ~0%:B0RĎEUB‰RmlLT&Io b1DpYJ1>8C׎J%H !ݮb"l U.!=tdtR~L򵩡;uDN?![^ޑh8 Yn]4j*/ZLֈd5dFbkEd2 W`sA+{rğAnkw-Kl. e?¾QzSZ`*` 8[&n<`B1@̏lA$ ^E./UJ 5#ѧo/Rl endstream endobj 139 0 obj << /Length 2780 /Filter /FlateDecode >> stream xڵYKW |d6w99pĞaIH#]»w~|qyW,.!iV;`v$7A7ocbӧo:M~3F#Nϻbd'!^|GFQE`19W4wðC*mo$xDAq ' )u3Ng!8r }R͡*>QȶD2%E*UM&J/T#+L%zӈ}N|jtEyZT̄"()yHFѺ`/I;}dLeᶷj-~EwBl%;v q 6XOkl}RlO&moh{<ч3,R>dv4dpņΛ4E%me k%mЋj[_Lb b0k"AJ#6m:yj1M+c_R#%7w6 'Z"rbhǫ´%cgsP`vpZ1^0*WOVZW,4]T;K& 4hKr+f/n׏"d#^ | &>Q?ɅB|d/"{,m g[u;)\[Xrfl窹VOj{y1|чoͳJ,UJ\Ok(k~? 96rI@Y2*U;[=YkJb;b}ܪ0* B,,KC9<(OLv@N+AW&40ïr:yx!"A]ɕE_ N DfT&NS'=i;,=rOl{H3f.xu08b5y[SCSNd zj'!$1E/!:8Cm[{4ƻ 2:ָ }Gvvifo: T5 ׅ p ŽVM35T =a6v1-R-%eeFA|̻Y»B]}6P07m-4.4>(FM(Y!F|;8Sw8dj”|gV$ԀE9aI0?AWUDs)(n\NB)9 a%N)ahQ# VDؐeSM1y'zVXZ _Z^r[Ĥp7rm nuw Cib+ܞ#[3>yq4m4dEB' XPotINZaftF_ұN='8٥Z4)owok_rwڝ=IO(94ʷW3?g nw_6[?{!pJ(r7~y+ endstream endobj 142 0 obj << /Length 2382 /Filter /FlateDecode >> stream xڭn6>_aIER\ dk`It7-X-5$=zڲ"EX*VrsIn~H}қ*r=ܨ$4 @ߣ?Ulw8w8}>v5*ΗqNh?VEa"goG˫}wsGǠ\eOJ–7ÍxO/Ov [*Ǻ#@iw[жHwYW09ّxQY pcFwĄg qXJFPz$Yb϶aAk]aZ1'vI@LvtW0-Vqj&QC=WĆa𦰄mJx(gmn`r>lScj{7Cǹzg`oy`\Sjǿ܄3-%0=$`- oft̶ثvu|Y&W3hkbdnŜAdz3t7H/ޏC)+-d3tFwcw]4טߔJ_Jgw#V]:x^Z㢜b%ڞL)-X t;WȳC-G+'-o(7?DRϴ_vGxb&nhweBE.Â89ƁwyGʣ!yG f yq͏jvtC8!wE>37>oCՕ$";J#: ܊Il EPm}y>|f0 %ζ+N/ƀVIE4JaF 2O}$0'TIK[O 3Mqާf&f[*$ߡǃt] p;/<ֺ Xט_y#սCCV)DlRMDV!J+Jȷ&EZX(LEZ<G*pݥz.t!ڐ-BE(cV#.^ !?oWkvt,sKKBĚIX1>eFBGٶks珂>?([Tp,T3'c5yYQzP}o82yɢڕ@TqiݳB_>t Cy 'Ҳx֭GԻeaz\!5wLIfIYyMwI{4qUo^;rhPR&5}_cU26 « >D?d,a7:A64,<91h,jR-B"o+Փy?ن,aV L83aϟfKN2tdt<]J'cWdIjk,N QJA.čVHUy.IUfp/. (>1zJ,$1[g~bVZv+!?MOB+I8QqVbR> stream xڍY[۸ ~ϯIklIIvه>HFTJʉ3ō|"A@H&U ?=]Tl Ht&͔fЫ6z7ԌO]bS?sX^owq{~SEvy+7 gh*&避1'J?nRSd.gG!;{bMTREObʻOvDުSyTB5Gtbԃ˱ni#¦wQ-H{(?JC璟l$O(~JAP87m2ە 29i@ED3.`(BѥA<nKܑ'@4#xd{݅p!5Zi$'Y/3 c>VE~37|^=7. Ђ% %XZجYEG:<~+=j>Fv( 7uZD\Ik8rm8M4)c g^Ӷbn]XyEEx݄$څXnrEkoLz*.. Jc P7BйxVCz*VfX#<|c[*#QA IkA#|w_3X=b;"ӎ#. ,JGŒy.]1I͟qn9:Å10d ؈[6kikaR̴؝pvی!垊Uxށ͙]dj9(% 1a[7h9j)f=3R؂IT({xV#LJr/ݡ;XcǔhF^c{}5LU$HlEXN[d=Z4+ HAOK9d.D QŅqF'{l`bƕذxd2Zz׍~n睺܁JTh3LV@H@EXlwU0U#FjbMKҟQ Ms f4v;UJ؁Pb\5b t냃ݩ6ƞ2Q}Mh(D=t8ͥWcÆ`U!q)pՔ@jܹ|Nt~2Y_u['}0R5eRxoʲ\ГD݅fFL- Y4V3hrr5%%CYܜ/|"ODl8*Zc#B摛\7bk LfwZ+KE U((zĨbĨW %_G@ :fyR?^`!y6N{ָ ^1< h,HWv'n)(8()4;W[c-^۵;(YhӦ/J fޙ EV\c/(R@Y({ʯ][ LEỬ6,t&`iG$8/Բ0 И kl+=hgHDU(#669d<_pc$B&?/č5u !\#M=rZD;>t|H%J@oԭ8]`dC8tB 0vT&v`NJx8ӘCK#Sk9.إb d!CAՁ#U7;oaA<1`roȩ] B'PwKk#KEmZE׭toCp\ncƞ.aQ:?xk(b~,k,۹W7H  [ O)nTjHcxzq .Q8YL)4X!40b/8b8{w!/(2@VVLݭ2Ivlz9e`| đ.+)1+F#u= mwRI>pomy.D>D@4-(?c{aV6PkT_" cQkjXhyQ"…^TWXDJ #c7 ל#wV^=~h&JYN VY1 5Ƀ|ؙ{VRb]{7L;%_3'yC~H+|rk~f91dT!ںܿ%Z^~n?2{8y`S $Uz*U![{)8U8.=HdI'qDbB> stream xYIܸWE2s /a&[ZjHj/>Qbcć94D)XWK'ۇW<ͻ򡊫<6*qC^d*T?<4Á홴#l'qWi;{{]?ea;N&ʾ;]}v&"DqOp _燕[+#V9l׶l'^x #OԀ<.şfUd羛wǹ>[ ikt!1ODlg?;` F#B(5 9näx29H+47,*8/fIZ΋X_g 70:Ns?}O ViS滒 A-6թ CCA4pqg0 o$" b[Ow#PFc%y$$k0'x% & $mB B#l~-LK1H±obceܨSc䯐ҵMICcق%-$b` x3C ~0d0 6'IL$G.W;iDOgu߉P^t Mc"]*@J5\?qm\Ev3)2}-i FkU'\" 1Z . t̴ˈ)kzNÙ!t>K):]*-jKsr{A'_ۆH=7YGe͐.7@ͼQ3W!5l';L.mws٨O#6gvv|{g k {=A:̌|F+_Z/Vҥf*o$s!Ho (m> stream xڽYIoF$Y 4Hi✒hPd60?~VEv⫪W[z 7Op݇PzpIg,bo,ĉ Tb[mמI =GoKnw@,d+;Ͷmxp8ʴSyÿ>3hq ;n_ߘ'pI[m D?*Y̚nqH&$cm#~W+xoNm7X@8!Y&US;lQd ;:d-4e(u񶑱gT?Ӝj56IQU*Ȣ_5,>tVUͰoU$I%l;R!6QKw`Z:=𗮈ĉڷ]W"@3d9~ȠMv2 Q,$VdW4+ 3\Ch1eHBQSzRgR@Iu#P&r:FY>%4]n8wPn&!hr"c"'}&_V"Hc F(NgS^L[E:ؠ]sRF%Fa;d@8]',N@Fa5wҝ{B8_qܤʳL"(m,@*yJ'gzZDI36Hp̕I<B\;݉}>uͩH?Ԟ{!9=EY`= q0,upɕc ][$0S%{ommݡZm)Xm0c`Ϙf{;R^Dydz~Mu5A1k7MMľ~mɗ!X %܄0z$6nԴ m4tqv>\R?xkx%+Q\}s9U\E!]I%*'Ws1 Cpr>u͘ЗAQew \Y){#+ m1G‰-8>^vKDxEt9<咑Q.;kS+z^_Wps>@IzFQ+:MJ1fQ=k@pIl/"ڕ@'@#"oD'2:! @e r_\xWTW=*^6aj#T_×=S Hiko4L{=u[[|hzcdB$i@/_rt 6~&wv@ߎhȢDTzpCP9Jǣ}K1$^䭦(e!x nT{z7?'x-0":w%<[ 0UK;s4;jfp! ~KVm|ړ(d4s/v(eV%a~܏3Ko3ТؘR aXټ}K cQalukHJcbϸI~dq|y+!bEIQGih*j/x#s(21WٹeklkRV`/p: TE]iv7I8Gq72[Z^5aC&m6cB=D̨.#ʞ $ئbfH\YYU9h]){mVdlBHh.Wamt", b|>N_ze;3gEۼGP^-+pn*J'ga|l:+B@_M1'E U[y-2δ5=Tt-hk@xĂ7ht}}.ŤyM]l }/&2>Ȱ+Rxn t-ZX OKƋJ_9,'zZ@mdd=ZhÔpLeTj0Se]RIѪg9f~qpJ~BdkKV #S_CFSuT!_Tz8gpv}$n?ʪ1D[> stream xYKБSﺜ]̤|sZTǿ>_fƾ"4~} E.}!Z=wy'2=v"a.IU(R*w ~Dz߇};~7זpW .jzzs= Іŝ̂i'nTMoj|Un/Ӡ;x&Cf zܑ~鋊f+{ ][!UӴfV ^Y(u 1Wԕ;WAu=AG'"ho% D:@OV'=B3= xU;7 ::KͪKs[at$RҁuCO{XtaQƩ|s7l6mT+$IkJ!WILzL0ЁJ3ipn8OBO49צ;ڊӣ3 D4,K C uC2 #TaT+jlgRrswsi4 mR "0~vi<5vxg#d^a߷ш~+pJߟp ;E瑟=cK|i\"%rNںj,[x,T j71M†iΠ ao_})JHM9?me9Gs'QpEi8e©EW%=,=W+ n|f3de`5)hf%xe"a-n۩ 1 s߈~B.l 3 a'#avdh{7\.,7?F(G9:dG>cp8qe_n_HJ-p~8Y[n[m3ꕳ$rK2c:6"2~8ywx!NQxoQ_MhM=m^y*0phJ!-сw>B[╕-=VszCݻh1Ӡ2 -Vʟ ”L!"°/$np_0`/ RW>{rZ < I_w=3U"WbqgGƹ99.Fyx7'Dˑw܄ʴlv]R6TZj%,T,!Nrx7Kp4b:"Pϋ0q<▓kHS͘M{D{4^ؓe$MN=.H_ANDc>ecz}]N2(?ڮB)+NO [D2"`<&m"T?.K _?~s_Yu]* Һ %OvWi!g)]R$J_U< }tޜuy< W8شr "^&9H<R P*[z7boXt`gAve⩎2T$dΥqG1sbx'T&QbәWGn9H?#9ƙo|n~=zbc}d+x:;ʐYScݥ:īb%nB=Ӑ$t*) ؤ* 4k5(lLr ,yfQ83`#!>Oű^Z11ZJ1P*8"b_B_u`ߨ%; \J8Va7VRt|Se يe2׼v;^hC$-I+rp$Վskv+O9]L h'q^ÌD(|8ȏ4ǃ*V,w(t;s9UE8g2ų>Nqr:INzꙟt)[=Z7_igM!QW74D郕Ql/y.o nSg/nd>ZJ3.pz2C$zfP7,Mo ޕ{r#K# 7 'Mm i4]M>Q =ޝ!SPP+'u:dž-iYOwnF#^gfX#uD_-D40O4jN}c&KKrLWH"{٥Rs2qbI@t-4_!@ofO LѡBqz1Ç]ϱ endstream endobj 158 0 obj << /Length 2531 /Filter /FlateDecode >> stream xڽYYo~_я2uPW`6^d1}%[ZjX~뢮V&7EbW=|Ow.s8wχ]$tNmoa;Iև=lj_<_UƽGA| Q$#]<z$oVK|-~$֜t\µdncn~} DE"To )n|nT<Ӊah/* v/c>x&GG?FG~4pl4;`$ErI_R}X~#*oqr]ѕ`0=୤GQsQ6D;GxLwѲ6' j䝩LwW٦a`wQ:x 2=8ވ-CqH@q, \^xz! ,+4$ y#LcL%Y0zSVH)f?OSH^ ^SCCUPS4*bkYӶM+Q5Wy>k)-Qntk$k('ofhtǦ@xI~I@șP}ٷ`ZS,V]/_"ylG#P 0-}UI"Nh&LG%-HtmL4sm018NrNd_R0^Sf1o+P (9X7p- YgF<`]L@C]S:Pu,7!ٕOKbDטlmi[ μaU{GU `H$8͝nO,w4?#Poe0 m Wx5pPUuYy b:VAݷC/0C8~u#LZ]wc&y$?/ WyϤEr =' zC%b[:gA\K6`n@6=S,CL /mSRw--r,WnB-',چS,%H6e M< %LM} 8+YYY]EPCںk޴XLiJ=ve7d[neB$Pp ݠ+! q4gm8*xGe7Nчra.ٷ_; ,( JLZEBjİ9BʺMj肿lcfmjӞebA"DXغ8VmqB5JR3@\`]UWIn]s.'K徜Zo~3 _< !K( `[96muԱ4"#Y$ʯ#ſ\b-s (EvIm>"Ck±$P1,dbB! LDMTWZfSDR>Q *Al{Vf)$`M"?^Vȏbn-YnjGNҔCʂq%T8ELGtT^ uQV Dу0Us hl-D|nւ ݀Ylޘ4h39hzw0^QgaJ [nv7Qp/H{<61q QeOʹfQ@Ҝ麾wwlpFlYѲUqʝAXm%a\\ Ptwŧb.𻤼攤4})uSy~7˺sjRk^37M <5˖wApnv -i|Ƞ8I53(:$SƷЏZg5eim`H&I6*%CL]տ}O@,l VP骱]ColɗbU^F~Fȕ?->F#v endstream endobj 161 0 obj << /Length 2859 /Filter /FlateDecode >> stream xڵI~`ќzh8pQ'-"%HC&>(|7F.}秷]NwϧⰈ]Pe*w? '*(pa`=x<;Y}`Y.ծ*puWs7ybyCwRBx?EI$kSuP*,Nx& N]ϓ[&i7UpRZ׎Gf?lZ >'@]m70N,I U<%Q1 UD\cҔa(c U;F䣓F^.#>8vm}k`RN@; |$uSLL=#ӍJ'6LB .ݽ)DdD|"BZc_4@]WNHjKF/d_W\8>ֺVcG#z-X8mP{mD&M0 }G9$2:,T,4yeʻ("FPN2-8! fHyy XVׂl&Ljͣ O¦cUu?G*(KG<y|c׃ Co[7 ̮WZ8ݕg//eZq-@k#Zƣ2/W=\(3fyhC\ow::1j* j07'h 5hIWtj,Yayu8+y I ٺ_Ѵx~ Sf h<ҌĜluf< ii['qPI, p4iVmwpCG{V!K}9L9NLɘ+ؐm+6x +wU@&1;5, ]O,9{VPQA>L{q}1oHڦr%{H62>љ*`얷>8\"g's5xE Ġ+#7q7(100DEL%_?ge`TTqPElO P@ Ft0R)v/p$FgIgTC|?R .vX\0R1xS)_|\f c߱=) O,'BJTLq)^`c+[.i.8@.OݝL3*د e):s[\~vi11 \/o*7r)VX-ݝ{dPHpe~'O Cu-jY;{"/I5;)W^Youwߌ 4'=\5$QA O6SHp^Y_ ?DGp^)N'Q4e(3$G@&FV8w{ iA۬!Yf_:hG!g11P~d`dwGH'sj⑭69-ɢt_H0B$s9"]()6U7i94[ra]@aCE Fs@d=*}FA;Ju E .[cሓ=glϣsLOHڐ8N t :9Z% 2V /7uўp_`lppra˃\#?bQ CeK0$|ő4]}0( ƀ/$Vixvl[z!Q{RFo(jO5qZ颋boz0S-y|{HKkdqORæj6gв]hѽ䀞%tIDnwi/ݦtGQVOY؄znUI5-ULqVՔ Ê4'&"9¯q#xN!V.ķsHq`U[ryʞ dtS('odZ03KMB}#FEG ڲ' Y0/ĔZ.ԛ̕Y7mMbg%j Q]&J:37_N'&va>^>Jj"߽N!h6Lݧ5qa$1_*4%a|M%IMwcMphu]:&VHd>)AFG'FЅ'*Xm:vbuZD1!K ̵.pv^PȾ$l*@mO}l|W9s:,ƜQ6BWnSb28,9 =ukTƺ58&|SwUѷtw+JC6}myDu e FsƘ slRJeE=>&eu+W7Tv{4FM0 0OW^mkmȩ( Ŗ|=7 MiK%s +L}ՃvypPc0S})ȱU}89?Ll)zL фqEʟhDs8]ls/WX% endstream endobj 165 0 obj << /Length 2935 /Filter /FlateDecode >> stream xڵێ_Xv$pQoᇦ\q$Kz=ZJ E9s;MtM$?ܿyA7EX*M0`V+hMownglqe3t zhXW]ko}8BS0\8俭Dznyު<8_Bma*<щru#g, \o6ME"?5V@Vxb孡Dx@$*ކȃ,?#~Pu3+dδ0nGˮ$1yЕ0]e۲z6iPY$̋"zx|-*@BD_Q/eؔhm9kmydHz2'q$8xD>[9F@Qz9+?y~OXl":b[ۗ 1І4)O;/0 p9J,"bDG|]ْ7CN$8C`1lxeנƨ5Ex3hȜ7D%׮Ca&n 8"bGa%U!E@`Fdo8 ܎letpNMHGhi#@ApxE9HY$ JP[8~/ixKϯ Zgg <58i_l2Na 2c D'>sz`?{ 0|g|: Ptón 7{;/(sD]VdgaTNX_qr+ dEncMfwg(@ֱoE]?t[l˜Ra3M6eP8B茝uI!t[^V\</oO(;_Zbֈlϩ/¹G0ܣsǜVeA ę 2/ c)ärk#;-ǘU8x~A%)+c ~4p`tv~螤%b9.M^Zs`@(<5)a\d償WqfakPE>[nmRƛ0SA9Mi@%,.C\/5u WsgvP5sv MNi.z qvo |VPHrSُԔ Pvݔpii4>mԡ~h<|oey^]d+$dZ v{O;!'>ϪA: sG?ZO0P}:'3yc*Յ:eTp˦Zd# f!򵨯j ],qؼ6,fw!̼X=|`'3sy\CW̅o?y0υ`Mvvf.W~)eO ׾nVju^llbWfS/cfW7} J3 fL^%!P7VÝo4q<3^N<.~*w/rxM79\Ƅyѩy}qΰk}N+;li 9ͽ\tEd2_AO_x\I'> stream xڝ˒6БSeqC]ەZϖ=`DHš"$/%NFh[ v]{C ߟ~ Ȣlp.S*{ipܿY*Ds'x6U뛾p}iC~ČEa'> #zwP^mۻ}{M7 $l͘/_1LLj ]q> s?> "˙neq5G^XLX]!B*{&[}lzaÉW õփtVX sl=5A]yV2t@@ζmjDFKaoX\t .μapփe2i<9~%w(|K5CNWB{t[m^btm!JB`TW~v௮KF4h{}/$>G_ 5EEѰs <,@8 ?,aFDi랗deAt# xI5#$u/'Ӑf&?4bY#qwU*:p횊b=tTxZ=!T/vP8ZW0m_a-IU^~`<6 R4-T4g u|! xYY> A{מNC"Z`hi,ЦF@k#~GFI({Scc#V=o8~}O?S\rӯ.o}~Wk. ưp־* $a 9ĠБ;@6,)m ~7mp# iD}5[ 1U/4o-($r4|*~Aj vӣrM3?hґD~ZO-H+I00M)鶅XYpsc0x7v'xӉ)Ȭ_ED[|FӇvk[58,č0s7.$;@}e)}+q3"Q1H#rW$ZiTkω˔1[R+ɾ}Ujr3J)P`(2h+zB4^/<ԝ^9ˑ30U)eQ9X4hD/FV"QǺ OYm#=^VKr8eQ,Jo'og@䰎P8 )05#b]~AJy~G  z9LrY$qBT8D&q"D*x8wl(Y+ʊ۳1ӱ y%Q0;$WzOg m)#v^pK޾>1k:^W$P{E 2F)nMZ9¯AZR/IK YھPKAZy9zC:eD{rlv ^wݸd>^HI!]Lr,cP0JnjU\J}A!ƯkL~6(ɟ<t &o#,:D#P -5' N+3z\'`4;RUbb"/k.0N1QKp#~FjF tHE{p1͵*Tꥳ"FS#z:~$4'x[u*b>&IJƊv Ҽ$D~56ӣ(Ίb$gi'Y=̅\pFC1ER/{!OYKϊIOazeQ-Z CS+CGA$e88y+Ыz0ꦷ[ѕcp:ѼY"ͬMkMs.X8T7nJ7$Vb|F ^5GMbk[whܳ Bch-X> stream xڝYK6WT^3Nɠ,t-f"KQͯ,J[tcw^t9lͻ|ū妊\囏MlBif\wFOV:zrm-V&],LG1mlg9sGc񟠜mU&jv1 &l#MzV' U4euJ"uL:0=Nwu quM#>Q˃=xX W3mn>{u<0-yt4"f#`q梢NRA.H/:MJԪ6B捎DĚ85pc=N'M a֝}\U\fetp [d Aiv0"\9PeBc[ mt}l[..E\N~SQ$ql_C*IR<Ɏqw{;X\wF? z'JYLXGDE{Avvp$9c{&J@ BffY e #I!t7 OG82,nT(4}ޞ6ˣOxv˸|2iYfNX?WKzm_,b͋b°=iBoj/Ml<-Yn' #ꜼX]\ԝG]7|>.Vsw4t!y͆YQ;R|w5L 6QĐۏ"EkIգ.PW8fX5_o e_CV hZ?%Vc~A⅗c'\#a&2_<*`CY?B21~1U=ea엿w=uC5O~%;yɣl =]"5!Y 0\*γ8ĀR4i9*#e8zԩb_@?>N :PG0݁9bNw  /X@ dۮìT.s .:=c (9Rsh@WR]J44(5C:Ŏuw b$ĭ1,/]#Q OB\qgh.yjmr2 W??\x m6Tܢ 3Fkњ\F.<ϮAfLH@$.*z Zrw 84 L,QҺ1TU/P!uPyG(+9yb3YnĄ=2a/ʡ/Yy %_a9 rU*x<nW(Phͬ(9/U]> stream xZn7W, >$n 7YXߧ(Z 9쩪.>G1FĮĉTIʉ!6.d %;U4Qc, rBʩRAdT*Bf3E!H&kx^LʔR`W_V E/xS#C#!r!▔::!@FQH-J= "U;WrWhWW! ,L-SUP҅BXK 7m: TT!%5A"pL`9ʁ>,8"3WAJTs40FNK^]Cб8g2T &" |^\k6|`{aFv(U0`X(3`'3=w+Kxԙ%܆@Þ*>fS5b}J`tEa]u_2 ЍQ< 跏XނUtUSDJ=AKؗ3<.9Y (b@!Hc7"uNbjɛo001c{xA=wSN1\7csK]L"2c ;Fl+MSx + ^sF:5 [iʠiKJ|'i_z2w#]2f%u,mex${h^y}f'Zp?Չest- 6 ]“U &NB2 ^iwqr1 endstream endobj 175 0 obj << /Length 2916 /Filter /FlateDecode >> stream xڵɲ>_THʌ+r\sHrH E(9wo9!'轛)~],߿{6O͡)Oe fDvMپ=npTD;TQz󯗿?g'u|Ȳs;qGn4L,v/8۹.KHtT}^t^{$i'ɡ)a>ͫhGtyv_i'Qk"$ζA@rO˂ p\P:|Yԫ5dږG`E+cy^eey$y'3\'nxu| Q+g۶|eÚڑU,>D5N:;ӟ蠇|+}:3N՞z(ʥMEbAU2௨M!V"ڪwIO7vov|H)p]+/x߉tv~f e)2 /:iD׼ĺ|tJ ۞. g.kCEpi ?ɢ# Uv3'ͨ3htfM?:  B*M 6T?@تQE!͘`~K_ MwlG'2@KG- &t!E̒ = T$"ϒ8iPMy^ Ədg'|şi k*U?̓OKYdrqh 8i%j3L^Qws?Or`bypQА(i7qNAkܱ87:[ GMt2ފtx[ư 6d`H5Ŝ"xSb! ڂ6^^~li&1;E-d` , |2!%p FW%;쒃6ACs  _xSvsG@J>|9XN3myM3#5^] ݢ!٤x8%k2`0L4Iȳ%YgPw}aԉp'@yS"Qw s#_4A4# bw{0ԉyA4NAIt7ߐqčd) H'LL\D $X4?$@8oFrg6ÿX:]230;D>&*::-`p ^cT[}ҨS\ڸkXDIr©L(KIx f:ַ,Ej8|uz$/UʒqrTt`q.oc"Y9ݢāzFw 6-r:4ceYk}Z#nE Y,1I_ ` WE L<'y68[G|9Uˡ\ M?$h1P;. ͡KC~SďW*a"ő0º'X{7S"wf" }i7 <I%SŦ;hʼnO_*2 Hx8Zò&Vƕ/Pz6d`3e*G"d-,0e&/&X !v:Y*} qr3? nqNMrf^N2Z0r=q3˾- l1?tފJ(3,%޳݅+qi*G55S744`x[ ,`gYh<3a>yZyg\n YeXp2;<-'HNg`_yhsEYԫ4~^Gch 0z]+Z lO^@nFs>xiK^g(0hcӇŲBQNmrՃ:y6\^3@[S$RB 5x|e)./(ܗIF,qRށsy%-Ae'|]ƝF@ivU,]!>S)£C^K, Lnv'?Zk&R5r S!mLSk_F 3ʽ@EwZE핷r:wCxL/TfOUXH eXQl1A(>i` ArP1-ƍ i]2S \Y:-|nUt4ȿE` i;dBF'i~~sI]lwҭΏB?fUuR@v2@ZvoHBLZ$|hCzlT*bY"w<`iQ1aɏQdW/ҌD@cҎGtr/P 5$rD=!/1otbrC7ϨB#L !Ŷrxls=ZSip&G%ypqi%\Gpp`W*&A"p?~Q\RÝ\\[IB孾zZ_u韄0ۛWգQ pektCmB?t]N$K$Vĥ~2tnEoi(_v .L'R𶣔UghJQ_F%$!3oa7> c}|%4XL?6K{x&|988A}`hA ϔϵbrsprW:oZBUİ˻y endstream endobj 179 0 obj << /Length 3097 /Filter /FlateDecode >> stream xڽZKs6W|j34s]JR+f %q="U$'Yo73XIjWw1+7__y锻(Ņ+t. .}(՗-RYRnƇDzj<<#<}awiXDULm5̺$l{o{j: 5/{t2/-zʃ\4bT^JC’P8]ո'F K۪mIXqy@r_<~{gUЅM5ǎapXyAj]z;6q# g t68(F!(i_>>"ud(uiaoC~1fot+$KʼnjQFV +(Mڡ@ۦFҚEPPkg,*r#hMU+A+ ,}MA\\Pl{/,MtUxW)g`ETkS"?`I㲟no^X~0E v ^zU;Pـ\AO=Az~}_==4[XQxf<⾢1(2 `8DpN*W9Q5Ƈj$!ٓ&>6/E;/;4acSׅVԈ;T b'LqkzIĪotnMlpaC.Հ H2|UϽڎOUq7YH ۀLQ17 G .q[o-.(r2XT%P).tD\$ۼdhNΪ=v6-sW=\ t MAy=ec6c7tLÁЄa7ö (Ÿ2uOx7Aۦ ;31q]a:8Nz٠J*_N'PLY<: 1j bU™=OGTCH &%Ka?RKj6<#~E^-  /#{TlTqM`v@)(F(k;}-ʄ||>-.9Mz4L7А A ]n2Dg8"n' hPa)y=3c:Gc RÖWdop ͛C gy_Q?77?P];8JE 6\%'" 6l*NtT`N'!Y9OZV,8P4ba"J Gܭ]6/d2W])rS-W(s%2Hk{ɭ+iK KʬY@!.\ K+܉76>3ˍCI"]CW se 0)5ȱѬKv2k01=N\7W׈WS;(J@7XTaw9ݔOq2z0{P)1^ZOᶟ 'QM `x74CMTc } \M;z2{ͻ!a3zwݬQzɽ-^ sVkA1-R `5/ (X y/isg?wzA )LH/. q*<˖~zY;[; @@E?GTA ~ E\)#̉c~3̞/̜ ?"X|zDsx<ڎ_ipG +|L>@Uu鈣ia~%.WPbGOM8C?/';=|%T%@Lr]$mK$LY<X D%a!#,ɧ*9u_ɱ@ξ DzT,=PR?a${ul( 0"NQQ. S?M d9b.*S}En/x endstream endobj 182 0 obj << /Length 3040 /Filter /FlateDecode >> stream xڽZYs8~ϯp剪8o's$T;S[}%ZF"=<ƕavUz0Fjiv`/գϹ<g*͕ȌL;_W >1X@ݾX1ɛIt/ZO˒W\8^ۖMZ,wʺzTk-YVǿ1F8>>r_at;p478PEQw/7j"]4kܱ芦nylj%`hᠭ_s&Rʤ2&4 4YB8-i%UrOvڟq-eJpIlI m%YɎ`xnmYXI:hP'W*sl|jZ9 ,Au\T¦Klq{ Xq"MMcmYhQWO,APӱJʉM4E{K-4v:*n!,Ig,*ca ʹ4CZz8ę95YC)7 R}{Yl@MwL/u^8ٹY抏5@Q{c豶g p}+%WvRN-Ϟ/klԀр~D6 > s5B J(;CX;W^M{$Ճ*(oGYJ r4:ZYkF*(:8FxLz3%A<~S#̗keB :ƠYmg$wg q3ǺKRP-vMA}xW [8׃rqO|lvDޗ[^.&ķZu̵5X, Y8)y7螦kaRe31_6;y5GP@k|_G`H'9 ,h>1AxGB}.C %%@ ND!/F ]1"ԉO$"'!/;:9H%#La^M*yǘ8?:9|HF6n m{d3F*ȩ"a lz!AѤ4̦ƂAo"p"RCg诊f:STxgjxmZζm麠uMWnkqV#J SGMjP3v0[ٟī-)Kp! 51F'+COU-ۦ]d?&-Q˰xw]Xn&TJH  R>mð#519b9`lyweʳ5U< +jߗ]T;`08[)D2Z N7Nsxw(ݵQ?ޖ{W3`UoHE\ usڽ"…t)G@ 3ЃP6Cy$S{|mxq>Ǒːm|ƬkC\5ZC,dl+0(itc! N ;i;upuIriy!5>!]|yh"-͏Z@ՠK-D1VI"2\qLC@|8ޟA_H1 'Hp"d] a!a{:1y^̺ӟ  %dԗ*@4h`8O~CDI0'Rn ݀ǁ4yo/q:|' +t>Ekm(8D;GyƛB: d|H![ہ\zá8P m_EZǥm@#f "JL q Pbɦ G֟'DbQ$HϊY[1nZ&v12͘'K'T0DkpXKf1]^=/=2m endstream endobj 185 0 obj << /Length 2364 /Filter /FlateDecode >> stream xڥYKs6WrTy` $lVyk˕]և8fH  !Q:@ht7~SdǬȮ.aیy2c%HUK~sWOyOrď˾5 ą:0p($]y~?='53K'ht2?/[v}sllמ8CU?(ǝyGqNhZe5/uFmq4-ix9ejQ!M BR*(asMǁfDؽ9*Tǻ&]Wĵ;x^S;b+-4KEsKd2OR}=(ݹ;zc̒ &؞>N;C7 ߶Z2ޕgq >dN~ =gA5!j2 !)]]`d8;xC8DBģJl۶nꢙKqs>*wԝNMސA>#͏uTh' (8e;q,bPi]ƃc s#=h1^ 'Um.PTKSdn!(+Mfl3ysP*Xhe9\NmpEɅY+iVzZ\kI9TP *}PDC$ ݀W(=pi˞ȇ Iz':U? .fBs" A" Bc3JcsAٓd߷F1#\DU}z@ Y6`3"S=+6FO 8\wDp;jTfOτJ77 H d6)I0pZb޹! (w*r?Bq{I$7RLL&'ti14BVD2 +B!jmثQ' B$bKg"qY#}* =P|XV$NO`]3LS\is5D%n5CXMu+6yGW|Gm^H?6B8N'pdߡceh@JhC+P7b1?GCH^ DF q[n-a۾SrWn*R޼)-U)_uL+|5(/J?CLg*  Xm qc&xy,& Ӕp9JMs A#axGG?#!)53B>̄s!@8@YŢEFFj8saOux~n~/jl (φvmۅ u}M;4,xiAtOW7W\ |9i_1Iﲏa)S4Vdm[<$sp_#pL =xxV3[iNvY9"XAm3@( >A2>c6<ǢkqX4+ɸsqM!`V)/ÍiWi Fojh^NZ ^j%0ۖQSTVSrj*C; JL d5~yInHRS_ '*>T=Ր2U>%($Ҳ=\v*6N9"`-3D^CjVJghte'r,=UܐR6x.G:ΗMx| eez ̸|ŃjzJ; -X+wk`Xwe]IOvsQȝv3ұ㩼ۅgꃃ$.܇Bȝ6ve+`\Vӂxi[ғ6[á{T$V t:ZhvVvzEGoFХ \ajڭeGZq{zA\|suq3xׁ8,@p"`~ בp_b8 3BSL3g.|bFA|ϯHtY!@J[ ύSmh~P[]$i!X&xj\Mj" endstream endobj 189 0 obj << /Length 2782 /Filter /FlateDecode >> stream xڍYY8~WT䊠m׼10VƲ겺ʋo^Un'I)9%el`Y g/MIln6yIR)ͿJW-t"6-~M%s5ܻo.+?7x[6NK`g9lw^I5<[ h8q۝V{;azW|`s{^g 403$/N1A 2S0q ZbA1X #Cy5j!.($ l/vJHo3y ZzJ88+P.5,+JEn2my[%cjv|8݂yU^#ti! d@)0ؾ`Fx$ݺ!s ۼN_Aa,9#sf0UݤtDN tL1Pc1~pM&.c.C_a%DႢ.#LJ單Qt/7Q3Kk_?'ee~L"˄V3ɟ{xEPEӋ0'~~ٿ ust=aa,00`52 tZ [3d2To(`UOf9/KRa΅tƶ`pC=#Ů'2h i(w@?8:B !Dl`   mK03>_}ma^ PAv,Q~_[ڔ`> stream xڍYs6_K% ssizSSMs I)R%:_HIN.X,~*z"^|*4IWytf*3WXvRy0lb8(\H`d^v&Ao35BSP(U$+[烈ܶ*p Uy[J;v)2Q\mWV\ݿAe5k0xs]* ~eq;s Xڢꇎ(/l-õ-cQd$Ea,})ORM??0Ȧ5K3!=3- k5 #-+kZeW

9eq_uNa8Niepr:qSXQ~ *SA|APZ{Wr0KW~="I59T: gn݅CơI}&ycfc,SQ+tX+eUy,x鑐 y40wm*JHb`k;c?]1ȘX [`u/pGet2$L&U/N< 8am6$/C&`cp8xcjm[ C7fz칣U Ӹ 'd;\kX]&vt$@w+yT ʶ#̠T9|ap+ Fa&=sM@xHdBZLyg<8>|SU;zn!:4gmUV eCd;"[xnr_m BRd|`1} ڝCUtlȒHZSdLB꒧s =g8ϯHt @Cr jWm!0fRc(7vR%EG'MJ{pĞ'* _Ʈx犪 dtTS&_$hQV!hamɨP +A!Bs nHVuV]:^F r,JY];2T7I.N᫻aHd\<"`:,@ԲwD4ZyLmW2-I]̷m/rJz)H)IJ2+m?CBfNu9&3EX#PqAL|TWMDe,p6x} A|}| ^af2(^d O.70i= :Xo/x#>øXB`'{Ѿ ` >HlI.Kyz_H ȎKԦf cg>+P wnol4q/e*7q@8Gq@Ӭ.hu@ "68_Q]B- N=k99n0B x2 q]a!y./s:≹LBTnPߣ*n}T/y BŃjDD PUblA 'j*NiYFϿٚ = aon/U?A00;q%nFiF1 @d,Ff#Ur tv!Qj&`t:1 {hRac+VV@P#:(Q %s/12Qw-K0o8nPE k @r~˩xtDYD:W8\Gw4u=%~}J%i.zr 8|J&(d6@eh5ҧ*wLS%Յ]0fhmE蚊f{IHx>GJ$IBKaqb8G!n(eT(0 LinfC'%ջ@2 cP.$DC)I; ?OL"ޓMǷثH32 S%ns?Ƨ$A.!t0ŲhB7-$;zÀ i7%@GS uٴ퐩!48c٢6f}:wQS wp}LߚQ"ן> stream xڵXK6 QYkERvIMEۚȒG6Pۛi2ECoޫ2D(f塗*im o?j-FW AyOI@jAGg7Nvu$m1 ]ؗrGkY 8KNVP,lzoJהPyyk)\DtLR*x.gJꏋZpX Ai xOv2U޻?pXDUiEk=0X|sGBI/<4[L_L=3{֌2: m[Uħށf',3U"C]f[bDc>Ad+Ne Ngvlm goMC[ YrT╦3KKU) %rG8+$ tEL$Udq>ZٗW"U&[SpQp3n. Ǎ.Ů2S5rmScCd܍СSg(_ rD MOb]yRorRA)<}37 GEfjXTT vO=p4+fi!Uo7 ҥi]PYgkbW -^oFӍMe$So"֌`׮<6Ee.)$9XrUj; _o6>`/:/]DZ"ߥHD3Oe]PKBȣ|b b9pꮦr?n.~qd t{OOGENGzݛڴj.+Cm$;a4ަ B[nMuF|):aOm*[C-^f ; \}&$3nYrJ_EYhIa6׆X&|"d*ڲoJC =JCQ: z!'Lyk\'ґz;_dBKU$eBʤ[Ť:"ž_?w0.)qP#R1ȍKȥC"Rr;]_sƖˈ)Ny4pp4 Z=\0r,-Ne endstream endobj 199 0 obj << /Length 2971 /Filter /FlateDecode >> stream xڕ˒6򞯘K8UM|Oή=LrY#A%)O\~Bınh[nv7?=mySU7ۛ* 67 ][mR6a}+ރu~tw݆!ci-]L{c~﷫45k9(([+΋߇VqV\"[MRYF]kˢ07nñ(p`i7_ 'aٽOkIYUndҶipRw?8y-3H?I3 ߨ_=MD{^@!EXH3c>5WAgþ;5{E!kz$meB\mmLLm_l ] `6_n3t >n@)(ǻbmf:#(ȥ*ZF~;>b[n!b4z[|= 'yhmD0^I/jPMx[uGƖ*Gq߈Ü8 +0UU2 zx\fpwQq=Jt&v̏=tN) Dunc#Kz-yC@хub̨̕z,L@Bj"l÷(0)_NQ3>EY48F6wa %y>//G0F<@űk_ ':R$l) ؃[j2~#n@NT)-db,!Ws2C{pq ,|ɿgpU߀DOkP;Z6%J8i/$42|f 8vuS~M%)j뱶N>j.A?g/7>x-bWaL<$+(}}8O+ 0aiٳ9q|D~F8xB+~]3Ѳ4aX-̫LVcע ,Fb;Cu0PrR;}1)2k3q i NDPAtҕ|Sֵ\ÓYҴόᧁ<-CaTn1%eÌx"@|DʖvSNJ1\"Pb9 b}zϛFMCm!҉-YkLոa`0\6k IJR[Ûη& B"" :ܲ;,RzȔqqv}*P5k~/IAaZbqC,G-|]~/l)Yy5N0ۓty.iS-`a\dI&1 Fn9zk6,tW\ղڝfCN'c \lǍkx؃6`>JE^9S>u PDsv2Ylm P߸hé+ )iݪ$ KŔ*Z)6)BV7aG՚pyDXr>ɐRyggSsP!ok~21M 1G1.cǒb2'[j)фǬAAS7.eZ<RHƾkw$T3Sev-N FX%JBI+ s {<#)j|^q$-pac>iA ŀ{o];L.rRf̐uʀqy UJu[KҾ_ԧ!ꜮbY%[X߶I}؟F,ogbFg~/ZQXDx?Yz MO~N0):bidblսT 3Fp=`RmyKj2]a2itߧ]'5|/PV=zYmut>D!#aH\9u^XYG/$p,5y2unym9P|BsTELHm"^N[\[`T_(@&`6f &av9+dԡ07p ȘE~P DCt&eE1U{oe+"gɟf>&FZCԳ& rsLpB,nViF)]7o~?U2 endstream endobj 202 0 obj << /Length 2544 /Filter /FlateDecode >> stream xڵYIoW9Q"Ymnv&-$fTȢy[^fޢjw]}|_~(ʰ̒*tXj}*s~ ~zިXxrA5G]'EGkj\H{xMt;ڽn?ȧ0h^o$ P=fiX;Qao$9TEFD z6P$: #U^m8,SԵfJmJծ3[ ٚ4c^S[b[0}ی{SOoI5sstQ"x''knx.#:q ,CM[^&%g:RN)x4eF^ ֔ D#}y#f0((15:u5Oϒ`p˾ekR1bxCv39Ղ`fxNZ~ڗ}=t:x k/<γU/"|邍 t7Hj#JjH>0*+#T.X5`ft@x]Ss@F8 , nܗrEE$@כ8TqzOHZ5k8!VV'Fj ZzfXJb=v%Ahg VdNeb_jU)8`NxF&*E58exõhy(EIbS icHV!X(2$V9VK*.ƪƉhiQF$Z=qL|Cf쐰u"+5hnp'e*h)qiMQ&,gRzé,L"?Pbj0;JNtc&j5xv۷ӡ՗rqX?#a5AJYZZR f' '<,oΏlh;X #^o~ ߼PA5#?Aši 4Ri .泤* agA"kɹYTb$OP;(*/ha)3O7Q0Vs_TcՅ+ּڅ* ̥UkxveA'I%g;u70q*CΙ^F,9b*3nٜȡ1Ј3hu0NðZE!8ˆp|yڌncuDQX=^B%j@X\28uA;i pOc5,c @5]``[X9.FV~hC8ɛ`;I-> stream xڽYKsFWpDV LNjnN!aD A =3ʟOtHXh/`={ΊY8yVllzvm:W>y~{PeEW, J,~f@NmS+E;ertd~4@L/ "k -EkZa٤Dc(SCpw;h=f`'$=V'Nnh[yW):~7)wU9MSfeH#}I(\ R`XצWOԲl?ȎMad˦Y~iCaWQ0mǬQ;mr~kQ䎴r\,/lyΛ(_j-;9;G'娀$_(KDAVŁ'ꑷc fY=D\C'js4l 0xtB!+ 1(x&6![!hZ>e\zgWV ՗~%q(ߦ$<瓼7QITIgutVB>Zˀ9;<փ+aXY*3@6?188=<_3;cWCo-st~PFV@fDIg,Ry;0(gp$I{8n)`N3$ : ^(U;`V+|dYhTz{0\!O,(CP=& ݅f B>`:wQ^f__t0@X! w,Y\6A'xgȦgO˛aP# Eߡy(#w-|\uN7L!GO(ynlس"DcX"(#`y&VaHoʊ~hd[KFV Iw ب=¦5fjd ¹R+=s=m뮄SU,dW8v5 E{m` |_Ł]W?iZ 2Utb _hf"ogī˲! &[C]ޒxZ VYR Η,6D46ESG/.Y>@ f͇uLԞ<9AE Nr /,4񆂞Itm^Ud+<7EZBaVr׃SO&rU&n&YiKAbwnxyƩ*.F2@|l͂8JN(b躓Pn zbv&J+rߪnĭ_YɀiLIGjD Spƃ64&+Nro'/;tz%*sL[i/Ÿ[Y}߁ngGqc Ю*&UquEj+ tU>wi *&* uZ-#/%ȩ7L#.ڿL#^Kپ7׷P`V6S?e36`D#ݎ6o( endstream endobj 208 0 obj << /Length 2622 /Filter /FlateDecode >> stream xڽ˒۸ʉ|"=9.ەlnl` !HH= )iƳ 4 &WWgIoRuU*[]WiZUi ջ}^ɓ"0A/TsES4`* Z:.3Ql{Feyَ;%*EduQzxlw˽I4GLwUxxAo%,=^֧Y| {__>Y/M3ovi+*朽.Vki p\pǓozG\|/op9\6acɍ^o ny'0 }#uS2EXBL3p+zn笥*w[+-\qƣΎ6kd`Y@qCa~fuơ8 n.BfbbY ͥ30ީhڃd 'Rs ͥ3}CVUV3_5>idnIlD`I\G} P k!oocg%qx0~#n{wۏZ(H #ak8Larwd-%(j'n q"K>Z ǽ0Ѳ,>.\aTcF"3A]k=8sMߡR)19GnΔYu Fga Jq%h!H:p@̐pr;'vmQ4LR"̍ Ca_[Ӟ06(,!('tm+<Xٝ&ˋc UX, ZJ=FX,4 oũ,g鈂T(o8aIitg8Y- ڶx3]1wiɓ΂`6[]{/SMcp$K9aj^dUpjG{ k9BjN2rƴ{݉IUA~ Ttxx@U"8(mm |uHtrvm{@4nQ()8pJl[D2T +1 J{ݔJka؏;<хԵ_<@DzdqH}c# Uo1A2S,j-c>~ǣS-Qwǁ(7XbUtj B.7%˺ 5̒d>A E-IO)~ :a4{qKNW܋a- ~3 ӑ 7j| kod Qbq "Mz!sN3+D-_ZbY؄<`_U\d*z2\rСZ滚jJ%?@Qt!SfP!Ԡa9Lgy gq6Trju]z=_>z]R 7E"aY?7Ï7i=yx˃Y 7el$z&›ǟ7xWw84x1E !.#&"dO4c3Ƹp`J?Y,uEp%oV*f>vI/~ @/ I|KaҝgE5bmG'Z۔JH&qbRj{X Tې+VbXǣJj ٔ R|i[q{k dň Rav^)|lOAQT3?D?˿C2!m{tĞ?LpikqqlX=Oh(J hW#tK]Qe#aƱʧ AoG ,%N|'B~DW OY<^i ݵU{gdIƋT+U.yk%*Y ^?/. endstream endobj 212 0 obj << /Length 2366 /Filter /FlateDecode >> stream xڵɎܸ_QG5EjOrIdLafl]MXKEmTIj{LNǷLCr._:q]tPIYv(4V%lF7JG2z˷?w*G|fi^Wы O|>?[YL|@Xu+ndf6?fp9pt g3Ͷះb!Ju.B<4j?"Ȟy -.鬙l˻"rD_PU7d|Y-g"2 x;1f~IT6fv*s`JDj3'^h|oY0Gs1)iQMW_4 XgDы:9PDm@|5t1 u\T(^lC~ yޛ?3|}rfː=!I^-诎d06n7.S9N)6#Y $j?ɍHяbpv30:.UW6OⅧe fF֦+=yq::/Xyhh9! [3pxDPΛP/Bro􂾔+[c@{k fnl} <<& Jt "`,<D4A-3x Y( RHKp"(V2ɋgHn\8u,|~GR`1SK _{`4B@ ygΩg&,>꺲Y!oX*$B f2ཙkAp-{Py>$֩:刪.Ke3towSp59([evSyuhM-qZW*\հŵ;MŻHRU\q] P fFb_qs@UwSVH2:K4xI(#O*3'GAgwzTO,-qvߤ(3Mˇ<\*^dio%ۍ/nxII9ORrYJ,ٗ;Y]J7lNƧׂ)},q~TiC+amo4U}H:./QZjGX%qUb GׇA# i=\e_ HFZ ,v˥V2S-'cU+lX'yBST{^: LJ_iupӥQJϮ15z)T2 shwQp!lUJmLUQn%Vt#| KW=2®}5ћh(Ym{*ȭg2o4^So җw:inNK??,_!޹L7`95y Jŭbm{>[Y.&Kװ&>O-𶼟! =|0'BoNCW-W4g 2k[b0W={r å"|/ٜǰ$2\f TQe7CY ZJJ <_C S,'yk7J!(921H>peۊrʤp$ĝ Sb%ov@0 * endstream endobj 215 0 obj << /Length 2806 /Filter /FlateDecode >> stream xڵY[sۺ~ϯPDw" [gr4-RTI*N{xLl ],Vʛ=?UziGJyM^Eq?/]w}`+q/uyNzǝm nff2 =mʍA :C.].熾UM?;Mj9h7}3gV:oy$~Vk4.Ù__4vϸTV"0yTWE(邃ݢfť,H^w+DNƳ;2\s:wLjR!d7zJ04[]vJOmn";!MVU?B&m >A)_kF8-/- cDHJ6m_A@;eù-{mZ +=Qp[N;;ӹV?~#ӂkD gCš2~T ˃yJ(!j[nw'0; ^445z=y #U3UFd^؊whӱ/r>W,F:mlIW1Hrhy,/2$޶m/0(!rv p`VAF$Ăw8H؁P9:O-+or(V[/.M9gyd-ҁ7q>qSTh hږ={fF@ZvZCTv2!fNz6Gz,p`X;RIผ%R'v!590"=zѣ7΅tL< KO| նNqCF/$nlJG:H6q &ȗI%ihMc4B]h_iPI@s31*yeA it`y 83@3lRlB]м>߁ CKg.6i? k)WiI4 6- &gKԉ|$E΄0ȫ4l Jēl e홰9~x=NY|>D(@G' ~HY#e:PaҰ p])>1u7 d3? Iύm%5=?qsq^Ř `= r{. ktر04RB~gFnΛ}: (URn^(b4HSR{P[Fpw~#[ǀp#t'Y^_^Yg Xs>שzv"KQdH*Lbk,FpkǸL?RE?w]R':4/y)NG55u"y`Ub?chGjJ&F͂Ճ)~A)}X~wo8A/_C+5SJͲ6_> stream xZK6Wtnn fD 0YlXL9AmeC3ȟ*Vd@G.6_*W!- Qdivusw%V*!-4m7 }J/a%t_~C0"+oJU[}WMV=5#1@aOe{-W꨾-Fl]n*4yR7P}ozUEMi* LЋ'gN3yJ:Y}|s6Y}8=2,V{i޷X$n*jj0ݩoΝxD6zamFw PLpQaǦtp*(!\Cٕ f Ov%jǺidV.*;X/(GXOzBJ׿+qQ$ZbT$2H_@T laf킪) xʫpx e_L` hԱ_<jX/gU9blPf/c/ e Í="AЛ}*fIĞcɡ*ұw^$4Y\7g6Ŏ31p`c4̲eL zX;lPTzp~fB0xM{K=3g^ ث_`NBbjf;,";,B!|N3r; "+z2vfГ9'ﰓ*B2xqEĻe @SD0uzKjN];<\;4ܩtw>rHke00ͭT4kh,UnaUh$:P!d-^?Vhdwx(fl+vkπ{}u\t`-u?/ZF EԵ:{5Cn4|%-s99mc`!b}|3?&@ ZE諭 =3IG_ /љ/6B!B+8gFXy=[aeG; &Ȋc۟otM&2%8S/P]wXڅpc$%"SBnx 6jn⌒ ׉őN;,ەK{^v'?I"tp3:b."3^L0"q.$& 7Љ96q4Xu *#ä"$.t| ,~y0~)$(AQ8 `9xu3Y))O#]3Q qvS7M!\gd&XaF8g'7Ip<^ b%~\_PQ梪oⲲ4*)WES)>RDv5)S]ɴY ! d@;rjlp'`Ɠc˧ԓc3Βt 'uOZx\`?Fyၕ嗞 >\߲ AegBeL"&Ny%lgv:wI|lE2 9\a4 7#9 !Za򓮓̂**GsT\y}įsIpBׂ7JdFqDf E;}2I֪La8;F#xzJYmAh# MqqK\@?,&<* -Vap x2%KSWGS*vt{0楗-81痑4YP[Y41s`ڮzvK&|bVmiV;v^7.Z藡4xwT n+~y`GLuKn(S)wyke3,n^fvq[QaN4fϣ/~ UIRXUjuS;ЂEәbSs3*.^Tյ.< c[tr(X=mT[ew_)EL'q> ՂK:YK^3Pye+)8K8|%̒H=b4܌CϞ o? z#SnS2N;tf>ϖqj&KL+eݫD0Dɘ|/ɴZ endstream endobj 221 0 obj << /Length 3556 /Filter /FlateDecode >> stream xڽZKܶWVi(>Kru瀝!'$GM|`Vl2fhtD¯G/"x&kfzX&Ӱ lU\nRze!Upu7-om܂i5a. j=,qu9Ta^*#/թQeh~Q4-MOGM˂+NaU"L.Yڥ#mc8[|}svtLswlL`}Pza0m>q筑#~<6qb@g[.=Qx5?a#E*)ǫ QDԱCX@*4cOnf:['>qA[ĥu>QxYelV &yiP0;=6&$9 48\s+s-4]Ύt  Nv47 K3qK|u+KbEiXF:J4lLx`/uލIcsp1Ԅ@hmt3gSvÀUIvo&&Pw<,~yeVM `ldd}KQ^c%q~*wҤH ^ bIAdIhU1v6߾ѝL݂̄tF@ϾNtU;#@  _<6huJyB|}փYW6})qFQ[?-[R0P^ͮ}N=l^\S5Sפ|I&g/0g_w>'Qsb2>;J]hQv/} !k(ɌwEvh _`Ė< s|%'3GFR C7;E"3*{ S0H.P9>#1b\9 q'qpuBܸ nD$,沙|+c{iArsLHIrheT.+j)32dzY{<$ bt KROلŜzv%y :qV~ 8>[S˥'itc\yRUjYXmr{;Z߁Gh_@4G%f9;IsYdVv9xy%@%t%yV96 4IKxxcD:g/{ (L($ M7iBV:Sz 8@-w9:SJ)@f7Ƿbz0L:e @n{>atաh9r ` ,_o޼[=U.E/rQD%s~b+0T^`X?=z#, B$6ɴi҈"8d+Q/ tl%bfx,*Wqˆx B}a#"08GXA\\qF@^A9 \Е، EStd3ry+[>URFa{<~<oe왫"ل^'*'g˫\?[׊~Ɨ ՛s)3w nss8|7*/r`Fj]r\⾕_ 8;ls;k7I ƃޚ0.c IMjdՆ53Rg JZ@ar(XkqJCĴt|Z2d_\cԼ[~<5Vp#&sj [}h& ;nRa=_Goa' Z&%J"Qu.G͓fYb0ſ۵FF*,fSÄ nkoeaͧ}!zf[&"1j2u/Xi;=ĥ _Cne0VnۧEPl0mߞ+ OsA}GP}uK("[ "࿅/Z1U&vG엠jW |oH-J2OV[Mf*%f`xҺaf-/N dgrnf+T݌ҽrƋkޔ 0WeC9('Sli!I&4yoPCtA˛)( 泅6ɂ)JC/EyTj_jZT!yJRNwmƔLvW {Fly#tOL !%V/PAߴw UtE2 Cws2ԹĪ MJ3W n/gUg endstream endobj 224 0 obj << /Length 2370 /Filter /FlateDecode >> stream xڵYK=ldo$38bĄ"eڱ]U͇Dk#9UW5j WB([I)ueUBXVBRFz}7AuY6>˦&§Pv7~leIO WAdD u5u e>/҂~[^jp)'u+;UG"b@:'pw"{@H_i.noe$p!'oY8҈,Jӗ=f}lGo^2,$щ4E:[XRV|IHK0l졷I]HO?E>H!їA0=qz_C(b`L%E"STxZЫ|?gK^DߴEYdgщtc LKmc7 ND_?402:`_/X"lӌERC nADZqmh?2q^$aB ޠ"om|. yv4<օmiH¢9?bMD+٧OZSz&BHRkKEhuhdp#K?ӏ&4}7Uem('27Za}H5y: 2Y-8Rf枱/]_@8$ C21;MMz<3ܰKj=^@@/X6j ltx3~U|`ۖN1Q"LU).́m_=Ev}P5ya4 "ކX!1CKV[4HhX3{ȟb%}>: $/i AIp1s%`'؄{.cwrsp<=! )E_L:!Yh7T$P+yx0E6QȯEѺo>Lɹ%QZhH8Aik9tUA낏iǽ%<1tM?Ӹ; QatG NccgN Tx=R`/(޶ǟǎsofʻOU:\r,tH|w fCXs2Wc(VCq8Ga0 CK^Df5Xq <<>klQ ;kOBBQHt5y[ iujP"!uԞR sS(&5 N?1isg,)`D!8{?Pl\@(ѐii %4g>82"/74w;ZHEߘۦ"2ߊQ ٰg C;O'.,<`dΈ mhዻ.ϴ& p WoB%cIH}(ko@oY~Xx1)wp0g뽓 0L 7N͒N>;"[6tȩ[j|"<}qD~Z9?ﶰezAٸHEKچN<_엥]sxt$SӕlN P%Bnk@招{ҵ3ѭ0X%hIj)HS$gwAftlQwCIH$4vt{dEvh*S:ONW3N̵k}ZߕѤ Ʌڔ:߿Uy<ӬS9'L:(qa#L{h /[ S^Gt;YwȪc#u>ĻI*Z4=/]+ @xߪw+k)Vaʽ=(d-0RGs bS~,3*[S[;W ;p״/-"s hHI{c:yf.i! :>PP"mxaCF$=TʙXQvERLPQCyIҶ(BR?ϸ[DRXVI,I쑙 6!ed>ѳE{~+/Q endstream endobj 227 0 obj << /Length 2355 /Filter /FlateDecode >> stream xڵYYs~_}F4Ǹ`kWR+֤j7HBnt")zj8>?4`7Wo.nl~.e4[mgy0Kd澘/0R8^Qn*i {m^6~D f(cՓ6Dκk]Σk_h5zCtc=5G\;7O4fHnSXQbָ]]UDfUqP;"PC1 ~_Oԧd>A=+3R晇f5FZ 'CrLUQxDM赮cd50Hg83ZA) 8EDA] Ի󰁘iGr\|E,rrܨ=/$͹@W@oq k&6H?-t#-Q7;XSXqQ\B`ǹ"OpDv%綢JRfP3AUj3OȐs|$O:M,ɉGyЛW?jy~&K.h#%B(9Lwu V A&?Z*vB@BBA[?8zaFNWuP/ũnkfљ̇mhGMV{|]=LYYnc@A?M Š:YӠN4V9~,>I": %?,I|u-'|㝋!j 74+RHkň_Пuӕتbnx'r1pbY+x#xtl$ ЮQ@zxoUо2e]V߼F0B MQe//H{ڷֶ n>@PډSm1$J OO?1ٔv"^@@f&[ 3PME=jm!Kn=ZQ4uvCO-I[BvbOn'FAr=0@=mc; ;WM]@whom k(x4+;QĚ[D*k y>1޲[<0YlaZM8P3zHhP畘 '4|\b'_CaU/ (Gu4=&;bLEnY;EmI9zv&2=D%!p]7qK 'ԵM"ζhRpl= 3XcІj͈e]V+XћJX'! pQtpUSowELs10m5*wHVB/rsӈU]klˍ! {ґ]ӂ^[ֲëyQ-&sN>BӚ`{SC훢i7znT4;NN {kѤ">"% |: Ys*?4 ;+i;, e_"ʝS _j&Ft ,GnQJLۛ;;}!>X2>;B:6ˬc˰Zx-z%6zCιȚBlȳ}6 77~?pEǙd@c~ endstream endobj 231 0 obj << /Length 3389 /Filter /FlateDecode >> stream xڵZYo~_S5:+~J0ͮ nmaRTS%[LIdxW}uP"],߿ꢎ"-./DEu\^e%%m|nVi=Nԗ(F#|̋&~e&͔u[m#Cov3>\^pe˴x~-M #ݨLoڞ's$sh~avd|nz/ H"Gf=EzYt܎OQ85[̗zn;qd$ iS`{rOJײX۲ i]kMգq\@AaoFn cp@?_}Y<0tvAڙ+M ҬmYl>*gT# P SwZ(tT4z<^:ȤA&z9YX{-ߓL,6[o>)53SEy]r8O#fޟZ׉~+SQrf|@1MQU4!R7rDD D5<vOqfqbdt]z\> Mz]QZe˳Eik=kۡMH+-혦QKc&iy~"*]IL/9?Mza|b&iT /)'b|9O:MA;!n9ӦJ:&}W{{Oӆq˖82jAv8 b_  A!k=\RuUQqAqVŌH!Dna.R2fpU"/IRZc Uh`QnXtߛ A 2/iz(2{)lg_7@d5ZFo/X4eT$Ӆ=hvWQF28z|*Yr~/ޯG̨7MG,GMSZ)[uEF1ȫ(IyA!/ =R0=e zidILmvv8 wx]y&`-V@?\NW֕eFmϰ< q OK 5Ok:ȯ3`ɿlgA K@&WC/CՇ *7QZupt)=!|HBs2ѿvc?p\VDB8(%;`3෣Ĭ@`I~.<64h%H8gێluXveԂ&(;x4k?%Hw4N?reZ4V媳4RVSt!r6َ#6Xb:b 8h4kH6x6\c Q29.?o1ʑcVd'qʃJ1w[ٴ4¯KFbyRSއr?sW&,Y 8ՆRC,MZgB]?')XN}H(dkۛኣ? vt Ik$N8FJ%!-u̝x\c*+¡ 40"qT1=i)cΟ(TIT$uTU w& endstream endobj 234 0 obj << /Length 1912 /Filter /FlateDecode >> stream xڍXK6W=ZEY m {kWm!l6,{k83EG*Zݼ.o^Vɪ4NWwHUPeV#mZ:AJdocc':ׁ6H1$֛8:7Z暶b~bwp\/&`8_8hLo+ 6JV1XHJ*sG]7tdZ5,lڵ *uMӭħ3ˍ;R0PWN>:پ&&lل֍EeLkkXPfט6=YUni *-aj,&Sb7/J*lCtY ŷPEq¹> `TɒΉV'<^|DkͮQT +,mͰsX=, } d53. gDGH~;Ó}E>Cv8_$ |,q1t}DWLV*7o0x^ nk߮_07em\dS1q5=p P14Kӳ}Ep8%ޟStZXDg/i 9o׍%$=T5o<,.܄,2ft]@GW6cû/ݦ޶aCi4B29c4𵦄7T;fI A9M|H#|iIR47҉oq ]Ÿ;̖ +[ 21؎#=:h6t oɫ%Hi!(U@ɮf=Sw){!yK+uhZ168T|߷6-ߚ)q7HSܱl nKsR+]j.B H=>rDjOXmlc4"TY18,ޠ41x}wLME5tVF \.@|ij:ǐc;n=Ζݾ[ك+@zc$S-E ]Q|xK2TgPQN1ydSM]fw6kP k*6Z#3`Y`1n/+E_+nr-$ZzDA 3>".⓹˱{:s0 @zG/ ٓ8(@r lUP*(HS6'ASOle1B+Zϱ M%\}k|gwuKBOUM7m#:x1+3L T( `CI yd/dDD' 3z#~΅ Y`x1̩\-`b$[JNii}^NBkmsy 7,fELݫvk,_ endstream endobj 237 0 obj << /Length 805 /Filter /FlateDecode >> stream xڅVKo@Wp\@}oo~ԑZUjK@썅%J}g 43|> ݊ Ib9 6OƁ4N6b1I$pHf_VˆcMa4#*9MgnkAE㱖*-kk+]Ta$(#h}s@ s479=p!_J):em4^2#€ś nBtkta$chYyZ9Gx>3gABPIgekI9e }KC d6OoX;7E2*x4Ҳ[9a\y:U\6//mi52dOdAF']]F9aHz!6.+?Q\⟗Р }6ѣ§fߠ bcg0#A֓Mzј^!!m5IF džvY^l z&EP;Wis*3'#N"pIq5'p0 %"z=l'b* ~5:r5GӞ&#CppQ\;@Wv-a%Hb.:ѡ 0)XMG,7.bdFݵC5t);D"/} ͞*X[pT&=곲ܴ[XhȕS!b=0/׺O,h]&K. B.mS!#X[> stream xڭXKs6WԁfB {in3̴a #P]wpz$bo]N&trͻ\ORU+dYM"bY>%0}hܘݕR -YYI3y0r]?8ĸj)V2K3eEL|暼L5'où5\+om-XEצ{ %K:3EI>VP bpB*Ƶ aeIvnܘB.i3QXSa9%@;o5'!~{qFo)Jms(9~f+Z3l:yBn㫫1v!\ TJcw׾\B:}@6Lsr9t5fćnIvkY(<,vKHJ@\l?C(-6WbeLB{ , MnrE'% [W ]Đb Ѯ΃tw*8.\;;wF,&ay. (hF,c( ,KƵMd~봳qhG,}&4enXD 4ܓy0dq>/b㺭yЯk 9(Np3} 1p=Xqrٹ&t |@\ېG>k<hlWc"@ص[lcTHD _CxS\?]0qVA =MCV*j (pp=Q|/I endstream endobj 243 0 obj << /Length 519 /Filter /FlateDecode >> stream xuSKs0W踞ABҴ0m餡 7Z _d@3dy^+C]N}LL!Js] &HHS)z>C307]s hMg]}].ҹLD2R!tNO@3f 2pUveb=f@a BhQHd6WPoʹa%4pTOPfpmm.Åb֙`gAE]hxVfk@+&ǒp *?Dcmeplbӗ]O15n\>DKr cm[mOhd0nH!v4D2 C4S}fxx>S |Z}$Cl‹Q*VdLNqdshDz3#*`U.mÖtm)]l1~@*5ncԔ0)S0>H\_%&L]H&9n]y%beA.ʥRCW]oW" endstream endobj 246 0 obj << /Length 1989 /Filter /FlateDecode >> stream xڍXIWHO-Adlacd\#$p@~|j"i[uub߄niw*]Pı" Q%v[psOm+DA}_aD&oU$Q|s[T{&>x^>j*"72)_N[ˢE&X^I1`el,iLTL*y- Ox&5a~k;{lbA)f$tbT*oʛ,"gVK`ѵTU~Ⱦ>W_D{郄XXMc+NQ5Cȶ[|]-3>bs2x &(IiDf d4ezCK\i΋Iʼ69*&OK(t8I:3&#e̺M@.H-TlD)/YE@\t jrJGm)7`mMy p+Ptn`O<گB&Dχ‹ +?+IXD>eɳ|Fus f{CAB!x &#öh=u)Ck+&w(뙱1]SWTu?K=I}ܟ,(W q!mlG>:)ǗːV%8vqZVφ,d($ZٷgU}!QYtVHEo>>˛vgn_Ei^Xx y& ͆r4 Sw &){6țW0r^=ۻϷWC O)+GX T^>SRE%Ht^\:B!:,Ptdα(1`̙b|a;*iI+\h~W R:V㋎W/T/xs.42tN3cC۱8g\VYʭF9;K \ 8' "T!⎳;e4ntu/c&I\PsYm yϾjj=!Hpo@<2LL3iOh3y:O];_?ܞ14t:'ZX2)c0WeE#,zMcStN1_Ng^HjC#;ncӺ]*I6v\6PȌdEuop|[@ ͷW2%Tynr\}yL6=T7/[&\՞zs4xjq==tX "||X~yۧƶ %<qϋߵ*t]Iŭ ξ3ũTq<~@# ]!M [Gخ/^5,%<5X#_'p|R"ٲO2PZ˜tf&#ŒZk~(2-Gt tC00c+%4^^!J+Y7'_x@Tg +M߸~u=‚hV_I\^j:W4Mw>ܽi*8 F,ӌ_^ hmSb%IцVG!&p(ra/A?KyQ_wEY|%u:gՋPQ82rF(sCe9n뇛Wm c/%Xҿ0A.Y9fiRB]ޗSOK"=U*yёIj%/~jnKuciy:л=s7+@+#] O lC ]#4CIMA4G-$GQaƱ9%"+!)22/5#] endstream endobj 250 0 obj << /Length 2039 /Filter /FlateDecode >> stream xڵYKsFWV0ؒT$$f.Ň8$motҤ^y_wj>۫l4uIˑE4FI~ Kѣs튺jǓ0 p9,E'/_^^ﻰ w)Bnnf`cߊ$OI9&mQjNW~bUՍ\Hp4c d4 wGDçQ<JM_50 ѬXi!7Q-8LlT!g@=0oC7dSw|1ʼnkAbs%yG*Ç BqsL%@m-W! [.8^He A$#8;\/LCgײ#+1s22p7axVfŒc-ڲx"I~~v0i^,=0,:4<|魨Ӽi6xB K(wڥ\dѲ78b%)z m\f?j(Rƍ ,*m+@WP!p FR+%pcUsX?Wi|銍,Ձ׷~;%%ȡW{ (H},Ѿh o࢟|>Z4F@(gFٲx>P#a/Gz-@71s7xG4~ardjjd0T#TzZ\0KTкB <9m1_W0JsU/tEfȷ4$vWL:{PgWEп(#<7L7QrþfkeM@&2ұYE0b Z} mn ]_{~_/ͯn8t QEɰj SI\[[G]:vbmwN=Z_Y@<;782>\PS>uʒ'Jizu{~X1T=F9b+lĖ'LcnE9+Rgc4 ˏ2IQhp,!DnI(Yr.&ZMQWV\QaQ Xnmr2+F_]yw?[^:u!Uٗ6nk뺮5H58Z;˷s~hHr;,ś~AϠQy4:L5I.O[WaA9PS\6'=QGK_Z[ (*}R 7L3כiD̷ ؛x rH߅9GP55v.ZRvP ?!EAfɔȧurp endstream endobj 253 0 obj << /Length 1118 /Filter /FlateDecode >> stream xڵVYo6~ϯ# Č$RlhhWͿ𐏄Np  fg[gqD⠘y(eAQGi *bg59r&$Jɚ33l{}4bp36`JbfVXj+$ct#AD_%Ux#BluGN )Vy;]ZZY%u=Rwt' td-l]/޻,]Ri>Y0nr 3wAߌDK^#=.ϊ7Ae(*6Nkl,VY`h!5D PͧWͲ̾#}y?#F1a8 nJn|,t endstream endobj 257 0 obj << /Length 1865 /Filter /FlateDecode >> stream xڕɎ60zXEj 6 P$ALOMQ2=V#K$g2߷Q X7:Zݭg|_>{&_avR cViCh+xuv덉7*:΃BKvj8rzZR5C6|m80z ߯(Վ$ڮ7pJ{scQFHD۔['v[٦*8V}_5w!@UMOֶEB`Fa`ѹU_q(D0J(xeVd8)3CӂY}W 2NH QhZ(U]󁸅9n3!gv?-jGw"^Wv :ZoʖdUØ({gA;q4v כ4I=u=AjOrv|pvQ1YAU˝s=,i.~FskmZkL&r5{/h@E2&O ANa:εg^Jܖ; !ޏ$" ђTN]+9D,t|YxZT$Um) .<*-ײ$ *a:pK$v/ y3[S\녦Yvi >P,25wsa xQA S]BWҎ"F%*3P@_Ga+|L&q1h0X30sW1}EMryic Frl Vy䂇\򎿔;Ơ b#V3z͙, Ww<'4sB*[D;h'Å/QJ~GӬ}x2yO\7Ɠ&`:e[/L&9U!kV0rɆNKg%ۄY=FHRKK.oXQ> stream xڵXݏ8篨xJ%jxXNXumH*NYv6]{nB'WOœo(L뉢$0[M>G\Wt8o&: J,=-j+“ -Yn'+'FLSOru՛Tzg#$Ny0pbYoSNcf"ZlL*Z6u=(NYFŏ6Hq\ Qm>Up"ɌSɌ1b篪WŊ<0Ig :ʘ !X0R":8۲+8'H=߮NM6cB&b0NT9 oFD?|1aI;z&0i+-ZM#48дŲ(Oy[qܾ8BF]_?]_/|Xjp}|ZˣId? $QR7ў!("02I]ĩDEݒq^b/aFCFm8Kx@L&qdh!L ~t/Z#`M~G7V\Y*I|(+eG3=ہvPFIe$sOuT@fФ"&(>H): fꟽ"1,Et3P|ٿ>0K^I7|W˪$2 # djdN OAD0HP3cE 6-0]YK /i䶭J[ML@kdqiFv֗b?'ݭ#}4x # Y%9ffbHqȟa[lfvьX a7mFV;fqlU egGzp^eۥФ0 CDösy$- \ v)_M" km-ZRBq${ȡYH-n{UBuM0r@*bȃ0I13b3l0;x`3Wř'BYW^כvqF]=JOEG#M&Cw >'&lB(IGud@tx/f{ endstream endobj 263 0 obj << /Length 2179 /Filter /FlateDecode >> stream xڵY[o۸~01K.[!t7H(vAX-yE3b)n}2p.hxXW~C.b}"NPIXo./VJEv3g ۛ"O-mS6]y"YŸmX$V/V:IJ`k$I٫5 6|Jk8eY!o˺>(IeO : -M5p p)ʯQ,LU ҩh2ff,ʂA>|jM_iu}us~bj^uXJ}{M1fe1c.AQٙh82]ң,ZjzqYyDldWv{[G3ǼE[4L7ieyv`JSxyZs:yGp3X ez%2kiX7c#4?1T7[}ɦ+2Je0iT` )/G0*%Jۼykvqk`$+9d=l &X i\iWt}b)FF 6^4Y%EHZ(,ywN|xIɡh?":EO4}A"r7<9FqqF,=*Y8?Nek02SUq*h|90Q ~ .I &+ڹB@L|A屏wpX &y;:Jz,STd2e: [6T%(9x/gh$Be]WvJЙvt=ˤ@0DĈ28 S4^҄P(M`M/ >BΝBf ؉ow${~1rKu t Ѧ;&厔Ag;L džVFfdVVdY",.; ߎn pDD"*dþo^C^PGvμyX w/)l@w>ѪfǐbYSc̝Y}fSW\}{ͅT5.?=۹OŐ{xmXKpMu|-ӓ̗t@lt5Bdܨ_)_m[Z>_߬ 0K_8Bu]fd%.?J"c#ґ/x})m&N>6FCc܇ 8nS[pPJf @ڕ{^r,[iI#~Y~:{-}u040&;p]iv5ܵ/3iJ¦]{QU脇m 4W)HTt;΄xa6(p۲=mXVj]M/r4 ܣQJhp@^%a:oS ჼ֣7{h܃=4k H?E۴}0G<l,",%6^!fxш2 Ia-Hs+::ʜ0v,G<^^!ľ9rOL#a0CpJ]V@3]lг TF!"e&^` endstream endobj 266 0 obj << /Length 1296 /Filter /FlateDecode >> stream xWKs6Whzf,P$SڑwȴjzHr@D” ZJ}EJk{x: `wow!oO+wWס7It'$&8tV体 (YΧ(ozr?~~\py xYIF4[_}yܔ1b(#@p`]'v̍t$\m49>:;`+,btU!$1bs| <2pS0Vw%!pFA)s(=wR$i2I YuMC]G{$38R.G>XfZSGK}uoVH؉t1zL"q?nTQO_~_>0/~^G͋z^0}YA`<3*< IBJ4aðHjVd8~rQ}m͢nu[A4PDf3tDiܮҎt3Ko<]ٷ* I3i#fTh|]> 6M7c`Omϡ#*XNcd0J4C kfR01$4*E8O}gOS䱵ÐgǞo!2D( ww ޗ܇+ YWy;3%/"o tbDf3 .| 0 ^o`v}C74%aڢa u,[QM\ᤁ) ꙬBFT¶XDV-cyM 9V5u mk%%oFUcxojD㱏9H0Wrũ/z6K%8̾xa=3]4am킺`b/sH:9 Wt\^J_T=?h NIms2{&~Q L81-# endstream endobj 270 0 obj << /Length 1957 /Filter /FlateDecode >> stream xڽ]6콿">`Q%[n.Q.;)JmD(7Ww+z6/^,iW9_:aBn1R,Z hsW7|L.9Ks Ly4Y̓c}!fi"ZȌu3cd"{LR)t03pZK4#@6;\eѾW=^t9~W{\ą,VBk2.PgY&gX+0OspIѥm.x|+X2r Dw&᪷d*U@դ(,N;JG;;Zξѹ*mҭ#,a]v@s.bU"b4<OD'.*W\.`ppz۵D ]<@դ3s12I>C@"څxL7q+s+%j{:Qrn/ xY^=e@aS0s%4<xIP:$ 9)t9 &"Lh"ET_= _2' ~INWoTXqz)?aZL{SXx+7Ju6m-[rAB+[BDHXz}iOnx/wEX ($xL$os1R'OףIڭA;\&i ߨ({7"b4hw/ cpQ@I6uZ uJoЊO_T7E]lpFҳBـJFso%N90<1kht"%PR,#!ƴӔi1;\_!mb4F$9z#Sq2uW=[ ETɔfe3w%ޔ 4Fﰉ{AUݓvp1cXK?cTu7@I-]}_AzyIS endstream endobj 273 0 obj << /Length 2416 /Filter /FlateDecode >> stream xڵYK6WĩZx$ڃ7kފ57+9!)+ۍnęLEijh4ۅXDӗZ,8.VE.6ձLY|heo/ʟ^]?_}^l$B,ZYӮlpXXKiFscxY? ͙ % nWRaT]-I~WRRYt<~˖:-}rCz~RiT5 ,jfc_}q㨱tmU>gR7Tؔ;b62m jFU&\ܾaк9H6QSR3)QǩwCPnuA@dkicZ{O8cK3$x vɴ4Sc7}їs+2Δ=oA4۰*5S[m˹‡bƘ[flC@mMYM<dX}FΎ5Ÿ 3iduK)NN)yĶRK\2-LL5E8{W^+wN\ˍ.Uힻ8$sEpz?r)#4N"_ipr3Rt4֫J4úpG ïǪѱ~=2.!GX1S=fή@\xb_)T0YmgΫ[31-iC&fK'p 7߽ 77mZ`3Xx? s͑xuM@4NtPy@gn|N4$ $7 3Et6r'^~m-9د&cI+i `3%9w, ќ>i)"Sʜk \.p  RxyceSuݔ81FO޲"JjHp4 MU@' =7rjR16"hYo`<q wd,j;Ra0H iԴiW18[@eWk1HE)}ԳaF@:j&UѮ!*.z ] ِ^}2-`l)P % 8l1+>ECijģx% \dӕ=-?b◫!?cE/9' *vM Jǿ^x}y)S=iڥ*羒:eQy"{[j{f9{Xqv V@V񟺉Cۜ.3w:fFg '-8%{)4<67gc(JF5@+a56 #By0bbF.S6F$\<ĿoPAb2CJ=.?SN'2) T3aZ~]u]gQⓛ&n:[vLbt ς{ǝpvr$s U]vMtv~* (D%M)2h։&ߘOF{aL/6 j.;D hBΕ~P`<D>p2q>%K'3~وa@6~8iLxYM66If~!H?89g-XUοKj벚?50sMg؟M:O؟dI,OAl\_JcyC! Dq3q5IQҚ8adb2VJ endstream endobj 276 0 obj << /Length 1793 /Filter /FlateDecode >> stream xڥXs8_)MrmKi3 &̓b͝হv+ /i{Ov?NwrѩH&"INwVz]U޾ޥNk9^ -5Wz*b롨H֬.KUexD/ڌG;8Sm-U+Ձ@bq4TǛ˫%Ryb(M)Uw97o7g״K||N$›؞$A@\6}fCL\e 6UiTT;./h9#cyAP]0žB'#ËЇ?4^B e TckS[DVN1C-l!|'bl{*FNOz°GRm?Qd9|_x<o!y—ɦ(-:l6u";нc(_[[V$uqvKZ)jTuKL掍5`I]iT(]Dt2|t:Ҝ^X9S[J~"ï7;\' 2EKE}j1 5St2EEC+qp/h@AT!ߡb{u+ HiWCbе)Ng+%$X;歮UH(z>;ӫѦy?eMSMC[J5薔0DGbfhyv жGIQ:qj`NC|g>.O"؋`5pus3 /7Mq8Zmx(2qN:drO<2lt;2I)h.[hm"'ڶuSϺC'Cr>lkNS ؾp V88)]PpqQBTPa#-1CVcƾ!—90i;7n:! 9Z3p,0ґg e럩P:?oyOߞ\^}zMz#o/ON.ׇecN=9%IЌv3 C'q{809(j:j-U,Y>+J2EK>Nq5gٱōG0 )3d3U3xxIMcJ#LV0!̓>kMe.LXq7oT2@uOhh9XDUD(ñX>HM$d[nPZ iڹ~snD+dpI 19p;n^(RȂ $؜g8 Rj]WEʓUApRҍ 1t{vJC/E{pvHDԁ}x*n:@V |i T QPӣ-X1* ؏iӣ}@  -gtESe=84udZiA04P![ƻk$t/ʿuGt;*2W+PmG6Bk  w3eyP|׌T+uB؄p$~=~?_yC #&lP `Mi~> G9- q g@!!1.B0$# 抆:cgu@K)pAtđ\ ~UT=+`&լkw8E0CZ係+_]'Anm?Ȋ_Oƫ[{ .?j!̡9`5[ F;ޥ/%(k endstream endobj 279 0 obj << /Length 2566 /Filter /FlateDecode >> stream xڭY[s6~ϯ#51ޒɃ^wؓt>"$s"$U'?8 )Qjz.߹636z,HDzY>+}T^XμrpK?r$!x|p&`W`|}suw?%a|=(=.h>X*F"K Iďp#DĐL=X"&/Svɪv]7۬+Έ{X3rxv6r$`DbKGBP?(0p|n ~i|2 ?!/CEۡNHIkev_P 4-2bE #_aﲢHMIg,^,YQx#.^ 26n̠T*ǹ|=#)q=WFYmrJ&|!Y5;X'\g?+3hk _tuk J{R,ʅ^>t RGNPKÎ2yHo7S fU' *т[.a8%=D'zR;{TsXbc^-$$Vʬb4깈GG'kVO;ٻ?{}|wdϸ;+*K\``\YyV+z% wA\BUO9\|mm&?(/dڃ t7şZʁ44NX[Yq˩"9/ H9XxFeȖA@Hl$. *0hWýc+S\Dg9Ő6@tgDH*!,3!DUUN=I_Yf4 s}}>vYRH8~,Lj IIu. *tu '0-ʉ<*7*m{KHrں)ה}V`@lw+('̘Jbkgw]_\~XRto`w,>ܾoi8~uIov33' woOAU1Ѧ ן,  ;W65蝳f2tf[ws?rIrhxө?J!>HT-,'CfVp[7 vg2ZMlD,)~ AƠZCCvת 2_Mg@m[31"ryH (א,{S /BECTpT! =1jyGATa 7u!̒+n!lD-q/3z*[T3k-V]%oQ 1PX+Mxt?NzLz+l`n !jx`~Ue {NRThsp⚳FuJ;:XtyjJP5`!zd^}Nu'*" Pmke=(w3a't:P$cSUۂ%$3uk:$WS d>21ɉ S+Es9_j) +[2'SX+#dS$>L!E 5Ro[ dg InvYfT8WY j݃BDYQ9|$ 8$7__fXng*2p3QVcWջ ugɎ__OI T*^4NG czo%nB Nmgz`ymzt>+M > stream xڵXo8_GfDyvnknAXdI\Z4$ pUxy˅fZEj-B%Xk[ZMH X1!u:`B#y^/Wqvo+5\eowLpMԮˬ[0k>r1[39bԒsx8,iMVNO)y6|a۫ +c XqthҬ6+-IȠ6mPI1,ꪤEL9foΐ"(W\0-@WVۗzȚa&k@ h ,J9Y18̉_Rq4<5)Ymux\aQq(9(6ЦfBli3(Yjo_?~ZUrJ1ЪrŃ\)09lLLT;j7ڕx{Կ\x6xW|[94h52S`dTkJ(#K[T.AP_XYq2U`5+%L dVpVd0ڞ485fw*Xu"R8MUo?Lm6WRV>T-i]tWc`%+݁1CĞxLEx8?~^?\KLLY۫3..LH{$S{`XR:RIk?v2Y9/-[f DIaFCy`(HQT@lc ]Pc}Fͩ2x2[$X\ۣ, DdjfƎB~˃ƕ <( Kw<]~\'@ f:2Ryuw\8k85U6{D/TAHy`^}mL!_J"|u~B ,C&t/IpaL1("#wḂr<@!`:tnj+DemK8 pc掗˶o> %f8%I.5WSܧ<ͩQ6s+ˮXoك_z B|þj `!*wR Y!ړaqDPE)jigSUrN#@ -;gGEaЦ dZ }Cb>w,8k_yeM;DY@(J |?+"#l8Ṻ1K5mNǿM߭_ endstream endobj 285 0 obj << /Length 1015 /Filter /FlateDecode >> stream xڭVKo8WEV )E.6b`Fbز%D7~l9EO"of>ȝÝIY;Q,ar*<<I*åjVdBw9.ڮ7mt=d d0uu+>YEM̗t얪]n_Yھ L"6ը+;6BsM)R8`uN0.R!q.c/dk(ܚZиu^f~v/usVoF;Mʾ(P\y@< %8CcJ ]S~iao5T ?v Y,b}uYA'uUiS=LDu 40cyF*+Xx Xȫeϋ!nٖ۾hp$GO, Ǔ% msE н<;7f1<9L"Y[Ouk*d[ud3("2 G^P _jv j) @5 Q)Cfi\ شj[KU1ޛ>oj ٞ@,2ط!/lUDurYQXOci; >HDۮe^>9Ne:Fp[@dĒ7?To̜E2NO&Kb& ,4 & W _DUp6+ ,0ͼ%&ò"P;Z\[Y%1u0Ͷ+lw9A|UuzP]ѫx*k-F'#w惒X^b9R0L:sĕM53s+$ESic'΄yk[D4ȐnX.P{UPXntQj!] 4y.`X_=M!S||/pz ͻH! $&&ͱ endstream endobj 289 0 obj << /Length 1764 /Filter /FlateDecode >> stream xڵn6z,R˹M- @K]!ZiCJ|g8J+Fa4'CI%>HwW~ˀ'q,* EU&xtQMYo>n% e# <›QM ﲿDYݴ2*'"*a^_o"^6ʲQ ƃ6'"ZޝOFQ&zs8 rtHڱxLhӺvf *X\e)@DDvr }|Gڨv{Tw׆ݚV'=<wyUxíjyjj^Dph;bkiCd ڌdǗxI#C+jԃuMB=q+Bٙ怃MZ"|st @iDVãT9X͌#!ke]곌89w "ҸJ yqEQgNm) Aݍx>l\|c;|#3SN|oϘ8c:l͗Yzs}=L VJ:` asI+N,BB<KvBin\J2 @ܸ,ေp*Jt\P}pJh"t<䊈K˳˥QO+@ʫzr%Ef0+z3\PrH M}A۝GUscaMxܛTzf?jB=ҕ\ak25BS֗Bӑ-E<{M`5`t'@DP5˖µ po b+;+W,;0/+(({.L+YkirVwbBbélT,lh H3g683NU ̵bH- 9&p}Bk_\@2?70aJYz.BĝgD;vmCsg^ͥ2.!Za,UKu+IV&UU\ ǫC00>ثǀU vLch)@ I!76e,8V/ACنM Mb"Te;Rй-?p䧾/U=p&Ti{>,.n.!z%D\ia>?i*y؎=J\8Iܒl8v`z[> stream xڥYK۸ϯPDUh_G'e)O*0$$L 3~$%^$h_`9l͇H})2Sq#Zo< H/]i`Fev]Wg{9r+j%9x0l_iîf30Hn@HVMлyrhsЖahZı=u8Ty2cSγ*{:Qm5 Wyz\;]qJ_p֎oFf7"9RG"% Ht@92ݜn5H/-uR*,cͲ?GiaȰ5MReRL(? 翛ŲL-ԭ8x[?oS޹;0Q skmښ@Ӵ.yGkj 4x=3XЛt8&eT.{U%$:Shp: H 4M)Oa X8LOT<u؃litfٚ); 4a2$ Nn:ģO7Vǣeb/KU5_e!#ɪE ۏ~ZFTpbuQ5#Ǖ4w@ʈYЩPzsYl%oiN=m^.D :3ۇm՝l}, p_4Z7Cx$1ey Aw Ǫ]/4ыb,JwV7ir`˂ǪXu;ak tX:M'8pW׏UNl ͩiMW"\< ` DjqPފov( *aObL M¿ῶdܗPؑM@nHHcPT]>[$:LK0pVR%dH0Zwv|bZ2pI ;!mqȝ_n6#EAK9CcDV%i[nyDž`&ﷅ njR[vq#5{B56OlG3pwTt˫m`'T;ɔZ''7XL]0Z`V)ìyVγ"L1϶GUpƋK1܉s1A%7T? e^6H] r'ΖPJL_.nY}ͽ#B|@ nxGx"TnpY!% >s!g{s규ۗЂ*[OhH [ ǁ;FFW)RW#ʼng"[E.G$[DF_զo-VaxvMuTNƚ}‡We)ASO 2vzg'UbƲ<))53vJ%8XSTh w\piZV ZDRb{sz2[ ؅ӯ-KnfB ÒC#WrTh2P^Yr(fbdER범X .]sa\VP3=l1fd * @" ۥA'*ӝ;Ci}BNo&0Ž8Vԥ5(}cCA-!9"ĉ=={|C [61$MEXBb9,MuzhSl>LbB x$ ÿn-K((Kc>di&=scԥHi+5SD!8C P Q׾q?W d+5s %N@Ibo]Z> PHO /`] E`)h–jV3Ј=T^PPYI;˰ϦY+档tQ3U,hszMly|#."^I YYu.y'gyhSFMYWJ7BWs|)$'qE-9o5l]yg@JotF_h ;D7-*+9D!2|@Wʣ+"2(@18~BoC{Ќ+Զja›fGjCbW.)IRjvWOڻ'T+.}$q_(t3K]~hG?eD~Nِ*Vbe!.{fPHJT>]lNg&RιxR7J~kxLq5T4A@0l ߖǀ,rn+b|j$>w3$Wa: yc{ls%@ sG*Td7 endstream endobj 295 0 obj << /Length 800 /Filter /FlateDecode >> stream xڍUK01׎p8XBCm#R8 gnAb3"}PQŪ"-6xTnMƮ)e\;-5 9LҘ/\d4hr]端wKHəR9&19W-`[t |% z)3tj 1QԎ_ D{?Wm*H[iǶ3EJ16p*N@73ԮH8\1R&!EVVd?+[} DaO]M(ހjx8khVJV.ȱI? Mzg$ $N!(W[p Nc;4"ͅzM%WgV _AQT뮣=~5A(iLgO";HN;߅O7f79DaWsL* Z 2j+N>@ tӤE/eߘo7WLUZGښa7 8RpV%ly]uxƒ3ԄM (dc=-&/Y.ٔ!ؔ+Vyg[ R~_g=EwCF0zq> stream xڥr6_Gj&F''icO$yEℇ#EJrӤOZ.>޽xg={FiO"ITn,b(Kt0tDSw"M1܌PKڴ]˛yFTUޠ`2&IySeeC{6c~2GF""؜Tչ*;VLdJXI sf:adOÒ-aR?aՒLSʼa05m;?qp>S@zp3 "DS/b[g>^f{ j*w0#PPƜNA:NX-Un Jh !9Vy3blr F7pEo{uej MQQpv$hm2r e>6h/LS_%h(YFPn n99Nq_ 弴"ʇAB=PÉ y\Z^$Bc,"iE% ~PDHBeimw~ vPᷫb>&e^nqĐf]Eɦ^Z0UOhۦz$Z@7/ЗPIVtr"zWZWsS*R߶c"h`S@r"MKnFa67:3_f<9a*aA,d/N9sy:F3,׻gAЍ"L4# (ͮD3Z_t1.{ڹN9D!"!|"3g?)W=Ѹh1]cX6G/c+p̣H 7м`Jo6]7 QژM5 !7 "/Y:4ɔHvp8 @Ʌ?R1YT< X#ݝD τW/x 9u~('Tֻ~tرښP{G`\R^_`3Q?l 8Bc_{06rL Bi: 7׶d@#o餬gw~Y2ː4f P}Kd9f6>I+@mor\B3O9` TFk}"NR+*97Gmt/Lϳq AH/T8=F[ Pޛtj}FD8`3魝v<8XEw8.h f<ΫP\^cOhقet`ZX҉)yz%p#}uggbj(W+/MN`)+.ޔ\<){pN:' MŪxrs@_} dt?v_oj͎2h@bt.uKFt%[\Qe{8J66"x U9%5{y=O:Ѐw?m)D ^͑\nx~ uHbr-$[D?> ϕl_Vqe"e~7蹍R.eJC %auWR:?@_Μ%|gM7$c> stream xڍYK WLĩd%:Ne+x|͡Ek/MQ2'h4.&o+EwwQn4w6-r&ͳ`\dp>q{껱jH}ݍtV`]{,d̃#3c7Q^V8AԪ(k?66mNӇfK(av=ڍcm7hx=mhoۦ/zn8v{<ѫ=3~|=X{eiæ=|Y8݀5[XM7N&i&Δ5YG>r/OwEk,3:fVQЭmxQ;22h{3:b$_qL$[azw6H ު,B]<*q/i> >KcK33GA#i`?\sbv`e6@yx @>qvQg=̊W iI{)VI3< lDNͮ*7J;ob[Yaq-"]?$/oJ UMߣ$ ڤGXMu㕗輒< *!Mq*f% B˓M=+Yܾނc(d\m~~n)'2/_5HqRқEEpFt+0End![fD=Yϭkif!t:v6]4BˋH}"ϮH_[:N-;_*!Jae[Fow¡p(RvȚi.-DCxizC)Nu#\w54~x)P|PcK::Q|˒߉Eq[HٺTM$ cnov2'1`^"78*u~oO4 AUBSzzڦ FSnM+Jv}FsM;<"m&Q#e LX}aRH3iίUs.-#C(A,@aVRʼn{_2#5/"]fI!WEjE3nc%ó Lwj)u?zXo*qFBu>!N3*(`抏67 [%LA𖬃WoFVNjEcucS|fs\MN CpK`Ͻ`N` c ;S&kԺR40X"="_?M9z$|D͙&OLt} ^-B`'IJhZz$Bu R74ZX KąL+"еXSe7O%"'P(IL [H,\ LQKmN7Z^zQw=͍] *$r ͹`R~E<ɷiTPb Ib.5C3P,6r?iR{I̊' ƼL)8¢3#@ V]K'P+_<ޢQ-9 aݤm+Q=V!ӈ:]Oz Rkn!~b73&hV`5Ϋz )x [gJvZ* g=H7xw:~$VOXI=%'β.u2='xSёDu޷s^V /][I! tr6oAK$}]겓"|KVqO}q%͟ܙk endstream endobj 304 0 obj << /Length 1034 /Filter /FlateDecode >> stream xڭXMs6WHX( 0LVJeJ6`c 6k˛μ ܩl]>WGPeG;aR W5&zb^C]ryߌFPK醠 `{W&އU$\ĉ♈Br}V{LT]OMB#⨐[X-wU ɀXxUu9w:+f!+~J ɞ *,44m5%gi{)m7A,wUi!Q`RskFHt8J&i={$rU>eؗ\l@K{쐡O~.o'TZE.8ceDÌaEx43vy_[}ۑ%^iHZ@nr iNӂKv/G8Ag9Y:Oθ$8V`?9!sf=H1 cW\"; Ե1mMFϕ5TZ2e4 } !$RIkS-e+D5k u^'u>u1gp!$]>lid[BjhSf^|3.۶^([Z>ghrpXcPMZ(p9 A+>v?1;I(K8mѕuaX6U54= PiqԒIr JHH::ӦO?-U,%f6ƖFF :i%d.M]9Lw"\svs\}`H*XiAկ_Ў)2"~ // endstream endobj 308 0 obj << /Length 2531 /Filter /FlateDecode >> stream xڽYYs~ׯ#U䑷(Ub{KEBCxLxVF#r4VR3% AD>ۀ?n/}I 5XAHfD/_K%‡cmml{d8~C,d_`IG>-a(¬a1Y ݼ b-YuQ%qL E|R<ˍLBۏcgD),ex1.|H "4Ix70]JMmńJU7$}*ؑ2"8e*f~̥L*g]c }ד&=}u7Uᱴ4VcIڡΜ ?% 7k4 C= `''Y5Ed J<:adW 911\jA㦷SNn-6cc4,'REZ&1~D+NS&vK T Q0(dUǎ&v{Ҍ4W\{alF|1._bCW;ϛ0nd1COSqp,mBI2|zE m\KSr\ R5ppK5 \G$,J>+>*@-<&2Z C~Fo} F"wl^tE/]sRF ㍪jʣU#24ޣy8f^tF 5Q6+WG" H;EVSn6܋Χ\C|-cYTZDJ JDT`-Xhb MTC$ԓ sUc!09'E\ݺz,g%9dH<>)n0!6zۊ%sp<->Jܚk#`>0fafIG"%3PWM(;)dq̞y^ReL 7g8pYW/S,|d1Vږ󁁲qWeyxL񈡽 h6u|j| ygO'B a"%} o>P>AJ9#8-p+rqy" ;0pF5i4HK',V1,eϼ`s"mwP.6VI#*/j?3fC#"yƒhr mtypX1SbīHMFͣ c1 NEyh֐"uK54iOGeDkM jSt=وMY/a_Xps9uc -M\ mW4hU3Chw+Ibix 3[JR2a-~u% Y"{k}IAQ?Ib bp'\Y+&+/aWHc*\Tn7`J:@$>SLd(;]sG@'n%3|jbz./9HTj[:EPmԕw-Gg[U5~2d]bL }q{1y"NT3. A4qhk-C2.1']6 W*> H8pA*K =M7 >}OVoFHhVSw5lE͡nN KYEK3_Lb/k?a$u> stream xڽZKs7WikTex븶d'xWV9 Ik<,ۗF E3YE4ލ_7ȃeWO7O:X8 ,:DE[כ~^>XR m_mכ\)t3ኄx$9/oD8< PI̫'΃T8SYۦU U)ɿhK'gqM{Ԃ%QzcHY)E޳|vv{7mYla@s۴T^bY9YyQPW6;s.< >" /8͋ORf|̺~?=j%H1}IjGсsdq|܌cS M&W=͛(wsC8IV\Sp[ٰ\©>ۦMMQ˼^PM2W8<Ѓ]@Nӭa*ǎYܜoX*m8 :~Lt` Sk) Ћ3 [M ҇bKR.Iw>cI,P*94:r t2YN',.XsA'pB"$i)@# PB@$nX m{穘ec[6xUQo?Q9/9ʨXV#q!ڴaQqD{ 9Af,NOH Fڡ4 u-$KqSpp0tʡ3mǺfhNiiXmz*p&m1BB$T'W њ7}^NlU m**I 5.dQtҞ5Sâ7U,F+Xjy͇ =kR_4 `+Wg>?HOt'/%C xw6D+qvM^ݝEQH=-fIcS']BYv8҇i9wir:0_8t,FA3td!P2؂pkb¥H[jf ۗ*@rƕ( )o,ID>ҷì"p.p44E;*+z\9]Ib:<'6 t4r ֬X KTak;}~ hp> $T<*a߰"d3}ѯȜ8?~;vSsšœ;?\4xOm~ҮfFDXUf|D-U~=?g)LY6];8^_s6">\ohw 75:XkQMes+UQ4Ġh+mΦL:Z2 $|+;x #zE2NlGs3 bР"bܻ{Nac bb 0h-q~;liscw@.I*y.Yā" D[h҅- 8NeڡD,JGΙttSvEbYle  s+)j{ q(&u>(17m&o yg w 0w4|ݴ 2%nF&+? I=U_ E7;OBW,+#z n:7ُ lCCTƷ L>FHm/M.Pc,aaLsg }:euq[L `1 bcdk"&O7Wo73U6Ap }BC S}?_˯"yW$I !> s>xI3.[ā<a g˶K:jTmF/u`;%{#;F ZY)WC0>EK3i(R0 h> # ouIPӭފŶdl$c$#D$9 Q`ء:c9'،3b://oc>ux+/~kf)RcH.U6EיcH_8BRB[0b:x9k,~?E; ƥ\-+ԺT 6.z M5d&S_;o3EY9Smk= %!, 3iȕY$ĩsO+ Wq %CC8O0y:L"6Qt%6pC }H`Cde4~K IvǐѮfReSށ2b]$I9> stream xڽZKs8WHՎ1ăyә$dޝٚ́& k>|q}Ѡ$*3%b&_wpX-͓_qHYxqiCRk*C޼پdlIwsdum k[-E4cr3p7OÛ/,V,uȫ'. |LŽZ-drqWڄ >HDO732f :N,zw?5-56 Pi+ufuWfc޸Ʌ~k7xiZwqA<,WumBJ}Z5mkc?ï`KBkF7kӴg_3ÆP: 70R"Mx$9 OEYP_7)Co [Ú_ ze<v"FP{p[:j>ѯr\{DDyD y \7Ee#Кas^@يD]嗃m }=_|]|3 )i@ "I 0Pu̩69deL1P#Jش -LA=TYv7~5U#gUHN'o@r;ovFTgm{ۯ'3UpB~6XyAga6t|p.h;߁p{m-24l)vh}W'd8orC- h.7|_gv6^vSfDơ0 *'șLS^{;O=,OS<$?Ib )9aȢXLEZ0;۲a_k(+P ݰZu㙎& ? 8S<O+F@jw_KӔ -mK\?bR<=Rfr~(Œ 6\Tƪ% G{c֫ MΟwB6 {nw>q+S3c7:ZB /wEP:RsQBxIS {_1.Ztqѹ3u(t^m3rN u8"}( ekMgڝI< p\~J1dDn)K} B Y)sbb*rtKѕ@4hl˒[ߓgn =kz*Ui4c*;o.so/? j %" :%1i.TBr CL2}CJTd"2R€z6&qsd}Sp3ɑ{&$r5P{3dhͶ?ϚΆE^!bZcP$gJ%I"$%K1[oVS뙩 Ws?Wb#I?DLDv#sBs#fJt:YeVleƤqmO=t*n(+y2R~.]Ĕb$C% ^6PKT&-z\gIϝN,Ͷb)w]̱[X@@]+aP(,3_=tVsv— dCT,uUy8Ҵ`Rlj[2 )q2icbODzG_5ئG[} ;b750&ok2xpQ%w,:̺ 6 _yY&w֨T>ŭuק"z",esU.Pnaa y $R4=R WHa@;֋@cskGuCL&\->г]jn\:fI.+ iBRz적q)sZVHn[$:/}NjnW; jXu~F3ܻp(HR&yo6~mc$knI ?aMV,`;h`|hɜz*&"m=29@kWR1?t ua_xOq5;u1&WYޗIU՝ -*4VQ, t! ũ,l`%+=Ju'RMZc^5@ڔ2ΗS<JW,3IG̜`_B7-"hCc&0a|b_0ZXH#YG <DZm7:&L;ޫOg籞Xm ԑ5Yo#ח$PR endstream endobj 317 0 obj << /Length 3217 /Filter /FlateDecode >> stream xZYw6~ϯ#uN eiN,k.*8_?w)R=s/]A]w/p4Rf!Pa@6_|/0{6A*v9|R>5⇫/BƱx ֋u>,|8&H/_q:ݷigLH5ǟ-S-|_OKx^}인ml mgź-CXwX>DήZ\IoLNM^𳮺6LY ~bVRT]f06OHlq06|D67[no2fʱ}0ni8g+JSS`vRޛm/mի;QVOQږ\$x"ꊾHÏO,ޜߚu[o*F GD'd6@eͅcpN!*'Q$t"; ==$-pq榪[nM}nܸMj۸ =n ©tOE=CǕO*qWxX2*z0Y\8D(Q 2X@u6?wMt,`?nG #]mVnP6iM5~KUD=ӵM@`VWLmֈ ƒqL6+7f0k饚 d QvUy$nI;#vR'MLUW85B(nA2J>5 ZْyXEvѩgQ4Nh*z5h?jĈ/߂TL>x5 29)2綰czd(:0*o !Cf`Zx*VS7h -)("Ԝonm5|ilLDȳP'"B Q!F9mQ:]-w(sݧ@<t@oMݧ@5aa[Xf"2@ď! %;PcgYc1zC ΁ym-031vq׺̢ϏONn \cBS"[y^-:h*S7HȕHa׏N\r⦤:ԓ× G@<4:s2ƳwB:M/CM/h T(HFi<6JyKLHO /*X4UTq@C(F'.9 B29^q[|56dcۮ2-˗4_[0-Lu `.uDZ-}^8/ "T>R%%vkI@W}J]Փ/; p;*B+iHu 窎k\,J_` *CB("tdHHM=,xqrt.Pors fzNGiRJR*\KL,kOCNwˁ2KQM[w붫M uЄ ̯+v]_Ӭ׶\$e> stream xڽZIwH+(ڗyTiUbҝ02}bSfjհG9%A]O_@:˂[!k8+W~ss2~(ږgҠz/,-Y8OpEfZ?`"ӏbvGm\͟[7򒶊s'?'-| ҝAq yQ BAזO4һ9sϺnȃ_E&r1??q|/~ 1] q[&Agi-@J`[H\!c!Iv\fց[nA%XsY#C(InaҶCo6s?NPAED^GnI]^Q^/}G ~3.5DZ!mf7Ԝ$~ig9 =EZ3ډƓQ zgCOOF'_h<5 esڀBnT0͖cR^L }TV j6/ [{a7iP՛RNFl'9+{J]c~mC{tpjWm)ҀL@O, E)\|!^F[ѷZƢ'caq{2q˅F$ŠA&;D=ϑ >ƴ½fY . Fs}g[ 4Qk8̽c(3ny͜_mTA 'd~Dߥ2.jgn&OdȥrA4_ sQ'c<82"-ȃ?VE(p=lA>/G@0Lh_;8=ᚉV=Kﳋ0ȒVMo4MxN8!Zf+ &`P9Px3 Q($uVZss[> 3?//@Cz'F+j&(8G ONaK\SOgv0NDϿﭳ6BcQ`Sx,{Qd9V+S*^<s>W58>fS7cs@N>3GX4O3ϛBz3=ϟ ^P[&Hs{॓}LHC+ێy6)B%M4~3Cف.@>GrÁUx.Zz-^H[8ǵ39K(iU»W7ⲁ&QK1A?)H,x nd[L[g[Tlo0a8@NEt3q;OQ=2 /~@JP-vik$)\UǶUrRgCE>tPA!2Qc dH)V^Ylr1Ì{@ز~ۖBl~덽O"~L%| )Bf2qه&6 =:0uȌ/c;<}Gvvmy Ci Pxƕ W$ISqqKC- MT޹iT;MT+<|E`|Zc )Lk/$gkB7-ZN@h Me'NI:;(HJ`+,v}!qFy Sy! 2 Dn<6 iF7Bڊ޸XXV#.qvO55-Ya׍>XB:oߋG-dN YNt.ųG2jj<ժJfע*zqt3pq4 sv`0i>tBEhe+-!S$)p@ (yE)d!u$T 75'QbD6.aUriRJ:uJZi `δ5 TR驦ί0A:'PIOIqj;ݕYTUv;pͩruZ>Ȍ3.Eb Ecc.BCNfSeD. /nIVIӂhi7XU/Np¦%[cG/G^}ˮ߀ye{y%TЂ\| j>/6L>l_ +$[/4K~<)m2S (JT;JX/@ g֪mHa"l{)5۱PqWSu[ b$ѐw$}NE+nEazg jnevnƶIBt0@EXB΢dX,$wzSne]jжVB: yĦќ.UBn#%tsipKGJ 43%:=Q$mX>#.Xz/{rSKQLN7lޤT32'2 ɚ/FRU0GD'2H嗐P-`Wn/y*n6G&HJHZceWc\35 hi/rR;L/n endstream endobj 323 0 obj << /Length 1001 /Filter /FlateDecode >> stream xmUKo8 W?sG vPbX,/)2)6["?RG&ۋO7U4̊iQdY\FENDuXFi6?FU*,DB`SrTejbͩUkl6WN)] 0htw3JFANڞ҂Z(XzE,bU^CdB\Ɖ[B\k/CdNsoT}ѽrƶNv=)Ƅ\,Wk?TniMiGyW1/q>tnzaՌlٓ| ZP9HcWHH3!ߝ?zD d6ڐlw4i=A:`t]hvtQ![d v ÿ"mIJUgSb=4=2t) iq4 .I;Ft:ʒ?SvPB%/q 5L ^+U[+ӂFҘ7@ؽ;Y8vjv=2aeyiqq.$`aPq ͸a<6Z3D ="ŕ2">/0xY[5G4kyזPz8o>C#?.OLp(PI kϕ^FJK1Hq4 ˗8GYͿ5i%$@YI hNo:k`L~{}yzݏq1ɓY4Χ$N+2P_V% endstream endobj 327 0 obj << /Length 842 /Filter /FlateDecode >> stream xڍUKo8WH#(I,ċJL,]~gHʏXby}<']'Wy.yJdL<ɢM^ȭ۱szJ#JjZD<ɤAv0.̈́D- rRFLOÇR~?d2 M3^.~NQ 篳lL ^8ɔ%8>?d!螂*JZլ}?"uz &>3ۭd,sS*B8^>Ba @@oțOQzFϘ8_p9?ZxWdj_>ȏAosiAa\O>qsnɉMlכ~Yф2dMߍN" Vm0x8#A\  r.<1hFKwzX34&i7Ά> 9[;!5*ȇP4,/Uw{,ke{1x1r_Ce/& ie¡5i6`r))MZ 4:k2F8 3Z @osRT2ҹTr2{/ !3(fW`pqyJq&hY7zҏ90qd_m[#vb5Sa|׀%R!pFڂ$;ۚ EN# n݈MnyyvqˍW*Y/"~N8+.r-U@X۹) 6TA+ڎJC.Oo1,a- JYBwX3O2b endstream endobj 330 0 obj << /Length 1048 /Filter /FlateDecode >> stream xڕV]8}_*! vu;u#5&x*'s%/Icmi=}N::yxzq8C>HS{+z%uZE#[ixE*-=wHI1Sitg>Ozȿg|2ͳe֟mJLtצWx-ʕ1+]Osޯ9 !ڗg/#?Iȁy]d}ܶ} _T;7;-THcD)!Oó12g'PscȽw4" њk ZA9I*̴|;zM遉-bվy-$qwutjc6qLqO U1 ZsM<Դ! 7peϾF46t1>{ء!ET1["/X‰+/$@92P ߣ%A! PN5{ SJi -,rlv^PٖHDi,w"w9#ȯ;hj􃀦H2>h (h۞553N-k㺮lCVB3WZޗ:L9f{=D9#.0Qt7Hv}q9<9vlF܄ZEǚk#|1<#G$@-,(0ϏTCn=Vf7! RrC^&4C [Gt *:¨^bG)?Gi XᲠi 2 LuZLq?\FtP< oHCGa(9S?,ttiS,eq*np5,e՝{v^.rU&Sw>í+?7w+] endstream endobj 333 0 obj << /Length 511 /Filter /FlateDecode >> stream xmTM0+"N -^|@n-mU+mzj{pulx'7oƦ.)&ۘF9ɳeMbFIelѯYl`4s\WbH鬰\_pIΘ?T1 v>[]ǎRDz'x.~7 Fu![4p=jD2C1Vzt-lS1'FV#gs'$gEeZHwn]B҉[ F}Kd,#g,yQGFݭewP2e*~0g1N:KJ,oNuV қkxH8g*B'L'k9@iq`17o5(|>z oai*,s4mICMh>GU}~~ƽ pO ?VkIꟗiH2Jȧb@ endstream endobj 176 0 obj << /Type /ObjStm /N 100 /First 886 /Length 1223 /Filter /FlateDecode >> stream xYn7 WV"%·[C.\v8iOt5"=Q&!$ZH)pc|Ɛ۽Ұ\9Tz̉ >%Ҕ Z )82)݂`X\(cٚ"T&bN+fJ)|p9#A 4J[؜V5DDŪO0Q bP50eܧ^g,$`ŰX"0-، ppb&#LL9ʹxVր 9dRCn\݂4e Dj YJ(s*Bj(%DjXfAZDeνZB*bUb< :laPjFɔRрTjM*P\ijpIA$2BȢ$S"1!ޥZhC`0(Ih^,A!e4h6?(n5E[kIB$([1D T1jts39~<~tt;?8<GLX,\<uoo2܄-$+;Q|y9i1Oo?v~ pzw>8^w46߶8e{V:u_|>%KJ>$K9 |zW2cj"RVR7/UvL̪J7 /-IW&xiɠ^m 5OHm9!ͦUBZM;53մnROT !n|OomG՞㶯ܿ^׍I=:i%)ym mn>xJRXZC5ӶC5?w}卭ULk{o.>פaxBs̓v endstream endobj 336 0 obj << /Length 1098 /Filter /FlateDecode >> stream xڍVKo6W(>+lqv==2-D-IR e*83߼a^mXl|/^.jmޟuY&pH=avxe7+7EXdEd>+R[v#)rj\)+Zg$Z*+h ddQU3PUԟϒ 5ay4VjV58G8o/o{{FxS/,v%vԢDeŮWf/ ?vTG?ь%dXTRٽdx߂Ŧ3wK)RIr0z?pJ{U ШDӼÑ^v=hEn =g+}gv8׿Qnn+)&╔,[6t(暴*qg"1T6Ԥ6 @4MjɅo6 IZD4a<@ 2Qq؟<Ž /^\*` *#Sd8ӗҮ&0jڀse \N"?f-45}zQZ`ZN"mƊ;%حi){~7Y_9G\낦R_mFNjFP?]=j4zu'pgc}w(NJeCL %{@` G=Ҝc"Ei5YY3I),tŴtm %hi[iݦ+ $5MbBV\~QЇDѮb\(m@+GX+) S꒸PT)&*?{(aM_a_ahILWqc:Z5=ŅSfTHbfV9 >0N/F[Lkϒi[mڛۤ*ii~6^_JL{b嚂$ueJu8(׫ǘ@)NƁQZ|-\DY'z"hc 5Y}hyFyWdf1~-ݿ\B endstream endobj 340 0 obj << /Length 1647 /Filter /FlateDecode >> stream xڝXv6+T-ze˖vu;qN"j`@0w(bAN_xܙs(MGoMճӛh,/fU2ZNGgAxOJb2͟sQO5n^l7`;\d\{[k1m.V7r4wnܷ mt'T%ȴu%wh$ ܙɓѣ۟M'ê)!Ȋu'͋QeVoU8hY =_||FWIɅ def`{ u΋ʲ[@SycO͐mXY\\JkCFTУҁŠjZ'bb-3iw}mem¸A[JvpD*IL4zdz(jw<88$lK+ W).8-tZY4q*gSsud.J ӰH "l1āϲ"/hqȽ* |qd!8)ڤgTiKиh~fH/? ȳEA)EBX;wJriɒ¤dL"1|I$132%Rt9jcAb6_6>.P`Qd=H-y(}x@X4)Ȥ_℧xKtcucUŭ\o^@ sR@F6>n O;*D{n=Q#$K=q=aqB앟Tl"Z`tQKk\%D#0co:yPbWhly8 wc0#8T(drب6t~ -fUuEHw!Ӓ"B'[ZW-޵> M 0=YkVOI:PMz4?j& *oz YUlZ'd9j҂VqK>OY#e t@G\Ii}J[ǘ{1픅F)SE~3vȣvX];#N(FJr:Ē[ԍk|0񈊣9z%Xߧr,OӰ)E=: w-n_L%k'o{~WCxw|X5_yb1_hc{3JLL=uRQN$ӻL`&`Hfz Q/k6]I}`u~QV #8\(("ӸVbl{"މ>>V9Jۗ꡼!5K6n̗݀/۩1e 1,o'E` /[D%Od1ѭ;d8C M]}3H dT@^EݦݲG=;SI]LXx> stream xڍXMs6WhCLDQeYN2]w$c(A]X a7vQ1JGwR"jٍVjy̖)a#׿N5zO^8i>|v+RԽ񕬙f=Y6l#+IAq÷҈=L?<&.INsHU4 ^L=2}MCD<'Z=6/&}wHE S࠭Vp g Ξ_$Y3y ťLPFdmYNɲWݏ&eOfmcApYL!wA. 6z$•GEDFݼJI-3j [g76"BƌE@[oCAv+Q>6t]%3eșCĚy8ɬ;C)b*;S99,<;5LyHK"Qie d nePNgӲ㱽kG*.ĒT(b^tϧ-7m]ӃꌠtE2\ě$uX@U%7HN!Lm$(x( > pQъ68'|-N'%-f@ud>NeI4t(Nlkm k}ҪjfD`q ͺv9c=1 !njxn)$v44[f34/Te*zH -eAUDKĒ"lUIv`ʰߙސ5Vʜb MN׬4b y0]x3cʜ: hiV WEAԩ-gcH*q:8O!& ww&hN'>-"91`I4)`-}m+_kMW qalii;B oeD߻p$;җ .|dx*D?Jy 4`%MaT:uQ]N,A|$ŁBLD/Sj]ZA%r7=6^SˈeW˃i<2xo_77M{Q$K[{-I;JҞC~tGTo]WF9,mcg J>@E5+uȣo3{Tgg?CMo;$_CV}΃)7wvyl endstream endobj 347 0 obj << /Length 589 /Filter /FlateDecode >> stream xڅU0JqȭKEvCۃ ֱS)__zih{cF)J> stream xڽXn6+SG M=,[NU^8#F66=ػߩ(FA@7[z!қ-oO|<@I |cǑTq؛II0bUv`/l񦙵 !RJӻ󕮭)( hHTR_G7i\rtumHbLN[|V\'EWYUIc$c85vf+[Ȣ!+m*f8C A s/j L13܏4J VԀ3Sƺ 87 G8bBo:C Vx7H*.yЄDM =zQ  IY/[t*k#7QSFc)"`po4pjDF$;\H_W#4 @D"$0 ~P>xe0#S6`M/{C8\ӯ< q6GDP0q%eeMx0v^&M3=ݶ C!EOs=4Qᮧ*0kԚѦEbs7tDXڽ Q*wmrYY7>ghiwijj]gc^,e endstream endobj 353 0 obj << /Length 1277 /Filter /FlateDecode >> stream xY]H}WUk?ɦj'1[ݝDSyH@Z]1~AD_Dhι}Zh--h1# ܣ1g͢Кˋ,ǭ]~kd&[nyscMr,pYKlpDwCsq3"թL_΄>&b+aԿyf4co/pOqy N߽xK` &v9@I9Ww,-3cy4#V\E"S#dCd`zU:S0{6Im4g굈DG:q=A*:?-9A,+% P[@.@#[%BG1OG+Lry^uJ`\LtU) W(5&d$Z3?.iιh`UvR߈] \GMrUǗE"WȺ['ZK*_O8qC?Hg@ NƭE羏/Я ?ͺe;J ݇ &-fyT~m.ÁBoVDl8ޯkv{^b~N>ys'$ \?͛DQCZ,כaԋ}r͞66)zǰ2j"M^ Ӡ7QJO*M$Uc>eF^t2ͫEnl{^0X? ShL9lL $ ڍ3ak$qӺVS,b]]'E~\vTS5BH\OFJ5#mT2BŪK(O1;}--WO> stream xڽXN@}Ẉ#aJeԖJ"LLL/dsA;{ K(` EJRLDç-A l~AskKu qʱg2t2",obkbr1 l,/$Ąs r2+P[LP|t2-|; J `:8',Jl^}?`59Ti9ѠЍ=һQdiȏC 0$R[)1&DZ̔hpo$n%W/iI@oLEأ5JP4e2=D@T^jl zަŜf?Ni˪B-J/?˧,TH0 LGuFÊ M"& '\ݱ%耥4k>Q0pxbQ/ 3X)[GatW mHQ6C#rrxk0)6YY#G,,wP΢o!q ̴VZ䒖q )wP%ֆUt%(Yh"5i/STm=rQm6͵oj&K~lɩP LT;&Н84sڲt#a% ?9E\MXTKnb_~+GE{*|px@Ci;lo0͏{0$~&QWs`mAb6IzKؐ5TN4K˴EW> stream xڵn8QbVzj7m6fm{`d&&*^= gƍQ8)uF)/^ͪ(KEQdytqiWu],O:Y(~*(r(R"_-TeFllc&cek;gբ.b×ȉbeEVʷO*u5TFz2tsי!'Wq5&ӣĉ lV@tfCIu{͏yحAI)ꜽC+R|ЅFB"h%L@`#r& ]q!42Tt%eq, e~A$oypCK |)En؄ܢ0$ۖՋR?H"+56|Neò@H>RP({g\K(\vr",Ĵ ? :-v8rxYP_kQ)~?*$KH"wJ}7Hh`;) :>Lhi^M]fRAgJo+ ~zvWh {#~}SC_SlϐŴ !abSHLDϜ Nnv3a |˖uaoFaL=^&x1D؛͞W1'm:<Asӿ!]s v$}j/ ϋ$$/ 63f@|0tuW|x#̤)\t=-*43nY2<@b_ ݙPb ۛ$(I#4Y.*?Q|FKx36PvRU_eFPUtPk0ri&ZAQQ5GD;ܭ0e.ʺ&vV?f endstream endobj 362 0 obj << /Length 2724 /Filter /FlateDecode >> stream xڽ˒6QSEm6=J3TmGt3֣CJ~gKA4Fit$wOu$$K]FMU$!&uf/6YUe'hy.2@)T߮_ <{%IRx9yER*ս~QɲVwַlU{!o,Ό[٫,=Ll%}?̈́xDV&el}=^*u7 x[ݘyhc`ifav/6 "i ԏ?;@jEjd 0?3D$EԢʬ[u:J;:D`Y >zO9I')ώ Mw\:8r;|H: .ϙF,Y <ؒ*n'{A="Z; EB֙y<2iV=Psz HeC*}\ju`k ܹ?,xRl݌Rnǵ5,󟔋9@AdtM.x6&;)d8j lQƗ A@DiyK@A7eɯq>o2G̨Ի9˷̀98jг3!d.ʹ1'=a#^;B<{vQd3UD!s`⡞Qd7Wٮ<,.RKFe4& ϡ;`}rE 2I!v}j*xڣe;Te^f^:MXh7H_w9G'}7'v54Nf17ຎP](T|z%_h.gtd?X|7X;wf|{qo6,aۑd8FCD[qZ#+ ;3h5NF <Ԛp/(i|SV'vA2Z |?+o.guQQ6AI>DLi2rG4mDD HYpY&ygd_ռ xga|}"9?-d@dLG GtG^ps?t`z5 §+ZqG(%F3wӛ0q9.G'&|4 25!;I.DL Wq8A$A-A <*eSڲZgqAt Ќ6bycN|it9$>G-y ƐyfwzQa *c4C Sq4v e!>lzl):LeʍS7`ع^~r޿aͶr…ŋG\#_ngm׼3s :z1Z O g {'aK{젙@u\h:&>9ne _0w #MNRͦT$%„蘲 _xF/! אAW7.`nF.у Djhvh}Szbk$ ۲{ @.˼)V25/TJYD׋Y袂 NG[mCouЭ P48h@=t&"(QcQ85f)=4ͷ4bu(~o+AX!T6:pa@"Iݠ&7+*pf@YZX=vx:܇v9.i`Q 4j}Ru?t7l| A_iՆ/b߶4Sm ~IG~nТ0$1.T(qP ဣw$ ,XZ Ш.gtp2uihN<6aN49mc"/\^{2<4Oɷ^3s0{Xze0sO8 JyWP'Z7t Yل\SLFYGׯ~&a{2L {8f{XhO{ƻ8 >9?#T!#f`n/$v qf*_Hd")2UʓN>O@U$iV>ΓQaU'O\To-__@<>rcsY@4{&0fXyx5CqX jOhԔry<;Z h%࿽W?e+1M#hqwŽq t(*@r,%zXYahz.M ϞG;݅t(GwJ{I1bO?>[j}kpL"*)k*n$RWHq[x}[d?,kY}L҆[ zޅX=>Vg))!:})ݬCxN:PXs "Q5"Դ5}H, endstream endobj 366 0 obj << /Length 3067 /Filter /FlateDecode >> stream xڵɖ6Б^&}|yr$4pqB(Q{v"Pp[WO“WO._xU"Uja,8^Y$dPf]0|QpPyPvguEm?v}7 tkMn!0`h6h, ^z2?.q6k4ť#huQeWwSOG `i7nCk)E0\8#ZeU2| 6zk=O\J®hr"LmeM7]Gvumgt o* lY)#(ZfpnɵR^`] W'r_(˚$Hue~2R {b^׏:6 lrLh[av>[]Y8kwuwsއԻãr|CB)uBրS]chԚ[} ޔ@wG:`2退}%mϱ;Ca 0Fm]HmET\U]N-|wVy "IÂgUgyYm>mo:_ m7NˎZ^(vGg'k$|Ei0Vz"K"HF|Q(;O, RS9vHY<%@T馤\tFuD84 {,y;i)_>Ngs7rmins9 Q-I3}oelh= /Dp%W2D^īX"l[$1_ݺ r(Qz_/̤#R9sVÙ+!QEPIĸk s^*lyr>'sVpczG^2?Î9-BY%"9Cg3nQ"]wmGub.4䈕v**hօ EʁahY_{Ǻg] w/MB"%p;SrZ1N~+%oZG1Sp sG4:.){JN:7sG%J霵:~ڪBr^D/R% 0P4 V&jVi:&&>s!r}]#w@`9Ŀ;ۂ2ψh / q#N"%U^40tj[g}Wg: 4K?0`~@;HE"!|URpGE2UE$({ Υd"̒%/p(~d`]ޗ؃U@}Bˊk8<~OYB}۵cߝcd[◑ jLTHW6q} Z/y|[![Q)p/WSHO9r:MXL 6,pVף o$ `P> ڨے:h K1.] sp:cmM9/E5]_8b*!0=?ޑq="LkL*CfVS< ¤b@B^ƈmOP'5CGTa+9= מ#see}-Ji%kA [h (g~dԁC KHMWoʊѲƣTis!'*b 2Msp84R$)Y9d NP%< w"(yDi[@\!p lH^698EY'QTcMˌ %jZ_|,#:NkmHԉB~ENT8 '[E (ieX|'t>n{H2f*Pda1gSs:V;ZPer$7em_=S|5>aqkZ&"ɋ܍RIrA`Z۞pHfyl/wZzК8zlH!gaӳr}T*;π1pbng\Y}i !8!;s=僫 NSfKd!5=<}ӛ=j&]1X'4ѻ7>Ee^G`8}M;1u5"8Dęulp;8ۖYyFq[!CO7[s81[<9>ij'ֽ"%ןTXq+͟р''1+NPlΉwC$EuC/ZuzSJoC؇x{fm5-j)ߠOHPK7N\v8?xSUbtL%jQg-f,9qPEIj?'l(婻n_yapҝ.Y~UCȅ2<)BdX&ø%Ta@kTN8LRs~19G?Zs쁓gC1C JS钒h""\ {G >yG_Jf@Z"s:Rb?s endstream endobj 369 0 obj << /Length 2999 /Filter /FlateDecode >> stream xYYF~Wt:UR!=CT]FGcfo^Rlp}R)3UGV旇f,w_ҋ0^Z@֋8|Xdgw_=Ig(:[\:zWH{ |ugo:(,t DmSZ񛫙Ⅹi.m' 2LـyoV>Iodn|ӟm$ޮI0"{#!δm.xL@A`oGMSi)u3$`Qz/#EcE&m:Y Cgo0iJ\c0Zrbmxun.$a:R;c8\dNǀ%Ya mTFjy`>ȅDZ&60ሕ@э,7gN0ad4$d\Bѱ= ;KmMJ2 ӡQ]Fp$s\ -ЋӺˡ2ט%2WW?x/t5܊^8=#}Nelו>]iz@+avÎeQ)d883j(m= 0 )& C;"`: !gO9ua s0F{nW6;D.0$]kZZ J( MR2ɪtP*y[4(ZiZka6p;>"$E8 TQRH}:M_IM)"I( 1;J8Rro+҃\3Urӌ8)Cq( W94In\Y=|J 1C)ߴ`>}Vj*#ma R2 ЏƂO8 K3Lj1$.<kݸ9C _p#ۙ_3*Vq25+c2HPj@a)2Cٳ r*9ڈmo4SOrViLqP`R0%ٵv*t4'l DS fy)"ᒭ);=gd(Fd+s$=4lzJTBՑ^S޴SԅX~x/%bSSż#J34<+̆|\Iak݈"l0zjd9ApPa2cO2d Xxv5 ߲h4ni+I8&BJx}}lLIBKރ w֥Sl;4Ζ<|DZ$zȗ]|#UF&~ڦ:q ܺl:ZLOm5n V*o* T0뱇vS=k"KArB _81|0D0$=à:SSw Q{Gax@μ R1 -|*LF$5`<5/vs?lf2 Jw:4ȧOKK-D`є A Nk!s%Vz~R:Q/\fk$y/Lo%}VV'FC2Q|3s$jDQ}_O拀w܈x5P<~r@e>u> 5^c\p1HM:H_;Hxr ^E%yTj3b14b>3N&v 9jPڏtOC Oג?Uz @7!)#?l*Ga$KZk?''ϭ~tzo!0 и۬Z{iK! KXB "sIٕf  㫓=~Pr0:O@[9KI*qBT+4wNJL߷2d9Z,'"9u Ly))%* NNv<0B?ggj@~yCي ߸#Z4juQȽYVM?Dim^Y/D: un`ӯ,f]ir(ipq8/8$ %ʞ\ޏ(}َSŞ{qksq;Ҽ{s^sε$`Cn"Z_|\w,J4%BG 96N\leҕ dŸ!,R*8c endstream endobj 372 0 obj << /Length 2775 /Filter /FlateDecode >> stream xڵY[w6~RD,A<%u{٦K8Es%Ry`4YNQw"af"$,d29T-&"O:]1ꃒz5z:i q ~h`hAE5ypXw#J|Zu,;SJY.t扲ixKAdp5-[V2",Smi"U;Λ'fqUk[ܣeּkvi^M;о(Pk&=,z>@;na׀t—̍6G\D߿nqN-);/4B[n-X.WcwOQ(|vmwvQl'if?et)J#.Xzh)ضfIgaShTi;g)@gY&RkpCd/ESTv\KB?K'N%'[jI]Π(Z< @6f0i| !!OwXpu?[H;p>eJ#\[q$ N.~ !"lVʫΕ׽Y-އwHze 5W2sՙq?#hkt7 v]u,ti). T5[,֙ k{. X ~A!S$@L^#7<8 dV-`g =muRnn "g6[3>`~/|Od@y/ L,_ n4".meg.Lvb* {.{-仍HޡMCpu2J(b ӅjnO%! @P[FOAWUutW,L?!>#RDH}z_ >] ݠ|ׅMWWi<`\Bγ/t+ \j4@\6N.jCϒ~B͍Yݼdpux" cr33EMp*q@Vhcqߕ~B" ^8%>|$7$|+8a 8j '0ݑ ɉ 5JxdIV? 9CDa\ ;Mc)BI,%p0#QŒ܈.ðyіCgyUF{Kx:0  KM c پz?RGmzng2֩uMJg_ IH$`ɬشݡ@AZ@o ;<9_<%[\ۡ nsc5эfZeCSex|jLN@MxacQޱo2Q?( |Q߾[ʇًuiZ~"1}} +b,2!Ϡ,'o6Gz*1 aDV nW(K=w쐝M&%I-.-VeP/3ZjgF 08Y$6FF gWVO* (Nn<n& ]^C{0Uo>׍ZQVh s׊誳gΊ~-/XfHVP?a՟XN!NZf0>7M4m7}ЦYHg±<Ӡftz8][HȐCOp  q= _t \"x"+VI endstream endobj 375 0 obj << /Length 2550 /Filter /FlateDecode >> stream xڽYYsܸ~#JC>VO#{׎SN cB<䯧/P3YovSʋl4@_wC(8z$}vET~EQe~GYaW__ϋN^ ?J q˨=]"2h`wj%*Mߝ.q{vZYlJ +^om[;~;//?׽SE'«<6^&+y9ǬkbOA}E6HNɪ6"mVeQRgPwLP0JEJR]AX( 4봭ec:^.^˧݊<y0xG3'o {/=eF= nf 19m з"؂wޯ;;Ǻ`e\{v8jfg]di|C sQn?á٪9bKe @>.3 X/8nR2n5!ڂѠnVLDjBUrocf6!;sNްDUw&Cֺ!+o1{]d;љiDɾ 4\TGʼnѴRAOE`+ @>  np1.ߋb ~ЛCbof1qa٥ixG*{6t=9K-7Fv'9KiejPfU1Ϗz1ݭѢFadX&Vw{+cLW5S-z^.<S~|\8? 2 DOj}4͍% OYs 5fmuêA(Z$yΓ+IKT_xsK_ ȧD$%|!+-^荹Aal~TZ<B?“q (݊3=Z$a a?ՍQIUdγcsX=*4cXS0/_]rAJ˗Z@DN]Q{biZ4ʂ~Z^懓koQR:$pE0Qyy'ZQH :m5˫i*W]qL6X2 =(YLe.Jňù`Wuu5 0Q\d r9q 8j&Tjk-8fᜳp? _꓄0 6 t sBG=.EK;K;ETCK}xDhYFъ}󎏚:v{^2AX߷q3,Xma~ΨoWF|!N=g4^l\m39NJ9_ӂZ~C@Lxn8B79 ZHOiDk; %^ij}.0u{g!6_a.x& h0azoܫj2*Oi `z0W2>t5f5pQw~Aqn/Jʂ2`H䏋asШ[8 Ս?m0Hq}c 4ue8N5ASL9΀ohS{ 7ɻ*ļלM+_Z~Lɽ QSWxOcOcOX`3#>"Lw=Ձ\K8 o`B|{3Y.ZlxgO+x֠k&.FAh `ͺXWBw{R]yӒ$ z, pz&Ga^a~q'ea8]H endstream endobj 378 0 obj << /Length 1567 /Filter /FlateDecode >> stream xڭXKFW航˜yǸk'UUrs".y7 0RP%'!~wt> &6o>hE 6Uc$?D<1Z(Dtg10r;ղUkRX;A#yڽ10,N$4H8VS $V:1$|J{Usd>Ykɾ LY!۬*W+mVEyHC{F90X#c+6jvy;0wFcŷ5hD?{ZvxUQ}1 1p b%Le*_8HPEjMQG@^i;Y(eyQoc]Xr"<+:"[Mi-@U^j@`W-BVE[#1ի} I#4U1۵'bt L\Ft \bp_5f4'l.h#:2@ׅu 9(IYN_U ;&϶Ku"{Yf₠P4\'Q ,d&1 e-W. FfXWC.-:-4 W@dC AK%DS,C~h,ڵ[ҕz qr/*?:2DAHu 'T—n+(qκZlneʆFl C>vވ - ZZZ҄ڴnǁ:U4ţI<NQ-'\=΢r(0U8-U%,&!jWza &peƒ^utJ$H3ZEdeyxx5ylcJdPJ] dh5MAK3 }vo֎CƗI(\~oT:\#v]n@2nDT*W0t{Յ;\ eh;Cg4717ؗiOt̫b{*ϳcSe# BDB=h%NGB-Zݑ!KNx7Px*S{H__`K;\_S*<3 A,LlCL]ʇC uFoB3z,s2=֕ ,-/,AvE8t$~;4a endstream endobj 381 0 obj << /Length 1643 /Filter /FlateDecode >> stream xڥXr6)tf*XG;5-c)q;m0ˬ)咥y AZNkwĝ,޸`:!l~ :ALOWɟ3^|_ܬ~ !Sf?!'4|)O _c;? ]߬ʜ)4D>m-5y$5{Z'__,ލ򼌋(5F?c.W[M\YTFADg$xtt<;Q'vԶgߞ,ӊ>ԘaYUQ#erMwωP:[֠&j l[T|Bی!9!2 {>ȮVv+&-N8K$J[0Etb7$.*%{~0jQYW(;ViHGNDϦ>{?ppϞ0͢4V\ꗺ]lWM, p:i]\ie(f2_-9z81y·iA]~Zr(KA!yA <ֿ q+AAh @Yb% 3Q"9>֪t{ЁҹD "$tG^Hr=$f+m|渾 V/Ke`[sӐn]^1cD4R l.t3֓lgs4-c0ndlgo:!%a#S@.p[jm_,ڱ ,6[1s0F6FVqtqυ@/A&jƛM&fM-)IFeYmQ4[2J2<'h Qm!BR(ݚފy8*lAz?ߖ&g;-O{7&qֿyuƑVƼU-\~{Q;|@Uny#Yol ƾ;!5NZLTD"'="[;ۼI} 1\QvEgN8G\^~xEGywҒ"GzC^,Fu$󟍱^7LfSQ‰_^^\_g~޵_ 8.Eh^(2B3;GeEb_P-yYm+w@oK_7RZ}o8VWg87nb`u3 O=MZAMop5I"SU>g=u J }YvarY-VSʣ*D>G~*u˷dzo7I֟>ms4TjQPfjͦތڜUփ\ Y-Ap6wD\Asu-4> stream xڭYɎF+tfo1b0|pr c. |nEzeHpky]v+>uzBJ_vԃw_b*t}gu,8s'8RJBa鮇*PYT0P6_X8#RGSzp}8ҽ#PbqKht(uդӃS[r|1J].?}8lZ5Ut鮪nGjp*C5ɍeЖ*L:O_L7b@.% wVVw*cs<)6-(/FҞnmHʰ=%*}tJБM.b-Lw-O|yiX~lPT 1| o]6X'6iq$  "zѵqT.mv05,C[#EfDtpo (p0w_8d4XP'&5M(Cm}ndטT8S.4q{oW3mp@kOr\tq,.u1˕{ Y`-z֭s}1RŅI6/ervFG3pN:MkUtrpk Wmy[~!V,9g7b:6ICG7-"_ ݯK|YQZmct=5=۫<]5$y莏*JgkA- C~|VYCHOh(PM "$@Ma% gj!:me;PS $TmR:.2帴|T$yMևNFד'G0FI^*E3Dy|o?qx~mSw;字tG7W.~]c!B;s폖j{SD )jg6&,$*Ԓ;2W:u$eiekQ]abMU4|6>(Jy)MnXnhm8($3U." zd/tY~ -|b )TEW4% $ ?ۜWbl-ϽEEd^b vl#Zӷ ݽh08QQL=GSn4"L!a IS¬&cSzA!ڭ)!  uPņ S4q3HPuQ{E- }A-_M.TbPV"ѾO8ԐtjΤ]04ә/jٶ6ոLxX8g4/讂mh#0^pւ+P @}ġ͝Vbb)nG9;S˨κֆ@n U"2Hi WDyH:,߬PM/`"7}ό֎n<b:׌'[3R(; e)us- ϲ_ىRW3^6^F~HLƄۂ#hnvc_XScSHoѿ}+-7ԡzح݋k`}B׮-?__jգߩ+vlm?Bx;G~B ݒ$@PƒD8PT?dӱ endstream endobj 388 0 obj << /Length 1935 /Filter /FlateDecode >> stream xڵX[wF~ϯ#:'v蛝Ʈ񉝓Ir!,OB0;\p^g=},]dA)_-H4^$Wşުh;Qr3Cis4 40:L-ow7B=Io0䈞q9'iR0h\=ѾNGf'h韖b=AE3 As>QDFb =+؍VgzvZcCMD(/LՉYa8pFÝ.[E[e’gP\nm݊(#C3q٨c* MٖڗhOʈ0]oQMN6Ȳr\yCy˜2l[. ÎOzmĪ0SE IS6`w_(*E_ !j^6C#חV e:h+ؗ"{gWfWu快CsafwMsܭO( 4&SķRCoeQ)aQ d(a'0c"wΌ msN w)shFYT(d#b!i|#E)]p 񞻡956`}}'v+\ۦs1EzWnˢS{Ϟ@c%TK388f6Uͫ ~@naN]Vx%1MOٞn+=SV;)],/b65 jS m'Vp74!ߋjݏMANdvPʍ˘O4 /S鰢ǝt8aN`,4'VC 'sR[ip~bE6׭ocڮ)ާW(]1Y}ypԗUXH6t9m (5wjHZnT /E KZa^?͋rQ˧#} .-¿URil\7 g0寮oas8RYf7*F)_Q?MF*+3 zskai|B9ig({"QNY${ ,Ff1իaDv{/%+nK& 'TF%t0gPh1CA#  ӆ.-r5^;Z\_|/ĶP~l X7Z)1w<ԫgs endstream endobj 391 0 obj << /Length 1708 /Filter /FlateDecode >> stream xڭXKoFWH.%@b CÚe6|$4H %o더Qiù)+^:ˌ@,i?zN=EcrxHuSUxIWƴQ(!٥QxU;sPRIܤe ZMZs|f{m&a:N;ta$ 9YO,',%6]yay I.k,˻-TAWM3]zzjC~iX .J9}ໞ`ApVIܤ>o{a7osw{) }XvIbrVn޼23J̤ߟ8cg{l( 2Y%7VV&mrO)kJ>'{ nl_uB ALXmTuzLM42;/6~2ij2׃KuaG9J7. ݞ;OY7iFEubJRUP%qN+tN -F=A ɀ?M9yX#F8$2c]Uwi9c!7% 2_2GCT|^ۊh| ]fAY}XNTnD![} e[Id}WAx|]C`P+kSf޵_5t2תJ-"tCS0b(b0x(AvG=J(Y.4p )⬬;Sܵl$ah]-'H[CVz$iYP,/xugC!OU^h=PG2]P8ILTH iI\E8L4imk]ż̊.6eF KXic2PnHw<^ >R6'7+siرh*Ug'$J-seJ_cTWOp2zBpnwѳȰdmpe: g+ٛ endstream endobj 394 0 obj << /Length 1169 /Filter /FlateDecode >> stream xڭWMo6W(#R> (4hעeeHtv|G")[64h/% ofތ &CHI?aA%g ~ ]۬$I_VyoMV?ƨ`ָ~7&%3/7lV$ hq-3:sfE-V, 5CKc5fqpf^~S9Hkmq[1KZ9BҷCOr맻#(3=֫|h^w/y$:Ŷ+'y=$sx-Ac/ŵ?8k,W2/O\Mtȗ֔tWJw{˿kڿ."nR BqI;XP3vs zC| }6MH=x(Aq\,wGV:?ИثCX&^Ѐi#liC}et9ĵ1-%hؑ`0O)WM]P}%ڨ[q i WC3iߜ;p㪲 ݾ]{Yn"ap2ig'LkۖbCc'zy 5.M&3ϗ<}{ˢOfBi~J#*ś)1NG$HIҤ80ў"bv חyE[^-t-RŗIEr2 %Mf8Z!Z(z-*=3ur:\S$%g)?b絋/5ߠu;_:#7{]H{K d0b D,=6'~\ endstream endobj 409 0 obj << /Length1 2400 /Length2 19626 /Length3 0 /Length 21009 /Filter /FlateDecode >> stream xڌP4.!5Kp!w4@̙3߫^֯PdeAN,)I=v;;+;;' r$-I )W;X&m6T9=\^A>Avv'; Ai3O[K +@tC9Z۸y@oc t0sfM-B ۸; yyy9\E^6 h d#XhZ6nQhܽ\vpMegc 9VW [,,@fN>N+[ 2;3/C37lwfY uspuvwcuuF€,d)rt:!+wkr/u Kg6m'[?6`o56lh8Vr% rXZ<wW`ߟEHK[ w9 wth 7~~d0KoG̦(O*%%A?^ ';q[ffOvDTpS{-͠lˠ 3@{ y-8?.v(3pp[O?}p߆ |!NT9X_B$m7R?K);:@n=8vߜ=Qqo|RK)d8s7su5Ax~#z6V';..`rEk<6DA6߈&ؤ#̿&q~#No`SJ]7F`v_fW|O7iF`v̮uE`ds1Xx: xps%qtל,~G׀\xfn6ʸy[89\^`d;,_ ?&@p Ͳq:aM;<`W';3bwN@mGepn =h NQao>n ctݽ@8cxc`o? 8Ɂ#]C?+3U/ Z ,,;%XDit3XV\x<3} r!>ڇ'C'J>szǓIA t7ARD-C{vnE|~4B{9ʵwuJϕs,q!e_i s(YHѿʛĒpU⧿͙QCHMO@ }51K'y^ɯ4nKd)/:qd5| eAI2P5E$;X'"AbZ@KGބAS.gZK5ZnCbBEiB?%@#hʑnWN [٬2l&ժI͂Qb?_?Y"K 7զ՚S/_JlF Zqpf0Lf9_R?]3+pKW(fn/8hCΨ?ZQͿtW_`q5b㑍cXLf&I>_ N[|wЮ"o W(3"ڝ@?2-#ڬGqʖf1̈́hY |4.X5H0K~olox~wNf1mIYjkiu?׬ֹ2|Zь_^GAVt/Okj^7=!eVvB bTILgU}P~w̚hOմtN5Fah}N:%2` іjS)xsF:*\[I`xǸ#~EWVJ;[~řMD~>ش@z땭q*ݞk4%!>ùdc$B|H[l)ͯO4=8HKnh.^3~{jܦR1U³iYCicTh11߻o=󤫔P62vաw MK'51w(X1%u}-o4қ tՖj bҨB #"3pГݻ2^Ca]ie$+ PiN*)>TBiEΩNG/e]=mgATmNgw}7v>1w )#Kvߞ ԠT9y!a OdR 09'{ ֍fGB}O1z˰rOwYtkO>/r 3n+Os MyruP%RGHڬ02R;\y`'WSdA ]C1VG 5I[ћo%gkQ: 6 Oaᠲ`./ẇHU=|;~Es/t A83Jn Ԧ>[~ؤ/6}ÙRLk˾<~BSYxo"kivEH }SбnW%P)"6 "ܯxj D: ?-h|i QqmCưسT@ײ1J} @_k馭p/ri8?!RmZO0z+%=ƖjI%Ãa ~_)JRDdo仈X=k~\sY=,/q5XeXH ۙ î(7? Y2X08O_wjk%Ew7}Q+$嘆:13dVMYH]OR`PwƽDdZi r7ٵߤ<7%YwD[gl6Q)hHpz:mK*:8ۗ ˘;Y_DL%躏 D ǣPj8ne3ɖI0t@靟M`C-F0HN\vZM+9d\\Vogvѻg>= ՌecUS4:$2^v@f|^)pGQCt2WDzTP[잰 PD=sQ,YYdT7c[Jf$洖@D]Nf;0j%xTuc av2͵.)5xlx>5Sr2ϻ!GM;C4" ITo ?x2U)KwO1C%'ye[ʣ .OX1T8 r%{W&F<\# g'e}Fbʶ^=1vw`UKV9tdu:?t[ COf^zOERݾ8Q%0J^uhR6\>g#@Ӧʾۓ[~8KITuyZPvgdsLT֛d]*\pbH21*ՀKUIQoMQlULd 4'XfPr5?p^cI uG-tLb&|=5(GQXj|_G(Nkĸ^CgyKKN> Os0hWx !7$Lrus_]rJw):?"y0 mqm Eͮȶls%a~|+Aq0-Ji1rMx샻?Os|n3N-D3f+871"z,/ ୹ _6h!؜UhIWj:SQ!3!OQNqT>bA!LWWdQ% xYt녲vuT=ֳ˺@X,`;M$lyy.@ è?SFZ.,v(\FjIr.Th ;zx *_GVR٧by4irq캘i!.i4+O25k& bm0FP5%e-ȼX,Ln(xhPJ9r".խ\,N"[;˦g<Ȯtr2>0]xbM9Gme]%)Ǭ+015͐ŽA\W\"Gr`t+{q (/|U3\1%8jV{+#h[Xk\^,m zNZ͟^w;FeR g,~LOEv94|SWԾI}1Pʪ{?}5;C-1Mk?3HM.B, tYqk଼Lko@E"C7%FП`pRƔLcG?@HY;HR7  \qGqZBkAIxt΢)ppk1I;*<^0DDb]}J:8YSN$}.g%c5ﯚJy|.^ r/ُ:ѳ]˯s. 3>CLvSFq1 #C+5|8XTje"z$4ѸajGUfHUL>OXwWX2./^l  5ֈ񦀦/wL^7RI4t:Pϯ伿x*Йk s_Ɗ;fWFQ'h@۱D*5 "x6y&mhv`_LWBXx/[X5f5֘\7vU7edeHEkG($CPL]PaC,deX~?{3ݧi?, Y$$2{ TG76η nJO>li|էa[4]OD‘o=!*(P_,rBϏu̅rE]Q&M8z@ƱY وmFڮG>fKMWLO—{ lU>{JE̸I} MyT*><0/Ӧ|_sOVnm(kY['M*ao#}5oI՞_0NǼ>Jwƥ8O $ƳONo"*4 ⧙FtSV7/^wm 2=<[lЁUM|ӫ6.o~e&W'-VwNKقQhقԩp@ ѥŌU) yE4X*!.*41S!qh:QyAڈػT˂HJ>^|'VG0uz^n6J PfGp(.nW. 7t$%C*'9L* 9Yב~nr=>}?AEv~̏)œ:E{nr7Ȇ=]ۦ"tt ]J7HZ} eX@7uDQIJ%>"-ljGȾAID~XWR-UkPˬ=v& Ua[ⵋ*ov~Bb< ^T-sfOTϠet:pg=":[,ƙXFc<( {cdfh)"C3t?ZTJfUe9ZR~|9o8})}t5| ڐBfS>b;` Yb!ztOL-  ΞFH^b%3D@6\Dw|eK- F:)}tsuDikAtqe (D^>ץΏxa12x4R&.֟qB P us[lxϼEXB Eu}5~ 5E=xJ{|E?ʠlδ-_Z~Paz9CKbq1=%ށ@TO\tD)ʍ:UHhlOCT=,Dsey5Ѥr<`£r@]guxƐa8/?O$us7HlL/|}^9~ ,)]!`3]Bj AWal. jH9!2\j$$_bYSz'ilF @8kjX@ny,)e_d>HA~}tA;8x7껼C`l?C4 /T HRZڅىCX.FZ^t1ka},w }A*)n:PW;]5&I҉a3W{fٺ#ڔؒ&l=Ѵ*P]]>hcb"{R ّv7uds9jdꐰc|^ӘRe{ϺٸZޚgrWo$ TTQBJZX 礖A:p{p%D47ܳC&]W_$%xv”%̜Ń= ƻK#􍂙ҥ*fGIOc->ʹoJnTA.l ȼ TU!6=eM^IC+hBlYkѥX7I, Pf*XMζ'tŹX8Y=x3M B\[δnLn Ba^܁;ol+m(Kt%*}h ]MpS|>.u w{cg_z!a&Ҡ̝w8}Ϙ^zJD)v%„8PrGZ^w>,Q9cɄί 11?jRÁd@zoO4cEF,Rgְ#r]20@Eꢏw4c&jUo!w!޺7WU@]8ё ̛*(%?Ca`Y<,lWߛ`vÞ2I*K~(m~|Z{SbYEfDS'Q0٦"Y5x5s+Yeq/ ]eW) N oB]_jL$Ҡ{}'÷U֌ r *Mơ/C,j\Մ\ x7 Xtjʦ̪bˢԒKУ!껾 r[r 3<(Ѽzdd3U իOR16f>bVÀ]9^s ]xToߡZ퉊w?7inl| U>9ĴFʔ^oaО1v{GMtk=yZf phh#U߹#ve5^?2bҨو~: W^:¥4;M-d+ q'vGZYd<"{!ۈhěAv.ca l()^3=^U,ٲo"w J: pV3kōEs}.~uŠ՜AhU9z7ӗ( Z rjDoc RMw靏Ծ K+d2Ygl|]kJZ; hn{aĭ:J9o4hȔ:J\⹏h~ B4M9|SW@)4B0NYuFcDg/yXJk:>Æ&i>8Fjo}rNŏ<8э5%1 g" / HnEt͌lJ}(i͊KnS{!@^}&mmۭvKyVsֵaBx)2G 枳͢őh^TU%yPo-7/*ֆ1~#\ LD[Oy}ƅduqZ ԕ3Ǚ\UW~rS="@h  RZch(R1Y`ޑW͚Yʍɲu2A8 /˱4p/[;-dv[!wBUM4ADuyoHSO,: }b?#zH(mx/lzfRrBae )FVw|ܗ{e|F2b9~vi|t>JBs O׼WQlac (Uk06i Z4N׋+grExXEW4 ߎTHG&k. ߌ1<1_*I؛qk1)IT/GJgǚR!y--%:gMZb>,Ni%ҏqͤ_Rn qU0&ŗi#52_=ܸ{Q3S}7  Li5 $1·,yi"*{|w.+KVvK|7͚-Mh+TJyĔB0s>fk+a s~}@D_he&@T2y[u+}pޛ0Ob^,%_F!U,>9Ѹd8b\U\"vHD0̿P#v8dT}ڈA P~o;F!#ӗǬ1#!eH2n\OVK7 tD2wCe㡃Z7v3*'UŏTG,|rXg#EPzoAKasHj hC ^dFzʫqQ\]o*YG{Bj& RFz3J jwl0-[‚):^<_M?j)#:}lK4h4PhŎ=Ug^T!/4 LZ*^51 ڗXtGW8vf1>o@XͥAIm6X) Ź3d/EY`yXbj|I{2*\>_9a׼3V/n9бUFRū/f T쯜#~oQ#VoX&pgƋeө#Sz[>č3Rdc:erRiH[%-V/ZehnI)Ŏvۡƽo]\KL䷃r+Q=-%J?_;muXFMqZ~D\Gee']"E7C28:D{;Tn.&rm黅VcB)\w~[J->=ƚF=P$ɿ^_0q Մs4n3+/*V7U!D@Ky 1ÁRAL)-BZW寁0KsV}j!L$ܺDctm Bk4drHx}OrI;z+e `>6dÌ1OWmdN6W<$d6G)U$ Ov?ȩ^1#Ztܜvo=mpȭ[=|X2l}xZ.U4Nf}x`?Y*ՊJc}|:[b0K 5G.y}FqA}X#h8D\Fn'X>DCl%V|^sԫ'%E5ЀqwGݦV{>;4pFMf?<%eX a)}?mYEۅ 0"aP#`jh儒h #X7J'[B+Kżn5xSh)r.zBsVΗS aU…&g "1H8U3yHg8IT|&xx˂:Ϭ@Qxm.bGIc(Н[G)Pds``G.z=y׈^K%5i UH|pF9.9Y5Ok ˆn*oF;dEMA}5Ir)V+t[8q;b lͣ+RԨ[&\qQkeBk }NG2t%"[Nqn")rDso*bWI@9Ԗ5wX]OGs"RL=$$% d( +9}!y!C /jkJo |8fTza+$ԓJ*Dkxh,ᚴSh;bLhGW\'Guxay 063M- jWBH s 4 $8Ӯ"!^OtN4̟\aq[~G,KR f&6{TQB) *OvHZ, Slɲó zZ5e&u^Oq\#'@z"a0G?3m"noBh%c9 ?CJz2:V+Q.'1`onJQdbUSˍP Ü>35J\Mi0;.wtHFq7X$X†(Nootƍ VG!T(=fvy5بƲHEMC~NP'_k:LT~_xRP5,#UlH*B 3}*#kGC\f,yxs+qʵOf_n[ }荩_?@%ҩPMu9SXMqETGQpDj͠d8^\>b2Њƪ)rHo:qe-[#vH)`j"F-P W@y)EV:qnɯ=$HfhwMqi#mZRɥTeZDǺoЂ)`r++ 8Wһd~Qe{ [8Nx|W;Ltj/&`!/qShju>ʙ2_\|όolgIsNs.CiEGY0uVv ~`pӲ~lA)[5 Kz12QIMLw7!i֘ۜY RyM^yXwjQkX70?X-fY$UIZeYċ&e9w߅_E|4& r4I!wwHle_n vhDATQI%4b]/-yk4tzSDCwbr%GiFM%RrOoh%لr#9zqxgy$PLvoJSUH5?g.2rQEf{Kla֯EaH+QPدO8_O'?Mḍ-8M\Kp=8U$L{pqY$ļKXE%r %/mβ3-_ ^!NwJF~ass ._ZF**;nڢ We4)&YMከmq&&md/&kJK_SS;[P.U4EtX.40vփ?/Bb9j:习^5^ KȤ//Fn1qf1vXKmB[d,6˫4\ܠ7|pGgVt$ck4~ˈVD5ȅho(u$ͭ691,$-wTJR,'/ O>GLV3Ŀj/'%ոc(%(Kߊ1#"%[b=|xLS`7@^;7' a1E3?怨7>.ˎk-^l h6p/8Ȇ##Ri4)}1o1ť^o^Tb+:+{tOfi #3Fe%Ud^G (ȅFeº e/fe +k2<,wRwBq6I12GDc8+_(k:V×YhF ֥K[bQ6p0B]:웡4R4X)nĴ3odV4Nkt@愈<6s;0dxw ڙ"] Xς'(f@CThZƼ@!Nfo}/XИLj4 v<.Dۡ51njݖgmh;ifdcR&5SSqoHis0s֮ooKӧ DǠC#j5y U >>bFK5 @Is;" s'-Jt56\!UƣdB-d1%1>O7_]60$WJpԭr/n/yP&H ܶ5[{ʁ2Fgĵ96zӂ!u ӿ,2q# nE󐿌AZpAJV:p7Voe1yi>3^Ib_]b(K +MFgI1,"zo{  M6H1K<5S逊o'!-E|"DrXpGL\{k\Fip;;2~2iͼ]zD:Głs`\T̜or$nYR9gsf \.ljyU4φ i@:i?z[]"adVS UgZUjK6z^NxISR6(;@^gj0# ƅNJo5\otF N~Nb$h!HV KB&oU\ҹ1- m?u+Q*Sx 8Oi.RFfX@q )ۨݺ=)ϴ 3;?x@N0z{1eIqk״zBQFCfU肃=lFOW ruÆuMw2&d g~{ZH?^A\xCkUkԌ|h*S$EZ?u* 2H1Yj>}(cطHf`*9T# rD!8Q#zYi 75*!9 H Ӧ )ΖYZ ɭ}jRȹO^u r5w! vM"UGh50z>&B|"*Ǣ@98 B~hILѕqA6lQN'2Gnt]'S8 N%07^23"bҩ:D-y]'{<"r΀KAg=U徥cٯSnP: =n׿ 1٭>oN mKr/20dz`ԫN7\ЍSP+{x:᭑Bl?9\&ψQYQ[7B;cy< }\]ZԊdE"ivg+gp0, (0Ex=BV&/4y.^X'ä(wN=u3KW,+l~I#|hV ༹ Q[W;6 .8IϏn~p ͥúB, jJ6FD]JG;'_k5SN7b:aˋ 2owTm6SudژyUq,Ð@ /̻:I,{b. 0VE$V(BFW4:Ye=,nueʛzqU; ^]嶾ߕK;K3Sc"X+Y]hiؼ;o}J2*{yijuZya l Ć)|3[\]e+F{<*9?/KıGf jfzx]4( endstream endobj 411 0 obj << /Length1 2401 /Length2 17293 /Length3 0 /Length 18686 /Filter /FlateDecode >> stream xڌtk 'Ɯضm;5NcQc7m17vwyo]\[P(19%]Xyb ,ff6FffVx u+[@'g+{X9]@2qc=@`eef23 nfeP`:)=,,]@< 6p:Y],v FSc[BP[821393:8Yܭ\,@g WEc;Kc[Z9K`nV@{g b2=07ܿ dePgtpۛehl7v3561@RD` 9:Y983:[U#_a@m7sڻ8wO_e:2i[}vʈ$#88y%_ꞎ,A5z;:8Ae}́xogc7 O"x hae':H 4@4~,^03{[?1,ݿKRT```8OK2 qdP{mhˠg 1s0X?/.f(3t[O/-@ І_S-Zd\A"boa6Z9KZy͔\L-5D9Pp[+{_@;gjTAg Z7u0kX98NNƞ̠cx l\@.Pqs'N$_$q n`/b0IA,&? $d b@ ]+qؕ VbW@]kA v?Į_A 3u$IuLfDe+(2P30!?qn K? OtvP,=-ɬA[fj? ov '"s\A=I9;T5(#go 4GvK젬A?g?*O!?2w@Aw"G]AsUsyOu W/ӿbEbW=h~@SK|!C:kE)i8uFIrIC]ߓ^%~>mm oKRiy1LPo_v*R?HG.|G3["+7rG)򵉰}N99/z% &98. ( wIJ tb؊uYc6*Y{pqup!'f)EReKdâ ;Q?בt/96 +Gٛ 3U٥=UAϫ*{e1,wV:|Zv q9Sf O% : ?J]\-jH|NXa5w6@:x;=-eUVә (%I.WjwApru[^_OMV ?l/Vw Y1+fZC=G&戚 MT*9|)56Y@nq[L;0[6plV#j3+S>s*mR]1 $`ɩ`J*de\^ OWUE(C[45q7,KYǺ޲`.]ͽjU&E.`c"sh.B-if#5f @db;م)g$!2ᾚ#f9A,At* nLfUCPQ#0jrVC) iX9c;c ) OUεoYz>ݩ0GF7c ڮvkgGCMjouƂ֪\cc yAKSCi= fB%S q%C/s݃0mt嚒ئll6 Πm1Ea㷌3{y/Kt3'sxgL12_ŞXMp8U6{ko4}Yt;#9I/䷲*A)M0I^t8gPO6h~#5~h~4<ةR !t ivVOS9,`Nu)enu*'6c'wuʷm OtHDָ@2v&#N]YP<++t܋s(iTd)x;s;W*w)Kg?EL ̉3g1v.Z`$>׫y 8tA1جv͚@Q+ڂqYNe.7Dw[BXSfmpϏ,6Lk% Ut;Y\=3/“V >JJݸ{{? !{5ZQWy)I YW !~"(uD/璆3_WyT.Rr]?6=|܌hȑbetgm8coϫG&#5LTJ|Sh@S^TXq2*1xO!ᆩiKZA}kF3=7e!1Ґ[F ztN M%{7IP-3v<ɪN< rIO=#)g\ < rqN܃{ +Fu6ZqA#Q󋺍-`wyM dg:W: -^eIXкPnSx/_"0iېj.o%J &P& 'I֑vEO\":*7U2ؿb).MZZtrP_7(O9./7;(L'Q1@ObG?IRe~[cj X|rWPRwMWok ة|ZP5|E!jz`~F0 X.mT:gy%R:%Z1E%[GtN85{]eʢ,hn=*Ia[re:Z]@g':4lNOW8P|U[%0pJumJ +D l)|gك*SO]@~I;~kٍ~nsS"^fj[s),Quhi'K]];K'俻H36W!q_r˂%yJCV ^K#Hڵ!^VN$j~,ʿ5ǡ"LH/Ć޳zInLr%G6a4eԵ;ڤ)iK~ WgdH~$E3)T˟QTW5cGhӞ ǘG%Ait԰__:,a15Һՙ?%!܄ <^2?_R8meA"c/VyY۾ ~\_ߓ] +w(߶я.9([YӢ p~X;}>S,h)_5r"cć&W ,ך4@0ɓMV"֤_lQiAOL%Qp4ݔ:7#![*.ZVˏZЏghӭw63\_Bq.Xu{E 4˺a;g=W})Mku;ai'Ə.o1.מwW7*t:Q[Zw.鷬%eJUk4 >!pe>*bȡF|%)V Ō8ZaWK'g2)أ0Um ۱ ޻"^WDq5T9diB$<~S4,q{ {_b.k$EE7VpS"X~'>"C% `C{Eȸ$f A<jҁk440Ck7;Z8 /S +ϭ? 6V@1يa@x>0!t)Beka~2mwxEȿO,\҅@]CWˌ|'H2v`qo2=kfr"T\I9 T*Ǥ}DyuC14lp%3d䗱c uvb~ݓJ_(.&V&Hw {aO ݶ=+E<mO u>5Š=G]=:\2}kXOnۜuʽl9FfcʢxT˻ŅXYL}mlQMwV1^evڢ+?0"ۅL>LON=TyD һTɤ~hGo!u5-1nAyݚĮ J?p4{V]16fzOCr23~Ek*c<8T J1onӼP3=(!ȩh ˈy|#]l/X]YhP (V#+CiH`$}<BƋƮ"֦ FptwDJ1U&hi]OQ |jV\G ܫ׮0Gݙ j!CStݩsjN~e9#[>v?I%'\Wv=m-pLw+ky ]r鵤=l6\鍊!&faOLjQu#yCpn"j48̱gHԝ,a,Iîo^\=H}nW/RB/DJ&ofeK5ULBzp ՋN}Kʤ`WPLUޭ& ^FSGXʪp`5|A +;V{ vhKTCߚ[Ͽ Rzr_5^= WJZױ Sgw.;)%ScMT~rx9W:h|}.;!wYCЊX:΅745\oWfh+јvxL|êkN{vpm$NHxQ Wwah}9֝ 7y21f+Bhu7E+Pl.Ux0ccPވ/gJ[bjVf)3 ?.CCwɀ#{F=X.[EC@'hƘxkB =UydY=WeE.~8&u'ZJ0)R3cݑ(G*/wѽ:g 2`UdW8Pm],f]eqcM[[p@N $7/hGœX:os; {E&Y8.4[wӕuifv(KHB.`@bM)&DgĈÞm[~^6; WQukIX0-*ZfVPpCN*vu>VZP4'$$̍ut՝6Fz!q8?JuFq+U7wʂ ozU_1:1OeHNU)o Ig"Y.}so˰FdV{DZnf\sx!"Yi2\꽛& 1@XDvffR ;Ԑ8z~iV*7OfzuK(L#uHH2 <Qya)D"eO7~k7TO+|6N|_iI kp_FoU/QJ V"Yp‡*P([LFl@fP!|R1TEbkRP^T< w|Uuv1k n܊੿3w449cC;"lNasH'14YG^dnw DO5.ALËlRvu+a+$BS^vXG:Vd*iNzֈ;l=gsҶE>grumre]uC v<NO#;aG ^Kѹyˉx={B*7;( [g2[& Sҽ ,t?8ZVB˜?Ӏ'u l!I^ʺש%LNXkKe߆ y-?uK4sR'J;Ԍ/r)$M"95%st1K.Ee70opVe*L sX$׷85GJ7@פvخ׾̚ CG| N~5-s;OI"FVaW<ѐk/Lϒ4ܢpk!Lpc.w9iX jѴ_2VW"=ߣWGt q%F#"̆Kpv8#ejx)&@Rk]хur/Fd}ը;&+`7 z ./w|Uzٌ0.ȼjIck8{]PQ+ \@݁ҡ Z=ycDUx"jr0=Y2fG:xG:v"A4#6{b!gu6[+|4rKĨ(T7[8=<~:xzG `ނŠh<~WBApLm ͨ,Hv|p?^? ,+pBvJ}6XJYJe (YSdcK B'{MC|fFZMC[Cv6ә/[=Xѻf?|I0J/t ^GhBY`2WCc/Ma(X囍C sf9ïr}`ઔv? x=x>ȚH6SVߔ=-5A"^,cto,#Y:~7ve1`㌌924RfpF޲3ʼr)ݞ)3"_:3y/B: ¤q%n5M1^ [4EdtWq0bhp$IKGFt^"# Dme_O `a.L++T  ER+P͎2`ϰ΂ wLx(>>:*@~,o x Veg{ ۮ7c|`=u”Ү FHꢹp= IP.ra geGxLD)j1QT_a{$hh?>e52EWXI,5l&>?^kR^|c`귪[Wćb(ٗPg}A (%ORfsz].0d ٳ5לUYmzѝ cm_N](jqo^>4\ՎsLVpU|4#SB 3SƠyIQ /ū>2ђCw~,4(=bE#Qte '/f#dF3wFĕ954T,eسtEb:H:Ogo;E&cYA"04A股rT@UhBWQ9~},<|>hSB^擨\o8eһ!ȄIwtʶ8¸\_62sy#3r1ni4z|7ޡpHG e@Hp?݉eW7 ħdafqpr x6s/`TCN .l DO1zzjWm*htƉP [~)h}wdiOV-^oZjuqQz]Eg_٪Og(iYFvkl^ bՖ4S(j>5(q? ~zz誟~xf&p"/hK|z_ǺRNrMZK]()<ӯ!sζg3":K Vcg\gi^`6wSc}ӮG-i)vMF(sy‘ BO &>>\,nkE3͘fo݅`([Z5u߲:NJ>|Zi9a^WmV9HYRX1F7Ua>9!)AMN/wt7n{u!,z%c]6^mWdZR\ ĩm+@%rZ"xDb)$qSK_z ozR@Sﻫ:R}Μ>wi#"c*(k7nOg}:FE@b'kn ”c<yUP]}<}$bps15mށ?B#6Dz#$+)X8b.Fkٰܼ<|o5;77O_I 5O"P4$_ߞ}A=O_XN|Zs;nԦkg Mm'j5s/Z?6 ~,?g}FB"pb &vE!;\7DI63fʀgZ# Gr*尥8~B^A U:@;to@y^d)3osӵPKr_ġM\WQ*̐pW~U(¿Br[MEFͤ'Q[%yPc]Q6) ~N/M@q~ W+q7OWFo ?oEk` Q=*18Ns ǿ* D(qX3;I*4{Ѷ1c4U%~5͕0%;Vd۪u4H %`|ޙ;u }8Pܒ3/ #p .JOnq:Gt;Yp|Hr'r =X̐tU׼ "+d.٣D^D/^NOUN%(/z,d1Nl\Ď1cw-?3$4aQL35Q`ىuq1,o]ʟ!p\e\;;KwgZHdq=آDSU4őؠ^JBESMBlPݞ *fþB  qe!E ydkq3p_Ľ&ٖڐ@‘yMR9) S)mVʓ?([TKOWӋz[ 1R7ISt;(~Z=( d ]KlYsӇ:2U#L;4ӥPop_ZlkH7wF;aO^zܟDrit鷀9i/2.s#L,'F_ ov9%Bׯ6}1B&y+vȞĝAI4jz_MJQu%A4DJR<&VUL(ps(M{)wҍw_X'w`@E gdj IP&o:lHꞑ5,њL}X+ob'U袍u(ɸ?}Qui^*| v0Y 3xyx)e㩶:Sع(oV.jHD$iۜ 9F6ȌpGZNK$8S~ A}[= e_N% (P`}b9>ks6m,g %8nJb$ #N:Odd783Qft.^mzYwZ=VCu·V岒L=l<הo8s?z<|"+b"* -@na>ߴ"lo;g)u[JkV4!A\Fbߊ?ovZf^t 8H+#¿ÎDG? ,Y )^VaB41m TI4r aPsҶ@8{*KbWC. fkr{S`䝲:G﷯7wȿkD)BxLLF˂muxvhܥ5:gn;55yZqD.oegƅY䟾+Zžir%refhu:;e&H#{hT%NɚIdg<] : D4*z/9Jj (d+|CfItWWge%7VT?Uy0fDB3 ;@psHKunsJItﲴ _i9+Z"(LHKT(%ʀ(I=VPpOxʀ].Źs|us؄@|Ӣjd,]*Ɖg6bCxȨDr2 dC"c׶\ HG.!c4*:Oj#z>=!.'3yM*:U@.cQi]-6ܥ1Ƒ{/fʬ 2p($e/p8w?r 1|kMęosE@U8ddũuqSʛ[.x@uEB|T_0)5•8^/:xێl"кޥ{0bthb8<)+nug<qpHP?vr)a>gf@l3O3&r0i=#1~45&]#/Gx]kM!_RLa$:;5>ǩu>%0ڠV9fW\Ȣr [eys9d8u@dNХ@R)P ;%<zA%xcZ9`v"-jՈ9Eۜ]Nl1C#W b~;B ߉s&%0ϧyʲ+[7uTʅ>D\ϕV&.<`}/|󽅎HfH ;T34ܿPoTTfNdJ*Z%?U5J̏dhY8s'-n .c|/xHX2,*ZW#jq9Pe)0\.?˄X~p8P$^Ϧ}IPi*X,lP EU#V-^k`]fqrD~fS|~bxUz[`TઇK/{A$F.F@vjq8&ͩBkaJn37pQw;,I ^ReAW~-l rh2Fy9dFsZ*P18џL"- ;~4ADًhRH61ꄟ)AH3'5UFџNj fĮ"`4:iDH ~͜)O/Z 8iQaI:^lk p {[ci7qnT22.]Jb@u?7o,ƢOF~u+7/=[(RZwp8ɉq}hQl)7](Xf ~崻f^-"ni5't}"  Jߙ=ȧBJx[_k1,g}OlSP&@!AB;%#H\{WJl{N4f/ZUqLe2pIɉyxEJU 뾾݉A{ʨ76D$Ԩ^RWH'p\훣V׋d;A})AMVe=/yCC75YCFZrߊ'd f'ֿM)'*1yFqC\NLL:MbaBaOhdcnu\״4fHi/nbBL."i1ө%{mG%s#M,a_N|P2¿Syʋf`P3sUrF 8d$4G1(j^u2kw;%<( e0fQGdb/Ob#QRM&U9 (ȼ,9%2{2앢k~as am<~0-a;H:kWlt>bo̐Gh94 T%\` ʛ, Dbrԥ:s/sET*Ѳ0-!Mڟ!xTAD᫅!y˓Ȏ9 lvyg[yvy;]Inj h"!JN5?z1B4zxIƓQYh4> stream xڍwuT7%H 'ctcmt R "! HH ݥt))4a`h7 m6 7997#źC0 ΁[Ð\+iua?ZP$w?#'CQNP'i#`@5-+"m~ uP+P'C5ŀ0p/"ZiA99X Th5=EbG$m Gb,b¹@I0,-- a"x:~q<|Q@[/!@`@,-rQQ  Tǹaظ-@=f`>?YDx}"Z}5eIVVFydb`PZRJ_{u?W{H[P۟|5 `kܗ~4 w&5W7/:bpũ> B2 a{X(N+JH;ܾ J5Fc\ Ea@,0b8 Z;2ܥp o_U5$P4I% i{́" $ KmQh_W+* Z8rM!b/S((nD2"@vEqP8 ٿ0̚|be-PT{T.YL}EUf@qY Gcϫp9+V B>N60Zb˚ ő6v +t(3 .U,<,Nitsd8 5:B{\=[ljkǯz$'sX)5Ro'6K]|^lVe: < h&vx2썿[QVV " EF4?!ZE0Y +$6?_g#zQ%.}`r!e/F$UOte}V8bP뼻dA5k/o~1';o_)i}WiμyYЙD κEO4_-{?+Fi`p0~;q6q(5aB6Ѝqk?LCud|u~has+҆v-VT%5Y] @S(sBպ\X,yOmYxF\ =\ +$˦P]2^3=(j:d)(b}iʵG⍼?{uxz(>鎸d͠ SAMWcHm۴\FjBQ]t!'^'xlR,>&QR q(XBCo6*/,[x"nYw .7E%r ])T&LҰf^,OLg_)D/:kUk&OYyMD/v+o`2QK_S q#qVUs͜OXMu4bfQXr!8J'FDqJ? /b4 {{T[,Ox+*&{16ӛ9fUFgo>0;MN;# 0v6#Ύ (bpLk6#n'Di᪙jў~uM;U/t$#u]n`GP`JS;~|yA<|{uKa䬤=a\ ͪV~A(?ƖПdF:t+qQ A,f%i+výԩn3ڢ&g8D[M}{F+Cht1jF]teͥ;m# !o$[_y HkޯTurW\o ;>ݼYqf;ޣJb h*-]~`11=̂]P]Ш&VT&O&|;cZ2oLEsVLC0-*r:J}M -뼔 O"'ӌ{z*^BRUċj-]E#wkO6rvl]sOOk ʤpM0)㞭7mAViR)3p£n%IutjoDs[f?rn!Т]Jwe)_;oeFNI rW$oY3 ~%7=ex/Ӡ̲$qˍ}c "`%$?=7aZD^ g]+ >1;|< Knt5}h-y|Z<$ow2ٷpTqI(Bq$s}u"eR1Kzۮ8u;- ~u1쀠<L!9_*K|nrp1ŧ'hj˽Yf:Q8N2B91Bوk Kwa:?@TC++vQϻmgrݹ%hfX&ft_k \U[SD=!b4ɛщ؉ɤo?UnX!2`jLE J4TtaXTIlGlB}lq⮹B,7@l%D3^QL nH*lsLoXy=\n{]*r[zYH]<::2:;'^VW~r`T̪ > {«xư%E#zW Y\fS ^<6M-嘋ٲlX@qRs o{sr\X-!+nB=k^tpqtxǖMPCAשI*k)֗I^޼ۤߔkM&'E!zEϩ1v1O?osh/I{z3:u|1AWXtWu%UX zp:g{KYnf=WS?h,X"z$2+ {NSS=~r9[.M1iJ=? qJ8\-bKFRU,ZF@lT$l!A?[sVT;QS/SF )t6JeR Ԙq w7;Иie Ԉ\Pam ^[5pߝ!-7bLt&QvyCZKEx y;^pó)9 ?~ʫe"^JꙥA]AşfFqak}&:qoUO۰i]LFikL3HB}܈:Y>!805:jG̎jHcN9Mt@%᥮O҄Ao{P #_%n"}붺Z#U#s[ލ,VIqaxw/t%4b w42tFctoK?fzvC(F߭/z֏*q"-^o'\S,SC<u)~JP&fhDJmf2&~PXt2tkSMZUT\stE+TZ1zzɆFC[j,Ԑ)O2CBRS.%Y* i ^J'1QҠٝe…W·n! =V iv&'zտ%:kKR+e{L>Ļ]w5bf[SUl%d*M B9ww}gCkMHbYkI-Hac4B`ޞrn2@O3,uR]TadpvXp_ltGl \UhE)nkX*|߱p'TPˌO/5؟͋ˤT5ĵ䡟 Y^OHk]LK y]P- {N1"_Gܳr0X*n6[qru 9+aZ6ASS.cOn5Ɯ瘭 |DM@)/9sD{VhGB}!jH lY@Gw!oP޼aWh<6l@haX}:Xy8p}>N80ќ Z{;|A'o;CZ} ŽWyrBC%yurfؤ:bg)mCûM]^6q#a[f|R*GR"e(u,GtJU[̈́@CLF4芮vexq'`",uuIU}z4"yi 9Wc) [TU=Jq·{yk8:\ΠV}R|Y|.m.8dpU+@tS^29cɾ^y5F̟R `{٠iz52p\ulvV]@i3|ٕx"K[>=kTNSܼK՝ѳ]^ؚffi{9cisy"Jmz]/I?N3NOD)D"76Tͺ5q1RXf>G~=\K*zv6U{ȶڷxFa|s$RMLloWQasOG!ŊswgވRt%C#%H)6'Srث U2!AB:\7߇XlfiLdUK2v9] m_ʛ[ BL9N̫=)7)s 6_ikK ]2kXZd1cq}V QF.(W,aOrdrϫ>0B#3>Fvwlgd3o"H:H:G{~)vJ>|ukxN?>*|lEA6' F̯Ҙ/[\x5. f t.MO*h[?κzӑ @ϛYFm;>_@Sf3rPc)[B , *?%:n T~CvGCkHa+Żu7ZkS m|!耏xHp Nr~(wZf!pƽAҤŬxs ϋ5qx6U r?F&PIuՒҥޯ-qXk>w8&k!LMR֤6rR 8QZ'Vy)<Ƹq(ఛSwtZQy ioEXZY'K ݭ(sO3w3d5 6I39e+"i*N$xM<u5nɻd'Sk/\N;ZǗ泫 evTHߩҼ*:X\2wYttKmpb)Wʻ6d.o\!P< d}o]6w ҕ@U)x\I>&eXUpAHe)YI عBNu#N!"7.gswkFxʩ{Ȉ?읟1j\ǃ?ӻhm׿XrZҊD k5M 0w2j!>lgjIQ.٠:vtL<'PnCg$+ w$pRFbȩf^!쫄a9wdrk=' FCmeEM{)3Xum_DK@eݑs3j@hޙ !v wo5v1 TeGT9qbB5Qʼn_ $96T]%='pѝ&ޮZU&g,h]pB*ROؼ-u}g!7r5oF[꽶 q4zYSՁoCaVwF=L^&^O^}CVk&3:=tHY0͸ E>w8h̛D)麊\}$R= /1[ϓM"ߵ~Wd,o)cv'>s0ַ B'8E0:R3x'E@Y[MY_NYr& dmxwD+|5tzw+j*E4՗Vօ05ZH/9=FQ@򝙇eÛbEBfmtdϳ6ʀ&_271|U\Eigګ-9:KHYmΕzbJqW"hj*K~˫ +)> stream xڍuT6U: %ޫޅ@5AJGw (R*E"FuZ<3>3|ag7Wt@Cp?H(PQ5@(Dn CAB^0\?H(Q @bR q)  J D *`@Gpz+#<0'gߏ.7$));E `8@rc*Bn#E#3 !%(+v@ 03E@(t?0FG/ ` n0 ;@Lu6@ 9_DJC w0w8ܠ=5m;ݼx~_ PS41 a(///`ڬ wPFC(/_S!L >9h8x{aPM?6'( @=P?N/3CpЀb @!AtD `;; u댙?baG,hhJJ?_H/$)DDEB&W ۪Ԅ;"o&>Vn,4!/YC+}#5o7~s,7 #F"AR^M#Eۿ RAa(_{0`p> yxaŨ%U/ H$؟3|IatA8 `H_3HïÜ~9QDb{ 0>; ґ.?oɾg0G#dp/#O3Q,r(|`D5Ĵ?28}h8A<7N7tWi.fgi+nv}"Oo r*?0ج"O2I+b/ϟgg$:9ur5A{Iehjc! ,qONp2ߚEW-=bIvV:5Czq@_Gj(e)!doMaO9Vq"amaf&s輡**ޮ\L.l5PXt缏S,},Mr5=A|WKnearx̽}|"K,1Pmrq@ëRcX6<Ĵϸ>4'OPMp\HYNQH']MGȏOYs?>44sE jٽzE~6+^2(V )v~j k4o٥QGc@䍏tC p!Y85i'P?k^|B1Ac'8gn_sk ž/ݣɂMN}7jVq4J'^lT/d.ubl13JH7,-񗤕ÉMafE9rk3#5*'m3/ 2*!KAp`U."@fMy>[(>|wyJ;d%xsCpTvt:9&;,rNӤ/Dpg̋/enmFsQ3|Mʽ4?8C#)r̶Iغտv <5jc,'d~.0:$kvm|b, irb[K.9үHvnZgp,+Z9JauPV{qݏU\tn.&^;VXu XF- )gj{,A>) T39n\:8+9?plԣ)5&Zt>ܚ{sz:)w МL oJ'u\rַ>3ʊސ1v:[0Bװ|\E1iHO*r-lbpgGWw9_*2iW[:Z=@ %zi1F rqqcZ≫xٳ)sz)_oZ*}C),-^ԄOƍ211+Q1tdVuzxm9X/a4>OVJ*_#d(4y,Nkɸn[cmdl቏}X_yև&6zޞaDrh')ٴdpé%X5ןprF-.d49\,=Jq>ZsRXTeyYBhQFs(vb&N$M|}ZŅMU] thl UijS'0I`~/pf^nb>qr)W'i <&|3b2wDDT_a#TgP:blR1Yѵm|?/*+Vdp˞k3*˖6IM'yMX=[dtӧIfY vtF1 K@m΍!fp|Dq({C%KlƯg'^} Fc}a!yF,Rrl}hк\0WR>YmhMe? e$BNr8"e#q;>zqI1 sc丛n(]gR:I^#Is&Aͬ67X-G ]#eQ 0slp;B2MiСCGR4ף&Ȟ&&n`@_ˇTF\ڌZQ-뇷_2HeX_FUoNJCYb_VPFm)ڦS>_7\磍gL*ǚr=4_k{ێ ,)X4e+ǘIP52y#'uw1:HQFLҝ[1S5t d& >q7NB*GCa DyZcki =|c+䍃w|g>w]69d:|hy)_-^)0b'ԛpNEorh7{Gg5 kf(گ:Ea\ynyXH5&ꓢHZ}8i!RzVb;gz }&lc<E:DL1'E'hlx6i}1mdpStXfbd-Bg~)DFfϥf!1Nsa_^` jDNhS!ИFc~T[(썣\"b,=zP16 ) fqb-7Z`ÈlޖoctRsb>Arp|f|oTC;ˈuC;& '=^Y !]Bk>%% J6J OTN7D&CWX?,aN`>8:ԟڧᡀfQ'o$˘Iol#GΑW L^G:c;Bjd^D1t8+]|mÒVoYd9II/wN;3^5~eiAtXl8I0jzG.қSqJ;r΂@3`\SKnK4#*r(Yu5ax<%oDSZ%Pjw w]DB֯?TI%=յo6.$hAj:ar郰3l9ˈ $)gi::F)6BfHwA"'͂qϽ@<Ūꖡ(2g5-WIf|P"bs0_29a@~<_3BLc91J/OH)BnQ¬L֟\,t)O|.o% ϻ;Oޝޖ~^uG|DFRSh[ޕJ)>i&4Qx>8[c$mEw?c34䧔b{ccQ@[F%ΡjEummZNQiXӈ9$|K!9a>9tf5]L4_W9 8D=P.ӳ_Ǥ%= ݊d0ᅱ}!ZV`0GUmLYV-Jw|׌(u:c;GHR e6L^RzPnb5³=v Kú?vBI/OlfjJUo Kzv+7#w',ul<зk4Np }n,` @rCXj-rgXG.#Ԗ] GsZ6j۹'dkzۃ/WbFP ,%R`a,/L9}P^wA`#W}B0[~r^jPX 8as7Tc;Dt[Af$q@`ブ8 ͚]s){1p:.>N$](9aYs+5 B{/aC\^<ȩY3k1`ᶨA<>-t.Db!%*\xR-'906Be?0RtH1_`~qVn7714`*/`dwtCU^y,sS)=GĤ˨e/}˛bOS7*~41cE:td0xxT[DC5('9^<}s#8od]κWM|7bOO=uJ$ uqt1"UZ:! ~sSjC(zr.$_)|N[E eѵt'L~VOI?P~1*J,;[jxVnr-Υ<2=(6|}չSUЀq_IT=&uy=ЄU\'NQ@ˀڝ#::ޚPft=龎VçM ꓌?ej9xv6~?`az3']C/# u1z‘SNUu<%NU*$(lsYs& 6WbX-R.@d%Ա0{?WK.u91 endstream endobj 417 0 obj << /Length1 1609 /Length2 8233 /Length3 0 /Length 9293 /Filter /FlateDecode >> stream xڍP.tJHtt ,.)]"!twIJJJ4JpVsfgv~]FZu-vI XgH(pq89y889!p;_rlF]3 / i'0ɀC@/\)!I rXT8P364#l|;@19T@pk=Ds@ jY  {g3+n ;\_%TA?Kfh[CPhA- '0!.,N-e 6w?8vCa wb)s _ ;g(؁S$5 Dl9!vj h4w l;:@]v3:@%F 2K0^=/X@31 `'#,v1PKNKYNϒVJIA<vn>N'9q_ f P#~Uh_I ?#TBߐ]+k;z? ?z=O _ˡEhj ĒH:X!,q[Ci ΰ8աΐ_‹t3E\.Έ9#{0jCjk' '';6B,7@(@ :as./o Z 2NW@C>>o7BnDDA "I?1oF#}sn`spMu`e$+Q>7h1&Wvd-^+ݼ.9cU)/'544rV4f3'郶"`G^yC~ Pņz}P,;aߟӋ,6Xs"$OM&Vv "Aµ 1 5 |koG xo5vc"[%WO"X&(p[D19;屢 ?y'Ơ݄jnuߛ!c=:2􏫠+9g8<# &HՖIy3 q/Vqټ**zeN˴:̗eMj}V؏Rɴr|`w3͌ v/ɶjIX+9.I 8ݟ.3c8,w&LP#4śk#yzu܃0;w%a(nb_k heϻljnp66HvoS 6<aէY~9s|B֯]͕bXg<cGVyiL7F/DCw-E(FO26ڝ/33 do>)/^jsy~DN=)7i6j 3Lyb){P?Cp}`nELFvPvu:xּMEEJ~s;0;5LjyI5R,9Hs-MqZ@3c'nNFsЪT0X9X⛧5 X8Q8Lw Ʃ]DG8& #LY/$I?=E+S22>t c|i=o!MgTWG4b@qO{s]J~f'0x_ս`n#sh^j)}ژK^ite:r\gu=.| TfZk _E/V <4ѭ$mXw qJŇ/|UهBoC!.݌VFC .\p&'gC윷l*tfF5j"DCU5s7!J <@ie4 xI΀9;6*@|4 ) <pR So3zQV+Υ([`|9SY,*嗺>g s!Tm|RyP ֖psO:I. Ќz*6([} Q $|BI_蘐(>Q.R9M͋%=$ņ^;CfW`;x8A.|ep8|g^9AB#YQ9,)\Exg%5_p]NpZ)sň`HN1YW~4oɦA9҉%:$+`%&]mBSbOį߁m>ɣSazHE ;ЮJU9箧7qkg#e+Z13ߩ=ӺeP^w7c%!ۣԝʲjnqH!"Zp:%[HYH {$T&,NLx:|#ko|n2#?{U >kb#Ymq0'vȮyY06^=iD֠g"r4 |8oBR$g/L~/(2'F^s9cǟ&ymN`"Z)d.Uж)/6E>bIb$O֗W͓D4XS2(eQQ0p$ Kz̝}{jѮ*LC>_[i=OyH&_/a!?ATF ҫ;Fk~ ٓz8MHM_gߎk7< R )S0p;h9&;#\^zh: - h{qPJEWPb^bw\H2+v8BH9`A*įe/'eIJd9 Icdt)&'dGy\AG=%ֳ,M,ɸK g'n/91H.߾8X#^lt@PylX7khgnb ZA 1;x&]xSўBnzT*SB7h.kNO`cS,GW4顝ÂNlsF$iT6Ⱦc/O%U-}v<-2'`{3d~9dil]j8pg4Bzi[q@ j9iRƺ`m*PB9b xJu#.;Nm6QqƝ.Vӝ^HUk\ c(glDEs"SMP3X)x{^}xfJb@o{w;?T$G=Mͼc3#~v;7J$8S2B;e?F,[05{p{|<`m4]ɽKGD!Rxj$dGPQ?2X¸kOQw+E/_m}21JhuAYOoqOnJD!%%*p!?z 6\*=oBl(R޲F}~2\#npcEIb UWww܎wJžggMo;>MXu)Xˊ9;s/几`U`OǛޤox# (jWmeXߵtiVf xkN$V5Lc" ZfOb,,G+:J#ý\:&"\ɲy6* Ö́ Q: 3[?}-{ɼ'#"\cS3p2yLLSr#Yk"aDU?ܼ{Gihci쵈Jb%qcwveFKi` D} Wď M}iDe(әjNr  Df`KԔ -hTv.bv.zi((^:__ZN0j0۳u̺_'`Si8p*ΔPv5jϛrIpd,\Q^y^l)jä q܍񟉺Dv蠵tW _)Gi}.8ׁaW`BoOre!T0]/놀@^>6v mπӖD7@t d(<>N㆓tr6LH~RC䔔Yͯ)@A͂4_u|tUH?);Pcޕ/=ӦN+Y ?ugVK&YE?sVw0qi{hyRHɤR:/j KR.E,V,S:ݥʠ vhT q wlՠϙyk]8^ڨY>)ɃO嗽`{9%Yޱ+ڈ4D7$>ub.z޶Fkślf{MVQ/x$3N^NgfW~ċ441rd)E 5WPŒRY߄An7}yM✵KZҸHo;`Ji0w^57xo?/ɲK^r@O= AZَQSjZ;ngQ];;h[w=VN`{ӚXWl!'q3mx*$>N 2Ɣ<4/u[,o߇%K-_ߕoH7eV &c.+i\M?ʤT9[Ƶw{7kf3峎^cMpZn5{)p2PϽyb8EC~74Ƹ0`9 J4 Jjz.r~ ߢ4)@g@۽V[)Y *h>#g7 ] !Qws! a{]sL#R;rKBM v1ie"Y1A*n ?LS)?Z^ pq=wcoᔫ RrQe:E)ks^+$}aksC?LlI&$87!d{ MO ^sф~Qupf=>/. 4g*e ߚu(Xg4.Q׍L;99dT(vZ' KCe&49,iRe:Csq r==-*A97[Jc)y/[>Wbj#9IJmVd3Y(,[3|Z.ŏBD*u=W{J^2eP8$˳t? gd$ X'' `q][:fD{JL{cYgLqyҶ:<sHK*κsWLf^Nv5*afb:L12/9 S8VgNd矩ӓ|pE~F`3n` dg"GMn[2֝qeFB0czRZ#!u Y)7:mhMgCJLLt7yCy+ 0xA%fKr;NaAg3M:ûq.$0╫LQ֜ t9 oܓso$1(ӹxٖL+U"f򉮉9eGZۺ][v3-; 5Z}R+mC1yWZ+9S|Js.Yprk`f=P<&-mTxYO(%1FCLW9]Umqm~IEeњo1!TDqٓJIx%gc#ʉÖW/PKG(ؙ'0rp+}L(4[싕e;C%"Z?2@ 6|y0PAՑ.+"|?r=^E5L0 `=4>ڞL!:7jw.P%BEL(Ҷ+&zEkip$OIwWiH ?Wx2zYPߎpNA~ɒZi<,]]5Kc?M/>F3PͪɷRgl+W }2M J2j0VJYvl@wGrz2M|K H;ԗNV9&-8Ȍp,{7BܪS}>t=ѵw7EZ{Y%MzKf\jx笨Z. G m ԧnjݛlƊAޫ:&3Q1)Y,16WcmlvjH ;eqcY>^уgO0ֵ0=?f7)dȔ=%Ļ**>c0J+(ڍ.yҗR+oqȉ:]~&/~]2 ZԷ5F5PqtB :o$SbLo}KwLDѢ<n_ԑpWLz;=9,F$bWx7߈P[ O~ЈE_|ۙ~[hzjA'}^&J )`d5Cܪzo112AȢ8/WM}44L%~}KC[NFcTǂ%U—B-6"34Tl0qB2w]|Gd/7@縬A+ţo|@,C%ɯ#_r!z%W_ԸH’qjT~9lwe=HJ"m?ǻ1\Œ7{ּy~}8]S}az,sۊ32"a<'3q4QgL鳁 c JDG(Qx1g; #ʳֶn\kZ"c)D ,;'G,S$7]:)9Hemʛe{>Ċ?Dl&{4,pk?ҍfV\QɊzX_~ 6qK}TmTu8dvg%ΌkSxuM,|VVjo9ɛ'IPj6[;Wbo#w _vJ:[ Y~i_U1_u$1 +nwhQ݊f:ȶ!X[ t-|sO%v7b&%vù({YN:dԕ;lho{4؍&X(H*NtC btֽzLǠť\1^BsZ|]J;ѿj< zJCB =#cOZ)g-,iǙ 2̘*p9.4^m?Y&‘{o#м *^ endstream endobj 419 0 obj << /Length1 2926 /Length2 24787 /Length3 0 /Length 26413 /Filter /FlateDecode >> stream xڌT  H"Cwwwww 0 !!-]%HwJJqnuba;gȉTMmA6N L<Qyf&+ 9\hik󇁨 v6g0`ab@ bi gڀEm,- i@eB ` l r4N kHF jkb rrO*> '';FFWWW#5r9L (AWƀDPt[jk t  lc r@Tv 63/g`f %ܜ@_@-!1$@Hh`ih U"0.ۘZ[l~t@dll]m<f6f0ucTwIc!LLLܬ=fb+/%/1oO;[;898=T!13L-M sK!b2|K7.dLY/S[o˨(#"-NwDDllLzv&%|o*-!GDi3[5@:\Y N ]~; oE[KH KMG cYeg'YBj>eyJ;!!lcn S%K'wS[ڀl-=lL GȬR ߔ6&tp#AFAOfȅZm#)`fkF_Q70F\F߈(/d0JFF߈(#6o"AF.o/pQ \#E7pQ \#E7p \E.:/bXM  hm9_; tbdA3vX 4?X}* YME,&M%t0q6CvbvH^[0dO'aey.Qd3gflj r9BJ!4utRN@V̿M UB.Oǯ8ΐȿ]efZ f! o &K;/s[g?A CH#`d]d,,@6X@dv ҟ@H ? dyc0qJ=RϿh<8s = 뙫iOD2qHGQ:,wj,]8d8:`G(%У1챤WYD4ָ.v0oe'(n%Ԕ4b:(bVFuau]ktO_0mq~uxd&$vqd[H_ܕFB7|e' iE&Hn%p.r˼Ĥ =žu]Qб>f슮ȡlܙ|vc*nB.![ 2o-~&lAĝH.~}|MZw{r8\/wÉFzk,{2Q^H`puY澭Ykpw5Π*~S%#^l"[7ƼT*|p+#,X Z_+ũpRۮxKM Cj>ܨq+vK;ul&'B   K\㧊 2 o*\_>3Z;})B ʄ!0~$/&W@<~#S(Q_p^64ٚ`G⧯n96exi8[Us秐Xkt,&4 @0{7K1TtVU<8 IW2`jEeơdJ(z=9b9jH5&{'gf.#KF^I̛Hq=W #zUOFF2i$df*BH}kݷ>k[6lq-;hb:]pH3 p4V7MyiV j5*/Gjs3>4uQ(X4:)کikwsO>&zk~z--;ll.ĺ7-է0vL"p.e?i3Ƹxr8w x~8cWmYwtؒ#0Qɬv$BeWᲔ!,LɕJddM ]g@c8,\~R@yINn2i9's6`wP >YC|haw#.! ߾s)vo(ǡ4&)reO8i_p{D< f?B#3\f5o:1 ;Wf O0.~58(pY֮"lr建koH"W%`2\iN~GE(n|;ulpL{Hr){F1\7EdZ3Ĕfn]Ymdf/y `dU~Uf*D]rE7j&AH\B12L&m Q>RS!қb.I+Йji޼=Bex!4ӧhk4m|9oޖ8vrKƠkZc*'K*mL %+m'bemQ>҉r4ڬ D=rXҼQXp48}5H,%À@s5쁼C6âyu5xH9oDۑ1^ tUB#Hİzʉ=x4+jXQ{ kS3J7csul$W Wρn|Cw8[[ieKBZ1gFg &f6X3}XT(AWp y.Q)Ŕ~Jj|&BϮ%zk[f:{ᾤZAb@"#B~̴!8lՂs[#%-3w]$GBܖ@rW9"l+2_HBt.1euD| `v'uPǻ,I8Uw)=2][cv[R;NVzGFs%ntt+7$yTȸ90(+-q]\kGn 3yj勪^,cÿnx][}~zb7'b~C[sZdpRkEG+}fυl0 ٬ v(>l: +ˡ$E$ ~20 ^6Lj2"<. vk^!kBT - iȼ/`WšD1hrz)S^ís8x 沲VjgYhY|x6 [N`9Q>n2}|IfQU.<%^B U1d2$D0t=a hXyN]ZEݻ .T<]߷C0E%I;xZaF{x,IxUt~Qi}O@vd$/!(|%SPXB~kSTHqșbRCs610Vvz&窪r&+}IU|KiXj- tFMi(!U)$gض (z5 abwMiZ,<3ؤ ͼYגnH$إ4w!T~ol2@'?6H,q(0<MdxZ;~!_l2?{*_G/B 2Ӏu~¾&!`[M:y8"eImF^.F-Gi#ϏpU)v=dCE+ƓM{ .g2Dg$3o^ZnwU{ۮWtN;zI}YR:z1. ]PֿD)m45:\lƐŢf !ܜZ7|jRa8Lztf@Sk]?LEѾ\o_oP%n([\c z:ۇ 0ßbvp;fdBwF _%ey][_nI;؟  it.Yh:=퀶O vudJR HvzrH_KA,nؘ֝)r~FP}-OMEj>Р-~004Us{4vR.zo/ .8=Q:<㧻}̝`EP \GDs+a{uiKx'YS?g9CUhF_;Fųz\qax(9;r lt#ջB?·}^j6§nۄ:F0м|U)HAh:& s*k$0+&1J=Yv,lq:`&sQy{Y0r[Ƿ,[Ĩ"u6K1VtsDT*_[{զ4m/̯X{bيr/ '@)Ǘ>(7GR6Y/Z+9I=BTY9noW1Ab2^--ZD‡Ԇ=Hɋ N2&{=M:J^o`&7@ *<8B:dFMzI:S2yL6P' q~CQhǜQu 虹>cm԰t([0ݭ;*F=+R+~04HR4Qjʵϰ4LXz$ K[f0WJk#a\ 2]+߆Y7}OZ\fo?\hJ,$ #IR<b~s'7[6ϬtֺG4fL'nNiBƒLg, ,w~w8ugHux Ǭ욪|q顓%F HTO[eҲ 5z B늈*;wm`g,޹{jm[%pT4dHW=jȄ` b^m ld^aSiQ<#0o$h/ףl4c8Jc¥}X}+؟',LJ)qvcWkoiJ |DBΧܼcaps7otiӴu*!aL7%1z5@rnQm"G) \!=aJ]YF^rѹVFU&nTݦ9Cq)Ri&$";dqR¡ԗ _%0~lY-C6J*ll#mэ@Ele_>2;aUFHILkAR$ܳѩKpIxjBʑJ\pƒ.)/t>ӌ$Wq:i}AYO*_(2mL{l ;]gf6Ŋ @v]T֪ݙca7)DѤzL=甹7S,}x/]Pib1ԁfx5nsMŕWVˍ7 7ϹFfcN5˘uq¶?P3g@lf62D*RPOF@e۹2JVyNW2X=}0-ya~HmӷD1JЬ02EͰEGDځ&4zEӟ؜yf ښ|vcӽa'uOE1 _J'@ C :DYDSQ87A!MC.4Lܦł5?lN`9EZg6Bэ|VpaVּWl&E /E]ijhV"Sh7sx,LU JBqڄ WV\g>9J~к@3撶Tp<,DWM 7(ﴭ/2W~:iH},,.(h|[B$ӎ+8ULhJ¯2xa͊@Ʋo! !Eo1/#:^**.Y&><=R.n-ZejޝlX^NϷVΝ][%#C!SkUU5c`Y3i]B']W~t10f|s%^e^.RYHV،CErA}J'O Dx-ċM96t/f@|!nQ wx! ZOL-`qI9a#}|M #t}P $Q oV˸=9yX.+Xty+\%) O:%wQ`Mܣ ];ǁil"Eko8 RtѢ)T@媩OZ.͈oaL#(0 `^}0l5^R &\nUXҁy2bs?βp-ww6PxqJ\4U)QU?y:F @Tt|?6M K2دB4η :O^X> 7t8,X|N=O,k|\-xPz%cGdUv2}5 <oSWx6=;(@#e*&#/Ȏ:7a^fO췽hl^whq# 9DFBx<@Est(]6 :Ri) 0W%T9=FABalZpKi.8ODb鳳YǢEس,LP}FK{8"󉉸AウO ܵfŃ# zW3"cB$5Df [ф˓nVyJ@TIn&U!pQNT7/5QĄDIb)қv^ඤ`}Gx9s"fL+=A(_"'~ΒI$ cQ: %GW%Vt$r1^TTlו>|d-ESuI$oߒnZ a!Xt+X@z7_mYns#"'И{$xZ%YK?}J-AY _#+Y{Q=rjCIgSΑ5{ӿ"d8/|BTC[~G>h/Šhp9r&)c&\CRoӃKC૛D|Fbe}.vf-IfcX²;4a)o|:-`&҆] ^`s?ݜ2^>XR~f?f*Wlv1lia~flh1@(;J^92"Nlo@?)V+vAd%%5ET&]w5Agl''4>?C~aȻ36~~ӚF$^]ؒ/2K"]  1b}4j8Eic3)Պf>AXcj-zlIO/e$JlH{$:߇ɹ՘,T܊1/&&"aRի;.陳zk8͞.+*HUY4_5 ٵ'=&q yxX :қi˩SZeQW&$uT{ylJ2ƧpfzfqO¯F%.a|@Iεk:dg@}З`f|J5LKdv}`q2Y3gQn___V6F&2픕gu?sm&%N\/5Ӽ,zx{$3.dBJqt"{ F~DڀDZ^v7Z`} ̆څ=!l?.QStfQBE[b t1[m6Z\4+O=h.RlU3c~wKXG=EI #x@T}8o=KC A}j}+k.v[+;\1PCL}; qI\xdfM_^o]$Fl}Iw*`viIhEDk&Ӝ8 cMC Os,601No")V&·n>Nj~(U?*(rSj{ɠMp18JC)Xr_t[F;x5֞#X7*4yia'ƪUo)hPQ54%i. De0 vK]y#^"]}w.P[lO5dwbq/rX?fnW]/ | UfPؠ8h2^9\d`s^bF;Й<I+ J1;=.R}ӈ&Sתs1?Bp. sJ8Ŵr~;\HF, Q͵TF0tˌ݊MHbYGY:NBzMql?41ݪi(TM74FJY4dcbV+PM]w& pXM%}l89u"TB|W)>ojt!~ D0W=X ph/tqSm u 5ΏG,iHL%9$BFg=¶&|U곍zUXڲXyrXԆ>rCi|[T tXW &ύ׀ D[r^SB~4մ7_uXK*_otG7i?i{ igҥSE*NkR9.`C2!RCr;1,4i&#Wv|-6Baj01&x4Bdd*/:Q`{M? _tM7 #EuaxY ʓD8)8gꝫ\[r<Ǽ}CTy6.A{~:(`zR?Qc;*9ǬBr~81)Nif Z>rQ"eGu\^Ot3ol֓!1G|JCm]pD) LwZ WqJ] A VxԦ m uxVn#uGls/+rW3F>uh vgH|ѓ1ZcJ|W=wm |u[;С޾8˘OTV2Z#R^5K.'V2 myV2ddQF2% }y zYW*.ƶNr?, a aӓ]2J5sfOQf0/LTv_&FxKS̥[Hp-N F(n6[;Δ 8` u2Er#_&]v<@.61tǏJ Хp?uAXde4I!Ui'e4xG]ʇ5Ciݗ.P\9SL0j֓w~LDߪ8|Ƶ佾n zk=cp׉T Ѳ0+Q"v=㥢Ul0ۑ ,_Ӻ Xtꎽ6Xjh.釃X裾'?/&tT0⹭[~H`sMVnKh,f(-B[jضKBc{&mntN(Zx^F9Md]I݈WK_b%7 \%}|>Ym~$ T8vZ (*ȑ-EKMolxA5F5n$^;r$`ohQ޶"jX:uq/*c7d/nhx숫< ҝ'eofkEbHcO[{畺2]>>2Kֻ袹T&e s?d+]PhvptNm+5yz!ݚfK{E7QѥS[)}y]DTg=EEGpzsh%!_G:ʘތCfZŵILōc<(|߳f,܅O(:|rm\/S}9mg]O@@zn>e!:2Yog/7jU) y0R.Hy[H '5tPVlV$. ?/a8q/lu/Hұ٦fr踩mo2b; \Qwus*>5H y)+ºt (hl%G7a0,YVcG§ 6{):xQY/wSj%u=(7 (m2L})5kݮ!0≯V UWtxǓd4&*FfFMg:9s+٭php\>bRT;moQPͭIœx",n<|cQ.+ %'8ĞlK{vI 69֌%P͌w\R Z*`UtLlVIA[(ZvJ‘4u;Qu< '9lDf{T,Iil8 A h_'{V'H9G`蛑7rnI ",r<ǻ*/PRweCTKTuJiꫯḦ](D@n ̠;Tz2!1M*!r8qIoN0} ەz\2)Gڢk|c P<+& =ZąyBo;VI\6ASɽ 6Rnl<*ѱ鼴Ϗ~g!J`w*""aXé )逦}af_C9t yD8n54g̃_3@EzT,cLTiG]._a]|5GPP\1ĖrJSg.O>YzaXNkS%h~nw/qA)o)rF$Z!p8螁 υ8FzqJp`;;.76McS1!5|G߄0TCc{Jǚxrڌa-֪5v ?w@8ni_BPʶ$"nY; ScNOc]9'‹X +uF}ƏT qȤ$uSd@}rmNTO.p\FCxZ^fs_z!-j;@]y6Ρb~e:2IhEto楔BqB5vGJPֵhIk+kap|z 7}y,9Տ=77Bf^*%,W%Qߤ:O3 z=I2BM@SgłK]]|ƙnyp:Lkl\;eMՈEVK\V>p@ SGn  M~>a<4a?!Vϑ DK~uytC?+1)*/f ce,Ah36ULoԠsƕ^6e FfpY{2}S Gܘf((9D}7J6_h3Ľ%|!K D^sEhkjí2y'+) AM`8^C,Eb)A`n5 <+z }85 xP"ȉskHmV)jݸwOl _秠սxH_0rnRZ9CCkx 9B 4hQRപ4riWPռ۞LJF`)񬩽UIpH՟Ӑiɑ+Ol!R!0hyUid]uQ^ˀ @4!JbzyxbzMrda}+ RJ(DgD$x2Fς^txyУʄ^ f-na<{H/UdR"slZd%b%Ojcnm̉VZ-v[iYFp@d@n^GGBJO9? ]ɧ컁DЇ?Ii E3B>6B|V6Òh91㕭)vOj$VSzZy l ٖ}^ }GWVBP0xQ= ZOpF?_HLX Y[I+ rhfqhFW;LbCCŹop4bpYJH W3B|DK ~kQo(_C?5ŲOIK !_+iO Rc#jdh@AKb"@_Xd5]f 20C/ےb1afK%6go|D [h9ۤ5&&W+!Z]{P~w-y.Cx_ )tcAU O`q zʝ_SM璯ظ(u땐iH0RETI|1?u`ćG#T sjOjJukCMMfoW{#66D)-Sv3KAanv$-Ky%ۦ(I1#'y_8o2Bhd|| ̻,݀&> EzD(b.,M_I#|!elCىK-T`|2 GXbe(yv/Ihy01nwcFfz\qLTT)Tg{2 9I@M#r؝3l!% Ѡk BM_ wTb vi?K}o ×R;Ts6:#iz~="dfdyjPm}iyeRk@LlALmU $8\oee3DRa)|0  o{]b sǏ$%xju9(3K ّ&X1ڜFu1MM.. y y^~ۯY<ODn SA)y߻jZX Q=lqr=ڤn/:k1. Vydbzx1Bf&A%O:/4+3AK'~_kssADT- ݷNzS0Ft[JLcHF2F-$$|5!&c_M3~EƘ ˤϪFdqk(K+]#?.hQL ,Tl3(e-Hjov7 d<Q9,'TXXE7"t$j$ 4;|Ɛ/=];Xgl+ ym5e{wg,abjoZèWriK$'onCD֨ $txoa8]pY-uD^u+!p =־NMswj%_T\/O,gpuuNAt`r5tjTV+A*tɇ£\ﻘ蜈}Bq$٣5. * 2Uh6>h/1p*8on8T@j]nu:ڦ?*6 ]!e߷u˲I '_tjc.s*ZVxP[:q}VLwqn# @BAH[̍TVN#;.^>ω Ii:1lڪ>2daT}!c*GL(?kk. :Iȳ9G:K[d8udRË='؟Y5/wc 6'v&R`2&o#ƥ&*JJׇ5YVsŞ1[[{/TCD9ӍSWP( R.\>26XKurgaCH d"TX+D0veRj4JAu?;˒Z7-vj*Z|!-U\zS uyI9~ whZ3;"KdXKx.o8< ulkڊpΏ!zwJlu)+^u+W&DS—VŠk{j6Gg$tB4q%A `a|w4\*v+FM9`Ć NKutTvP qn 1R&SlR/Fw bmuKHh(G\-ۻv+0r9)QM;.}Fpߐ*(@ Sg zx4v\P׾{QS<}(Z հPۭHa`5-CǪ\$Ly!1%EGԆ5PuoB]?,mP[߱7~^/ٿux蓮-=u~{̦C0'hx1? wtY45{!jStb ' ah#kQQυPlPȵǨ"Dy+݆;jRI; /O=Aa [$}&hS\qPvg*@U%򴡁Rf=S3բOgEƍB&o$cJM%ע֟"ҨGg2N S$'ol` 6⏈v&moB~AvuK+8H;g>WK滃̔o5>l:جZc$e4=|PAMa[xqKD;APz YqU Eڊx02vGL /9' NG=@VnKsFv%Kbh774::rILG$yצ}KBiP+OҿҀ.pTMs@:XMf &S-m80B`&hXQٌҢfS5pk0e; 's ޳j*bPVTb[YOm7#jl=ke5pvQ?Vj#dU_r[Ҵ\5[9璚v65:=aQ_4;}АJE7K\JWvuY Q$I|(!j%EbC@ij<jlբk_ "oֺ<\ô[ߎ(k~A[(p /땕 -i"sMNJ2圁\B4+|*^84[8䛡V*ЋfbK x`tyEЧݓYdE/bd/و͵g sv5u_Li9[ GmxmR9&Ŕ+osZeTm^ʈ _æD11dC1MCK؟U }+{tb|KR= ), HIDEbiꎊ1MB1ns\d33%Ni×4 (ʵH4_'~: ,ZƗoQ;}Ҵॖ7k甮<}*-O+#wQ& JBYB# Y()>bAL 4 ){u P@q;rFJnk.b߰Hߚ;8-rDG:=[/<^(1&.vgHrʖoBa-Qn;iz[;^,3#m_hF) F8ȸԪAWE<ǚү6>/ⱗ' ɴqۙPt$] +4}hQh0[nQ=lZ$߉HFv!A7 ԅ񷃗I $O ^j7FD!|8J-.,zb66(]Un6U=P_fKL _UPlt yRGGu9 9}6$  = -J()ɝsCspKl C.TaJyzDfFj14JY\]mjǼa2%^qhʲ.wyzkwBBd< t-@@wŸ(͸~RQ`ÑPItQH88(32 p?7p VAWߓ mwՂ)k~Z@cg,=?W.#f9"TMb\U8|=c(ukw+ %TNZR26kB wR 0jSȀ'~|o6&i(Hkj |uS\*@Jcva1{m$l}"14jh[,BQ)ĂC춭 9)n(KDR 3R81 j*ɞ)W9]lAYrU%c6SgWqg}H1[6+e9e]Ҍ[/U͙Xt!qVo%?<> MIYWnόo><0be$fjgz^>ث[< x$*C޷ɤKOyMtwxnXV=yikC~Wae+zb%1őX(9VxVD]fqj΃B =04u$O[G<]ќ] goV%.LXF=E 0Em Rd^>~rz~ǀ=a?˩ Q&foVui=O#2)]kQ~YՌkb!)$&lue㧢LD%D0%`TWwBu&`J8MMm:_vc*LC0ƟB@VɯS?qgKA>L'zm~LD{=+ OO.ٮTd1L:|rk3書UhN5֣o~VxEw+NU|Uo ݄o&_#![F>2@zNpZPGVn9p5&@G17;hG $iSq;L$:v"me^)淅p s>DB-m| tWfJvSxVV_˖H.u"̧<ɎPSEApX{ ː39+O ([3gru=6w G~sl)cYܜ4+eU-`%}V߳Ѿ-h?H5)Ė&+!NV"4g>\h`1~0N=<_|x"FDP[O2[VwV$&ҧ*`._d~r);T75 \ |;}=r5҃ͧ&eM ͦ@ @pQ7?囥 '"kpB@ &&%3C=u}*gyC k8~ `/@W J ۧ2ns69rn( ljӹ05^#Yjm" jC B2+VhSzf'R]E!щhuґgeȤ 3DSl4CX  endstream endobj 421 0 obj << /Length1 1517 /Length2 7550 /Length3 0 /Length 8553 /Filter /FlateDecode >> stream xڍT6N#!]2z JRdFn鐐NiR ""9{v|>?pI BHD&094rp'0ۍMvh;DBB @+ ) PzZM'̕C ui#h ;pK(u9t:,07غ9K zzz @]6r|O-s!=`V_PG9p?NnP$ pcp[7+p C>wܟٿ NPa;:Pn|(W &;@-n~ P7j; ~QUUVJN0+)Ñ0˛kc'OϟEYwqi(rc"fs@ )QCY *o ea ![n~}\0o nT1ì7GQǠ @>? O i5tTy`OQ  $%b /PgSPaEOUn;h;H' 1͗W@w3Fn7[t 5Z0+z5ܠ7F8}pWU8 f wCBMᦼurz@웥fV]uoKկ@H!F^bb~+ (prIX;! MTTeIFR77Ѥ _P h/( JBAMM#?,ݑț/ $qjWqV fG@gp#;/HSkWԑ^MOOmz?|/&B&si_|7 00(lt5 nwq$-i>eū4c)B@o6 ͌c\xNJYjzc)Kh%U7V W>$DH sཋNm`FE0a5pDm.ciW Y.Yjj"1Waj ܰɮ [6`YB kLjzOFzm8P}=rsrc,[ۖL!T>-5;3UIhi=wVn'YMrkpMUd6 uf1w+뚑qW#ޣGE r}ERbmJ\Sqb fR}TWҥxp}^E"gTVp> \q=C!WDs)gcM2?i<8nlF5y[~(ɦ\R?a\n"E)&O y!)^?xBK׼ss0f)7@f^=Mp:,T9VRm'&Gg{>/Dlj4seTD<'kd2uK'vBg%2!+-e$eꄛ53Zľβd S`1l/P5_9!lC(@f/Lws<9[Xj~ن}V{ SxnǪ1vXJirzpda:`=Y|6S1j&kǙFC-$_f+r((d9;;4ǚq}OF듞z@ csߤ+Ki|N, P%RƠ( Lbc6ϝrEz= 6J6#B$l*`*/Uy\a͏7%ͲW8:fVr03"6 ^!Pk*oԊF&[RIRre%kK &5C^WM͠ gT}xBbB)+h(m}Y8p);r`t׮C>RBD736琧'Փd:Ta AdUײƉ`U'qщ{F3G'\!zI<!&r߃x^:WMBv#-q$F+A?ԪSl@4z)wdV,?60K+NfJV@dfa>^Pזv>~\}{Px[,qE];ٯ^Q̧ӌ/εV|g}ܡ9<0:\[# AF ̢l*Agi¬b0㓕4=EΫ\lKk"wJvmjt9VҺQ2޴^>ZH9ZG.t-Bc/#jpLٚl8G`eUibV<:*b l/,;xtI3<<39wآGcAѳ$7CnJm7@YqՒbH!L"nbʔ)7y縸u ya\o3jFr HdЍo'J)6,P5' /aK*]l =*?uaT'f-n(ѣr9곂B{jO侟nM94L,OSVzK+MIos;I[O>8{ ȾauF>A { ̵O =P`ܪl}twLK Pa{IAx_2+(z[CQ~έkDRZVI4ώSS届#oCk;j,6lɞ[A`|\Ӵҧa)N$2XuC{HF4;[)|4!;'o^ NHyZc({'d74e |z1sI%^F8fo`nhL/Df]E<,=jl C$gQ\ll⢂rU,IҒih) MIʈ,fb JZ d5|J5Н8b@)<"E4O,w7vqۣ9}f0^.'Y/mLnlIt-<'( H6gԶYSz<_-(8LՏMXa;%?ޱkJv-UFAssdOGQ2EEnSHqgwX#%H_u#Ģ(ПGcu2=NԁJi/jD5vokwRh .ã3EXޑB&~쑙Kԋ7X┝>ysoJ.4zѴ6mq1 /<F7qxb`4SkCO4.Fx8l5r5LRV*^.=^yBEihNMb6 X#,g#ؖxJAV.EW8.Yؙu]Bwny-.Ec۪߅iEg'&kX/ծjЩx_A[!#Uwdn8c!%*zbLXgɷ͟C" ?H_u({:Vܳ;\T3ׇݩu*R7M| nG(.'8ஞ$*Rk*NNO EBd>HwU$wcL^:/kV C BKHцz󤓅;MBj yQH; &+F0]c*z] P0K1^%d 1_޽񞐵&K>/'s",udj6&XH <>4Yxd뱆{dF2=^_yC>nx`$=> -x7eٻlKGSL31 )9^^v e+9q?|y#儠<&5*%p, H )N`Nn³FV!`.p[w29p@dici }x7+, ר1CXvR:eF@lgJXا\턔)2g,= Ms Q~g]XCV{^f dɷRdקpgr/$!"d:ђa6#) ?'`(/D-[̴Ub"mʒE LV] CX-oNV_7:\tnv{ɉ2둊 Dv:V%l)r3v B6j>XPD~$QؘR#3\fj%~S1;BráLj44[XpsyM}qeX3J'eڻ]Y"ܧIXɘ zUZ]K T~cr(W\Pd Rx:x紆2QaӣpFmݰcQB o6l[S~ 7cc!rXS1X5VyHZ ~FWCӓ7U pӧ\K>$k Ơ>*Te3~AClZpjb&Js`P鎃jWkqv)y cG\M\١U-@BV!dجA_Ljfm gߢ_j~do4 H3D'tڿadvćଛ'g\k*҄[=03b]}8$ujDWէ1b|1Z:Uv cg @8%UӬ^SJ9~ cCo-ˆSd噦.}6UmZ.e3KpD՗h㖅rB02+F8٥}u:gh0mx#`$u}$=]l8'߱r '+v>~`l[ӏx KX-YO Cț[LB4XJGcߊiha CٛhֿV6zbLG7W?vurXQ M5%:K l8˥9k <6m``:z6_L˖/H  *0|L5_qXL_\ !2S&8/y /ޫ^SH\Ƥ3t72ξI6 >\iiI43z-g~Zg\©a'bT_c5=VXOQC&߮ԱqI m(Ѡ'/pFGĹ'W=P6t: 'n0$}+rl[Bm8xo˚YGh3 endstream endobj 423 0 obj << /Length1 1559 /Length2 8218 /Length3 0 /Length 9239 /Filter /FlateDecode >> stream xڍT-LPJ3tI7Hw3CHIH 4}_o{׬5'>g?gCK,j3KNl,@~*`ii!N6?贚`G q0&rzSAr667??` 9$@.3 @;ӊ NmzЙx~DmSr>v4`Jнtrgeuuue:,'K*6" Pق`ƂN P8aW;G  u|pjoJv`o`76;dj A!P 9 PzA~la d{ HOz;'GG/<$Lfk :9Zl5 CfH9۱j@!`Y?CM,N. nʫہ;~x{$s# prp{{_0:L(?`?;@zG>?< q'Jɪ(3o `f8<|V_[A?,EOU91vP=J G@.WwAR66t7bgB8 1 `3ze@! {!R72 u m P20{7S~ߖPSٯc@Gysq< [V(1H`s@uq|lgLo:}ܢ vML>5]V2o Nni3{94;_c&їg8&}^ܐ;Rڐxuk:Ո>;J3~W )7;{/Mk/r9μyx]nU% ![*ʹ1nKƙ5 'isM2Ppܰ&'pG(ѽ9 ?0u5[vK:9V\ Db䴛g,rѕr$QWO 2E /Sy;Xl| }34#qOJ 1əTT1Hfoq{F\OdH|(9_B `0+P:/FK}.(wus=?۷9`p1)[:c/'`㤣N"YY<v h#zX%̺ö2l"$RJB' *ƁkTʹGMI6`b|mL*r-QX ;p59lLj4v7ˇmה2mdNJIm"l1E9~ESE%ՉF\a3⻞XŽK dgjO+4Ԭɞy2tp=7w ߏ<8H젼CZ*Lw}0+ԋ^-@ DzG сEMKIm5Jbc撼,Udғ? S%l\Bi]7Z =kU8=ҐXN80=w>fےU@|-wU_9Oj3SKmv ~J@Cᅥdgu{+8B]H{>[ Ԇl| q rI$Du'`p1 ~a]qC*&j:MΙH*8;!D Uf&| :fK?=+=+9rE{XPv2i\IjE1 G \+mYbp;FG {zW7i#N% sz6 jKp'WM:6*Z w`z@:;- fOjCU[B~)ScŞsH8{l~wO}D{\XGD$*-#BtXk)ͽ5Wdl/jӲBlP ,"JAjQ\t'6S\[LTGs?R {p{ߦj=hedt}˩ J~1\dOY7mjz-eזi+8t$E&eRm4G?eoy|;4S~`-' sXRĪY#6ԤRRz-Ovv%riK!MnS(ٟ&͕-c\ `ټH)6bW"|)K5:qh@.CċBie̸Yʂ2.,4LUSvDfхKUvrDȏTYT\<Úm6A} u{5؄Oj XҎ&,DR<^(x2Xh|(,D̸ipAfD%읂ķgV̧x@C4|3CoޱbW<ŁrۏU-[!I '[s䵩lzKgPD>n> M,h* /&_cl#`O̟zRV7GFg C7IgV%t+fX~ Fi8q\-kQ('vaޘ7,3"% Wk>(G9$.@[RℼGW2^?U|4tP"OI m"BU< WI2WSކdte^I 1KIؖg>|^].۫Z3Ʌyht>5ݲΞ$4xx4]yV9 >k4xYE.Q3ȧtxMlXQ&˳!2 |\\FH[P 67#}Rw;__ !M<2uUX0HP>l@ 44XiTS BcjKS'v7pOˠ(| ] ̞LwqlkW]Qg} G!\*)6\#^ f.}%ԍ~L=x$ߙψؗ|C/OϏL~.Kd.ۭ"(6kg+HjQNDU5dž5*U6mc~GFO{BZIʬʌ閾#:rmrb.Oǒ2\6^4PtE OML!x,چ|2<pVӓ!prEAaxLd^Bbej+ 4V~ȝ6(Vƹdn胍6HBs~:EA!x O(SʐR7oiگ8n߹ 5Nݺ&H*!4X%eD{}=_u=0 k%iGz?ЫjEc(5_V}IE֘I~ݣ̫ GݹD(t?p!br=KbExNM~"&f-z9!6L]5+@7'f3_Y¥ȋn h5ptc/MQ''LԧSoTWY?[ű,]OcuǺ}Tu/x4mYSKr6н aZŮ-~5d(rֿV'/ߛ䯷DcD\ΘmU4FSn_bK33>۸|K1v~R`( QMƱM:F0>rx0lIBFI-y432ju>:H4]|N 1imz+rsOD :yQOJ,}Ӟq,zī3bϼ-HȆ:?6vm-MnS[vY7=dX5)LѣF9VOM?*^jD3<<P Mk!f^VscauƶkE.$ BI*H"ۆ1ȷ>; &xjARD,KQ/LC )#Q*O{ fBy( x%*{r&i 'jvZ/М6b;xC 0˫KI-|>>9޿M{C( (}-NlQm5k}R",p撳@otūq,vBR׉=ueq٩r9Ź. `C]eXNr1TH!_PngFhVշd?.;I0k:y܌.6ul9f2pkNcbw|sy}r{JNʍmgrKC;}Խ[dB4"\pwcfT.W2r1&2eCs~\c'->0Far9`N-{D,qT|pZ!P~ѕE{O jJTµzggkC|}oDH>R v2L) [r%3nq)v' TwjrxD?m*R2Dfu=EKАBz j|B5{aGLϻZ9X(z3цSCa㴷!U )eDFZĻ[)Z8 s$'dgSȇܣi$xzfiaU`Z!{'W7ݾke%R730{=tIm)KpR;R+)XbRuC%?9]R˒O} F-,8C֡%bT8uM' JR=$|>`$]Vz!"Q[;ÇzdiKmvTDCۊƍd3 T29P2r>sx,yVB i}n%ϣ5Yɇe{>a^2i\:ٰ@UPЮWUk Sa0}捾3uhKwkޟ/K&08bF +9Hcq/ɼ)XWgS JǦ=E7($a1 k%NQQ) 3㱖,QfX~BEs~>`s+-VIŲ9Q9񒯧p_.:Aqzn#`]@%ZYp,2<3$ >Sd3eBV*~H/Rq\F浩`I o8ԙwa4g,d㎻32:xN_cʭ&cay)P@/67Q1yHVC :$P6Y%1{.J Gb/=.1ƨh~ &ln,am{jG]:ݳ5&8/Zlx+v4r;]oy;ͤLeyG xS^}fp)^A6OTynvaAbCPXC_*W[Puű3璳!Oػ/-Lҽf\@ᖇ`:L@Okڷ@)!+?M' b ַ"uW(첍AdNNԱ ӵ~$K mR1,P~#C=QxCDoU=הGg!|;:iU:T YG9JQ~s􌮱N$:ŕg~>Y6aH߷znR{t8}x&ҡ拀W@iKmxHOjz43g9R=q]R/%["/@#ցjy{ְ^rއ^Py|H#5~tI(j' nNL[u1Xl1D[aFN NBUtZiyoWsT>0*36"ʎIJXv> nX3]YkB>qL]lOvǍZ[FjJo=)cHYTp5AW(v_2wbc爄P}@%PI)@Q@Sp5)xY"_'2a 4aS/_"#U\4yA S] ? endstream endobj 425 0 obj << /Length1 1548 /Length2 8549 /Length3 0 /Length 9578 /Filter /FlateDecode >> stream xڍT6Lww3C] 0 CH*HҨtt HwHH _֬̽w\`7StC0$ ?H c( A !<c(aR+# `N7Ӂ>Aa$eGHTPG?@xq(=Pg-:\AIIq?EtH`w AW )% #x~P  AB=  @R~`pp:@`>0Gp7HC e/o߁?`'96? ݽ`_0lo'q0@MPO77w7Y xS" ]3V7 st] P^@ qI! wp8?$ p/uy}!$KxG`q~8%OX'd}-G8=?7W1VS!%%? OX'$ U>wn"jɿJݿׅ 7y #(#L?.BG P=o>ЁM -|0g78C._3A O~I WwNHT F xDAk? wܗp#~S\ [G#c)G'ߢȽ@oQ^?@| 邀_?gA8 ޷_'8-#]".jd9^p-"}ӹs?ӇzH7Ug K̿ZO5hM6j[0^|Xψg+4 S㕗~!_}O#s[bZ7oMpҰb!qɾϜ&cL /\d.p9Ra,ENkIÈ~F62I=T^aE97sW(j[;!U: /)lzխɑn'N KSwYqZ¼s.bMoŇ/4\7hni}wU1]/sdfyiS5`B$LIf.W zMѤd/) FXTr-nkC=a)4+%6L+-[b[|Br= E,C-c>1I@xiٹ\/Gq6ר\}"VM5h'gR*ԛ>RQ$f$twۺ2a-G֏[N,QM%G#gJܷV5T {mgpe:I|U,A}||GP$Z01{1<5+0r[|a"GX@zmϯp91ft5oRO̙+{EOO"+nڶ3Wdtd:{)[O5 )(>8rAH(d+P) _zz}ACm]ͫiƗjg{5ǹu4 ?؈Z^GFPT||`V!÷B*h+@Fx̃!e6mzځd :ob.7|ofCl I)$7j`{N7y3&80LLKV0M}&|!$vGTth+(w%=%RO'gL9\ʸwlX\$ܲy;V4*+ X!ybwmY`R@Jidc0 n wKj奾ot?XgPv^V}#{T,51~e&Y89y`RêQ,N܃~?lXMچ?ڊ\.?Jo8ZCˍQ[Uh$+QV7:m9`>Φ+EbB Q#N^fZ6|;nx 8M Y =FJA"!U5m6֩V¯M~T%.[2sOQ][n4){zKŏZWANk_WM3^lpu.Ptو1+7q)8|pr~';Q/=ހ'ꫨp(6XǗ3HlUUGĝ`-o/曢}y}]Ŵ<66yIOX%k{Q:Vn\ljfG{fYD1mW;r߲VnN.S ;0 q.ro$aۂ^:f\Wd&ː˙jJ$fVVV~ S |u{wEу1?lRyE1S8 pEr9\kRd|9Ćb&4O[\LZ`fX.O<'/f#)$NF.c7@7hNmSS}_7H{QFW zhF;)\.?eVK J\ C^1/QY`p' m 6Mb^+]mdfᙙ.=ÞB{8#,NteUZ}b[oZbwDÇag8=#@ ~3Ny'CD`7=^k!X hk!4%|ɵ)g]b(l7_= [mQ=.8?y=ҥ FTm m{ݸt]Ģw@Iݐ_@n[a~>8|pjs7k%3vykHʼnl)l^Uҋyܣv0>{%WC!e7QiW$KFahot*%Ulq:9< o$~Hp+#Xky7G$G'ҳ\pQ _2-Lʨ_K +ڲB6&^VyMG(Ũ -rrJ:Db]. @̪3{5?dF GwS].nEs.46 z%VaII s~fdsvmg}`a@14+FėCL%gۗey sB hDcq8kٛ7q-̗@n9 u݆n~{qU(ʎJ @Q*DQvFjqI3J\uψ)YR"gJnؒU1e.A;jnJxڂUpz2;|p%>fD#ָoG-zupg`_g5ôV,}&>1'ܽAa3G՘i.kS+D8yn*O?oqa- Z4i8gx A AEg=ېMĻ&t>7رzD:k%$8 s\o{^t:>ĝ> cR&񔥲Nnaw|a鞁äv#;*޾aj<1w!oGvGO _jkﴸR8ߦJD<ң#zie4fJ!ab F==+{w-}MWׁy>{9NۚypkX@twsPj1ҿy؞r{-toPwXwB%*huEs9 Lt;b\z㉉k[Njɻ"w:eyE0"ݾ3?4V :tv̤:04g0:!\/F~Nyw |A^e2lԺgV'U֝Ҁѽ@]VԈ7 VV\&~"=O3cy 4g"h2fOh5?5_AH2b)R9383" C .^WM<^5$>n;Q:SڜE@WtBp6$[!.˨}et-Cmgn;y sNՊِLzXb-l,ËO 8su8k9c/'8"PS$flki \bvNu+y_L2v/5L~ :أ=/y w W963elp<ܾV|Ԁ-o_S0؂y#7:$2W/n9NlhF3'[ԚK pMڭEIޥŀqS(ĝgT'jS2JO?p+/%ؑ߾mmU':K]{4CF7x@:D Ǐ0EUܭVޑin '2\HGL5^hs@O @QIxY^=tV|+bgt)+Av}^"Zb~3x/ң$=5<{w ?d$+ Åpu|w|AcAON$^D Y-,ω&3Ydezcd֨SiTqs)JĈr)ěMwv8%">#ƪLȳeրeT+hQS|gYwC+4dB]<+=If6[,qJ3o`LPĝ%sgG2]mZH@c])O4"y2(UYXZ~ˮ %H⣵+mzӭ !0fD(mr}+/)ptIItPr-zy֍n4¹˫R|um`V5s6lzj<2MFDOc.  8N 2e`$Zٳ=ܺ/Zm)RI7Q^ *)W/lIBeP4唏!VG - eጥOٴğ3_& )fmq2DԭN:ep]8*>j(SYb3;B[;局ɒ\-SU+`T6؃&3"bhPxJQG7/Y7~₱iK]pz͞fʸ`fZ;rSEZWr<<" 唫 JGVp+nHcҒGYJ_ pI]UAW9 Dv>ِr'?A sן.=Pՠ.Fp\;澼3-閬x%Q#4TMwĿB#ã_?C8{JQE߉wD.;KqM2u0GO. ʹ(=[VJBD+IQ'dMzy#b+w*h“|ד" OPyoH֗57lB Uĉp'WDK(*V=x;wnj4}hp/5=ʵַOq?踙^9=860=Qs`}3-Ha.c찦2&LOz8zu)Rc*=YhdgGEEr`/\05([UY֢pF^\B:1]p6PA0d8 t`Lihji0 ~B?'ùZNN(6 5kNSW |<#wboiG ?&@:"ZoN LK<.Fhʌ0YM+vE)q;;qQޙ=bg ЛP ,2!7{n2ƏBmUUi"ΙJ!ѓ;3|zFv H*B*".w[C/* ř:,/Z{gjY_Dl6'ݒm(L fJt8B١ +u^[*Rbyo\bud(lb5͸*KGsne8Կ(euyfZGW~6\w AIff(=ӳw&t8OD$bʨ5usPniё!jW{4DuU'L˹SY$b`,:%G\uUIO|&`؇kQ'\mbI %tk9;uG\Uv-Ա\ ;d1 V#N̴~Ex;BMSGyrM۬<}#)Vo̅e'xl #B*372ĩ|[ BEjj{U@휀Kl^ȷ7yjűzf F&bQoRU7Gfzҟ;|sZˣB=4bh)<( CdiJTIR)sKt[Kϕ#mmnbu93)~L^%G8#s '/"FO-=l aD:[F4j0]d-+&bdP] ;lP8*x!lױg]q76E(4vI'8cj`<侘/LΞRIk 'W7=K$+3;7>KpS]hUҶX,u.4mN:5O,j C <@UipdأN4`0;Ouo1IyH ӊ0p  m/|.Uas)-63[J EA,K8[>nWvr-f@΂]@}&`"!0 ƚs 4IM޵vq.~o jƆg洖qќ䕢bF%u{%=g|btVa.ɒo \-"mMy|S;w/ؖ XN>, Of])ʾŦV>F̜U z>'io[L endstream endobj 427 0 obj << /Length1 1472 /Length2 6574 /Length3 0 /Length 7572 /Filter /FlateDecode >> stream xڍxTl?")@$ǀؐnA:FIiA)Po9wvζu{Ƭk'g(#(>?Pe`@!~ PACܑP\?,!(L6B0HJA PoC@j#$>B-vȹBܡ`[8@qEg0GN)'MB@ˋɏpw| $bm  `E0@8l!CH@git 52iW?޿A῝m`- w8@a&? 2!h[O[(mt[>$B#_~AY npuQH_)B!`t} }r~p0C{@ؠE9BPa0y x~%0qV1!hPT`;:Z q댞;`Dz%a8G,lo8O\@"QQa?-յ?"@7?6\fF p@0 ^.?+R~92P 4=PB7ߦ&Z bpo#rpG4@CPo.vKCtH{z`݂D ެUVPPX`n냏f$ w~8v1+E1C.98Rvޡo  C{/@k%G`wwfϿ/ ƟE%Ü:.j6FqWQ9ifL=Н+}B}p1MnRj> CM`G=q\4#z0Iۂ#d2\Gh嗢.䦹.PrFœN|j̺6{D"Ph )4\#ϚE|Oos3 5zkD#h}ՙFi(r_!1Yh]#ؗlD~N' y49j+ xрY:^1.@Hݒ[*Vcq6yX#Ŧd4t-hM#J41?6 Y}N ZI?х18|JѲai3;xZiʔ?jy1y`=` N4Iz&|Ԙ[IUm͕0ޥ"i.+>7`,D\`HPs#SD\4 A9ˏU"KH&n)%ԭ~*H@J#ɦTC ڼx%o6|$:/mhMV(!gӦ|S(sXtjTw 'z;96U~a H *> PDY jvsh>N8|fդ}ⱼ"1\ZV6Aq"7{M!p~ 'fuG] ֧-1 ?T܎z? ϱC~z -~0y#;ݴ4yLՊe`$,a]ґ`rj>{|hÃI;쇉6~Rq~Vk4OԵL @MRL}'KF<%<0B K@IB'^ "a:Wkw&C^b9 ԯbYNZQ34Ϭv7~&7}kkԴdV+PJɦ={훞Іr +Dh j"WS*xiPm<ѐٖ,Ӑ$['=7l`KlI۞ isعzN4DӲּy#ĝ.(`rjV Y^d%jC.sP1C{Fj ~cHpQ}=7 ?[4t dwTC#RI-rīYL`mdq2*Ւ9mؕYIq $@% Bi' [ En49Eh}J"C[u _؈H}Avr9aEx*^藕*63|RЁCgizKYK0XJV1G(͗[Q\t+ege0OKT_\0gq=ƲȌw#D{W'ǖbWV7V\̆}A'+U +, [iVrY"Ҥ ,5ꬄr2KQ@Ɂ!tP[W`17Z BC'6<F"ʐ*cݶٖ[23vXJHҍNgu)D>7t"o$ӷ=]|H)T}$i>RiAGaUr|UdXB@>{1oեčn~y*qk3^V=GUF7_k3[A ~xnعE*בKھBM"קqq,|GۋsnYkm3ƹ88+G |3& 5 ;w6i2{<'%ߐҰЋqfJp)wy֎;F {~WFo:ٓLyR籒v?T1P±.U! ۞,*"%{yM9ױvY<0..2S؇44~j%/%g Bw1Ο+ @_ +L_%ږmMS׷Ι|}]/G[/bU>$ͭF[R硻δ\~t Ar݁m1H%J\[&R=<޶R]YI -0%_2$#>wa]IǺSOobgzul!ſ2op38~\)(L0"m 0)c$[@nuX]ig8t=ϺG"ekVӃovJW(OXĕ (Z*yݮ&:/V>pnxL>kk=gOJbKpc#'@/uߩ:59]Mܽ"OMu?NUXoŠw ZK}UF8ޥ< N ~Lu{G` /Z_Sv~i/!SW]5#Ӌo] _e`D&7,S [޻P$ݖ M)./8Di7EIZ\,#. ܘÛhCppf˸8.īԗ쯆H-ew1N޻ٙIU5Kp!ݘ0K:>~[(Qi<\le=C_y i[vpB8TvfYŸv ] Vc.0A'Ѫk= ^EAt){zӬdRl:Ѣr|]X]\X-P`Z ~Ԑ+`zvӫy%+nBVszÔ]ʓb3r]27~쾒R3y8kPw㔍/rpS^=6 2?FIĺ ɔ p卌;짭^\aWAGRܡǘ+dG.{:lWT͸?=TZ>@M~tѠ{^sȇ\{Y!0Pm: *}/mvqCn4 r|eRZ(p8q(͍ :ך)nGNq]-605 B͚/C]$JdGxnSgFO3ꔿ]貴kEDTvLuADdigxP{:lFIG\78ca6/HPl~Sh||LҴڮ::oe6MCċU}11dF+t{H|$YƜSCvE ڰNTޑ!ҔÝ;R驱l?@W+Xm~ |TD-Ph{PzHx칲}`◫5$$!!\ $9'Sb8ImUaLwKMuW$e w_!)Ό,_&KO\߽Jn|z#]l`E؉꧓s+q4_]ztz>?DZ.BcyJj8>x2(ʃeAǢAZzg7nvde#ZMSE 0 tnW~7BrC;KOOP#¤Gƫ# V̯8ֵ@$݁$y)i=iaF]3y!Nt* uWYr8<=?K)O-W!ގjYmh&Zrm)M?8@_V$(OfTm-F=u,˘;W;;R<${(Zܺ(r"6$mBTIӜ'Nh#Vc-ceaچCtWS!TdsM[sEDI/CӚ1Nf(¢.)qUaVy=9E U5H#n;m5p]t231@5N|Xl}K{Y-B"BGxYw=̫z"Z ì$=1b18AiSҍEz?E?0sG]{xnə~-ej"T W X^\q+ ޳8yZxBusW CrRmvuO%m <]0}1X@0cXT2h+q|bP3zI>,)/x6DXj?sx+t+j0Ҽttt(1 ؍)f"39UC,x˓džaҏ'rg9,r|}ƓgX! {}=pYD>&Hj_ `#)y;r3wBmix| ;0zF1dsx ?`~ Gje*5L+Z$e=ovN'V; rX>Tr|%[2|f)}fd'ͽE,lsLXp4KC>ז j&L%HO|-[M(zӣZؽ|3@" /' Rj?#m򂘰˵sJ\5/X0YLZ7.ul\2bj^eV4yHTC WhԈ(:/^L1I# ĮcB_sʙ=huN7MuM7 4߽:IE8{Ŋdv^ Qi[5-S2oS)]*%hM!'sXӾUWgfRR#BP救 ,^L_DlϟReU( 9hέ endstream endobj 429 0 obj << /Length1 2244 /Length2 18460 /Length3 0 /Length 19788 /Filter /FlateDecode >> stream xڌtk Ic;Ic۶mLl۶fcvҘX O~os֬5n>׍gfȈiM쌀bvδt \aYIF3,5?rX25-?,2CCY;[5`b`#@ K: {8Z;#Ҙ N;@halh 5t6|d46([='%== t:MQM bn/#!0:}ؚʒ2y{ee@wqt oYlhllgcohaak0dݝi&Z;}ZX}}tC"9;Z;;9YXő0e5:;u> GG=\+[;7[ S [ӿhӫZ8%Em!#3:X88@؜*?8xL?h},L^N@ 럊E cgO1_mc0DŽZ{1JZrR_;@`ddbbq0 fS8AȠ_ 9?G?N`}X>r~q6?GhfL$>zfdbYtGпv.018,17X|,?JbQ PsGdp? dv(!AN aqoq # f.]?9Hv# T+f9H|鸞oEM?v32`gx3<>/> ! !S*mY)vQsuǮyJ]A$lzʜk>D{pX8˷Y9i!&M"*}fbiBR&}/#{+\Hn-Ia 2 sվ+&l0\WV1UMLֻw}/L9F2%[mJgz0Zׁ yA@"4a!SnEP2CGKb/܃,P8 Z'K_ԣb ޾|2xS-2$dg<QEJ,I|&̈́҃]1)ytA&Aw*4?")]s "G*D'mʙWG1\TP:_s'_k4e˂iY0_Ee &d]BKVz85X׮pYŗt"oav »|KX(,&Hv&o;Os3oBVf0 i~G9l;vF2Es|~ˤPSz]sno]Sf&;0j`Msʾw5M';N dGH SiszluMW^wr`7~F zMpm/FfCuTQJHǃ3wg&guu,DYD8gIJ;MxkoW3߳9yJWy#vɩ$I$۹3+>4⋃qqAZqz˙Ƞ$śFgP["Bhk DH0;5A`J@mIvDS/]'gii4.]uMu@i|6.}^ hCS8'zi &jB0چc(ER  q.9f[5 )̨X+Nt͑r5ŻR<ߖAs <+jpfIu9 rEonAVaa&q aQrNw뺥^u_vȕf@Hq%p:ﻜ2E L/O8;/ qf_i.[>!ٸ&w 6DB & QEZaB)Tw&@^%f1'>"3pzz%P~7 08AWw9wh_4u(xHEu(VeL1V%j<*f2g.ƞz /(m:]}eE :u.%WLYaΚj]sEcƏK[U Wʹ^):tCFFI А-ʷZ3^\,M*XzQP0,`(zkFgEB\#"@ rEA#zG9י%ŧlCc0+|s_H(( L Z pFgSx.8z`,'DJ (Ϣ3Ski%) )|q_LP/L`;3=cTRms;RLMtaA( GG :e]\qfb6˘_Н5\e 'ʊY@!b'ls#o=F[;`qw.F;cq d{E(`℃ #bD\mG VE\l+~`{df-& TmOq;Vr-ҷYE.^iWV} V`  nsd톲ey~gWFF1*MMQc !ameV#C)b`$֗gG5_=G $#Y3P5ў0WC ^߃O)L:"W !hxH@^4i<yF@B(%c$J)kkU'wy$*92m;ԡ Q 87+1FMI;^x- 5</m>\>lzG%+s\%Q|Ҏ-Gqrl1dUgO ts 9/0 ^傆T|r|]k6u{9xiBayq+sOޥJ^e@Ꮁu]͏I(Y=8898N'*F#"G]Ғ;Ԭx]f A8ƼGtɼ.=%1՟Ժ,Tc. 7AIGE|;^s2H_T;vQ9z--'x(ҝ N"yLNWCeoͧ,}'~\|~O*[5cNJ7UbiTB*qr*1ڵ_8G{w 3]w}J`U.23&kD;]_]?6'ZBԷLQ-9w Q~Hp3R Gh@GOPӍ HUOZy96sU2#G+WP 6(P4~,˘SN\CrYM9X'AL$O0.n/ !=DPG-]S W=n9D DHMbKέPtD3Yn_qN=o7ᅍf[:2Y%%K)3^wHr6yn:N$ϘAhHk%P$AV\?N-0|In6|b#(7/{9'.UR!UD߫ Bʣ1iN!Is,b9{6\(WoB;* 4JXs!=˶5|>#zɪD;=yˇǴVmoLa*4O%G$۞ODO ;>a+s/:qlV C-9YZK/FA^b~>w >y\g}~`Z^_{7vVқi. ~䘘ӑCbׁlf'}ץ+֜}tF^ў=;İed^%,g7o_ܶ§+ o!#lPXSE"i<4F55eW!DV+V+JDћTtě9)+vAdlM)NF=>\K /Vmc,wsw.141B`OmR w6~S(D2: N8CA+aVz;Kp'gyfn{ױ BK-뚽rj.*޹U{36Ff|QЎ}]}dX?gѮb(.' hz~Ց\(_wԐABN*d=?DTCwu8X=oc!AUaMOwnޖ>`}rx:C/@Ziw~rC(GaB»A0G;&I6BUkq88:CUTAD;y/rEוfՎĻ M+n]t F|D_t0L>NaE$_lLT="`ercso,{%e[?YIY{T}]H WFi#SQX;,$ɗ %XS a28Vev&T|.!Gm!Pz@1E~pzr6܂\Z_O?m9} 顅?vgNR7Ya0H8N̻ȿQ>rg1Z>ڀ}kQzZ`'֋ѡ5*vVCF篚!'B~3;sF_\ш-dy`jwrrLdcTL":naSd޶eQ;}ؗ GWmn nd>;R㜬Dx g H%GJ'xo>_rfv v =Cx ^dv7[iXbADL@u\BoҎ"iΫJ7gBȝ4iKoHW~O>P|bTwP13mUS_TD&KG˓F KR˭4];K- HQÑZ=]Oɖڇ1nU1 y/Zj}TU) &ɮĚ"~\~p1$tc,v9ʴ$yfr¨ϳ夝(-&NYgTzXKk$#ioqґfC`c*VP`/~S\xrZ>#tzV-Xv9d)͠*T>5R_5pJȠ\;np̤VEhfu!kby?'/KoZYT\!N`7@AmaS1"^pjѨ8sajg%luj'82j603m }͋V]6xX;y;o| n bd3C)1ҞaQ |.>y e쭯tgaiMj٬<)' h;qм0eD3WCk ?A: mrV*DHS (`h sv+ⶩ4hWt 7GAI&t/ǏIGG!j@Kɡb1Jk_~F%/%Ǖ*^ @Jsh{ nglUHOG/DqjiylbfzBz 1'LR1's4ՈBQp[Ot,;)=`Wu ,~khY[i`_ul(pvd=Ra`@^L ^5ǁ%aR_OrA]QG萵#.:~bz(Q` ߲'}{8g!4uR|+#jդ┯kg\#W?](3H~lR໴.sb'1:>!HZBw@v#v3pسzg`T2 r@ >mW7P`Mi/&bwIzfg ÎE@/ɚU6R)c9`vutҍ5C"0yA~/ e}uyߐY  KӖRsY B94o nǸF.S2y +daDcMF T`t%ކS.)!2044ݟ_I" -RG:FHoQﺛK79%v˽I̭ҍj*#[5LB6i :Efn<NJ% ZZWѮ# U26٦SiQoO?a+ C,fkZYVn-/9'VRฯBq ZN(xkK\6S:,JN!*?"2iԕ¯4l ]#]V Dʈ_ɇGLyywA칟(g3#:bjW>44 -Tۤdv QE, =A29Ƈ5.ˡrLF|`*= \CĝR!~ p6ߗpC&.J.Mxf!AP"m aT N%/izJ.!H9`آ=f}.C|54]#CРJ=(t(yO6;mvnsX{멟;1@!snSk"#Zi@TUk!V01۟B@y~/0(n" ;",g0LheLI0<Ϸ#AAhD=wG//чjq2@K ȄToא]ț;zO|O%dsBl'⼓K0mNIÓ ~V, *A~6oj'IyLn/>i9i(zz>ο^[N'5.r"zQ9Z8jK?RdQ:܄smKx) ![t7w.d$-$k>~l1]eZYb” ѕ;H8DK-To,ѥj#qb2”m҅I9͉pMİvŞ3N,$Kݴ5=|#5B[M @)sa=awޭdK+v,0;{}Lkbr{?&rUrHmkArl ` ` <_lf η]h RVc5q+-Ey=fIvk)H8˫dq -<Ez{fWtCm}7~qfoD1 n w$+yTԲ9U9@'UuLB]_ݭe##3~VRT^FϯޖFUg,HDtɨ>e4ڌ4}5{R*^XIC΀??T FMyr^o:ל$O;)l|ZaQW~Mb[lK(<4WkhF;1+dxe'(`c~3Bp"8Kߌ{X$G}4DHd: Y ,=qOFE.%!I2{"4W~u u*)[-w*۴,yL6 Z!t&٢M\vX H[M _Qkei CyO'e쫁aoٶuؖKt߃##yvBK?G|W&75*X`~4bIY uRn_inigPr9'Q )M2ll; 6:| z{+fʊA W$v7ӫ >mwoUީVްr|AjM_Ow(ʪUY@&Owb̫A8^eڽ N}Hfl뜯8Jmz nYHl)L&" Lm(=#y='і/Og ͒+cS,4XD]fO`;Uۿs ;fJD뫔JmqzjtPm[ܜAZJXȂi]=( 8=.$aG}ӷTBA(t\fFka&X$6Eʃ6WS l}ssd!gGA֎I߆w4qmfĩ%IbwыB1!WrP _v^ Fa[O[I˨dDNe')IM/ɖjE؝GZq\FU0?2nԬ)6I֘ b`5ebmkښraCգdTkx_:i h*qRP,$C+Dd엡 sV-l4OU6q,bmzNxWgaP xIJ~R~aA%bٞVz5k#vk8 r f򥑣#LtTrc/ꔯoWMv/oF6 r%mZpw<\c<ϥHΰ:'sJn-:;Mv\_vQ;8H=,Ե+=#2TzIq6@vU jpU~ǩhr r L\]bT~՜d pXeX*W-A}8&lj?8!zxEz;Bô4|bt۱m G|%,i}l}~|Q^q)(bEu=$a}MYm;Չ!ݎ3B2 7 >67&j@@hvCFHO#6qz>\ P͓r)C9deq9ȕO/c0e SE5ƛD0>fXCPi{{0#ݮ6~Ynď3OvvZf[o{yl7]|!w"~(J*" a/Tܹ%x-j{8UnOAݣ85/LEe]9K/-P6O GܼRu"}32=ʎH4;7+bPr`n%lf7_xk )Es:bY]jqú  8V9-D/ "9v{d3L(Ze "(?q6rQB?0H C%FxTy'3_Km&/L9x/:x|#DFFY֒D}fn\Kٟe9%:skQɮ?p`N?q퀍rADx${YoonRg! ;ΕBQDq(Kfxwu%]B{I2]>$k8〷[7onW._lnRW "{Lb+ 8 B9giAvhL$Mul0g b_vbhۡ"WDW/-" T_^~YT|{U߿S $JļFrV"P]8=EEe1P<Zl?5düσo}=4ޫϏ+/Z'X]D| 9–Q!5Stw^ք~%7ur 3QnH*wFEbDy[g:*Գ9k.R$S]p9B2g<&E)/۠1Xnس?[UA]ĦҐ.cP04[+vP6*YL"܁Ϧ_cML#laX3EbGn&8KGoKSJ7hhQCZPs'\5Mŵ8|jFp((E&f0\0/cY >8:15+:(EȿKs1ð};S\&ѽSd`{Sa(gSd_ҝ "BXUJ΄jqT db/-Ġ<IH=,WkG_7n%(țQʊ(c2D#wqv_I?(!BekwF3LWAKs0% IR1_ "d=s1Tfj v*Y,vVD $vf@G{*(G?SdR#ߊ endstream endobj 431 0 obj << /Length1 2869 /Length2 20609 /Length3 0 /Length 22234 /Filter /FlateDecode >> stream xڌP-w? ;]C $Xx'3sUUwjXI^(aoBWScf01201Y#':9[a!4rČ\@vW3+ C{')@ cot'wt4pϯ*j377'_¶@'K#;job t/T|..< F NtwK 4N`d '5xr U{3w#' $49ڙUi9oc Nvdia#{[#;OK;s (!B03mhdl:ofdicd 2@BX`M,\-m~ v@;g,&{2\k;{w; 3K;Si:0Y:_e@;+ zX0K[ `Jkil8}T7gfZvAb'K.hLhLl<_j1?)xӳYXY쬜n{7Tn3pvIퟹgiA4@gbg2`^Mo/_F666l-m<M h3AaYhjjZi#Іۙ[HKg K_6X-7zf&сVt8 ڨ(ngbo{X9FNNFLbagx3vh]@G|fN[`-qE^'Qq^7Q_`xEFW`zEFW`yE .Eȿ"W/qQzE .ʯE"W@\4^+qzE ."nW:g/b3uk_ #gKKK'W,(\,mLX~AjlڜN\^}"" c#kg#g?; gL?+{U27bۀ_l%=243"d|M4 [ 7w?jJ ??M@鼖 4.@?,@2? 4 @P^ڿA##Эt]Em%{hJS̠D^ՠ??>a2Sd=f@VF@.}ڻM3? 2M̠JFcntd z%6kbc|@urqȇ^blbgAwqcAN=@P^9ЁϳF5d x y+ҧ?%=V9df?G,#7ΞGBOKev=wH&#go-y 5n2w7c"G)2؋%Eћ9L `cD>_Ic38-sK1j!e:|q8E^|Gk.!I_`8.‰T-F`{͍/^f;p;kM"bᎾ\>Vd}Vg0(o 39Goj߲n3{C;"xy[N죗;~Md41zI7 HD…2ZB2UBmgw=eh_NN#d77jG*`DJk3|,<*Hu"4B/-Rt ; k,r,ѫj^Ast:q|JA/(ovtjHtf{t}]('ȮO[Oa ))&-5JkU%gƁՀ֍k9Q{Pjt{v~*4A# T% /s\h0dpEi}FۙÁ?'y׳ li4GG 2M!*STݩd~}_Mz-mVpHpmD( O1&d8/2Dz1y,mˀ7(!"tِ%$m[h`Tɕж(;HhY[J tk vFr-;,K`(@Ciꋃ~^?RL+$lGG5; Ev%>%D^oj7>J(w+g*r1M?Y>ID 0< _iDS5nzE1~W! dy@km@a: p'JK.NL?Z~=.ql&k; tx}38lꞄ$)ؔu$E٩Ca,}I~cVLXD x!,wZߝ5[#5t5'Q;_6&6'un܅9ɪmx6-C{qƠmcdXP,3n nKa3Ic'wMt{n8"rֲ 0fOt6>x3凍h n?t5 q5”Q6A`5+LO0Ggin )Y~XC,MSp~YAaDDTIR5lkSa K XI'@h~KȨ葲g,w(@2 2zqX\'2Ղ$z+PK=y %a\^rauO@ ? .V1EJg)^ \IX?KA j.1LF#T۔DbV.M|QZL^̛ddM|V;dl@:a>D} /Ax]ѯL ]1XQ?Fy;F.[T~%?%JC% ff'NN ?-rJNl_mB܆6aج Қc&FkIGr!%$oK6TzeB}ԩbgV!g!n7^qBpQp&NN݇Hg'8+-hH̪'P`C {+o-@Ebw%!TAכRien#h @߳sQ=J^Uv-_!A⭟0n甹a_r?Q"&<HVr 'lnsB 7n H &BF({p1u) eؖQ.7ۜD̙㣃G;{Qv Oi ח (bw!TzL*n²k~;5TK6eW,ɥSG]2 6{QC])ۯko3P@tJ(,U /WL릭kvǣ18q|_kƧsFK+ 5OHg`s_2[qyO?a6#B0a8o|WKyS2U_7Iu]!ȅjg4GdgJkSFMhQc椡) < :07"xӜ1ݣ-Fa:9r`94n@]pڅ%ߝ~ba֩a˄bD`X쭚7{&5qBa<;𼧋<VD[5 t/ZQDDPDn$fynQܯZE.I, ޛ%?/vMkKh.(|^5~k5^j0P ig.>~HƣM:WOp o>u*L9͘BӘ/>4M0iBj*I{ ʧ {r+_|Tu~J;s8=[ڡb_I~6'a5qdl$h}ݳ?8d}ʢܡU pzLXM$c]%YZs+$rZ8Û4`@NZF.#̐܁=~efՄYRŗM.9{ *6BSUqld/$ 8A4Hٗ%[YWFk+Ӓ5ZB-ӑ=؇!屛X7407֜"##*%!eD}W}| a+8%y48ٍ$]˘IQ IƏmYb.ю5DIy7x٦Uq&2+y{q텋$$>S#,VS-1rdGOs&nzBo+ҍh#"jMsnW|"86k72J˻3&G`NRun^߁˗l%CcR㻴Vr j#4XpCm~Qן>T%0͐8e9gNV@x">=1հ%mȣI šO>c7%B>H %Ll6дӖTbIhڙNh+A6Ue[ۯcϘAao~{Zj8EͫH5уz$dhh]r8sb YQ_hׇWhLȉcw^)D]4* LmÒCC-B9\ļ# WCx]4]rwC]IE8Fv!xW =}U: ѾS>>,K/hYճ\P3k`pf_U+RE>V->r$y;ѨwR1ưvb⢔yQWn$785F|pOvrk:rGĪ(Ȍ^!UT4WuԍkNXk.(aݰ7Ã׶[ _;"wVs5tǶh>ܖ104, L?U{eݭ5oby-\= ] Oq9Aok$2riLM#<*[8i](XeA'R*IhҤ!̌T9Q ;e;7n XnW eH;7LߓI,-Z<&3PSO% kαKr}MY !\/>+c0M:O c3̖{| 0)`vI oJ2_N c-Py2NLJ۸Uy*]/?FBzMN[|N>BT:CΎG֮atnNID~IBiK%9<+ǙH]Yg~#~Ȯ ߊ&i*ko/jޤED[@,7pY aOLY)%4QF`dDIvϱt2Z&moџ%htKFU?#nYO)ꎐEAKgZ4R=mp2?ŚsT^0{!(zP~d(ud#ꤢRv2Rs Qץ׶Cq0۸Yr 8ƫFsݍ=L U+'"u&:<_%Q,#nPMgaYqrX+b *3?8[r` am'Qoa7\3 :޲e2x|Αzx7ͤ+Hs5xe0۪dGfHoM(MGZm*~tĭ!eJ$!Ev6RЀƽRb4dLW9"[&,˔L1(w<ߥ!0]E|~ lZ5r!~XPz05&N}҇2_Q2]rhiFW]If#Zsm7[rџmSnAtfe@q!#EƂ;w㹉$Y<[qR}rʷWj[v+;*%Ro*C_sp#~e\15&iIͲ'?nfi >aӏ7L_D9̆My>;bN1[%M¨)cD6qyzK܏r|21T†gu?$CZF͌q0o+ҋ:aӅ!Vǵ8ps<̻ObZ;Xr֮I1x,.0k!xGM~:o eJY]@_9H,zp ݺrWwrlMalЍ$!6J)lgA{ ϸ%ҙDT.8QL0Է ۙc\8EAR(~qq8K<ฬt JWL}I ].- V1nLTOHΤ ]rjF^ōԾ%bW ^lS& ji5,|U.G/f l'Ã8٧GZ4V Kخۄ "n2riuu4IPּ0҂UKX$do4~S&-9B q2P% N1Z:hsQuH'K:~+s٦~HeDHWDzkM*whmuKdpPQJl!G^a?)uB$2bD!|K.`#<0% F.3F`L-slk0' s=0\.YKPafeB!Jwa%rrҾCF`'+MakW;%qJvRƂ7Ω&$(=. p#sq:CzKW*d"?l/fVoϾq%~Pi1UaY=$w!1A' vG޸pbe&D #-*m8 α'.SZ+L\}*+5v޼x)ƅ' ŷΙKȸ;YΈnIʪ&łY?G'?T ِ5tߨlB_ &~~?ӧRBgQ+P!V0{LJ4Hn6s&mLPWnإ :RxJdX<-j|TN~+J1aJ ٻM-=f> U wzơu+S }YL<3Uk1ّ:Pnu_Mn I}GxU]<qg36F)g>ϟj?^dXt~>/cO.K!ꓞaѳ/sd] s%IYC7 zG;hzϫ>=ih۷ wB3RFT%B +bG*r.n )b(wžʠna_!=^zҩm Fa'l6&IBČ|`WNh -D4컞Wg#0rn-3Νcb MTH]j̘^g`;d\*D(پfdS  lI!^/zx$RÊcV%:_н1<#zyr+5ϩ> 6CpDUz|<?Dh&h.@`"X&9Ώ!d)$/rOewZ0 I} d{n x,HtⷱWlSO[[Ueβ2w=\#^u6c[3fvS1)w@qync%B?䨧ѷw'b<ԖW/n$iI:Hة>ֹWyY 0lp2WJ(õ}!zQy(BB'̠P\8 7)4UIE牳m52_sVəEodBKo~YiKKΌ#>Yhhwk@WuBouϷG%'h&#M@j,ԣ\f"#,$5_TK^Z>*},3@i[B{gcl^sX)/iUg? '˖eY۝x:'|$58JܯIdVޠ>X>V"T*MˣTRp2uɩW]+ǍbZhgZFsp ;h6B}j尰_yWJs͂ՌP&S0sln!= ͮ\6(EΫsOpԞ?-3o gͶtŵ@UKZS`Ev o$ 7ыmK]jETannT[ 1fC?R%CI`6, 3Sb tb~4EhS3}қ>>N+w|I'$M۞U!Z,ZEKƝ|ƒ{~cr盗x*l"%2X=f)㌄N 5xy$F-3 G ,ٌDv,D ܃څ%Y̳l.SWzH:&jH7$?m+,FʶFJ݊}CM= f*DֆnF3ٮjԋmTf1ɯEA(&mbq0T檄Qj4-,m1|ܷ;)ōcf?iOuМ=*?F萤1@2M|Ҧ΋O_!ă:duM}KZ!zlI[z!F၇^Td78?r/DzuA@me+9kCLm=}&͛@3qY7*k]uZp6(=~*9ԑ[gE@;o*:0A) *ctbd~(Xɝ7>Ykv˞!`45\~"00Bb']&ph. PtgJʎ A?+|ÊI,aN4l~$5>S b@(>`SNڴeLAu\Q)?^\ #A { UNP6>򍡬=#:9>ͺ/Eh:is)hWy`yYNjU2$WxTZE$_7X %Uv5y@ ۣqnzZ#tv[ӝ9Jcԫ'P /jtd'i򛯘vt9GmCI#;>+5NXx!lVq6ý5nDK1OTAJ#q >qĕ[{fkдԄ?fg"IJ}c_CUXNz,g?Ocl2$ɭt?FcDtM䬔>Ki >u2^ٛggXX2I }V:<&βEVҨmuMLc.θR)zwbb} ې6>yxO@Zq#^Wma-TS;Ob\AS mMDW c[So=%ˊLXtiKQ U(EV֢Pd-6I Xdh"e*Q0^yuls~XhU fN2s58,Cn%hfxp XC2Ej΋4W҉(%plVU;lkO]wJ'LX蛒n;li\dLT.ʥ>\Qq EzP#ᴢcG#~_iWu`: yկJ sn˿*vWbBxå:t8Pg! GzʠkUV^BUS:ކbw񏻁J5~kW3Gj]ϙ3RW~`?TEIJ2RH\VQÎ^ y ETI01mUxl_2h!œj@/(y8Pu vПu*B$S8 n}P`M!>JN#oR@H 70R6 wJ kѝc+eɶ99O=Gg.<unog6q'+\ct.UV/R6KǍa"],yQDe,]F|¢Q,oQ3k 31;/,v^cdmׇo\Q+A ~XV[/5i *ZS5x+ ?xxiQƢNZA ,&Oѭ~ \ynCaUHhR~ټ.MhS% '1pDʹsĺ .GJdyRcouTRvޝTĤTr22 c_7$X[MɈRf%D֓XӀѧG.a ~hP;b~=hZYWUk/mESP+oo^|`Du8?$yKh6 i tH={ B0^_L>yI :crQfdUNk{j$nTկpu.Ğ..:Įze+2iy8$Mtw`j7H,'b8q:vvp18Lข_"[>([>!s;c$+evtav;lʏk&g s-$GVך#oں{g`QOl\8{0owĠUerCgMs$_Ҿx5o&DZ}vǍMh]v@J̛ #F쉜vC# Wt=JFiP8VKD;$KA{LTNs'Dv b73,)eA̕[$;dA$NȄx%K~ n($ ʷ-Fݕ )I]%4-靺2W1yܨڝ<+ a pnNSii5z:FC, dlx_q HiuϑM5͟3ƉlYΈaMãO[QSW>oV}l 1 =t+S7<3m(Y+;pvsLu[0U9x=/AӒPYJ=^5iL")y}z[h# `H^vv8Dw-& FPˠ^{ sGCkAvެrr.pR9N\9)eK)&=!"ڟ6Ƨ\(vZRn! n˄{[ۡw7*"&x=8M#7? [yQCm&…DScoFaʝ}9I𓾯us/}.e)PI!txf]`vݵ(l ebj!q~da>#!<%_|H~$52ʃRTt=;{N 79E`tlQ!4(H|[3勤Ur;Q5Oݨ̟>lVCCx։TM`i޹Wh|G"w mΉUTnHUث44f]"o ܸ*PlG5uƇuOOoy`s"`]h$d=b}3 ԚXm[|FdGEQЉ3p'<,jh@%itrn*Z /u޺Hc:ŽڢK}O6s&adܙr=&/p] =PnX `CdjXgS|zRGԙUpI`%;9$Y@c% O u惵silmW;"Πf;fNzmuL irCՇ.e[r`h4=^T|桅"Gw[ґZ%MK(ZCc̹VOi=/}XӨtY+rT_c/Bƕ+,ABi[31'#-qѨgi㵓ͼjF&֓`:IYHYF?Ep+ ^x\\et}̯i#B 5]Eh/S5R kt-p|P/P[ӔkAOXIA4{vA|>wQcJ:v͎S=͂`®P%hZp žBx4=NNG븡֧)Bs Qf1dH?1/KHs+*Rӈp%HIW6|x✮;TVn# ;7Ip<[M}aK<kʜ*^pp>¢DUB݊pNN-Au[{īm%a~2va:#3awn&PnyV*4HN΃.1okUM` 1i[AvݨOhaT#h{ (ٜ_)e?!'p~?P'_RS=^FHwba\$YF-!ijL#QL-SZ jH:WM=zn.QQW~>j4*Y`ϩ-<e,ǫyK /0EZغ7|%?JœuF1m% }/ODŽȋ?xΡg+ɜ'gG pӤ2@9prt!3x1-GK P{mY .;5?("A_bok *SApByzګʲt#={h99ʃ\pA)2O߆<(+ y A$?GxbyB_,5Yeh?Cn~*;0+aIeiӌ?kv?b1c#DVM ,dv\ ja]?ú_pAeE e ^PrYkޞQج ޴/fYhѧSBLW[W9Q zsgr6p=gCYF:97Kܫn܇(l]aFƖ^tEL@0Ѱ{#ރsB8 \.ĦEV&lv!z#Ф~S:N|$y QP[셐D1(AKa"pU >#1fQk ^ʜEz˥/9?*yAhHNrIt=V@L.9͒QxReܕP\XgU{SI=mi'7D#t V5s*/SCwZ-VqywԷ?،ٟNݽ&58*{"8G[+Gj?LˬY Deܻ*8bRʢV;&Zޝ+P򡋆-2O }9)h7IV: 3Rcg.N&S͛E{  zku# ܋ڑF7 6?W#IgnH0N/ZD]4͠(.ኞşŐ4cDre(J֘|V~(juW uUs=m6PH0 Lp+9r|NN7&<˾'}z`VJޫa  = 6xT鼦$]wS : *5} Nߕr UsrNWqJhXȦ&|!ĩRxYٜp5 KSOAhU8€I*mj[.74N72,Jo:f5{3電@WePcٯi}:xVQec[Y+['元rmqv"J4*{$kyҳ6'|Q&~q\m[rc3euGz RZPL uG ˆd<R8dv=kCi8˧OS`K3#5}Ⱦ#XȎbR`n3O U|8N I0kUsW9 9\~,^LGc,[rwxm I'Z2ݩD8)se0;'}N]h>EowOt8)baƂ ݁%OB0t/U.t ^huMhVH>yoA54GY6HPn:6əWS5bP=v|>2T+v\#ય\M8yBؒRkŏÎ x>xJxj/@ɅGscn  d %{ fS=Bq[;MJ,ckuNN3VwR}$ u%="3B>ݱXDʪc!:I7Fw{u`@{$לK}ߓ: \!ߩa 1)q<~CvTv)7;LX ȇKvg4h= re@o:˸bAB*lUlӍj677&ƋBdnNխ攧ڪ]{5hN:/Qǔ%>a=m F֙Nb?t4Dg'1vB(Ƒ+ 5M!VNMO֥D @saLRp7b ڋ'r|wk)* VlFAP Wp^hޱ|+%ii Wb8;xMA!itU|Nw v1W$!9ήi6%EY%Qr]TZEέh#&J:ŕa}Z% r \ð\sO6_ t9@C}/bo-Fv*nHh4̱2U_!*o2Iu35]kZ"jG'/62 ij(3 Di}4 (uNLgѪ|$Ø N@O bau=^ iɉ=onoLm5Ei-\p/g4Cy$U8Z3[S:I9 Zggy e<vlR}>ܤtg#8}[Kk^/7\H~:*hŭaז|VZY ) :ܩ)R@)umG4zL]4 [MSW\ƢebWjh#tA@'.r,k{[8US +R)yHfR>,y;UE)QpN2v*F_Z/bR 'vEvc-ixMF"F$E4Ù]O-#eۣ&Ȋż2gd*>SU;V2c{u5`Rab2T]q:D1?NHBau 2i@nrPU𳩡TNBN eF'2MMϼ6.(t\I7ޡ"⏉XMQ | f~qa}RgPQ˜[VWQ$w AMdin^ۖġ%Kǐ"qX*W$Ʈ5ݿk՛ŊHs8[qYܽU s6t0XPx0‘'?%9,@:Wh޸/ H 2u+!HASu?} NLF`Fui=y.ψW?|'}2&dzӠ*nVrV0&</7&4:9+mjow]50?$c4@8g8SzH~%@r>9#j`$+活RT1ffM[HW+35˗QX6&RK!9_AX\ i{ .- "ʆ!Ց½T+2]2,0!㪙_PsK'ضQE;4[;JQZDP?0忛>q endstream endobj 433 0 obj << /Length1 1759 /Length2 5048 /Length3 0 /Length 6113 /Filter /FlateDecode >> stream xڍ 8k-Sd'$_oc,c}}M4f,3žS֐,٢.ɒl"k"!KHoͽ~<|9Ysel&vkQ8QÊa?jpCfM:a)䧁\w\(ge8(u<\W ADG Ⲓ:uB0TB~ 5xB Cy 87QB 3 8](? bL? \'U„9Q~lefn%jjh_ @JHJRTN]O1 +7?tQ.h@w _s!kiG&L33vN/y~M/7#-OeAf<h~kj{ H8aCTQ\$;#qN HExoQtsr')XB~wDMIHC'̗4!3h`1G8 \-J`$#u!Y)ldsdNЏ''J`HHq "O @B'@@BHHbN !.N .' $%i Fhop'w#h'HȆrUvх> )]ryMV%pu/;qc-oLӯI<:qfwx/N]U)9z5^bQ$ٕyִgWeXE۬mE'M2bgHnőnt#x2SFK*O>j&<;B_; 1->R'b^9L޴<[[J]>u)'ng,nɵ,vfNou)zˀ0{<Ӻ=n 9vOOHVvthqpח]j!rnGtōUy!ĸ"΍HTNfSr4{u:}`Xj2^|m%<Aܕ0|c LMAbn·A00O%Q ߨf-gG2i .S>jsW+2=m>fٹڞƖ) yjZ5myiXo-JBY I$M"svGb櫲QӜ&FՇ?XqWbêYsT 4dmK/5tlnsfNjVc* _)L+O>^瑾N|WuǜWơ+ +e*)cn= jjH@8,*KXC=,r_M']mmI ),S+˰Ȧ,ʛݰ~+sv/. "BPI;rG^4nLپ!`&ѾJvy4Һg|+f#7)muT|^?'}h}L/+o ]t ]kRٶ>%jp_uP;+Y#_$u9ג[jyԯ+l&| -Rxqh׳qFv^Ca<5'|MЈ\HQeӼfm,e@ᝑn;݆r6GIbA&BT-hO+>q~M㽢6Cڏ[("fz]:qÖJs"ۓYE^([p_sVHh~#V fXz4^p4Lط1{G:NzҔ9D>5LK:+\a4K7LܰLy-גơ"W5Ŵ }qZ6uT렙풎\˰U{ 5Lnp&ag_א܂Jv7ft@ىd%<_`ˤQ3V:k'1[boLY$_i-ghjӏF3k/iNWuPc7 UXh!{<]q6e hDrjSA*';%9J-S2J-D-/B_KoL%O|߄ڋNNWxYCiIsv$F-]QrzBe9U uQXyeHw`:gwޥ+KRy6n9H[҂ P[tl{4h$2R;_/7Q< ))d6OwY2Q2/~_GNg8c=W=-ݭErFMV>3Ѭ f7ɏh2h 1;[Ѣ:IXxZ.C/2隣q1Y#Ȃ]jX~A2/̛5{ 𬮬^ۮ۟3(F<_RfDʃ{g޹juLUwm3Sp#0`Y۵(BQaR^Wv5ۄ,! ''Nj5?J~99ƷFe xg|%j*B3'h늒wNTeᕟ,% m`g*&mpl62{"ZYXv;ev4Tf<_a3ef=*]Jơ- EAHSJ}MTLՄGJ7%M#*d6pOP,z(< XOtT[9҃6[X;ԏ*!9qkGx! O6Uwؕ l(Z$^j̆ OSi&ѱv`PtMIGFoZ / iuPLKxw%YQw@U4-^v#Z mpHUڸ,_*a>ܹü CWiQ|}!/u`lA8n xhӧ1YY)R1upyKWV3庛5&؞J>dnY -lz~o#lAJv-E]1OhS; zF![wcMlk}sy"'^6k*"})AR{ĻfmEãD)v]EhV9惀q7_㻮fbFu*3U__&V*V>G,Wn uڈ4A8WO薬$X]< 8.>7rNRMG'#Hx( x&K^4ŔO6 R ozV3fnH}s6&ZS|Do Fo.I5{}+ӪCAf-vDWf%d' Pɕ'Da-#Q{ Cmbk9֠gsՊ$dS,?bI܋FG==?yʯt)dkiaN~T 6i7"]kw|K>G2I֛bPfL "=jvd18J|!G_H I)s5[='^%S!f͓J};c E2bJ[f rwH)6Qէ@ gռ>೸c{+ ?EU~xCSqFJ󣮃2V uOL!∇/mw==Q.UxWN.ƧlYs{T )Ob@iLM* ,cBnUmp Q:Hפת*MsZ_Db`uY1!cwaG!Xs[A^()(%notVúyA%$8z | t-F =bK~fsA O_ydvu:m⋈{ZcIt;ڱݪf*>m)3V迁 c g4y`$\kqq/Ppewܒ܌]CtCg%Tb9DÛB'/,,@# XeĩԶY)ɀnJ7HH |7+IX;zĤ?Ko m|!uʢ0s:vD};rKSO۾~'e9Mn*l%YeafqLr"qV<Q.4qBkv$hᳰ35n!a,?H&Fv?rf&q9MfٖOm̏|aDU3oWîP,զB5n~{>ܱLҎ7 ς[Pѐ*jb hB h[}S9*_-yjN 4$]04evo~hrEEx%2EX}S~UC[T{dp Gsg-{'!g ҿxs:@3`70az9ke/lX$,CCvKdžA~FMƪ5KH@I*F[cs:-[KnA6]Ar&3&}ɓSQS5XirW#ڛ24hmh+Mn{`zxmah"{kTNy++$Y"9(h+w磩&Gz{ï pإ%c SeaC!/> stream xڍT6NǤQ)FH7] #FItw !-)]JK#]9n~49$,PY, R<`07Q CTu.0NSA8]@. 00 rD8 !n0K 'Pu0J!=a6Ȼ22[%0 PU ̢6H0 wD8[?eaÐ6@ j  ԲDX!!P:E:XBwŁ P?p`9 ';baw8xV08\VdB,9B.x9PB ttAJs7eK)=՟4jq7vOs@;x)X,~tui;\ ܩ謡H  BP ЯZ;>^G zrAHgW׿ \\@Kh9~Z!-4q ,pg m? 7[| VF ?I[Aqd(w_\_Yo߆d]fb{pGdWQ N]u jV$8$" Z6aP5 Kvwmvwݪ~wߊ2_W8;C<;rq@yCB8~- ~ZYK <@"/dhsqK D@]NGKwK,AP iHmup; *wa udέW ,K D2gϾz}kmWo1[o̎>8M}5#g޷N:v荨mNjr{J^NoT+ݻ)Ҏ4 (d1Ϙ"BrP㰒zNOdUeFx,sG_NXxN@a@N~F24%H6U\$6 fDu=49qsͰ^0~X%0"yT?bUYkV~\vY5\RQ-io'fi/"vS4⇨N!\(Jpv L{e)ƟwK$;u$],-UX㱹l\4Z 727rسؖo&F.ο yhzP}S66$k)&uhyJp\얘 'Z!h^C݈VCg 9Lnmf]m( aNzז% z.m+[SG(ϚVh>Àk{;DCmUj? ?Hߨmá3Gd&q_ PZGzES7L22,ׂa6eγRQJΛ=2qC$-%@@bBdbalPZ;ժs>>1r,!Rx;_1& )>#DRᵼ~6rŒ?phL9ݖm0G&VH݅?D2"ֺU"R۵\cOKL8E?SA8DDI$^Oa| аLFiJM |;51>EE@G*]yE=!1~S$5F:0QO,jq_b\ݠdJI<)*MG lGLh Ib䇖[b Yjٻ3EFHxJUlЮdv;Gm9ϵes+_=H5sBw +DtD^ ?_4]k3OiyNjbXm!J"mנٛx#@/AFLGu wȦҘsmcsɠ~I+LyHczuM' _plQIU|FVMyǛSʏM:h|%ՕznM n{`%39 tk}46aRJn4xxj+~4#ϻX]품WFt_š2:Obp`MC(o'*[җ ,8>NP3ms*OD?B-ѳ?{{*+ JSG#M9A`z g`'Yqk@]e}@-Ed|OV2.x pKw{NG0bs'äx~߽I/ID4AƂVϽO1]1FKoD/+\:8=R_Ku+rƔ+u'[W燏`RuX ~AU.bl/⌌=O;!OEmWNt(->* 5!N* 2PҗXg隓|Sp[PM%Oʋ/Ms1q{0yƫ\ь~$ѥtȸ:zL= mgl1YqY5'mۣrV(dro _]_0|i4^ɐrxQQU2I#P3~}(ueh(d\g=|й:X!۵6JMxFU;WF.'~DZ "ͭXKouvujLpE)u3Rk:XzUٕP폮Ά; ` >[l.?j`8e?h.`-:xij #E!\|ƆV᜸[QC _O/kE1 5ܲHȗSDBs};ԉSVd׌b^ttb/مQQY|~ kuNjMeֳrTJLMȆ7妨{3fE/x9p, ]^yd o{jԡQ.QMϥot0`W~zk25=vl]Grh?vH O3gI IܩNdON48 MIzr&gf8?o1 O QNca,K^o>^V = g5i@6 ݊$R34^F jZkPz1;5SߛecB܉i!IFЊ{P[ܳE/be}xs;@2lTflZԓa,<\YzdDB fgZ7ՈhPz|HxEggx)4/h/$< z9?ER>euAtQi1yu<K+;e1՜?|{&oFNSEݸzmo:?jRqiJ.3Xl^0?c,dQzpKDXq H0 &HO°+k ~[:3HEŨC<He | MIe'7Awꐕ%vROb{4c$ j*/Y 7oI-/=QS5ktzq00|>vR/vNhlOC4HI?B7De&&:sR$,Ti4? Vw"e(w%%{Zk0s>2v}7-!$Xap{ʸV7dUMsX!ĉ4Th|SMk to, ^A#"NVI&8`bkDA%D$mǞS\;Yp%U=ȅ!+ǀi?q 4Ʀ)|=1Hk㜸 !rBkYjḶ^YTǁ׹&yd}q{UM̻v}m(y7N#OJ!+Z2/=.X6u}C=pBt9}e\7jFHɠ 0!2;/'fg5p$鱗S[95V& .y׷jzNc/yaA&Ey~薻Ay8z%nT_[;kqhOEdoCGqѦg-3P?WY\QGzѺWzɥ٨pPJC En=8G<$Xg JtK^"U :u[-V"'4IfTFP]W:0,MN'X=1SR s?Ryp#aνl-漨<82Zkg`]´P(֟ J[!fRod|NI`@-ى|>؟d_8;!֥*z1km(U g~n:tOC-A#}]r7Ѧ]VL%|9?b(LpjD?MW}?utk zx&QG$9ȆQ-?9F42'Xرr|4g ‘Pըm۵8=.Sb6ŀoDgj8B}K10D_iD ì`7Ի(^dLZz&s7P0ĺ"A*WGi1|I|nrv]VFDZl0xdf,LdiKiqcjjA#SXO]ŃZl,p|_E%jbU42rć"#jie+Ry,SgrKB]Ƙ^bPi^m6{˭ &U]Y> stream xYSG_яeRk;NA1h#DbwH=< zzB k.Yh QX}uZ8A^YIDw,qz-p"W':Ih-t&%aF/a`Wa=] Fؕ=JmthF+q@5HAp`^l vE pJ [&E]0 ;Dn'E H@Dq$ g,\r0HuJ `@3X5NDcELm;NEiݩSfnM_RїNFם<{g#<\xv#H4]-mvi7ÙLJB+cvS0<&<Ovn׉̖>ìvזvf57oNiBU+SđMƃF~a\Q0*|xI`7B/ 8ZEM WZ-Pj KrUtVjDգ4c-!qN:^d@iA^@t^ dy|'锆=Cfh]惝)]nCZ Ҩ94oXOtb/v [y;Rj%ҢUhάk ?/ZTɖG"ԍ!) O4")|Yx:Hn<:Ncz :V+vMg(p&fVa;JjWjsh4|dV#)XzR48Ad¢q,q1> wJn3=G|ToN!z!;YMGE)HbV{kzGӱkW~rGp6>_Lgpf=x^+rV "PC|2|8:ڌO6hph2>v\/+ZQ$ɑ$t2=t$d# lΎF|9Ngy ?7b&<|l.Moy(مtmǘם2c7%)=Ci蓟PrS8 jѺS)'r8OFd%lC.i p]|Z-yC/t$C;{| Dwɜ>ӅuB6G?Bz, mrчn?nL?7#}p `{ՀBk5:E=} w u=s> endobj 442 0 obj << /Type /ObjStm /N 6 /First 45 /Length 196 /Filter /FlateDecode >> stream xڝ 0 }A&^v"M< C'n|{fzz5i}ISX%Dـ>\)9UJQf_TR֥c~a`tasx[K! j<#t3䭑e/"nfp2)y 9 vY$^1IKy}B7Si ] /Length 1197 /Filter /FlateDecode >> stream x%}heƟystNn}tsnmNi6\kN%0ĄHÒ vG%ID dV`h:Ϲ:8\ҜwXh!V+@'PFĈ.αE.:HK".I-m1D*ܤtJY1` 村#2j'ꓥ pMlCz5b2ܺ+jBmP: %t"n Lb_D>Ή7(sM-YpʤsbHKpJp$O=kD9܉jY@T}!"5"SZbk.&/=%D=n]X JD^*]N49R-H3PtNh*.j+1pu{բ}igJW@gɵ]R5|^Z`6_G'rr/ $]O{^ Л> D?0x ԍ0cf;gu ef,~i23?MTfƒ: 7ǒc t3cӤL"eR,>KʤX&|+R&Ųk|q ja\,c)bnI˅T eRl*)by;xgc\l¸X> wL¿IYoK+?Nʤ\w5ʸX)ja\ 1j2.VZ"q[1)bgWjwØ?D-_: eRʀI7_cR)˚5ʸX3Bj0.ւISL!) ƤXBR&:Ok<[PU",2)օЮ&u#t l~^ыhS}P bOz)Cb<+@c ?,a^i^n Fql4i "vi1Zi0H1DڣDs҉3ID6…$i1U)D.ϥiTwl:pR:(ʒR2D1MsD QJ#ʈD9Q(FU"xJDGR7UU!|SU5b)Z#T rǡOUUOGU-F UVU-E|8b$b5=?kj!~n6 endstream endobj startxref 454924 %%EOF