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