[GRASS-dev] [GRASS GIS] #2173: Tcl NVIZ: load state file "Error: must be surf_id set_mask_mode BOOLEAN"

#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&gt;
GRASS GIS <http://grass.osgeo.org>

#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.5.0
Component: Tcl/Tk NVIZ | Version: svn-develbranch6
Keywords: load state, raster | Platform: Linux
      Cpu: x86-64 |
--------------------------------+-------------------------------------------
Changes (by hamish):

  * milestone: 6.4.4 => 6.5.0

Comment:

Replying to [ticket:2173 hamish]:
> 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?

sorry, my mistake. That happened when switching between 6.4.3 and 6.5, so
the bug is in 6.5 only.

Hamish

--
Ticket URL: <https://trac.osgeo.org/grass/ticket/2173#comment:1&gt;
GRASS GIS <http://grass.osgeo.org>