#2173: Tcl NVIZ: load state file "Error: must be surf_id set_mask_mode BOOLEAN"
--------------------------------+-------------------------------------------
Reporter: hamish | Owner: grass-dev@…
Type: defect | Status: new
Priority: major | Milestone: 6.4.4
Component: Tcl/Tk NVIZ | Version: svn-develbranch6
Keywords: load state, raster | Platform: Linux
Cpu: x86-64 |
--------------------------------+-------------------------------------------
Hi,
there is a bug in writing the saved-state file in tcl/tk NVIZ. It means
that re-loading a state file with raster layers leads to an inconsistent
internal state.
The reason is the mask-map inversion status being written as "00" not "0".
Fixing the file by hand solves the issue and lets you load the state file
correctly.
spearfish example:
{{{
GRASS> g.region -d
GRASS> nviz elev=elevation.dem
File --> Save State
Save as "test.nviz"
GRASS> head -n 27 test.nviz | tail -n 17
surf*1390794941
map elevation.dem
0
map elevation.dem
0
unset
00
unset
const 60.000000
unset
#888888
0.000000 0.000000 0.000000
3 3
2 2
poly
grid_surf
gouraud
GRASS> nviz state=test.nviz
Loading raster map <elevation.dem@PERMANENT>...
100%
Loading raster map <elevation.dem@PERMANENT>...
100%
Translating colors from raster map <elevation.dem@PERMANENT>...
100%
Diagnostic: Error: must be surf_id set_mask_mode BOOLEAN --
Load procedure for panel >>>start surf may not be defined
}}}
And the internal state becomes a bit messed up: The surface renders but
the Raster Surfaces controls show none loaded.
In map_obj.c set_mask_mode() fails because it is saved in the file as "00"
not "0" (7th line of the 'surf' entry).
The code that creates it is get_mask_mode() in
visualization/nviz/src/map_obs.c, but that is using `sprintf(tmp, "%d",
mode);` to create the string so I'm not seeing where/how the "00" is being
introduced, since %d should lead to just "0".
?
The work-around is to edit the .nviz state file by hand and change the
"00" to "0". Then the "Load State" works as expected.
Interestingly the first time I launch tcl nviz in 6.4.3 on a different
machine it wrote out "0" but later attempts following the exact same
series of clicks writes out "00".. smashed stack?
see also scripts/panel_surf.tcl for the reading and writing of the
session-state file (Nviz_surf_save() is well commented).
Another question is if after fixing the source of the "00" trouble if we
allow sloppy-read, i.e. to auto-translate 00 to 0 upon load so the user
can load old+broken .nviz state files created by this bug. Or as a general
policy if keeping work-arounds in the code base for old bugs generates too
much code-clutter? In this case I would suggest to err on the side of
being kind to the victims.
thanks,
Hamish
--
Ticket URL: <https://trac.osgeo.org/grass/ticket/2173>
GRASS GIS <http://grass.osgeo.org>