Hi, if anyone can help with this I would be extremely grateful.
Currently I am trying to code a small 3D enviornment where I can control the 
central body from an external source.
I have been trying to write a COM server so that I can automate Soya3D (and it 
works).
The problem is that when I call mainloop my com client is locked up, I think I 
can poll mainloop.update but this seems messy and It could be quite messy.
I therefore want to run Soya3D in a seperate thread which is how I get the 
error below:

  File "D:\Python24\lib\threading.py", line 442, in __bootstrap
    self.run()
  File "D:\Python24\SoyaTutorial-0.13\tutorial\Cate.py", line 9, in run
    soya.MainLoop(self.scene).main_loop()
  File "main_loop.pyx", line 165, in _soya.MainLoop.main_loop
  File "main_loop.pyx", line 254, in _soya.MainLoop.render
  File "renderer.pyx", line 419, in _soya.render
  File "renderer.pyx", line 395, in _soya.check_gl_error
GLError: GL_INVALID_OPERATION

My main program is adapted from the basic-5.py tuturial and consists of 2 files 
which I have put in 'D:\\Python24\\SoyaTutorial-0.13\\tutorial\\

[FILE #1] starlight.py

from win32com.server.exception import Exception
from pywintypes import UnicodeType
import winerror
import string
import sys
import types
import os
import traceback
import regsub
import StringIO
import sys, os, os.path, soya, soya.sdlconst
import Cate
import threading  
# Creates a caterpillar head and 10 caterpillar piece of body.
# Expose the Python interpreter.
class Star:
   """The interpreter object exposed via COM """
   _public_methods_ = ['MainLoop','MainThread'] # Extend here your methods
   _public_attrs_ = ['scene']
   # All registration stuff to support fully automatic register/unregister
   _reg_verprogid_ = "starlight.Star.2"
   _reg_progid_ = "starlight.Star"
   _reg_desc_ = "starlight.Star"
   _reg_clsid_ = "{389CEEE6-E7D4-4583-9AEA-C7865AC6B2EE}"
   _reg_class_spec_ = "starlight.Star"
   def __init__(self):
       self.dict = {}
       import __main__
       self.dict = __main__.__dict__
       soya.init()
       soya.path.append(os.path.join(os.path.dirname(sys.argv[0]), "data"))
       
soya.path.append(os.path.join('D:\\Python24\\SoyaTutorial-0.13\\tutorial\\', 
"data"))
       self.scene = soya.World()
       caterpillar_head = Cate.CaterpillarHead(self.scene)
       caterpillar_head.rotate_y(90.0)
       previous_caterpillar_piece = caterpillar_head
       for i in range(10):
           previous_caterpillar_piece = Cate.CaterpillarPiece(self.scene, 
previous_caterpillar_piece)
           previous_caterpillar_piece.x = i + 1
       light = soya.Light(self.scene)
       light.set_xyz(2.0, 5.0, 0.0)
       camera = soya.Camera(self.scene)
       camera.set_xyz(0.0, 15.0, 15.0)
       camera.look_at(caterpillar_head)
       soya.set_root_widget(camera)       
   def MainLoop(self):
       print "callthread"
       #soya.MainLoop(self.scene).main_loop()
       f=threading.Thread(target=MainThread,args=(9,))
       f.start()
       print "called"
   def MainThread(self, num):
       print "mainthread"
       print num
       #soya.MainLoop(self.scene).main_loop() OBSELETE CODE
       #Cate.SimpleThread(self.scene)
       print "mainthreadover"
def Register():
   import win32com.server.register
   return win32com.server.register.UseCommandLine(Star)
 
if __name__=='__main__':
   print "Registering COM server..."
   Register()



[File #2] Cate.py

import sys, os, os.path, soya, soya.sdlconst, threading
class SimpleThread(threading.Thread):
 def __init__(self,sc):
  self.scene = sc
  threading.Thread.__init__(self)
 
 def run(self):
  soya.MainLoop(self.scene).main_loop()
  print "a"
class CaterpillarHead(soya.Body):
 def __init__(self, parent):
  soya.path.append(os.path.join('D:\\Python24\\SoyaTutorial-0.13\\tutorial\\', 
"data"))
  soya.Body.__init__(self, parent, soya.Model.get("caterpillar_head"))
  self.speed                  = soya.Vector(self, 0.0, 0.0, 0.0)
  self.rotation_y_speed = 0.0
   
 def begin_round(self):
  soya.Body.begin_round(self)
  
  # Loops over all Soya / SDL events.
  # Each event is a tuple ; the first value indicates the event type and the 
other
  # values depend on the type. The following event types exist :
  #  - (KEYDOWN, keysym, modifier) where keysym is the key's code (a K_* 
constant)
  #    and modifier is a flag combining some of the MOD_* constant (to test the 
presence
  #    of a modifier, do e.g. for left shift: modifier & 
soya.sdlconst.MOD_LSHIFT).
  #  - (KEYUP, keysym, modifier)
  #  - (MOUSEMOTION, x, y, xrel, yrel) where x and y are the mouse coordinates 
