View Single Post
  #2  
Old 04-23-2009, 03:16 PM
farshizzo farshizzo is offline
WorldViz Team Member
 
Join Date: Mar 2003
Posts: 2,849
You cannot extract the underlying osg::Node object from the PyObject. You have to use a modifier plugin to get access to the osg::Node object. However, there is nothing stopping you from combining a modifier plugin and a python plugin into a single DLL. Here is the C++ code for a plugin that works both as a Python plugin and a modifier plugin:
Code:
#include "modifier.h"
#include "Python.h"

// DO NOT MODIFY THESE DECLARATIONS----------------
extern "C" __declspec(dllexport) void InitModifier(void *);
extern "C" __declspec(dllexport) void PerformModifier(void *);
extern "C" __declspec(dllexport) void TextureModifier(void *);
extern "C" __declspec(dllexport) void SceneModifier(void *);
extern "C" __declspec(dllexport) void CommandModifier(void *);
extern "C" __declspec(dllexport) void CloseModifier(void *);

void InitModifier(void *modifier)
{
	strcpy(((VizModifierObj*)modifier)->version,"Modifier Example v1.0");
	((VizModifierObj*)modifier)->dataSize = 0;
	((VizModifierObj*)modifier)->status = 1;
}

void PerformModifier(void *modifier)
{
	fprintf(stdout,"modifiying node\n");
	((VizModifierObj*)modifier)->status = 1;
}

void TextureModifier(void *modifier)
{
	((VizModifierObj*)modifier)->status = 1;
}

void SceneModifier(void *modifier)
{
	((VizModifierObj*)modifier)->status = 1;
}

void CommandModifier(void *modifier)
{
}

void CloseModifier(void *modifier)
{
}

PyObject* py_do_something(PyObject *self, PyObject *args)
{
	fprintf(stdout,"doing something\n");
	Py_RETURN_NONE;
}

static PyMethodDef ModifierMethods[] = {
	{"do_something", py_do_something, METH_VARARGS},
	{NULL, NULL}
};

extern "C" __declspec(dllexport) void initmodifier()
{
	Py_InitModule("modifier", ModifierMethods);
}
You would then use the following code in your Vizard script to access the plugin:
Code:
import viz
viz.go()

#Treat DLL as Python module
import modifier
modifier.do_something()

#Treat DLL as modifier plugin
mod = viz.addModifier('modifier.dll')
node = viz.add('gallery.ive')
node.modify(mod)
Reply With Quote