Sfoglia il codice sorgente

wxGUI: bug fix - trac https://trac.osgeo.org/grass/ticket/297 wxNVIZ: crash or failure
use display region settings
(merge from devbr6, https://trac.osgeo.org/grass/changeset/33315)


git-svn-id: https://svn.osgeo.org/grass/grass/trunk@33316 15284696-431f-4ddb-bdfa-cd5b030d7da7

Martin Landa 16 anni fa
parent
commit
22bb85d369

+ 83 - 52
gui/wxpython/gui_modules/nviz_mapdisp.py

@@ -78,18 +78,21 @@ class GLWindow(MapWindow, glcanvas.GLCanvas):
         self.parent = parent # MapFrame
         self.parent = parent # MapFrame
         
         
         self.init = False
         self.init = False
+        self.initView = False
+        
         # render mode 
         # render mode 
         self.render = { 'quick' : False,
         self.render = { 'quick' : False,
                         # do not render vector lines in quick mode
                         # do not render vector lines in quick mode
                         'vlines' : False,
                         'vlines' : False,
                         'vpoints' : False }
                         'vpoints' : False }
 
 
-        # list of loaded map layers
-        self.layers = {}
-        for type in ('raster', 'vlines', 'vpoints', '3d-raster'):
-            self.layers[type] = {}
-            self.layers[type]['name'] = []
-            self.layers[type]['id'] = []
+        # list of loaded map layers (layer tree items)
+        self.layers = []
+        
+        #
+        # use display region instead of computational
+        #
+        os.environ['GRASS_REGION'] = self.Map.SetRegion()
 
 
         #
         #
         # create nviz instance
         # create nviz instance
@@ -101,17 +104,14 @@ class GLWindow(MapWindow, glcanvas.GLCanvas):
         time.sleep(.1)
         time.sleep(.1)
         self.nvizClass =  self.nvizThread.nvizClass
         self.nvizClass =  self.nvizThread.nvizClass
 
 
+        # GRASS_REGION needed only for initialization
+        del os.environ['GRASS_REGION']
+
         #
         #
         # set current display
         # set current display
         #
         #
         self.nvizClass.SetDisplay(self)
         self.nvizClass.SetDisplay(self)
-
-        #
-        # initialize mouse position
-        #
-        self.lastX = self.x = 30
-        self.lastY = self.y = 30
-
+        
         #
         #
         # default values
         # default values
         #
         #
@@ -150,9 +150,11 @@ class GLWindow(MapWindow, glcanvas.GLCanvas):
         dc = wx.PaintDC(self)
         dc = wx.PaintDC(self)
         self.SetCurrent()
         self.SetCurrent()
         
         
-        if not self.init:
+        if not self.initView:
             self.nvizClass.InitView()
             self.nvizClass.InitView()
+            self.initView = True
 
 
+        if not self.init:
             self.LoadDataLayers()
             self.LoadDataLayers()
 
 
             self.ResetView()
             self.ResetView()
@@ -171,10 +173,10 @@ class GLWindow(MapWindow, glcanvas.GLCanvas):
                 # update widgets
                 # update widgets
                 win = self.parent.nvizToolWin.FindWindowById( \
                 win = self.parent.nvizToolWin.FindWindowById( \
                     self.parent.nvizToolWin.win['vector']['lines']['surface'])
                     self.parent.nvizToolWin.win['vector']['lines']['surface'])
-                win.SetItems(self.layers['raster']['name'])
+                win.SetItems(self.GetLayerNames('raster'))
 
 
             self.init = True
             self.init = True
-
+            
         self.UpdateMap()
         self.UpdateMap()
 
 
     def OnMouseAction(self, event):
     def OnMouseAction(self, event):
@@ -421,7 +423,7 @@ class GLWindow(MapWindow, glcanvas.GLCanvas):
             for sec in data.keys():
             for sec in data.keys():
                 for sec1 in data[sec].keys():
                 for sec1 in data[sec].keys():
                     for sec2 in data[sec][sec1].keys():
                     for sec2 in data[sec][sec1].keys():
-                        if sec2 not in ('object', 'all'):
+                        if sec2 != 'all':
                             data[sec][sec1][sec2]['update'] = None
                             data[sec][sec1][sec2]['update'] = None
 
 
             event = wxUpdateProperties(data=data)
             event = wxUpdateProperties(data=data)
@@ -479,12 +481,11 @@ class GLWindow(MapWindow, glcanvas.GLCanvas):
             else:
             else:
                 print >> sys.stderr, "Nviz:" + _("Unsupported layer type '%s'") % layer.type
                 print >> sys.stderr, "Nviz:" + _("Unsupported layer type '%s'") % layer.type
         
         
-        self.layers[layer.type]['name'].append(layer.name)
-        self.layers[layer.type]['id'].append(id)
-
+        self.layers.append(item)
+        
         # set default/workspace layer properties
         # set default/workspace layer properties
         data = self.SetMapObjProperties(item, id, nvizType)
         data = self.SetMapObjProperties(item, id, nvizType)
-
+        
         # update properties
         # update properties
         event = wxUpdateProperties(data=data)
         event = wxUpdateProperties(data=data)
         wx.PostEvent(self, event)
         wx.PostEvent(self, event)
@@ -496,7 +497,7 @@ class GLWindow(MapWindow, glcanvas.GLCanvas):
             if layer.type == 'raster':
             if layer.type == 'raster':
                 win = toolWin.FindWindowById( \
                 win = toolWin.FindWindowById( \
                     toolWin.win['vector']['lines']['surface'])
                     toolWin.win['vector']['lines']['surface'])
-                win.SetItems(self.layers[layer.type]['name'])
+                win.SetItems(self.GetLayerNames(layer.type))
 
 
             toolWin.UpdatePage(nvizType)
             toolWin.UpdatePage(nvizType)
             toolWin.SetPage(nvizType)
             toolWin.SetPage(nvizType)
@@ -549,17 +550,15 @@ class GLWindow(MapWindow, glcanvas.GLCanvas):
 
 
         data[nvizType].pop('object')
         data[nvizType].pop('object')
 
 
-        idx = self.layers[layer.type]['id'].index(id)
-        del self.layers[layer.type]['name'][idx]
-        del self.layers[layer.type]['id'][idx]
-
+        self.layers.remove(item)
+        
         # update tools window
         # update tools window
         if hasattr(self.parent, "nvizToolWin") and \
         if hasattr(self.parent, "nvizToolWin") and \
                 layer.type == 'raster':
                 layer.type == 'raster':
             toolWin = self.parent.nvizToolWin
             toolWin = self.parent.nvizToolWin
             win = toolWin.FindWindowById( \
             win = toolWin.FindWindowById( \
                 toolWin.win['vector']['lines']['surface'])
                 toolWin.win['vector']['lines']['surface'])
-            win.SetItems(self.layers[layer.type]['name'])
+            win.SetItems(self.GetLayerNames(layer.type))
 
 
             # remove surface page
             # remove surface page
             if toolWin.notebook.GetSelection() == toolWin.page[nvizType]['id']:
             if toolWin.notebook.GetSelection() == toolWin.page[nvizType]['id']:
@@ -605,8 +604,7 @@ class GLWindow(MapWindow, glcanvas.GLCanvas):
             # update layer properties
             # update layer properties
             self.SetMapObjProperties(item, id, type)
             self.SetMapObjProperties(item, id, type)
         
         
-            self.layers['v' + type]['name'].append(layer.name)
-            self.layers['v'  + type]['id'].append(id)
+        self.layers.append(item)
         
         
         # update properties
         # update properties
         data = self.tree.GetPyData(item)[0]['nviz']
         data = self.tree.GetPyData(item)[0]['nviz']
@@ -659,10 +657,8 @@ class GLWindow(MapWindow, glcanvas.GLCanvas):
             
             
             data[vtype].pop('object')
             data[vtype].pop('object')
 
 
-            idx = self.layers['v' + vtype]['id'].index(id)
-            del self.layers['v' + vtype]['name'][idx]
-            del self.layers['v' + vtype]['id'][idx]
-
+            self.layers.remove(id)
+            
         # update tools window
         # update tools window
         if hasattr(self.parent, "nvizToolWin") and \
         if hasattr(self.parent, "nvizToolWin") and \
                 vecType is None:
                 vecType is None:
@@ -839,9 +835,10 @@ class GLWindow(MapWindow, glcanvas.GLCanvas):
             type = 'flat'
             type = 'flat'
             map  = None
             map  = None
         else:
         else:
-            if len(self.layers['raster']['name']) > 0:
+            rasters = self.GetLayerNames('raster')
+            if len(rasters) > 0:
                 type = 'surface'
                 type = 'surface'
-                map  = self.layers['raster']['name'][0]
+                map  = rasters[0]
             else:
             else:
                 type = 'flat'
                 type = 'flat'
                 map = None
                 map = None
@@ -883,8 +880,9 @@ class GLWindow(MapWindow, glcanvas.GLCanvas):
         # mode
         # mode
         data['mode'] = { 'type' : 'surface',
         data['mode'] = { 'type' : 'surface',
                          'surface' : '', }
                          'surface' : '', }
-        if len(self.layers['raster']['name']) > 0:
-            data['mode']['surface'] = self.layers['raster']['name'][0]
+        rasters = self.GetLayerNames('raster')
+        if len(rasters) > 0:
+            data['mode']['surface'] = rasters[0]
         
         
         # height
         # height
         data['height'] = { 'value' : UserSettings.Get(group='nviz', key='vector',
         data['height'] = { 'value' : UserSettings.Get(group='nviz', key='vector',
@@ -897,7 +895,15 @@ class GLWindow(MapWindow, glcanvas.GLCanvas):
         
         
     def Reset(self):
     def Reset(self):
         """Reset (unload data)"""
         """Reset (unload data)"""
-        self.nvizClass.Reset()
+        for item in self.layers:
+            type = self.tree.GetPyData(item)[0]['maplayer'].type
+            if type == 'raster':
+                self.UnloadRaster(item)
+            elif type == '3d-raster':
+                self.UnloadRaster3d(item)
+            elif type == 'vector':
+                self.UnloadVector(item)
+            
         self.init = False
         self.init = False
 
 
     def OnZoomToMap(self, event):
     def OnZoomToMap(self, event):
@@ -1122,19 +1128,18 @@ class GLWindow(MapWindow, glcanvas.GLCanvas):
         if data['color'].has_key('update') or \
         if data['color'].has_key('update') or \
                 data['width'].has_key('update') or \
                 data['width'].has_key('update') or \
                 data['mode'].has_key('update'):
                 data['mode'].has_key('update'):
-            width = data['width']
-            color = data['color']
+            width = data['width']['value']
+            color = data['color']['value']
             if data['mode']['type'] == 'flat':
             if data['mode']['type'] == 'flat':
                 flat = True
                 flat = True
                 if data.has_key('surface'):
                 if data.has_key('surface'):
                     data.pop('surface')
                     data.pop('surface')
             else:
             else:
                 flat = False
                 flat = False
-                if not 'vector:lines:surface' in update:
-                    update.append('vector:lines:surface')
-
+                
             self.nvizClass.SetVectorLineMode(id, color,
             self.nvizClass.SetVectorLineMode(id, color,
                                              width, flat)
                                              width, flat)
+            
             if data['color'].has_key('update'):
             if data['color'].has_key('update'):
                 data['color'].pop('update')
                 data['color'].pop('update')
             if data['width'].has_key('update'):
             if data['width'].has_key('update'):
@@ -1145,15 +1150,15 @@ class GLWindow(MapWindow, glcanvas.GLCanvas):
         # height
         # height
         if data['height'].has_key('update'):
         if data['height'].has_key('update'):
             self.nvizClass.SetVectorLineHeight(id,
             self.nvizClass.SetVectorLineHeight(id,
-                                               data['height'])
+                                               data['height']['value'])
             data['height'].pop('update')
             data['height'].pop('update')
         
         
         # surface
         # surface
         if data['mode'].has_key('update'):
         if data['mode'].has_key('update'):
-            idx = self.layers['raster']['name'].index(data['mode']['surface'])
-            if idx > -1:
-                self.nvizClass.SetVectorLineSurface(id,
-                                                    self.layers['raster']['id'][idx])
+            sid = self.GetLayerId(type='raster', name=data['mode']['surface'])
+            if sid > -1:
+                self.nvizClass.SetVectorLineSurface(id, sid)
+            
             data['mode'].pop('update')
             data['mode'].pop('update')
         
         
     def UpdateVectorPointsProperties(self, id, data):
     def UpdateVectorPointsProperties(self, id, data):
@@ -1188,8 +1193,34 @@ class GLWindow(MapWindow, glcanvas.GLCanvas):
         
         
         # surface
         # surface
         if data['mode'].has_key('update'):
         if data['mode'].has_key('update'):
-            idx = self.layers['raster']['name'].index(data['mode']['surface'])
-            if idx > -1:
-                self.nvizClass.SetVectorPointSurface(id,
-                                                     self.layers['raster']['id'][idx])
+            sid = self.GetLayerId(type='raster', name=data['mode']['surface'])
+            if sid > -1:
+                self.nvizClass.SetVectorPointSurface(id, sid)
+            
             data['mode'].pop('update')
             data['mode'].pop('update')
+
+    def GetLayerNames(self, type):
+        """Return list of map layer names of given type"""
+        layerName = []
+        
+        for item in self.layers:
+            layerName.append(self.tree.GetPyData(item)[0]['maplayer'].GetName())
+        
+        return layerName
+    
+    def GetLayerId(self, type, name):
+        """Get layer object id or -1"""
+        for item in self.layers:
+            mapName = self.tree.GetPyData(item)[0]['maplayer'].GetName()
+            data = self.tree.GetPyData(item)[0]['nviz']
+            if type == 'raster':
+                return data['surface']['object']['id']
+            elif type == 'vpoint':
+                return data['vector']['points']['object']['id']
+            elif type == 'vline':
+                return data['vector']['lines']['object']['id']
+            elif type == '3d-raster':
+                return data['volume']['object']['id']
+
+        return -1
+            

+ 5 - 4
gui/wxpython/gui_modules/nviz_tools.py

@@ -2478,11 +2478,12 @@ class NvizToolWindow(wx.Frame):
                 else:
                 else:
                     display.SetSelection(0)
                     display.SetSelection(0)
 
 
-            if data[vtype]['mode']['type'] == 'surface' and \
-                    len(self.mapWindow.layers['raster']['name']) > 0:
+            if data[vtype]['mode']['type'] == 'surface':
+                rasters = self.mapWindow.GetLayerNames('raster')
                 surface = self.FindWindowById(self.win['vector'][vtype]['surface'])
                 surface = self.FindWindowById(self.win['vector'][vtype]['surface'])
-                surface.SetItems(self.mapWindow.layers['raster']['name'])
-                surface.SetStringSelection(data[vtype]['mode']['surface'])
+                surface.SetItems(rasters)
+                if len(rasters) > 0:
+                    surface.SetStringSelection(data[vtype]['mode']['surface'])
                 
                 
         for type in ('slider', 'spin'):
         for type in ('slider', 'spin'):
             win = self.FindWindowById(self.win['vector']['lines']['height'][type])
             win = self.FindWindowById(self.win['vector']['lines']['height'][type])

+ 0 - 18
gui/wxpython/nviz/init.cpp

@@ -112,24 +112,6 @@ void Nviz::InitView()
     return;
     return;
 }
 }
 
 
-/*!
-  \brief Reset session
-
-  Unload all data layers
-
-  @todo vector, volume
-*/
-void Nviz::Reset()
-{
-    int i;
-    int *surf_list, nsurfs;
-
-    surf_list = GS_get_surf_list(&nsurfs);
-    for (i = 0; i < nsurfs; i++) {
-	GS_delete_surface(surf_list[i]);
-    }
-}
-
 void swap_gl()
 void swap_gl()
 {
 {
     return;
     return;

+ 0 - 1
gui/wxpython/nviz/nviz.h

@@ -57,7 +57,6 @@ public:
     /* init.cpp */
     /* init.cpp */
     int SetDisplay(void *);
     int SetDisplay(void *);
     void InitView();
     void InitView();
-    void Reset();
     void SetBgColor(const char *);
     void SetBgColor(const char *);
 
 
     /* lights.cpp */
     /* lights.cpp */