(in
  #    pixel) ; xrel and yrel are the relative mouse coordinates (the 
difference since
  #    next mouse motion event).
  #  - (MOUSEBUTTONDOWN, button, x, y) where button is the mouse button number 
and
  #    x and y are the mouse coordinates. Mouse buttons are :
  #    - 1 : left
  #    - 2 : middle
  #    - 3 : right
  #    - 4 : roll up
  #    - 5 : roll down
  #  - (MOUSEBUTTONUP, button, x, y)
  #  - (JOYAXISMOTION, axis, value) XXX
  #  - (JOYBUTTONDOWN, button) XXX
  #  - (VIDEORESIZE, new_width, new_height)
  
  for event in soya.process_event():
   
   # Checks for key down (press) events.
   
   if event[0] == soya.sdlconst.KEYDOWN:
    
    # The up and down arrows set the caterpillar speed to a negative or 
positive value.
    
    if   event[1] == soya.sdlconst.K_UP:     self.speed.z = -0.2
    elif event[1] == soya.sdlconst.K_DOWN:   self.speed.z =  0.1
    
    # The left and right arrow modify the rotation speed.
    
    elif event[1] == soya.sdlconst.K_LEFT:   self.rotation_y_speed =  10.0
    elif event[1] == soya.sdlconst.K_RIGHT:  self.rotation_y_speed = -10.0
    
    # Pressing the escape or 'q' key will exit the main_loop mainloop, and thus 
terminate
    # the program. soya.MAIN_LOOP.stop() is the right way to end your 
application, and
    # causes the MainLoop.main_loop() method to return.
    
    elif event[1] == soya.sdlconst.K_q:      soya.MAIN_LOOP.stop()
    elif event[1] == soya.sdlconst.K_ESCAPE: soya.MAIN_LOOP.stop()
    
   # Checks for key up (release) events.
   
   elif event[0] == soya.sdlconst.KEYUP:
    
    # When up or down arrows are released, the speed is set to zero.
    
    if   event[1] == soya.sdlconst.K_UP:     self.speed.z = 0.0
    elif event[1] == soya.sdlconst.K_DOWN:   self.speed.z = 0.0
    
    # When left or right arrows are released, the rotation speed is set to zero.
    
    elif event[1] == soya.sdlconst.K_LEFT:   self.rotation_y_speed = 0.0
    elif event[1] == soya.sdlconst.K_RIGHT:  self.rotation_y_speed = 0.0
   elif event[0] == soya.sdlconst.QUIT:
    soya.MAIN_LOOP.stop()
    
  # Do the rotation.
  
  self.rotate_y(self.rotation_y_speed)
  
 def advance_time(self, proportion):
  soya.Body.advance_time(self, proportion)
  self.add_mul_vector(proportion, self.speed)

# CaterpillarPiece hasn't changed since the previous tutorial.
class CaterpillarPiece(soya.Body):
 def __init__(self, parent, previous):
  soya.path.append(os.path.join('D:\\Python24\\SoyaTutorial-0.13\\tutorial\\', 
"data"))
  soya.Body.__init__(self, parent, soya.Model.get("caterpillar"))
  self.previous = previous
  self.speed = soya.Vector(self, 0.0, 0.0, -0.2)
  
  
 def begin_round(self):
  soya.Body.begin_round(self)
  self.look_at(self.previous)
  if self.distance_to(self.previous) < 1.5: self.speed.z =  0.0
  else:                                     self.speed.z = -0.2
  
 def advance_time(self, proportion):
  soya.Body.advance_time(self, proportion)
  self.add_mul_vector(proportion, self.speed)


      ___________________________________________________________
Yahoo! Answers - Got a question? Someone out there knows the answer. Try it
now.
http://uk.answers.yahoo.com/ 
"""dspaceinterpreter.Interpreter COM Server
  This module implements a very very simple COM server which
  exposes the Python interpreter.

  This is designed more as a demonstration than a full blown COM server.
  General functionality and Error handling are both limited.

  To use this object, ensure it is registered by running this module
  from Python.exe.  Then, from Matlab use "Application = 
actxserver('dspaceinterpreter.Interpreter');",
  and call its methods!
  
"Application.ReadVariable('D:\dspace\Demos\ControlDesk\SampleExperiments\Throttle\Ds1005\throttlecontroldemo.sdf',
 'ds1005', 'PPC', 'Model Root/PID/P/Gain');"
  
"""
from win32com.server.exception import Exception
from pywintypes import UnicodeType
import winerror
import string
import sys
import types
import os
import traceback
import regsub
import StringIO
import sys, os, os.path, soya, soya.sdlconst
import Cate
import threading                

# Creates a caterpillar head and 10 caterpillar piece of body.

# Expose the Python interpreter.
class Star:
   """The interpreter object exposed via COM """
   _public_methods_ = ['MainLoop','MainThread'] # Extend here your methods
   _public_attrs_ = ['scene']
   # All registration stuff to support fully automatic register/unregister
   _reg_verprogid_ = "starlight.Star.2"
   _reg_progid_ = "starlight.Star"
   _reg_desc_ = "starlight.Star"
   _reg_clsid_ = "{389CEEE6-E7D4-4583-9AEA-C7865AC6B2EE}"
   _reg_class_spec_ = "starlight.Star"

   def __init__(self):
       self.dict = {}
       import __main__
       self.dict = __main__.__dict__
       soya.init()
       soya.path.append(os.path.join(os.path.dirname(sys.argv[0]), "data"))
       
soya.path.append(os.path.join('D:\\Python24\\SoyaTutorial-0.13\\tutorial\\', 
"data"))
       self.scene = soya.World()
       caterpillar_head = Cate.CaterpillarHead(self.scene)
       caterpillar_head.rotate_y(90.0)
       previous_caterpillar_piece = caterpillar_head
       for i in range(10):
           previous_caterpillar_piece = Cate.CaterpillarPiece(self.scene, 
previous_caterpillar_piece)
           previous_caterpillar_piece.x = i + 1
       light = soya.Light(self.scene)
       light.set_xyz(2.0, 5.0, 0.0)
       camera = soya.Camera(self.scene)
       camera.set_xyz(0.0, 15.0, 15.0)
       camera.look_at(caterpillar_head)
       soya.set_root_widget(camera)       

   def MainLoop(self):
       print "callthread"
       #soya.MainLoop(self.scene).main_loop()
       f=threading.Thread(target=MainThread,args=(9,))
       f.start()
       print "called"

   def MainThread(self, num):
       print "mainthread"
       print num
       #soya.MainLoop(self.scene).main_loop()
       #Cate.SimpleThread(self.scene)
       print "mainthreadover"

def Register():
   import win32com.server.register
   return win32com.server.register.UseCommandLine(Star)
 
if __name__=='__main__':
   print "Registering COM server..."
   Register()

import sys, os, os.path, soya, soya.sdlconst, threading

class SimpleThread(threading.Thread):
        def __init__(self,sc):
                self.scene = sc
                threading.Thread.__init__(self)
        
        def run(self):
                soya.MainLoop(self.scene).main_loop()
                print "a"

class CaterpillarHead(soya.Body):
        def __init__(self, parent):
                
soya.path.append(os.path.join('D:\\Python24\\SoyaTutorial-0.13\\tutorial\\', 
"data"))
                soya.Body.__init__(self, parent, 
soya.Model.get("caterpillar_head"))
                self.speed                  = soya.Vector(self, 0.0, 0.0, 0.0)
                self.rotation_y_speed = 0.0
                        
        def begin_round(self):
                soya.Body.begin_round(self)
                
                # Loops over all Soya / SDL events.
                # Each event is a tuple ; the first value indicates the event 
type and the other
                # values depend on the type. The following event types exist :
                #  - (KEYDOWN, keysym, modifier) where keysym is the key's code 
(a K_* constant)
                #    and modifier is a flag combining some of the MOD_* 
constant (to test the presence
                #    of a modifier, do e.g. for left shift: modifier & 
soya.sdlconst.MOD_LSHIFT).
                #  - (KEYUP, keysym, modifier)
                #  - (MOUSEMOTION, x, y, xrel, yrel) where x and y are the 
mouse coordinates (in
                #    pixel) ; xrel and yrel are the relative mouse coordinates 
(the difference since
                #    next mouse motion event).
                #  - (MOUSEBUTTONDOWN, button, x, y) where button is the mouse 
button number and
                #    x and y are the mouse coordinates. Mouse buttons are :
                #    - 1 : left
                #    - 2 : middle
                #    - 3 : right
                #    - 4 : roll up
                #    - 5 : roll down
                #  - (MOUSEBUTTONUP, button, x, y)
                #  - (JOYAXISMOTION, axis, value) XXX
                #  - (JOYBUTTONDOWN, button) XXX
                #  - (VIDEORESIZE, new_width, new_height)
                
                for event in soya.process_event():
                        
                        # Checks for key down (press) events.
                        
                        if event[0] == soya.sdlconst.KEYDOWN:
                                
                                # The up and down arrows set the caterpillar 
speed to a negative or positive value.
                                
                                if   event[1] == soya.sdlconst.K_UP:     
self.speed.z = -0.2
                                elif event[1] == soya.sdlconst.K_DOWN:   
self.speed.z =  0.1
                                
                                # The left and right arrow modify the rotation 
speed.
                                
                                elif event[1] == soya.sdlconst.K_LEFT:   
self.rotation_y_speed =  10.0
                                elif event[1] == soya.sdlconst.K_RIGHT:  
self.rotation_y_speed = -10.0
                                
                                # Pressing the escape or 'q' key will exit the 
main_loop mainloop, and thus terminate
                                # the program. soya.MAIN_LOOP.stop() is the 
right way to end your application, and
                                # causes the MainLoop.main_loop() method to 
return.
                                
                                elif event[1] == soya.sdlconst.K_q:      
soya.MAIN_LOOP.stop()
                                elif event[1] == soya.sdlconst.K_ESCAPE: 
soya.MAIN_LOOP.stop()
                                
                        # Checks for key up (release) events.
                        
                        elif event[0] == soya.sdlconst.KEYUP:
                                
                                # When up or down arrows are released, the 
speed is set to zero.
                                
                                if   event[1] == soya.sdlconst.K_UP:     
self.speed.z = 0.0
                                elif event[1] == soya.sdlconst.K_DOWN:   
self.speed.z = 0.0
                                
                                # When left or right arrows are released, the 
rotation speed is set to zero.
                                
                                elif event[1] == soya.sdlconst.K_LEFT:   
self.rotation_y_speed = 0.0
                                elif event[1] == soya.sdlconst.K_RIGHT:  
self.rotation_y_speed = 0.0

                        elif event[0] == soya.sdlconst.QUIT:
                                soya.MAIN_LOOP.stop()
                                
                # Do the rotation.
                
                self.rotate_y(self.rotation_y_speed)
                
        def advance_time(self, proportion):
                soya.Body.advance_time(self, proportion)
                self.add_mul_vector(proportion, self.speed)


# CaterpillarPiece hasn't changed since the previous tutorial.

class CaterpillarPiece(soya.Body):
        def __init__(self, parent, previous):
                
soya.path.append(os.path.join('D:\\Python24\\SoyaTutorial-0.13\\tutorial\\', 
"data"))
                soya.Body.__init__(self, parent, soya.Model.get("caterpillar"))
                self.previous = previous
                self.speed = soya.Vector(self, 0.0, 0.0, -0.2)
                
                
        def begin_round(self):
                soya.Body.begin_round(self)
                self.look_at(self.previous)
                if self.distance_to(self.previous) < 1.5: self.speed.z =  0.0
                else:                                     self.speed.z = -0.2
                
        def advance_time(self, proportion):
                soya.Body.advance_time(self, proportion)
                self.add_mul_vector(proportion, self.speed)
_______________________________________________
Soya-user mailing list
Soya-user@gna.org
https://mail.gna.org/listinfo/soya-user

Reply via email to