فهرست منبع

Bug fix for wxnviz. It now starts and quits and restarts without errors. It also does not have to reload maps previously loaded. Panel switching works without duplicate pages and overlayed panels.

git-svn-id: https://svn.osgeo.org/grass/grass/trunk@36523 15284696-431f-4ddb-bdfa-cd5b030d7da7
Michael Barton 16 سال پیش
والد
کامیت
17b5c9dc35
3فایلهای تغییر یافته به همراه93 افزوده شده و 72 حذف شده
  1. 3 1
      gui/wxpython/gui_modules/mapdisp.py
  2. 73 27
      gui/wxpython/gui_modules/nviz_mapdisp.py
  3. 17 44
      gui/wxpython/gui_modules/nviz_tools.py

+ 3 - 1
gui/wxpython/gui_modules/mapdisp.py

@@ -387,6 +387,7 @@ class MapFrame(wx.Frame):
                                                        mapWindow=self.MapWindow3D)
                                                        mapWindow=self.MapWindow3D)
                 self.MapWindow3D.OnPaint(None) # -> LoadData
                 self.MapWindow3D.OnPaint(None) # -> LoadData
                 self.MapWindow3D.Show()
                 self.MapWindow3D.Show()
+                self.MapWindow3D.UpdateView(None)
             
             
             self.nvizToolWin.Show()
             self.nvizToolWin.Show()
 
 
@@ -438,7 +439,7 @@ class MapFrame(wx.Frame):
             # hide nviz tools
             # hide nviz tools
             self.nvizToolWin.Hide()
             self.nvizToolWin.Hide()
             # unload data
             # unload data
-            self.MapWindow3D.Reset()
+#            self.MapWindow3D.Reset()
             # switch from MapWindowGL to MapWindow
             # switch from MapWindowGL to MapWindow
             self._mgr.DetachPane(self.MapWindow3D)
             self._mgr.DetachPane(self.MapWindow3D)
             self.MapWindow3D.Hide()
             self.MapWindow3D.Hide()
@@ -454,6 +455,7 @@ class MapFrame(wx.Frame):
             #
             #
             if self.tree:
             if self.tree:
                 self.tree.EnableItemType(type='3d-raster', enable=False)
                 self.tree.EnableItemType(type='3d-raster', enable=False)
+            self.MapWindow.UpdateMap()
             
             
         self.toolbars['map'].combo.SetValue (_("2D view"))
         self.toolbars['map'].combo.SetValue (_("2D view"))
         self.toolbars['map'].Enable2D(True)
         self.toolbars['map'].Enable2D(True)

+ 73 - 27
gui/wxpython/gui_modules/nviz_mapdisp.py

@@ -128,13 +128,19 @@ class GLWindow(MapWindow, glcanvas.GLCanvas):
         self.Bind(EVT_UPDATE_PROP, self.UpdateMapObjProperties)
         self.Bind(EVT_UPDATE_PROP, self.UpdateMapObjProperties)
         self.Bind(EVT_UPDATE_VIEW, self.UpdateView)
         self.Bind(EVT_UPDATE_VIEW, self.UpdateView)
         
         
+        self.Bind(wx.EVT_CLOSE, self.OnClose)
+        
+    def OnClose(self, event):
+        # cleanup when window actually closes (on quit) and not just is hidden
+        self.Reset()
+
     def OnEraseBackground(self, event):
     def OnEraseBackground(self, event):
         pass # do nothing, to avoid flashing on MSW
         pass # do nothing, to avoid flashing on MSW
 
 
     def OnSize(self, event):
     def OnSize(self, event):
         self.size = self.parent.GetClientSize()
         self.size = self.parent.GetClientSize()
         if self.GetContext():
         if self.GetContext():
-            Debug.msg(3, "GLCanvas.OnPaint(): w=%d, h=%d" % \
+            Debug.msg(3, "GLCanvas.OnSize(): w=%d, h=%d" % \
                       (self.size.width, self.size.height))
                       (self.size.width, self.size.height))
             self.SetCurrent()
             self.SetCurrent()
             self.nvizClass.ResizeWindow(self.size.width,
             self.nvizClass.ResizeWindow(self.size.width,
@@ -152,9 +158,10 @@ class GLWindow(MapWindow, glcanvas.GLCanvas):
             self.nvizClass.InitView()
             self.nvizClass.InitView()
             self.initView = True
             self.initView = True
 
 
+        self.LoadDataLayers()
+        self.UnloadDataLayers()
+        
         if not self.init:
         if not self.init:
-            self.LoadDataLayers()
-
             self.ResetView()
             self.ResetView()
             
             
             if hasattr(self.parent, "nvizToolWin"):
             if hasattr(self.parent, "nvizToolWin"):
@@ -174,7 +181,7 @@ class GLWindow(MapWindow, glcanvas.GLCanvas):
                 win.SetItems(self.GetLayerNames('raster'))
                 win.SetItems(self.GetLayerNames('raster'))
 
 
             self.init = True
             self.init = True
-            
+                        
         self.UpdateMap()
         self.UpdateMap()
 
 
     def OnMouseAction(self, event):
     def OnMouseAction(self, event):
@@ -231,10 +238,10 @@ class GLWindow(MapWindow, glcanvas.GLCanvas):
                                self.view['persp']['value'],
                                self.view['persp']['value'],
                                self.view['twist']['value'])
                                self.view['twist']['value'])
 
 
