BGE Py API

added exception messages for replaceMesh.setMesh() and allowed None as an argument.
added exception messages for other BGE module functions.
This commit is contained in:
2008-09-05 02:53:12 +00:00
parent 3c95d91a57
commit e3a1547eea
6 changed files with 228 additions and 229 deletions

View File

@@ -108,7 +108,7 @@ struct PyMethodDef M_Mathutils_methods[] = {
}; };
/*----------------------------MODULE INIT-------------------------*/ /*----------------------------MODULE INIT-------------------------*/
/* from can be Blender.Mathutils or GameLogic.Mathutils for the BGE */ /* from can be Blender.Mathutils or GameLogic.Mathutils for the BGE */
PyObject *Mathutils_Init(char *from) PyObject *Mathutils_Init(const char *from)
{ {
PyObject *submodule; PyObject *submodule;

View File

@@ -38,7 +38,7 @@
#include "euler.h" #include "euler.h"
#include "point.h" #include "point.h"
PyObject *Mathutils_Init( char * from ); PyObject *Mathutils_Init( const char * from );
PyObject *row_vector_multiplication(VectorObject* vec, MatrixObject * mat); PyObject *row_vector_multiplication(VectorObject* vec, MatrixObject * mat);
PyObject *column_vector_multiplication(MatrixObject * mat, VectorObject* vec); PyObject *column_vector_multiplication(MatrixObject * mat, VectorObject* vec);
PyObject *row_point_multiplication(PointObject* pt, MatrixObject * mat); PyObject *row_point_multiplication(PointObject* pt, MatrixObject * mat);

View File

@@ -123,15 +123,13 @@ static PyObject* gPyGetRandomFloat(PyObject*)
static PyObject* gPySetGravity(PyObject*, PyObject* args) static PyObject* gPySetGravity(PyObject*, PyObject* args)
{ {
MT_Vector3 vec = MT_Vector3(0., 0., 0.); MT_Vector3 vec = MT_Vector3(0., 0., 0.);
if (PyVecArgTo(args, vec)) if (!PyVecArgTo(args, vec))
{ return NULL;
if (gp_KetsjiScene) if (gp_KetsjiScene)
gp_KetsjiScene->SetGravity(vec); gp_KetsjiScene->SetGravity(vec);
Py_Return; Py_RETURN_NONE;
}
return NULL;
} }
static char gPyExpandPath_doc[] = static char gPyExpandPath_doc[] =
@@ -149,13 +147,12 @@ static PyObject* gPyExpandPath(PyObject*, PyObject* args)
char expanded[FILE_MAXDIR + FILE_MAXFILE]; char expanded[FILE_MAXDIR + FILE_MAXFILE];
char* filename; char* filename;
if (PyArg_ParseTuple(args,"s",&filename)) if (!PyArg_ParseTuple(args,"s",&filename))
{ return NULL;
BLI_strncpy(expanded, filename, FILE_MAXDIR + FILE_MAXFILE); BLI_strncpy(expanded, filename, FILE_MAXDIR + FILE_MAXFILE);
BLI_convertstringcode(expanded, G.sce); BLI_convertstringcode(expanded, G.sce);
return PyString_FromString(expanded); return PyString_FromString(expanded);
}
return NULL;
} }
@@ -183,6 +180,12 @@ static PyObject* gPyGetSpectrum(PyObject*)
PyList_SetItem(resultlist, index, PyFloat_FromDouble(spectrum[index])); PyList_SetItem(resultlist, index, PyFloat_FromDouble(spectrum[index]));
} }
} }
else {
for (int index = 0; index < 512; index++)
{
PyList_SetItem(resultlist, index, PyFloat_FromDouble(0.0));
}
}
return resultlist; return resultlist;
} }
@@ -193,16 +196,17 @@ static PyObject* gPyStartDSP(PyObject*, PyObject* args)
{ {
SND_IAudioDevice* audiodevice = SND_DeviceManager::Instance(); SND_IAudioDevice* audiodevice = SND_DeviceManager::Instance();
if (audiodevice) if (!audiodevice) {
{ PyErr_SetString(PyExc_RuntimeError, "no audio device available");
if (!usedsp) return NULL;
{ }
if (!usedsp) {
audiodevice->StartUsingDSP(); audiodevice->StartUsingDSP();
usedsp = true; usedsp = true;
Py_Return;
} }
}
return NULL; Py_RETURN_NONE;
} }
@@ -211,28 +215,27 @@ static PyObject* gPyStopDSP(PyObject*, PyObject* args)
{ {
SND_IAudioDevice* audiodevice = SND_DeviceManager::Instance(); SND_IAudioDevice* audiodevice = SND_DeviceManager::Instance();
if (audiodevice) if (!audiodevice) {
{ PyErr_SetString(PyExc_RuntimeError, "no audio device available");
if (usedsp)
{
audiodevice->StopUsingDSP();
usedsp = false;
Py_Return;
}
}
return NULL; return NULL;
}
if (usedsp) {
audiodevice->StopUsingDSP();
usedsp = true;
}
Py_RETURN_NONE;
} }
static PyObject* gPySetLogicTicRate(PyObject*, PyObject* args) static PyObject* gPySetLogicTicRate(PyObject*, PyObject* args)
{ {
float ticrate; float ticrate;
if (PyArg_ParseTuple(args, "f", &ticrate)) if (!PyArg_ParseTuple(args, "f", &ticrate))
{
KX_KetsjiEngine::SetTicRate(ticrate);
Py_Return;
}
return NULL; return NULL;
KX_KetsjiEngine::SetTicRate(ticrate);
Py_RETURN_NONE;
} }
static PyObject* gPyGetLogicTicRate(PyObject*) static PyObject* gPyGetLogicTicRate(PyObject*)
@@ -243,26 +246,21 @@ static PyObject* gPyGetLogicTicRate(PyObject*)
static PyObject* gPySetPhysicsTicRate(PyObject*, PyObject* args) static PyObject* gPySetPhysicsTicRate(PyObject*, PyObject* args)
{ {
float ticrate; float ticrate;
if (PyArg_ParseTuple(args, "f", &ticrate)) if (!PyArg_ParseTuple(args, "f", &ticrate))
{ return NULL;
PHY_GetActiveEnvironment()->setFixedTimeStep(true,ticrate); PHY_GetActiveEnvironment()->setFixedTimeStep(true,ticrate);
Py_Return; Py_RETURN_NONE;
}
return NULL;
} }
static PyObject* gPySetPhysicsDebug(PyObject*, PyObject* args) static PyObject* gPySetPhysicsDebug(PyObject*, PyObject* args)
{ {
int debugMode; int debugMode;
if (PyArg_ParseTuple(args, "i", &debugMode)) if (!PyArg_ParseTuple(args, "i", &debugMode))
{
PHY_GetActiveEnvironment()->setDebugMode(debugMode);
Py_Return;
}
return NULL; return NULL;
PHY_GetActiveEnvironment()->setDebugMode(debugMode);
Py_RETURN_NONE;
} }
@@ -425,22 +423,14 @@ static struct PyMethodDef game_methods[] = {
static PyObject* gPyGetWindowHeight(PyObject*, PyObject* args) static PyObject* gPyGetWindowHeight(PyObject*, PyObject* args)
{ {
int height = (gp_Canvas ? gp_Canvas->GetHeight() : 0); return PyInt_FromLong((gp_Canvas ? gp_Canvas->GetHeight() : 0));
PyObject* heightval = PyInt_FromLong(height);
return heightval;
} }
static PyObject* gPyGetWindowWidth(PyObject*, PyObject* args) static PyObject* gPyGetWindowWidth(PyObject*, PyObject* args)
{ {
return PyInt_FromLong((gp_Canvas ? gp_Canvas->GetWidth() : 0));
int width = (gp_Canvas ? gp_Canvas->GetWidth() : 0);
PyObject* widthval = PyInt_FromLong(width);
return widthval;
} }
@@ -451,15 +441,11 @@ bool gUseVisibilityTemp = false;
static PyObject* gPyEnableVisibility(PyObject*, PyObject* args) static PyObject* gPyEnableVisibility(PyObject*, PyObject* args)
{ {
int visible; int visible;
if (PyArg_ParseTuple(args,"i",&visible)) if (!PyArg_ParseTuple(args,"i",&visible))
{
gUseVisibilityTemp = (visible != 0);
}
else
{
return NULL; return NULL;
}
Py_Return; gUseVisibilityTemp = (visible != 0);
Py_RETURN_NONE;
} }
@@ -467,8 +453,9 @@ static PyObject* gPyEnableVisibility(PyObject*, PyObject* args)
static PyObject* gPyShowMouse(PyObject*, PyObject* args) static PyObject* gPyShowMouse(PyObject*, PyObject* args)
{ {
int visible; int visible;
if (PyArg_ParseTuple(args,"i",&visible)) if (!PyArg_ParseTuple(args,"i",&visible))
{ return NULL;
if (visible) if (visible)
{ {
if (gp_Canvas) if (gp_Canvas)
@@ -478,12 +465,8 @@ static PyObject* gPyShowMouse(PyObject*, PyObject* args)
if (gp_Canvas) if (gp_Canvas)
gp_Canvas->SetMouseState(RAS_ICanvas::MOUSE_INVISIBLE); gp_Canvas->SetMouseState(RAS_ICanvas::MOUSE_INVISIBLE);
} }
}
else {
return NULL;
}
Py_Return; Py_RETURN_NONE;
} }
@@ -491,74 +474,81 @@ static PyObject* gPyShowMouse(PyObject*, PyObject* args)
static PyObject* gPySetMousePosition(PyObject*, PyObject* args) static PyObject* gPySetMousePosition(PyObject*, PyObject* args)
{ {
int x,y; int x,y;
if (PyArg_ParseTuple(args,"ii",&x,&y)) if (!PyArg_ParseTuple(args,"ii",&x,&y))
{ return NULL;
if (gp_Canvas) if (gp_Canvas)
gp_Canvas->SetMousePosition(x,y); gp_Canvas->SetMousePosition(x,y);
}
else {
return NULL;
}
Py_Return; Py_RETURN_NONE;
} }
static PyObject* gPySetEyeSeparation(PyObject*, PyObject* args) static PyObject* gPySetEyeSeparation(PyObject*, PyObject* args)
{ {
float sep; float sep;
if (PyArg_ParseTuple(args, "f", &sep)) if (!PyArg_ParseTuple(args, "f", &sep))
{ return NULL;
if (gp_Rasterizer)
gp_Rasterizer->SetEyeSeparation(sep);
Py_Return; if (!gp_Rasterizer) {
PyErr_SetString(PyExc_RuntimeError, "Rasterizer not available");
return NULL;
} }
return NULL; gp_Rasterizer->SetEyeSeparation(sep);
Py_RETURN_NONE;
} }
static PyObject* gPyGetEyeSeparation(PyObject*, PyObject*, PyObject*) static PyObject* gPyGetEyeSeparation(PyObject*, PyObject*, PyObject*)
{ {
if (gp_Rasterizer) if (!gp_Rasterizer) {
return PyFloat_FromDouble(gp_Rasterizer->GetEyeSeparation()); PyErr_SetString(PyExc_RuntimeError, "Rasterizer not available");
return NULL; return NULL;
}
return PyFloat_FromDouble(gp_Rasterizer->GetEyeSeparation());
} }
static PyObject* gPySetFocalLength(PyObject*, PyObject* args) static PyObject* gPySetFocalLength(PyObject*, PyObject* args)
{ {
float focus; float focus;
if (PyArg_ParseTuple(args, "f", &focus)) if (!PyArg_ParseTuple(args, "f", &focus))
{ return NULL;
if (gp_Rasterizer)
gp_Rasterizer->SetFocalLength(focus); if (!gp_Rasterizer) {
Py_Return; PyErr_SetString(PyExc_RuntimeError, "Rasterizer not available");
return NULL;
} }
return NULL; gp_Rasterizer->SetFocalLength(focus);
Py_RETURN_NONE;
} }
static PyObject* gPyGetFocalLength(PyObject*, PyObject*, PyObject*) static PyObject* gPyGetFocalLength(PyObject*, PyObject*, PyObject*)
{ {
if (gp_Rasterizer) if (!gp_Rasterizer) {
return PyFloat_FromDouble(gp_Rasterizer->GetFocalLength()); PyErr_SetString(PyExc_RuntimeError, "Rasterizer not available");
return NULL; return NULL;
}
return PyFloat_FromDouble(gp_Rasterizer->GetFocalLength());
Py_RETURN_NONE;
} }
static PyObject* gPySetBackgroundColor(PyObject*, PyObject* args) static PyObject* gPySetBackgroundColor(PyObject*, PyObject* args)
{ {
MT_Vector4 vec = MT_Vector4(0., 0., 0.3, 0.); MT_Vector4 vec = MT_Vector4(0., 0., 0.3, 0.);
if (PyVecArgTo(args, vec)) if (!PyVecArgTo(args, vec))
{ return NULL;
if (gp_Canvas) if (gp_Canvas)
{ {
gp_Rasterizer->SetBackColor(vec[0], vec[1], vec[2], vec[3]); gp_Rasterizer->SetBackColor(vec[0], vec[1], vec[2], vec[3]);
} }
Py_Return; Py_RETURN_NONE;
}
return NULL;
} }
@@ -567,16 +557,16 @@ static PyObject* gPySetMistColor(PyObject*, PyObject* args)
{ {
MT_Vector3 vec = MT_Vector3(0., 0., 0.); MT_Vector3 vec = MT_Vector3(0., 0., 0.);
if (PyVecArgTo(args, vec)) if (!PyVecArgTo(args, vec))
{
if (gp_Rasterizer)
{
gp_Rasterizer->SetFogColor(vec[0], vec[1], vec[2]);
}
Py_Return;
}
return NULL; return NULL;
if (!gp_Rasterizer) {
PyErr_SetString(PyExc_RuntimeError, "Rasterizer not available");
return NULL;
}
gp_Rasterizer->SetFogColor(vec[0], vec[1], vec[2]);
Py_RETURN_NONE;
} }
@@ -585,17 +575,17 @@ static PyObject* gPySetMistStart(PyObject*, PyObject* args)
{ {
float miststart; float miststart;
if (PyArg_ParseTuple(args,"f",&miststart)) if (!PyArg_ParseTuple(args,"f",&miststart))
{ return NULL;
if (gp_Rasterizer)
{ if (!gp_Rasterizer) {
gp_Rasterizer->SetFogStart(miststart); PyErr_SetString(PyExc_RuntimeError, "Rasterizer not available");
}
}
else {
return NULL; return NULL;
} }
Py_Return;
gp_Rasterizer->SetFogStart(miststart);
Py_RETURN_NONE;
} }
@@ -604,17 +594,17 @@ static PyObject* gPySetMistEnd(PyObject*, PyObject* args)
{ {
float mistend; float mistend;
if (PyArg_ParseTuple(args,"f",&mistend)) if (!PyArg_ParseTuple(args,"f",&mistend))
{ return NULL;
if (gp_Rasterizer)
{ if (!gp_Rasterizer) {
gp_Rasterizer->SetFogEnd(mistend); PyErr_SetString(PyExc_RuntimeError, "Rasterizer not available");
}
}
else {
return NULL; return NULL;
} }
Py_Return;
gp_Rasterizer->SetFogEnd(mistend);
Py_RETURN_NONE;
} }
@@ -622,16 +612,16 @@ static PyObject* gPySetAmbientColor(PyObject*, PyObject* args)
{ {
MT_Vector3 vec = MT_Vector3(0., 0., 0.); MT_Vector3 vec = MT_Vector3(0., 0., 0.);
if (PyVecArgTo(args, vec)) if (!PyVecArgTo(args, vec))
{
if (gp_Rasterizer)
{
gp_Rasterizer->SetAmbientColor(vec[0], vec[1], vec[2]);
}
Py_Return;
}
return NULL; return NULL;
if (!gp_Rasterizer) {
PyErr_SetString(PyExc_RuntimeError, "Rasterizer not available");
return NULL;
}
gp_Rasterizer->SetAmbientColor(vec[0], vec[1], vec[2]);
Py_RETURN_NONE;
} }
@@ -640,42 +630,43 @@ static PyObject* gPySetAmbientColor(PyObject*, PyObject* args)
static PyObject* gPyMakeScreenshot(PyObject*, PyObject* args) static PyObject* gPyMakeScreenshot(PyObject*, PyObject* args)
{ {
char* filename; char* filename;
if (PyArg_ParseTuple(args,"s",&filename)) if (!PyArg_ParseTuple(args,"s",&filename))
{ return NULL;
if (gp_Canvas) if (gp_Canvas)
{ {
gp_Canvas->MakeScreenShot(filename); gp_Canvas->MakeScreenShot(filename);
} }
}
else { Py_RETURN_NONE;
return NULL;
}
Py_Return;
} }
static PyObject* gPyEnableMotionBlur(PyObject*, PyObject* args) static PyObject* gPyEnableMotionBlur(PyObject*, PyObject* args)
{ {
float motionblurvalue; float motionblurvalue;
if (PyArg_ParseTuple(args,"f",&motionblurvalue)) if (!PyArg_ParseTuple(args,"f",&motionblurvalue))
{ return NULL;
if(gp_Rasterizer)
{ if (!gp_Rasterizer) {
gp_Rasterizer->EnableMotionBlur(motionblurvalue); PyErr_SetString(PyExc_RuntimeError, "Rasterizer not available");
}
}
else {
return NULL; return NULL;
} }
Py_Return;
gp_Rasterizer->EnableMotionBlur(motionblurvalue);
Py_RETURN_NONE;
} }
static PyObject* gPyDisableMotionBlur(PyObject*, PyObject* args) static PyObject* gPyDisableMotionBlur(PyObject*, PyObject* args)
{ {
if(gp_Rasterizer) if (!gp_Rasterizer) {
{ PyErr_SetString(PyExc_RuntimeError, "Rasterizer not available");
gp_Rasterizer->DisableMotionBlur(); return NULL;
} }
Py_Return;
gp_Rasterizer->DisableMotionBlur();
Py_RETURN_NONE;
} }
int getGLSLSettingFlag(char *setting) int getGLSLSettingFlag(char *setting)
@@ -704,10 +695,15 @@ static PyObject* gPySetGLSLMaterialSetting(PyObject*,
int enable, flag; int enable, flag;
if (PyArg_ParseTuple(args,"si",&setting,&enable)) if (PyArg_ParseTuple(args,"si",&setting,&enable))
{ return NULL;
flag = getGLSLSettingFlag(setting); flag = getGLSLSettingFlag(setting);
if(flag != -1) { if (flag==-1) {
PyErr_SetString(PyExc_ValueError, "glsl setting is not known");
return NULL;
}
if (enable) if (enable)
G.fileflags &= ~flag; G.fileflags &= ~flag;
else else
@@ -724,10 +720,8 @@ static PyObject* gPySetGLSLMaterialSetting(PyObject*,
} }
GPU_materials_free(); GPU_materials_free();
}
}
Py_Return; Py_RETURN_NONE;
} }
static PyObject* gPyGetGLSLMaterialSetting(PyObject*, static PyObject* gPyGetGLSLMaterialSetting(PyObject*,
@@ -737,14 +731,17 @@ static PyObject* gPyGetGLSLMaterialSetting(PyObject*,
char *setting; char *setting;
int enabled = 0, flag; int enabled = 0, flag;
if (PyArg_ParseTuple(args,"s",&setting)) if (!PyArg_ParseTuple(args,"s",&setting))
{ return NULL;
flag = getGLSLSettingFlag(setting); flag = getGLSLSettingFlag(setting);
if(flag != -1) if (flag==-1) {
enabled = ((G.fileflags & flag) != 0); PyErr_SetString(PyExc_ValueError, "glsl setting is not known");
return NULL;
} }
enabled = ((G.fileflags & flag) != 0);
return PyInt_FromLong(enabled); return PyInt_FromLong(enabled);
} }

View File

@@ -80,7 +80,7 @@ PyParentObject KX_SCA_ReplaceMeshActuator::Parents[] = {
PyMethodDef KX_SCA_ReplaceMeshActuator::Methods[] = { PyMethodDef KX_SCA_ReplaceMeshActuator::Methods[] = {
{"setMesh", (PyCFunction) KX_SCA_ReplaceMeshActuator::sPySetMesh, METH_VARARGS, SetMesh_doc}, {"setMesh", (PyCFunction) KX_SCA_ReplaceMeshActuator::sPySetMesh, METH_O, SetMesh_doc},
KX_PYMETHODTABLE(KX_SCA_ReplaceMeshActuator, instantReplaceMesh), KX_PYMETHODTABLE(KX_SCA_ReplaceMeshActuator, instantReplaceMesh),
KX_PYMETHODTABLE(KX_SCA_ReplaceMeshActuator, getMesh), KX_PYMETHODTABLE(KX_SCA_ReplaceMeshActuator, getMesh),
@@ -99,28 +99,29 @@ PyObject* KX_SCA_ReplaceMeshActuator::_getattr(const STR_String& attr)
/* 1. setMesh */ /* 1. setMesh */
char KX_SCA_ReplaceMeshActuator::SetMesh_doc[] = char KX_SCA_ReplaceMeshActuator::SetMesh_doc[] =
"setMesh(name)\n" "setMesh(name)\n"
"\t- name: string\n" "\t- name: string or None\n"
"\tSet the mesh that will be substituted for the current one.\n"; "\tSet the mesh that will be substituted for the current one.\n";
PyObject* KX_SCA_ReplaceMeshActuator::PySetMesh(PyObject* self, PyObject* KX_SCA_ReplaceMeshActuator::PySetMesh(PyObject* self, PyObject* value)
PyObject* args,
PyObject* kwds)
{ {
char* meshname; if (value == Py_None) {
m_mesh = NULL;
if (!PyArg_ParseTuple(args, "s", &meshname)) } else {
{ char* meshname = PyString_AsString(value);
if (!meshname) {
PyErr_SetString(PyExc_ValueError, "Expected the name of a mesh or None");
return NULL; return NULL;
} }
void* mesh = SCA_ILogicBrick::m_sCurrentLogicManager->GetMeshByName(STR_String(meshname)); void* mesh = SCA_ILogicBrick::m_sCurrentLogicManager->GetMeshByName(STR_String(meshname));
if (mesh) { if (mesh==NULL) {
PyErr_SetString(PyExc_ValueError, "The mesh name given does not exist");
return NULL;
}
m_mesh= (class RAS_MeshObject*)mesh; m_mesh= (class RAS_MeshObject*)mesh;
Py_Return;
} }
return NULL; Py_RETURN_NONE;
} }
KX_PYMETHODDEF_DOC(KX_SCA_ReplaceMeshActuator, getMesh, KX_PYMETHODDEF_DOC(KX_SCA_ReplaceMeshActuator, getMesh,
@@ -129,7 +130,7 @@ KX_PYMETHODDEF_DOC(KX_SCA_ReplaceMeshActuator, getMesh,
) )
{ {
if (!m_mesh) if (!m_mesh)
Py_Return; Py_RETURN_NONE;
return PyString_FromString(const_cast<char *>(m_mesh->GetName().ReadPtr())); return PyString_FromString(const_cast<char *>(m_mesh->GetName().ReadPtr()));
} }
@@ -139,7 +140,7 @@ KX_PYMETHODDEF_DOC(KX_SCA_ReplaceMeshActuator, instantReplaceMesh,
"instantReplaceMesh() : immediately replace mesh without delay\n") "instantReplaceMesh() : immediately replace mesh without delay\n")
{ {
InstantReplaceMesh(); InstantReplaceMesh();
Py_Return; Py_RETURN_NONE;
} }
/* ------------------------------------------------------------------------- */ /* ------------------------------------------------------------------------- */

View File

@@ -76,7 +76,7 @@ class KX_SCA_ReplaceMeshActuator : public SCA_IActuator
void InstantReplaceMesh(); void InstantReplaceMesh();
/* 1. setMesh */ /* 1. setMesh */
KX_PYMETHOD_DOC(KX_SCA_ReplaceMeshActuator,SetMesh); KX_PYMETHOD_DOC_O(KX_SCA_ReplaceMeshActuator,SetMesh);
KX_PYMETHOD_DOC(KX_SCA_ReplaceMeshActuator,getMesh); KX_PYMETHOD_DOC(KX_SCA_ReplaceMeshActuator,getMesh);
KX_PYMETHOD_DOC(KX_SCA_ReplaceMeshActuator,instantReplaceMesh); KX_PYMETHOD_DOC(KX_SCA_ReplaceMeshActuator,instantReplaceMesh);

View File

@@ -59,8 +59,9 @@ class KX_SCA_ReplaceMeshActuator(SCA_IActuator):
def setMesh(name): def setMesh(name):
""" """
Sets the name of the mesh that will replace the current one. Sets the name of the mesh that will replace the current one.
When the name is None it will unset the mesh value so no action is taken.
@type name: string @type name: string or None
""" """
def getMesh(): def getMesh():
""" """
@@ -68,6 +69,6 @@ class KX_SCA_ReplaceMeshActuator(SCA_IActuator):
Returns None if no mesh has been scheduled to be added. Returns None if no mesh has been scheduled to be added.
@rtype: string @rtype: string or None
""" """