raster.tcl 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472
  1. ##########################################################################
  2. # raster.tcl - raster layer options file for GRASS GIS Manager
  3. # March 2006 Michael Barton, Arizona State University
  4. # COPYRIGHT: (C) 1999 - 2006 by the GRASS Development Team
  5. #
  6. # This program is free software under the GNU General Public
  7. # License (>=v2). Read the file COPYING that comes with GRASS
  8. # for details.
  9. #
  10. ##########################################################################
  11. namespace eval GmRaster {
  12. variable array opt # raster current options
  13. variable count 1
  14. variable array tree # mon
  15. variable array lfile # raster
  16. variable array lfilemask # raster
  17. variable optlist
  18. variable array dup # vector
  19. }
  20. ###############################################################################
  21. # create raster map node in layer tree
  22. proc GmRaster::create { tree parent } {
  23. variable optlist
  24. variable lfile
  25. variable lfilemask
  26. variable opt
  27. variable count
  28. variable dup
  29. global iconpath
  30. global mon
  31. set node "raster:$count"
  32. #create form for layer tree entry
  33. set frm [ frame .rastericon$count]
  34. set check [checkbutton $frm.check \
  35. -variable GmRaster::opt($count,1,_check) \
  36. -height 1 -padx 0 -width 0]
  37. image create photo rico -file "$iconpath/element-cell.gif"
  38. set ico [label $frm.ico -image rico -bd 1 -relief raised]
  39. pack $check $ico -side left
  40. bind $ico <ButtonPress-1> "GmTree::selectn $tree $node"
  41. #insert new layer
  42. if {[$tree selection get] != "" } {
  43. set sellayer [$tree index [$tree selection get]]
  44. } else {
  45. set sellayer "end"
  46. }
  47. $tree insert $sellayer $parent $node \
  48. -text "raster $count"\
  49. -window $frm \
  50. -drawcross auto
  51. #set default option values
  52. set opt($count,1,_check) 1
  53. set dup($count) 0
  54. set opt($count,1,opacity) 1.0
  55. set opt($count,1,map) ""
  56. set opt($count,1,drapemap) ""
  57. set opt($count,1,brighten) 0
  58. set opt($count,1,querytype) "cat"
  59. set opt($count,1,rastquery) ""
  60. set opt($count,1,rasttype) ""
  61. set opt($count,1,bkcolor) ""
  62. set opt($count,1,overlay) 1
  63. set opt($count,1,mod) 1
  64. set optlist {_check opacity map drapemap brighten querytype rastquery rasttype bkcolor \
  65. overlay}
  66. foreach key $optlist {
  67. set opt($count,0,$key) $opt($count,1,$key)
  68. }
  69. # create files in tmp diretory for layer output
  70. set mappid [pid]
  71. if {[catch {set lfile($count) [exec g.tempfile pid=$mappid]} error]} {
  72. GmLib::errmsg $error [G_msg "Error creating tempfile"]
  73. }
  74. set lfilemask($count) $lfile($count)
  75. append lfile($count) ".ppm"
  76. append lfilemask($count) ".pgm"
  77. incr count
  78. return $node
  79. }
  80. ###############################################################################
  81. proc GmRaster::set_option { node key value } {
  82. variable opt
  83. set id [GmTree::node_id $node]
  84. set opt($id,1,$key) $value
  85. }
  86. ###############################################################################
  87. # select base raster map from list and put name in layer tree node
  88. proc GmRaster::select_map { id } {
  89. variable tree
  90. variable node
  91. global mon
  92. set m [GSelect cell title [G_msg "Raster map"] parent "."]
  93. if { $m != "" } {
  94. set GmRaster::opt($id,1,map) $m
  95. GmTree::autonamel $m
  96. }
  97. }
  98. # select drape raster map from list and put name in layer tree node
  99. proc GmRaster::select_drapemap { id } {
  100. variable tree
  101. variable node
  102. global mon
  103. set m [GSelect cell title [G_msg "Raster drape map"] parent "."]
  104. if { $m != "" } {
  105. set GmRaster::opt($id,1,drapemap) $m
  106. GmTree::autonamel $m
  107. }
  108. }
  109. ###############################################################################
  110. # show base raster info in output window
  111. proc GmRaster::show_info { id } {
  112. variable opt
  113. set mapname $opt($id,1,map)
  114. set cmd "r.info map=$mapname"
  115. run_panel $cmd
  116. }
  117. # show drape raster info in output window
  118. proc GmRaster::show_info_drape { id } {
  119. variable opt
  120. set mapname $opt($id,1,drapemap)
  121. set cmd "r.info map=$mapname"
  122. run_panel $cmd
  123. }
  124. ###############################################################################
  125. # set and display raster options
  126. proc GmRaster::options { id frm } {
  127. variable opt
  128. global iconpath
  129. global bgcolor
  130. # Panel heading
  131. set row [ frame $frm.heading ]
  132. Label $row.a -text [G_msg "Display raster maps"] \
  133. -fg MediumBlue
  134. pack $row.a -side left
  135. pack $row -side top -fill both -expand yes
  136. #opacity
  137. set row [ frame $frm.opc]
  138. Label $row.a -text [G_msg "Opaque "]
  139. scale $row.b -from 1.0 -to 0.0 -showvalue 1 \
  140. -orient horizontal -length 300 -resolution 0.01 -fg "#656565"\
  141. -variable GmRaster::opt($id,1,opacity)
  142. Label $row.c -text [G_msg " Transparent"]
  143. pack $row.a $row.b $row.c -side left
  144. pack $row -side top -fill both -expand yes
  145. # raster name
  146. set row [ frame $frm.name ]
  147. Label $row.a -text [G_msg "Base map:\t"]
  148. Button $row.b -image [image create photo -file "$iconpath/element-cell.gif"] \
  149. -highlightthickness 0 -takefocus 0 -relief raised -borderwidth 1 \
  150. -helptext [G_msg "base raster map to display"]\
  151. -command "GmRaster::select_map $id"
  152. Entry $row.c -width 35 -text " $opt($id,1,map)" \
  153. -textvariable GmRaster::opt($id,1,map)
  154. Label $row.d -text ""
  155. Button $row.e -text [G_msg "base map info"] \
  156. -image [image create photo -file "$iconpath/gui-rv.info.gif"] \
  157. -command "GmRaster::show_info $id" \
  158. -background $bgcolor \
  159. -helptext [G_msg "base map info"]
  160. Label $row.f -text ""
  161. Button $row.g -text [G_msg "Help"] \
  162. -image [image create photo -file "$iconpath/gui-help.gif"] \
  163. -command "spawn g.manual --q d.rast" \
  164. -background $bgcolor \
  165. -helptext [G_msg "Help"]
  166. pack $row.a $row.b $row.c $row.d $row.e $row.f $row.g -side left
  167. pack $row -side top -fill both -expand yes
  168. # raster query
  169. set row [ frame $frm.rquery ]
  170. Label $row.a -text [G_msg "\tvalues to display"]
  171. LabelEntry $row.b -textvariable GmRaster::opt($id,1,rastquery) -width 35
  172. pack $row.a $row.b -side left
  173. pack $row -side top -fill both -expand yes
  174. # drape name
  175. set row [ frame $frm.drapeinfo1 ]
  176. Label $row.a -text [G_msg "\tOptional color draping. Use base map for shading,"]
  177. pack $row.a -side left
  178. pack $row -side top -fill both -expand yes
  179. set row [ frame $frm.drapeinfo2 ]
  180. Label $row.a -text [G_msg "\tdrape map for color in color relief map or data fusion"]
  181. pack $row.a -side left
  182. pack $row -side top -fill both -expand yes
  183. set row [ frame $frm.drape ]
  184. Label $row.a -text [G_msg "\tdrape map: "]
  185. Button $row.b -image [image create photo -file "$iconpath/element-cell.gif"] \
  186. -highlightthickness 0 -takefocus 0 -relief raised -borderwidth 1 \
  187. -helptext [G_msg "raster map to drape over base map"]\
  188. -command "GmRaster::select_drapemap $id"
  189. Entry $row.c -width 35 -text " $opt($id,1,drapemap)" \
  190. -textvariable GmRaster::opt($id,1,drapemap)
  191. Label $row.d -text ""
  192. Button $row.e -text [G_msg "drape map info"] \
  193. -image [image create photo -file "$iconpath/gui-rv.info.gif"] \
  194. -command "GmRaster::show_info_drape $id" \
  195. -background $bgcolor \
  196. -helptext [G_msg "drape map info"]
  197. pack $row.a $row.b $row.c $row.d $row.e -side left
  198. pack $row -side top -fill both -expand yes
  199. # HIS brightness for drape map
  200. set row [ frame $frm.bright ]
  201. Label $row.a -text [G_msg "\tdrape map brightness adjustment\t "]
  202. SpinBox $row.b -range {-99 99 1} -textvariable GmRaster::opt($id,1,brighten) \
  203. -width 3 -helptext [G_msg "Adjust brightness of drape map"] \
  204. -entrybg white
  205. pack $row.a $row.b -side left
  206. pack $row -side top -fill both -expand yes -padx 5 -pady 1
  207. # overlay
  208. set row [ frame $frm.over ]
  209. checkbutton $row.a -text [G_msg "overlay maps from other layers (transparent null value cells)"] \
  210. -variable GmRaster::opt($id,1,overlay)
  211. pack $row.a -side left
  212. pack $row -side top -fill both -expand yes
  213. # background color
  214. set row [ frame $frm.bg ]
  215. Label $row.a -text [G_msg " Set background color (colored null value cells)"]
  216. ComboBox $row.b -padx 2 -width 10 -textvariable GmRaster::opt($id,1,bkcolor) \
  217. -values {"white" "grey" "gray" "black" "brown" "red" "orange" \
  218. "yellow" "green" "aqua" "cyan" "indigo" "blue" "purple" "violet" "magenta"}
  219. pack $row.a $row.b -side left
  220. pack $row -side top -fill both -expand yes
  221. }
  222. ###############################################################################
  223. # save raster node to workspace grc file
  224. proc GmRaster::save { tree depth node } {
  225. variable opt
  226. variable optlist
  227. global mon
  228. set id [GmTree::node_id $node]
  229. foreach key $optlist {
  230. GmTree::rc_write $depth "$key $opt($id,1,$key)"
  231. }
  232. }
  233. ###############################################################################
  234. # append elevation maps display lists for NVIZ
  235. proc GmRaster::addelev {node } {
  236. variable opt
  237. variable tree
  238. global mon
  239. set tree($mon) $GmTree::tree($mon)
  240. set id [GmTree::node_id $node]
  241. if { ! ( $opt($id,1,_check) ) } { return }
  242. set nvelev "$opt($id,1,map)"
  243. return $nvelev
  244. }
  245. # append drape colors to display lists for NVIZ
  246. proc GmRaster::addcolor {node } {
  247. variable opt
  248. variable tree
  249. global mon
  250. set tree($mon) $GmTree::tree($mon)
  251. set id [GmTree::node_id $node]
  252. if { ! ( $opt($id,1,_check) ) } { return }
  253. if { $opt($id,1,drapemap) != "" } {
  254. set nvcolor $opt($id,1,drapemap)
  255. } else {
  256. set nvcolor $opt($id,1,map)
  257. }
  258. return $nvcolor
  259. }
  260. ###############################################################################
  261. # display raster map and output to graphic file for compositing
  262. proc GmRaster::display { node mod } {
  263. global mon
  264. variable optlist
  265. variable lfile
  266. variable lfilemask
  267. variable opt
  268. variable tree
  269. variable dup
  270. variable count
  271. set rasttype ""
  272. set tree($mon) $GmTree::tree($mon)
  273. set id [GmTree::node_id $node]
  274. # If we are told dirty (for zoom) force dirty
  275. # Don't remove a dirty from a previous unrendered zoom
  276. if {$mod} {set opt($id,1,mod) 1}
  277. if { $opt($id,1,map) == "" } { return }
  278. set cmd "d.rast map=$opt($id,1,map)"
  279. # overlay
  280. if { $opt($id,1,overlay) } {
  281. append cmd " -o"
  282. }
  283. # set raster type
  284. set rasttype ""
  285. set rt ""
  286. if {![catch {open "|r.info map=$opt($id,1,map) -t" r} rt]} {
  287. set rasttype [read $rt]
  288. if {[catch {close $rt} error]} {
  289. GmLib::errmsg $error
  290. }
  291. }
  292. if {$rasttype == "" || [regexp -nocase ".=CELL" $rasttype]} {
  293. set querytype "cat"
  294. } else {
  295. set querytype "vallist"
  296. }
  297. # raster query
  298. if { $opt($id,1,rastquery) != "" } {
  299. append cmd " {$querytype=$opt($id,1,rastquery)}"
  300. }
  301. # background color
  302. if { $opt($id,1,bkcolor) != "" } {
  303. append cmd " bg=$opt($id,1,bkcolor)"
  304. }
  305. set cmd2 "d.his h_map=$opt($id,1,drapemap) i_map=$opt($id,1,map) brighten=$opt($id,1,brighten)"
  306. if { $opt($id,1,drapemap) == "" } {
  307. # set cmd $cmd
  308. } else {
  309. set cmd $cmd2
  310. }
  311. # Decide whether to run, run command, and copy files to temp
  312. GmCommonLayer::display_command [namespace current] $id $cmd
  313. }
  314. ###############################################################################
  315. # get selected raster map (used for query)
  316. proc GmRaster::mapname { node } {
  317. variable opt
  318. variable tree
  319. global mon
  320. set tree($mon) $GmTree::tree($mon)
  321. set id [GmTree::node_id $node]
  322. if { $opt($id,1,map) == "" } { return }
  323. set mapname $opt($id,1,map)
  324. return $mapname
  325. }
  326. ###############################################################################
  327. # duplicate currently selected layer
  328. proc GmRaster::duplicate { tree parent node id } {
  329. variable optlist
  330. variable lfile
  331. variable lfilemask
  332. variable opt
  333. variable count
  334. variable dup
  335. global iconpath
  336. global mon
  337. set node "raster:$count"
  338. set dup($count) 1
  339. set frm [ frame .rastericon$count]
  340. set check [checkbutton $frm.check \
  341. -variable GmRaster::opt($count,1,_check) \
  342. -height 1 -padx 0 -width 0]
  343. image create photo rico -file "$iconpath/element-cell.gif"
  344. set ico [label $frm.ico -image rico -bd 1 -relief raised]
  345. bind $ico <ButtonPress-1> "GmTree::selectn $tree $node"
  346. pack $check $ico -side left
  347. # where to insert new layer
  348. if {[$tree selection get] != "" } {
  349. set sellayer [$tree index [$tree selection get]]
  350. } else {
  351. set sellayer "end"
  352. }
  353. if { $opt($id,1,map) == ""} {
  354. $tree insert $sellayer $parent $node \
  355. -text "raster $count" \
  356. -window $frm \
  357. -drawcross auto
  358. } else {
  359. $tree insert $sellayer $parent $node \
  360. -text "$opt($id,1,map)" \
  361. -window $frm \
  362. -drawcross auto
  363. }
  364. set opt($count,1,opacity) $opt($id,1,opacity)
  365. set optlist {_check map drapemap brighten querytype rastquery rasttype bkcolor \
  366. overlay}
  367. foreach key $optlist {
  368. set opt($count,1,$key) $opt($id,1,$key)
  369. set opt($count,0,$key) $opt($count,1,$key)
  370. }
  371. set id $count
  372. # create files in tmp directory for layer output
  373. set mappid [pid]
  374. if {[catch {set lfile($count) [exec g.tempfile pid=$mappid]} error]} {
  375. GmLib::errmsg $error [G_msg "Error creating tempfile"]
  376. }
  377. set lfilemask($count) $lfile($count)
  378. append lfile($count) ".ppm"
  379. append lfilemask($count) ".pgm"
  380. incr count
  381. return $node
  382. }