-        if event.zExag:
+        if event and event.zExag:
             self.nvizClass.SetZExag(self.view['z-exag']['value'])
             self.nvizClass.SetZExag(self.view['z-exag']['value'])
         
         
-        event.Skip()
+        if event: event.Skip()
         
         
     def UpdateMap(self, render=True):
     def UpdateMap(self, render=True):
         """
         """
@@ -343,38 +350,77 @@ class GLWindow(MapWindow, glcanvas.GLCanvas):
         listOfItems = []
         listOfItems = []
         item = self.tree.GetFirstChild(self.tree.root)[0]
         item = self.tree.GetFirstChild(self.tree.root)[0]
         self._GetDataLayers(item, listOfItems)
         self._GetDataLayers(item, listOfItems)
-
+        
         start = time.time()
         start = time.time()
 
 
         while(len(listOfItems) > 0):
         while(len(listOfItems) > 0):
             item = listOfItems.pop()
             item = listOfItems.pop()
             type = self.tree.GetPyData(item)[0]['type']
             type = self.tree.GetPyData(item)[0]['type']
-            
-            try:
-                if type == 'raster':
-                    self.LoadRaster(item)
-                elif type == '3d-raster':
-                    self.LoadRaster3d(item)
-            except gcmd.NvizError, e:
-                print >> sys.stderr, "Nviz:" + e.message
-
-            try:
-                if type == 'vector':
-                    data = self.tree.GetPyData(item)[0]['nviz']
-                    vecType = []
-                    if data and data.has_key('vector'):
-                        for v in ('lines', 'points'):
-                            if data['vector'][v]:
-                                vecType.append(v)
-                    self.LoadVector(item, vecType)
-            except gcmd.NvizError, e:
-                print >> sys.stderr, "Nviz:" + e.message
+            if item not in self.layers:
+                try:
+                    if type == 'raster':
+                        self.LoadRaster(item)
+                    elif type == '3d-raster':
+                        self.LoadRaster3d(item)
+                except gcmd.NvizError, e:
+                    print >> sys.stderr, "Nviz:" + e.message
+
+                try:
+                    if type == 'vector':
+                        data = self.tree.GetPyData(item)[0]['nviz']
+                        vecType = []
+                        if data and data.has_key('vector'):
+                            for v in ('lines', 'points'):
+                                if data['vector'][v]:
+                                    vecType.append(v)
+                        self.LoadVector(item, vecType)
+                except gcmd.NvizError, e:
+                    print >> sys.stderr, "Nviz:" + e.message
+                self.init = False
             
             
         stop = time.time()
         stop = time.time()
         
         
         Debug.msg(3, "GLWindow.LoadDataLayers(): time=%f" % (stop-start))
         Debug.msg(3, "GLWindow.LoadDataLayers(): time=%f" % (stop-start))
 
 
         # print stop - start
         # print stop - start
+        
+    def UnloadDataLayers(self):
+        """Unload any layers that have been deleted from layer tree"""
+        if not self.tree:
+            return
+        
+        listOfItems = []
+        item = self.tree.GetFirstChild(self.tree.root)[0]
+        self._GetDataLayers(item, listOfItems)
+        
+        start = time.time()
+        
+        for layer in self.layers:
+            if layer not in listOfItems:
+                ltype = self.tree.GetPyData(layer)[0]['type']
+                try:
+                    if ltype == 'raster':
+                        self.UnloadRaster(layer)
+                    elif ltype == '3d-raster':
+                        self.UnloadRaster3d(layer) 
+                    elif ltype == 'vector':
+                        data = self.tree.GetPyData(layer)[0]['nviz']
+                        vecType = []
+                        if data and data.has_key('vector'):
+                            for v in ('lines', 'points'):
+                                if data['vector'][v]:
+                                    vecType.append(v)
+                        self.UnloadVector(layer, vecType)
+                    
+                    self.UpdateView(None)
+                except gcmd.NvizError, e:
+                    print >> sys.stderr, "Nviz:" + e.message
+
+                self.parent.nvizToolWin.UpdateSettings()        
+                            
+        stop = time.time()
+        
+        Debug.msg(3, "GLWindow.UnloadDataLayers(): time=%f" % (stop-start))        
 
 
     def SetMapObjProperties(self, item, id, nvizType):
     def SetMapObjProperties(self, item, id, nvizType):
         """Set map object properties
         """Set map object properties

