Carlos kirjoitti:

I like to know how call a prim method from another prim in python. I like to write a python script to change the texture URL of a prim when I touch another prim. I’m using the touch event and the rexSetTextureMediaURL() method.


I'm not sure what' the best way, was actually hoping that perhaps Tuomo who wrote the rexscript system would reply. Perhaps Mikko knows too, he has been writing some rexscripts now that perhaps refer to other objects as well?

At least there seems to be this in the World object: def GetActorByLocalID(self,vLocalID) like shown in http://forge.opensimulator.org/gf/project/modrex/scmsvn/?action=browse&path=/trunk/ModularRex/ScriptEngines/PythonScript/RXCore/rxworld.py&view=markup <http://forge.opensimulator.org/gf/project/modrex/scmsvn/?action=browse&path=/trunk/ModularRex/ScriptEngines/PythonScript/RXCore/rxworld.py&view=markup> . Actor refers to another object which is using some rexscript class and is hence registered to the rexscript system.

The prob there is that localids are not good though 'cause they change when the server is restarted, you probably want to use the UUID or the name?

We (at Playsign) have now actually started writing apps that use the whole region, and not just a single object, as normal OpenSim region modules but using Python like in rexscript. So can reload them live, without restarting the server, like rexscripts, and get the other benefits of py vs c# too. In that case the Opensim Scene objects provides methods to get an object either by name or uuid, as shown in Scene::GetSceneObjectPart(string name) and friends in http://docs.opensimulator.org/classOpenSim_1_1Region_1_1Framework_1_1Scenes_1_1Scene.html#56950aacf328e0ac8567025ef897ec31 . RexScripts have always been similar to Opensim region modules anyway, in the sense they can do anything with the scene, access anything in Opensim etc.

We'll probably commit the Python region module loader soon to ModRex, perhaps submit it to Opensim core too 'cause it's not rex specific (but does use the same ironpy lib as modrex uses otherwise too).

Hopefully there's a simple way for the same in rexscript already for you, though.

If rexscript doesn't provide this, you can perhaps use normal python stuff to share references. E.g. make an own module (file, defines a namespace in py) which several rexscripts can use. E.g. scene.py in the same dir where you have the scripts. It can actually be even an empty file for this to work, but nicer is to initialize the variables/references there:

contents of file scene.py:
a = None

Then you can use that new module to share a reference to the object you wanna call:

script for object A:
import rxactor
import scene

class A(rxactor.Actor):
   def __init__(self, id):

       super(A, self).__init__(id)

       scene.a = self

   def do_stuff(self):
       print "here we go!"

script for object B:

import rxactor

import scene
class B(rxactor.Actor):
   def EventTouch(self, avatar):
       a = scene.a
       if a is not None:
           a.do_stuff()
       else:
           print "OOPS, ref to a was not there (yet?)"


normally you could call a.setMediaUrl() etc. directly from B, but recalling 
from reading the sources of the rexscript impl once it can be that the 
internals of it do some tricks where have a notion of a 'current object' for 
the execution, so the calls to the script engine funcs for A from B may not 
work right. Solutions would be either to send the event which triggers 
SetMediaURL somehow, or in A.do_stuff put the command in a queue, and have a 
periodically called update method there (with a rexscript Timer i guess) that 
does the setting.


The new solution to use normal region modules doesn't have that strangeness, is normal Python where objects can call other objects which further call the opensim or modrex internals normally etc. If it is problematic in current rexscript somehow, we should probably plan a refactor of the rexscript system to improve it, perhaps simplify to be closer to normal region modules .. especially if the upcoming opensim scene refactor results in a nice API (like it of course should!). Basics of Rexscript has been basically untouched for 1,5 - 2 years now.

Carlos Miguel Lorenzo


~Toni

--
http://groups.google.com/group/realxtend
http://www.realxtend.org

Reply via email to