Thank you. After some experimentation, I discovered I was looking at a combination of minor coding errors and an IDLE interaction--if I start the script outside of IDLE, it now works. If you are at all interested, I've attached my experimental scripts. Beginner question: what are you using as a debugging enviroment?

Randolph

Hartmut Seichter wrote:
Its hard to guess as you don't provide the whole example - all self.Refresh are commented out and its not clear if you use the wxApp OnIdle message pump for updates. The other example (osgviewerWX.py) in the repository might give you some pointers.

# -*- coding: us-ascii -*-
# generated by wxGlade 0.6.3 on Sun Nov 16 18:44:07 2008

import wx
import OSGLumView

# begin wxGlade: dependencies
# end wxGlade

# begin wxGlade: extracode

# end wxGlade

class LumViewer(wx.Panel):
    def __init__(self, *args, **kwds):
        # begin wxGlade: LumViewer.__init__
        kwds["style"] = wx.TAB_TRAVERSAL
        wx.Panel.__init__(self, *args, **kwds)
        self.viewer = OSGLumView.OSGLumView(self, -1)

        self.__set_properties()
        self.__do_layout()
        # end wxGlade
        self.Parent.storeCanvas(self.viewer)

    def __set_properties(self):
        # begin wxGlade: LumViewer.__set_properties
        pass
        # end wxGlade

    def __do_layout(self):
        # begin wxGlade: LumViewer.__do_layout
        sizer_2 = wx.BoxSizer(wx.VERTICAL)
        sizer_2.Add(self.viewer, 1, wx.EXPAND, 0)
        self.SetSizer(sizer_2)
        sizer_2.Fit(self)
        # end wxGlade
    
    def AddGeom(self,geom):
        self.viewer.AddGeom(geom)

# end of class LumViewer

import osgDB
class testFrame(wx.Frame):
    def __init__(self, parent):
        wx.Frame.__init__(self, parent, title = "OSG Test Frame")

        self.canvas = None
        self.Bind(wx.EVT_IDLE, self.onIdle)

        self.lum_menubar = wx.MenuBar()
        wxglade_tmp_menu = wx.Menu()
        wxglade_tmp_menu.Append(wx.ID_OPEN, "Open...", "Ctrl+O", wx.ITEM_NORMAL)
        wxglade_tmp_menu.Append(wx.ID_EXIT, "Exit", "", wx.ITEM_NORMAL)
        self.lum_menubar.Append(wxglade_tmp_menu, "File")
        self.SetMenuBar(self.lum_menubar)

        self.Bind(wx.EVT_MENU, self.onFileOpen, id=wx.ID_OPEN)
        self.Bind(wx.EVT_MENU, self.onFileExit, id=wx.ID_EXIT)        

        self.lumviewer = LumViewer(self)

    def onFileExit(self, event): # wxGlade: LumEdit.<event_handler>
        self.Close()

    def onFileOpen(self, event): # wxGlade: LumEdit.<event_handler>
        dlg = wx.FileDialog(
            self, style = wx.FD_OPEN,
            message = "Model File")
        if dlg.ShowModal() == wx.ID_OK:
            try:
                fn = dlg.GetPath().encode('ascii', 'replace')
                geom = osgDB.readNodeFile(fn)
                self.lumviewer.AddGeom(geom)
            except ValueError:
              pass                      # Handle the can't read error here
        dlg.Destroy()
        
    def onIdle(self,event):
        if self.canvas:
            self.canvas.Refresh(eraseBackground = False)
            
    def storeCanvas(self,c):
        self.canvas = c
            
if __name__ == '__main__':
    app = wx.PySimpleApp()
    frame = testFrame(None)
    frame.Show(True)
    app.MainLoop()
#!/usr/bin/env python

# import wxWidgets stuff
import wx
import wx.glcanvas

# import OpenSceneGraph wrapper
import osg
import osgUtil
import osgDB

class OSGLumView(wx.glcanvas.GLCanvas):
    def __init__(self,parent,id):
        wx.glcanvas.GLCanvas.__init__(self,parent,id)
        sv = self.sceneview = osgUtil.SceneView()
        self.rootnode = osg.MatrixTransformRef(osg.MatrixTransform())
        sv.setSceneData(self.rootnode.get())

        x,y = self.GetClientSize()

        self.oldX = 0
        self.oldY = 0

        sv.setDefaults()

        self.Bind(wx.EVT_SIZE, self.OnSize)
        self.Bind(wx.EVT_PAINT, self.OnPaint)
        self.Bind(wx.EVT_ERASE_BACKGROUND, self.OnEraseBackground)
        self.Bind(wx.EVT_ENTER_WINDOW, self.OnEnterWindow)
        self.Bind(wx.EVT_MOUSE_EVENTS, self.OnMouse)

        sv.init()


    def AddGeom(self, geom):
        self.rootnode.addChild(geom)
        # Calculate bounds & set the view matrix
        self.Refresh(eraseBackground = False)


    def OnMouse(self, evt):
        if ((evt.Dragging() == True) and (evt.LeftIsDown() == True)):
            x = evt.GetX() - self.oldY
            y = evt.GetY() - self.oldY

            self.sceneview.setViewMatrixAsLookAt(
                osg.Vec3f(0,y,x), osg.Vec3f(0,0,0), osg.Vec3f(0,1,0))

            self.Refresh(eraseBackground = False)    

            self.oldX = evt.GetX()
            self.oldY = evt.GetY()


        if ((evt.Dragging() == True) and (evt.RightIsDown() == True)) :
            m = self.rootnode.getMatrix()

            x,y = self.GetClientSize()

            rot = osg.Matrixd()

            rot.makeRotate(self.oldX - evt.GetX(), osg.Vec3f(1,0,0))
            
            m.postMult(rot)

            self.Refresh(False)

            self.oldX = evt.GetX()
            self.oldY = evt.GetY()
                    
    def Clear(self):
        self.rootnode.removeChild(0,self.rootnode.getNumChildren())
        self.Refresh(eraseBackground = False)


    def OnEnterWindow(self, evt):
        self.SetFocus()

    def OnEraseBackground(self, evt):
        pass

    def OnSize(self, evt):
        x,y = self.GetClientSize()
        self.SetCurrent()
        self.sceneview.setViewport(0,0,x,y)             
        evt.Skip()


    def OnPaint(self, evt):

        if (0 == self.GetContext()) :
                return

        dc = wx.PaintDC(self)
        self.SetCurrent()
        self.sceneview.update()
        self.sceneview.cull()
        self.sceneview.draw()
        self.SwapBuffers()


_______________________________________________
osg-users mailing list
[email protected]
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org

Reply via email to