+ 17 - 44
gui/wxpython/gui_modules/nviz_tools.py

@@ -39,7 +39,8 @@ class NvizToolWindow(wx.Frame):
     """
     """
     def __init__(self, parent=None, id=wx.ID_ANY, title=_("Nviz tools"),
     def __init__(self, parent=None, id=wx.ID_ANY, title=_("Nviz tools"),
                  pos=wx.DefaultPosition, size=wx.DefaultSize,
                  pos=wx.DefaultPosition, size=wx.DefaultSize,
-                 style=wx.DEFAULT_FRAME_STYLE, mapWindow=None):
+                 mapWindow=None, 
+                 style=wx.CAPTION|wx.MINIMIZE_BOX|wx.RESIZE_BORDER):
         
         
         self.parent = parent # MapFrame
         self.parent = parent # MapFrame
         self.lmgr = self.parent.GetLayerManager() # GMFrame
         self.lmgr = self.parent.GetLayerManager() # GMFrame
@@ -2304,60 +2305,32 @@ class NvizToolWindow(wx.Frame):
                                                                                   max)
                                                                                   max)
                 self.FindWindowById(self.win['view']['height'][control]).SetRange(hmin,
                 self.FindWindowById(self.win['view']['height'][control]).SetRange(hmin,
                                                                                   hmax)
                                                                                   hmax)
-        elif pageId == 'surface':
-            if self.notebook.GetSelection() != self.page['surface']['id']:
-                for page in ('vector', 'volume'):
+        elif pageId in ('surface', 'vector', 'volume'):
+            if self.notebook.GetSelection() != self.page[pageId]['id']:
+                for page in ('surface', 'vector', 'volume'):
                     if self.page[page]['id'] > -1:
                     if self.page[page]['id'] > -1:
                         self.notebook.RemovePage(self.page[page]['id'])
                         self.notebook.RemovePage(self.page[page]['id'])
                         self.page[page]['id'] = -1
                         self.page[page]['id'] = -1
+                        oldpanel = wx.FindWindowById(self.page[page]['panel'])
+                        oldpanel.Hide()
 
 
-                self.page['surface']['id'] = 1
+                self.page[pageId]['id'] = 1
                 self.page['settings']['id'] = 2
                 self.page['settings']['id'] = 2
 
 
-                panel = wx.FindWindowById(self.page['surface']['panel'])
-                self.notebook.InsertPage(n=self.page['surface']['id'],
+                panel = wx.FindWindowById(self.page[pageId]['panel'])
+                self.notebook.InsertPage(n=self.page[pageId]['id'],
                                          page=panel,
                                          page=panel,
                                          text=" %s " % _("Layer properties"),
                                          text=" %s " % _("Layer properties"),
                                          select=True)
                                          select=True)
-            
-            self.UpdateSurfacePage(layer, data['surface'])
+            if pageId == 'surface':
+                self.UpdateSurfacePage(layer, data['surface'])
+            elif pageId == 'vector':
+                self.UpdateVectorPage(layer, data['vector'])
+            elif pageId == 'volume':
+                self.UpdateVectorPage(layer, data['vector'])
         
         
-        elif pageId == 'vector':
-            if self.notebook.GetSelection() != self.page['vector']['id']:
-                for page in ('surface', 'volume'):
-                    if self.page[page]['id'] > -1:
-                        self.notebook.RemovePage(self.page[page]['id'])
-                        self.page[page]['id'] = -1
-                    
-                self.page['vector']['id'] = 1
-                self.page['settings']['id'] = 2
-                
-                panel = wx.FindWindowById(self.page['vector']['panel'])
-                self.notebook.InsertPage(n=self.page['vector']['id'],
-                                         page=panel,
-                                         text=" %s " % _("Layer properties"),
-                                         select=True)
-            
-            self.UpdateVectorPage(layer, data['vector'])
-            
-        elif pageId == 'volume':
-            if self.notebook.GetSelection() != self.page['volume']['id']:
-                for page in ('surface', 'vector'):
-                    if self.page[page]['id'] > -1:
-                        self.notebook.RemovePage(self.page[page]['id'])
-                        self.page[page]['id'] = -1
-                    
-                self.page['volume']['id'] = 1
-                self.page['settings']['id'] = 2
-
-                panel = wx.FindWindowById(self.page['volume']['panel'])
-                self.notebook.InsertPage(n=self.page['volume']['id'],
-                                         page=panel,
-                                         text=" %s " % _("Layer properties"),
-                                         select=True)
-                
-            self.UpdateVolumePage(layer, data['volume'])
             
             
+        self.notebook.Update()
         self.pageChanging = False
         self.pageChanging = False
         
         
     def UpdateSurfacePage(self, layer, data):
     def UpdateSurfacePage(self, layer, data):