- Mostly this cleans up the #includes and header files in the python project. - Warning fixes are mostly casting issues and misc fixes. General warning clean up. - #include Python.h MUST come as the first include to avoid the POSIX redefine warning in the unix makefiles - fno-strict-aliasing flag added to makefile to fix a unavoidable type punning warning in types.c
1283 lines
40 KiB
C
1283 lines
40 KiB
C
/*
|
|
* $Id$
|
|
*
|
|
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
|
|
*
|
|
* This program is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU General Public License
|
|
* as published by the Free Software Foundation; either version 2
|
|
* of the License, or (at your option) any later version. The Blender
|
|
* Foundation also sells licenses for use in proprietary software under
|
|
* the Blender License. See http://www.blender.org/BL/ for information
|
|
* about this.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software Foundation,
|
|
* Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|
*
|
|
* The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
|
|
* All rights reserved.
|
|
*
|
|
* This is a new part of Blender.
|
|
*
|
|
* Contributor(s): Jacques Guignot
|
|
*
|
|
* ***** END GPL/BL DUAL LICENSE BLOCK *****
|
|
*/
|
|
|
|
#include "Metaball.h" /*This must come first*/
|
|
|
|
#include "BKE_main.h"
|
|
#include "BKE_global.h"
|
|
#include "BKE_mball.h"
|
|
#include "BKE_library.h"
|
|
#include "BLI_blenlib.h"
|
|
#include "DNA_object_types.h"
|
|
#include "gen_utils.h"
|
|
|
|
/*****************************************************************************/
|
|
/* Python API function prototypes for the Metaball module. */
|
|
/*****************************************************************************/
|
|
static PyObject *M_Metaball_New( PyObject * self, PyObject * args );
|
|
static PyObject *M_Metaball_Get( PyObject * self, PyObject * args );
|
|
|
|
/*****************************************************************************/
|
|
/* The following string definitions are used for documentation strings. */
|
|
/* In Python these will be written to the console when doing a */
|
|
/* Blender.Metaball.__doc__ */
|
|
/*****************************************************************************/
|
|
static char M_Metaball_doc[] =
|
|
"The Blender Metaball module\n\n\nMetaballs are spheres\
|
|
that can join each other to create smooth,\
|
|
organic volumes\n. The spheres themseves are called\
|
|
'Metaelements' and can be accessed from the Metaball module.";
|
|
|
|
static char M_Metaball_New_doc[] = "Creates a new metaball";
|
|
|
|
static char M_Metaball_Get_doc[] = "Retreives an existing metaball";
|
|
|
|
/*****************************************************************************/
|
|
/* Python method structure definition for Blender.Metaball module: */
|
|
/*****************************************************************************/
|
|
struct PyMethodDef M_Metaball_methods[] = {
|
|
{"New", M_Metaball_New, METH_VARARGS, M_Metaball_New_doc},
|
|
{"Get", M_Metaball_Get, METH_VARARGS, M_Metaball_Get_doc},
|
|
{"get", M_Metaball_Get, METH_VARARGS, M_Metaball_Get_doc},
|
|
{NULL, NULL, 0, NULL}
|
|
};
|
|
|
|
|
|
/*****************************************************************************/
|
|
/* Python BPy_Metaball methods declarations: */
|
|
/*****************************************************************************/
|
|
static PyObject *Metaball_getMetaElemList( BPy_Metaball * self );
|
|
static PyObject *Metaball_addMetaelem( BPy_Metaball * self, PyObject * args );
|
|
static PyObject *Metaball_getBbox( BPy_Metaball * self );
|
|
static PyObject *Metaball_getName( BPy_Metaball * self );
|
|
static PyObject *Metaball_setName( BPy_Metaball * self, PyObject * args );
|
|
static PyObject *Metaball_getWiresize( BPy_Metaball * self );
|
|
static PyObject *Metaball_setWiresize( BPy_Metaball * self, PyObject * args );
|
|
static PyObject *Metaball_getRendersize( BPy_Metaball * self );
|
|
static PyObject *Metaball_setRendersize( BPy_Metaball * self,
|
|
PyObject * args );
|
|
static PyObject *Metaball_getThresh( BPy_Metaball * self );
|
|
static PyObject *Metaball_setThresh( BPy_Metaball * self, PyObject * args );
|
|
static PyObject *Metaball_getNMetaElems( BPy_Metaball * self );
|
|
static PyObject *Metaball_getMetatype( BPy_Metaball * self, PyObject * args );
|
|
static PyObject *Metaball_setMetatype( BPy_Metaball * self, PyObject * args );
|
|
static PyObject *Metaball_getMetadata( BPy_Metaball * self, PyObject * args );
|
|
static PyObject *Metaball_setMetadata( BPy_Metaball * self, PyObject * args );
|
|
static PyObject *Metaball_getMetax( BPy_Metaball * self, PyObject * args );
|
|
static PyObject *Metaball_setMetax( BPy_Metaball * self, PyObject * args );
|
|
static PyObject *Metaball_getMetay( BPy_Metaball * self, PyObject * args );
|
|
static PyObject *Metaball_setMetay( BPy_Metaball * self, PyObject * args );
|
|
static PyObject *Metaball_getMetaz( BPy_Metaball * self, PyObject * args );
|
|
static PyObject *Metaball_setMetaz( BPy_Metaball * self, PyObject * args );
|
|
static PyObject *Metaball_getMetas( BPy_Metaball * self, PyObject * args );
|
|
static PyObject *Metaball_setMetas( BPy_Metaball * self, PyObject * args );
|
|
static PyObject *Metaball_getMetalen( BPy_Metaball * self, PyObject * args );
|
|
static PyObject *Metaball_setMetalen( BPy_Metaball * self, PyObject * args );
|
|
static PyObject *Metaball_getloc( BPy_Metaball * self );
|
|
static PyObject *Metaball_setloc( BPy_Metaball * self, PyObject * args );
|
|
static PyObject *Metaball_getrot( BPy_Metaball * self );
|
|
static PyObject *Metaball_setrot( BPy_Metaball * self, PyObject * args );
|
|
static PyObject *Metaball_getsize( BPy_Metaball * self );
|
|
static PyObject *Metaball_setsize( BPy_Metaball * self, PyObject * args );
|
|
|
|
/*****************************************************************************/
|
|
/* Python BPy_Metaball methods table: */
|
|
/*****************************************************************************/
|
|
static PyMethodDef BPy_Metaball_methods[] = {
|
|
/* name, method, flags, doc */
|
|
{"getName", ( PyCFunction ) Metaball_getName,
|
|
METH_NOARGS, "() - Return Metaball name"},
|
|
|
|
{"getMetaElemList", ( PyCFunction ) Metaball_getMetaElemList,
|
|
METH_NOARGS, "() - Return Metaelems list"},
|
|
|
|
{"addMetaelem", ( PyCFunction ) Metaball_addMetaelem,
|
|
METH_VARARGS, "() -Adds a metaelem to the metaball"},
|
|
{"setName", ( PyCFunction ) Metaball_setName,
|
|
METH_VARARGS, "() - Sets Metaball name"},
|
|
{"getWiresize", ( PyCFunction ) Metaball_getWiresize,
|
|
METH_NOARGS, "() - Return Metaball wire size"},
|
|
{"setWiresize", ( PyCFunction ) Metaball_setWiresize,
|
|
METH_VARARGS, "() - Sets Metaball wire size"},
|
|
{"getRendersize", ( PyCFunction ) Metaball_getRendersize,
|
|
METH_NOARGS, "() - Return Metaball render size"},
|
|
{"setRendersize", ( PyCFunction ) Metaball_setRendersize,
|
|
METH_VARARGS, "() - Sets Metaball render size"},
|
|
{"getThresh", ( PyCFunction ) Metaball_getThresh,
|
|
METH_NOARGS, "() - Return Metaball threshold"},
|
|
{"setThresh", ( PyCFunction ) Metaball_setThresh,
|
|
METH_VARARGS, "() - Sets Metaball threshold"},
|
|
{"getBbox", ( PyCFunction ) Metaball_getBbox,
|
|
METH_NOARGS, "() - Return Metaball bounding box"},
|
|
{"getNMetaElems", ( PyCFunction ) Metaball_getNMetaElems,
|
|
METH_NOARGS, "() Returns the number of Spheres "},
|
|
{"getMetatype", ( PyCFunction ) Metaball_getMetatype,
|
|
METH_VARARGS, "() - "},
|
|
{"setMetatype", ( PyCFunction ) Metaball_setMetatype,
|
|
METH_VARARGS, "() - "},
|
|
{"getMetadata", ( PyCFunction ) Metaball_getMetadata,
|
|
METH_VARARGS, "() - Gets Metaball MetaData "},
|
|
{"setMetadata", ( PyCFunction ) Metaball_setMetadata,
|
|
METH_VARARGS, "() - "},
|
|
{"getMetax", ( PyCFunction ) Metaball_getMetax,
|
|
METH_VARARGS, "() - gets the x coordinate of the metaelement "},
|
|
{"setMetax", ( PyCFunction ) Metaball_setMetax,
|
|
METH_VARARGS, "() -sets the x coordinate of the metaelement "},
|
|
{"getMetay", ( PyCFunction ) Metaball_getMetay,
|
|
METH_VARARGS, "() - gets the y coordinate of the metaelement"},
|
|
{"setMetay", ( PyCFunction ) Metaball_setMetay,
|
|
METH_VARARGS, "() - sets the y coordinate of the metaelement"},
|
|
{"getMetaz", ( PyCFunction ) Metaball_getMetaz,
|
|
METH_VARARGS, "() - gets the z coordinate of the metaelement"},
|
|
{"setMetaz", ( PyCFunction ) Metaball_setMetaz,
|
|
METH_VARARGS, "() - sets the z coordinate of the metaelement"},
|
|
{"getMetas", ( PyCFunction ) Metaball_getMetas,
|
|
METH_VARARGS, "() - gets the s coordinate of the metaelement"},
|
|
{"setMetas", ( PyCFunction ) Metaball_setMetas,
|
|
METH_VARARGS, "() - sets the s coordinate of the metaelement"},
|
|
{"getMetalen", ( PyCFunction ) Metaball_getMetalen,
|
|
METH_VARARGS, "() - gets the length of the metaelement."},
|
|
{"setMetalen", ( PyCFunction ) Metaball_setMetalen,
|
|
METH_VARARGS, "() - sets the length of the metaelement."},
|
|
{"getloc", ( PyCFunction ) Metaball_getloc,
|
|
METH_NOARGS, "() - Gets Metaball loc values"},
|
|
{"setloc", ( PyCFunction ) Metaball_setloc,
|
|
METH_VARARGS, "(f f f) - Sets Metaball loc values"},
|
|
{"getrot", ( PyCFunction ) Metaball_getrot,
|
|
METH_NOARGS, "() - Gets Metaball rot values"},
|
|
{"setrot", ( PyCFunction ) Metaball_setrot,
|
|
METH_VARARGS, "(f f f) - Sets Metaball rot values"},
|
|
{"getsize", ( PyCFunction ) Metaball_getsize,
|
|
METH_NOARGS, "() - Gets Metaball size values"},
|
|
{"setsize", ( PyCFunction ) Metaball_setsize,
|
|
METH_VARARGS, "(f f f) - Sets Metaball size values"},
|
|
{NULL, NULL, 0, NULL}
|
|
};
|
|
|
|
/*****************************************************************************/
|
|
/* Python BPy_Metaelem methods table: */
|
|
/*****************************************************************************/
|
|
static PyMethodDef BPy_Metaelem_methods[] = {
|
|
{NULL, NULL, 0, NULL}
|
|
};
|
|
|
|
/*****************************************************************************/
|
|
/* Python Metaball_Type callback function prototypes: */
|
|
/*****************************************************************************/
|
|
static void MetaballDeAlloc( BPy_Metaball * self );
|
|
static int MetaballSetAttr( BPy_Metaball * self, char *name, PyObject * v );
|
|
static PyObject *MetaballGetAttr( BPy_Metaball * self, char *name );
|
|
static PyObject *MetaballRepr( BPy_Metaball * self );
|
|
|
|
/*****************************************************************************/
|
|
/* Python Metaelem_Type callback function prototypes: */
|
|
/*****************************************************************************/
|
|
static void MetaelemDeAlloc( BPy_Metaelem * self );
|
|
static int MetaelemSetAttr( BPy_Metaelem * self, char *name, PyObject * v );
|
|
static PyObject *MetaelemGetAttr( BPy_Metaelem * self, char *name );
|
|
static PyObject *MetaelemRepr( BPy_Metaelem * self );
|
|
|
|
|
|
|
|
/*****************************************************************************/
|
|
/* Python Metaball_Type structure definition: */
|
|
/*****************************************************************************/
|
|
PyTypeObject Metaball_Type = {
|
|
PyObject_HEAD_INIT( NULL )
|
|
0, /* ob_size */
|
|
"Metaball", /* tp_name */
|
|
sizeof( BPy_Metaball ), /* tp_basicsize */
|
|
0, /* tp_itemsize */
|
|
/* methods */
|
|
( destructor ) MetaballDeAlloc, /* tp_dealloc */
|
|
0, /* tp_print */
|
|
( getattrfunc ) MetaballGetAttr, /* tp_getattr */
|
|
( setattrfunc ) MetaballSetAttr, /* tp_setattr */
|
|
0, /* tp_compare */
|
|
( reprfunc ) MetaballRepr, /* tp_repr */
|
|
0, /* tp_as_number */
|
|
0, /* tp_as_sequence */
|
|
0, /* tp_as_mapping */
|
|
0, /* tp_as_hash */
|
|
0, 0, 0, 0, 0, 0,
|
|
0, /* tp_doc */
|
|
0, 0, 0, 0, 0, 0,
|
|
BPy_Metaball_methods, /* tp_methods */
|
|
0, /* tp_members */
|
|
};
|
|
|
|
|
|
PyTypeObject Metaelem_Type = {
|
|
PyObject_HEAD_INIT( NULL )
|
|
0, /* ob_size */
|
|
"Metaelem", /* tp_name */
|
|
sizeof( BPy_Metaelem ), /* tp_basicsize */
|
|
0, /* tp_itemsize */
|
|
/* methods */
|
|
( destructor ) MetaelemDeAlloc, /* tp_dealloc */
|
|
0, /* tp_print */
|
|
( getattrfunc ) MetaelemGetAttr, /* tp_getattr */
|
|
( setattrfunc ) MetaelemSetAttr, /* tp_setattr */
|
|
0, /* tp_compare */
|
|
( reprfunc ) MetaelemRepr, /* tp_repr */
|
|
0, /* tp_as_number */
|
|
0, /* tp_as_sequence */
|
|
0, /* tp_as_mapping */
|
|
0, /* tp_as_hash */
|
|
0, 0, 0, 0, 0, 0,
|
|
0, /* tp_doc */
|
|
0, 0, 0, 0, 0, 0,
|
|
BPy_Metaelem_methods, /* tp_methods */
|
|
0, /* tp_members */
|
|
};
|
|
|
|
/*****************************************************************************/
|
|
/* Function: M_Metaball_New */
|
|
/* Python equivalent: Blender.Metaball.New */
|
|
/*****************************************************************************/
|
|
static PyObject *M_Metaball_New( PyObject * self, PyObject * args )
|
|
{
|
|
char *name = 0;
|
|
BPy_Metaball *pymball; /* for Data object wrapper in Python */
|
|
MetaBall *blmball; /* for actual Data we create in Blender */
|
|
char buf[21];
|
|
if( !PyArg_ParseTuple( args, "|s", &name ) )
|
|
return ( EXPP_ReturnPyObjError( PyExc_TypeError,
|
|
"expected string argument (or nothing)" ) );
|
|
|
|
blmball = add_mball( ); /* first create the MetaBall Data in Blender */
|
|
|
|
if( blmball ) {
|
|
/* return user count to zero since add_mball() incref'ed it */
|
|
blmball->id.us = 0;
|
|
/* now create the wrapper obj in Python */
|
|
pymball =
|
|
( BPy_Metaball * ) PyObject_NEW( BPy_Metaball,
|
|
&Metaball_Type );
|
|
} else
|
|
return ( EXPP_ReturnPyObjError( PyExc_RuntimeError,
|
|
"couldn't create MetaBall Data in Blender" ) );
|
|
|
|
if( pymball == NULL )
|
|
return ( EXPP_ReturnPyObjError( PyExc_MemoryError,
|
|
"couldn't create MetaBall Data object" ) );
|
|
|
|
pymball->metaball = blmball;
|
|
/*link Python mballer wrapper to Blender MetaBall */
|
|
if( name ) { /* user gave us a name for the metaball, use it */
|
|
PyOS_snprintf( buf, sizeof( buf ), "%s", name );
|
|
rename_id( &blmball->id, buf );
|
|
}
|
|
return ( PyObject * ) pymball;
|
|
}
|
|
|
|
|
|
/*****************************************************************************/
|
|
/* Function: M_Metaball_Get */
|
|
/* Python equivalent: Blender.Metaball.Get */
|
|
/* Description: Receives a string and returns the metaball data obj */
|
|
/* whose name matches the string. If no argument is */
|
|
/* passed in, a list of all metaball data names in the */
|
|
/* current scene is returned. */
|
|
/*****************************************************************************/
|
|
static PyObject *M_Metaball_Get( PyObject * self, PyObject * args )
|
|
{
|
|
char error_msg[64];
|
|
char *name = NULL;
|
|
MetaBall *mball_iter;
|
|
|
|
if( !PyArg_ParseTuple( args, "|s", &name ) )
|
|
return ( EXPP_ReturnPyObjError( PyExc_TypeError,
|
|
"expected string argument (or nothing)" ) );
|
|
|
|
mball_iter = G.main->mball.first;
|
|
|
|
if( name ) { /* (name) - Search mball by name */
|
|
|
|
BPy_Metaball *wanted_mball = NULL;
|
|
|
|
while( ( mball_iter ) && ( wanted_mball == NULL ) ) {
|
|
if( strcmp( name, mball_iter->id.name + 2 ) == 0 ) {
|
|
wanted_mball =
|
|
( BPy_Metaball * )
|
|
PyObject_NEW( BPy_Metaball,
|
|
&Metaball_Type );
|
|
if( wanted_mball )
|
|
wanted_mball->metaball = mball_iter;
|
|
}
|
|
mball_iter = mball_iter->id.next;
|
|
}
|
|
|
|
if( wanted_mball == NULL ) { /* Requested mball doesn't exist */
|
|
PyOS_snprintf( error_msg, sizeof( error_msg ),
|
|
"MetaBall \"%s\" not found", name );
|
|
return ( EXPP_ReturnPyObjError
|
|
( PyExc_NameError, error_msg ) );
|
|
}
|
|
|
|
return ( PyObject * ) wanted_mball;
|
|
}
|
|
|
|
else { /* () - return a list of all mballs in the scene */
|
|
PyObject *mballlist;
|
|
|
|
mballlist = PyList_New( 0 );
|
|
|
|
if( mballlist == NULL )
|
|
return ( EXPP_ReturnPyObjError( PyExc_MemoryError,
|
|
"couldn't create PyList" ) );
|
|
|
|
while( mball_iter ) {
|
|
BPy_Metaball *found_mball =
|
|
( BPy_Metaball * ) PyObject_NEW( BPy_Metaball,
|
|
&Metaball_Type );
|
|
found_mball->metaball = mball_iter;
|
|
PyList_Append( mballlist, ( PyObject * ) found_mball );
|
|
mball_iter = mball_iter->id.next;
|
|
}
|
|
|
|
return ( mballlist );
|
|
}
|
|
|
|
}
|
|
|
|
/****************************************************************************/
|
|
/* Function: Metaball_Init */
|
|
/****************************************************************************/
|
|
PyObject *Metaball_Init( void )
|
|
{
|
|
PyObject *submodule;
|
|
|
|
Metaball_Type.ob_type = &PyType_Type;
|
|
|
|
submodule = Py_InitModule3( "Blender.Metaball",
|
|
M_Metaball_methods, M_Metaball_doc );
|
|
|
|
return ( submodule );
|
|
}
|
|
|
|
int Metaball_CheckPyObject( PyObject * pyobj )
|
|
{
|
|
return ( pyobj->ob_type == &Metaball_Type );
|
|
}
|
|
|
|
|
|
MetaBall *Metaball_FromPyObject( PyObject * pyobj )
|
|
{
|
|
return ( ( BPy_Metaball * ) pyobj )->metaball;
|
|
}
|
|
|
|
/***************************************************************************/
|
|
/* Python BPy_Metaball methods: */
|
|
/***************************************************************************/
|
|
void *MEM_callocN( unsigned int, char * );
|
|
void allqueue( unsigned short, short );
|
|
|
|
static PyObject *Metaball_addMetaelem( BPy_Metaball * self, PyObject * args )
|
|
{
|
|
MetaElem *ml;
|
|
PyObject *listargs = 0;
|
|
int type;
|
|
float x, y, z, rad, s, expx, expy, expz;
|
|
if( !PyArg_ParseTuple( args, "O", &listargs ) )
|
|
return ( EXPP_ReturnPyObjError
|
|
( PyExc_TypeError, "expected a list" ) );
|
|
if( !PyList_Check( listargs ) )
|
|
return ( EXPP_ReturnPyObjError
|
|
( PyExc_TypeError, "expected a list" ) );
|
|
|
|
|
|
type = PyInt_AsLong( PyList_GetItem( listargs, 0 ) );
|
|
x = (float)PyFloat_AsDouble( PyList_GetItem( listargs, 1 ) );
|
|
y = (float)PyFloat_AsDouble( PyList_GetItem( listargs, 2 ) );
|
|
z = (float)PyFloat_AsDouble( PyList_GetItem( listargs, 3 ) );
|
|
rad = (float)PyFloat_AsDouble( PyList_GetItem( listargs, 4 ) );
|
|
s = (float)PyFloat_AsDouble( PyList_GetItem( listargs, 6 ) );
|
|
expx = (float)PyFloat_AsDouble( PyList_GetItem( listargs, 7 ) );
|
|
expy = (float)PyFloat_AsDouble( PyList_GetItem( listargs, 8 ) );
|
|
expz = (float)PyFloat_AsDouble( PyList_GetItem( listargs, 9 ) );
|
|
|
|
ml = MEM_callocN( sizeof( MetaElem ), "metaelem" );
|
|
BLI_addhead( &( self->metaball->elems ), ml );
|
|
|
|
ml->x = x;
|
|
ml->y = y;
|
|
ml->z = z;
|
|
ml->rad = rad;
|
|
ml->s = s;
|
|
ml->flag = SELECT;
|
|
ml->type = (short)type;
|
|
ml->expx = expx;
|
|
ml->expy = expy;
|
|
ml->expz = expz;
|
|
ml->type = (short)type;
|
|
allqueue( 0X4013, 0 );
|
|
Py_INCREF( Py_None );
|
|
return Py_None;
|
|
}
|
|
|
|
static PyObject *Metaball_getName( BPy_Metaball * self )
|
|
{
|
|
|
|
PyObject *attr = PyString_FromString( self->metaball->id.name + 2 );
|
|
|
|
if( attr )
|
|
return attr;
|
|
|
|
return ( EXPP_ReturnPyObjError( PyExc_RuntimeError,
|
|
"couldn't get Metaball.name attribute" ) );
|
|
}
|
|
|
|
|
|
|
|
static PyObject *Metaball_setName( BPy_Metaball * self, PyObject * args )
|
|
{
|
|
char *name = NULL;
|
|
char buf[20];
|
|
|
|
|
|
if( !PyArg_ParseTuple( args, "s", &name ) )
|
|
return ( EXPP_ReturnPyObjError( PyExc_TypeError,
|
|
"expected string argument" ) );
|
|
PyOS_snprintf( buf, sizeof( buf ), "%s", name );
|
|
rename_id( &self->metaball->id, buf );
|
|
Py_INCREF( Py_None );
|
|
return Py_None;
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static PyObject *Metaball_getBbox( BPy_Metaball * self )
|
|
{
|
|
int i, j;
|
|
PyObject *ll;
|
|
PyObject *l = PyList_New( 0 );
|
|
if( self->metaball->bb == NULL ) {
|
|
Py_INCREF( Py_None );
|
|
return Py_None;
|
|
}
|
|
for( i = 0; i < 8; i++ ) {
|
|
ll = PyList_New( 0 );
|
|
for( j = 0; j < 3; j++ )
|
|
PyList_Append( ll,
|
|
PyFloat_FromDouble( self->metaball->bb->
|
|
vec[i][j] ) );
|
|
PyList_Append( l, ll );
|
|
}
|
|
|
|
return l;
|
|
}
|
|
|
|
static PyObject *Metaball_getNMetaElems( BPy_Metaball * self )
|
|
{
|
|
int i = 0;
|
|
MetaElem *ptr = self->metaball->elems.first;
|
|
if( !ptr )
|
|
return ( PyInt_FromLong( 0 ) );
|
|
while( ptr ) {
|
|
i++;
|
|
ptr = ptr->next;
|
|
}
|
|
return ( PyInt_FromLong( i ) );
|
|
}
|
|
|
|
|
|
|
|
|
|
static PyObject *Metaball_getloc( BPy_Metaball * self )
|
|
{
|
|
PyObject *l = PyList_New( 0 );
|
|
PyList_Append( l, PyFloat_FromDouble( self->metaball->loc[0] ) );
|
|
PyList_Append( l, PyFloat_FromDouble( self->metaball->loc[1] ) );
|
|
PyList_Append( l, PyFloat_FromDouble( self->metaball->loc[2] ) );
|
|
return l;
|
|
}
|
|
|
|
static PyObject *Metaball_setloc( BPy_Metaball * self, PyObject * args )
|
|
{
|
|
PyObject *listargs = 0;
|
|
int i;
|
|
if( !PyArg_ParseTuple( args, "O", &listargs ) )
|
|
return ( EXPP_ReturnPyObjError
|
|
( PyExc_TypeError, "expected a list" ) );
|
|
if( !PyList_Check( listargs ) )
|
|
return ( EXPP_ReturnPyObjError
|
|
( PyExc_TypeError, "expected a list" ) );
|
|
for( i = 0; i < 3; i++ ) {
|
|
PyObject *xx = PyList_GetItem( listargs, i );
|
|
self->metaball->loc[i] = (float)PyFloat_AsDouble( xx );
|
|
}
|
|
Py_INCREF( Py_None );
|
|
return Py_None;
|
|
}
|
|
|
|
static PyObject *Metaball_getrot( BPy_Metaball * self )
|
|
{
|
|
PyObject *l = PyList_New( 0 );
|
|
PyList_Append( l, PyFloat_FromDouble( self->metaball->rot[0] ) );
|
|
PyList_Append( l, PyFloat_FromDouble( self->metaball->rot[1] ) );
|
|
PyList_Append( l, PyFloat_FromDouble( self->metaball->rot[2] ) );
|
|
return l;
|
|
}
|
|
|
|
static PyObject *Metaball_setrot( BPy_Metaball * self, PyObject * args )
|
|
{
|
|
PyObject *listargs = 0;
|
|
int i;
|
|
if( !PyArg_ParseTuple( args, "O", &listargs ) )
|
|
return ( EXPP_ReturnPyObjError
|
|
( PyExc_TypeError, "expected a list" ) );
|
|
if( !PyList_Check( listargs ) )
|
|
return ( EXPP_ReturnPyObjError
|
|
( PyExc_TypeError, "expected a list" ) );
|
|
for( i = 0; i < 3; i++ ) {
|
|
PyObject *xx = PyList_GetItem( listargs, i );
|
|
self->metaball->rot[i] = (float)PyFloat_AsDouble( xx );
|
|
}
|
|
Py_INCREF( Py_None );
|
|
return Py_None;
|
|
}
|
|
|
|
static PyObject *Metaball_getsize( BPy_Metaball * self )
|
|
{
|
|
PyObject *l = PyList_New( 0 );
|
|
|
|
PyList_Append( l, PyFloat_FromDouble( self->metaball->size[0] ) );
|
|
PyList_Append( l, PyFloat_FromDouble( self->metaball->size[1] ) );
|
|
PyList_Append( l, PyFloat_FromDouble( self->metaball->size[2] ) );
|
|
return l;
|
|
}
|
|
|
|
|
|
|
|
|
|
static PyObject *Metaball_getMetaElemList( BPy_Metaball * self )
|
|
{
|
|
MetaElem *ptr;
|
|
PyObject *l = PyList_New( 0 );
|
|
ptr = self->metaball->elems.first;
|
|
if( !ptr )
|
|
return l;
|
|
while( ptr ) {
|
|
BPy_Metaelem *found_melem =
|
|
( BPy_Metaelem * ) PyObject_NEW( BPy_Metaelem,
|
|
&Metaelem_Type );
|
|
found_melem->metaelem = ptr;
|
|
PyList_Append( l, ( PyObject * ) found_melem );
|
|
ptr = ptr->next;
|
|
}
|
|
return l;
|
|
}
|
|
|
|
|
|
static PyObject *Metaball_setsize( BPy_Metaball * self, PyObject * args )
|
|
{
|
|
PyObject *listargs = 0;
|
|
int i;
|
|
if( !PyArg_ParseTuple( args, "O", &listargs ) )
|
|
return ( EXPP_ReturnPyObjError
|
|
( PyExc_TypeError, "expected a list" ) );
|
|
if( !PyList_Check( listargs ) )
|
|
return ( EXPP_ReturnPyObjError
|
|
( PyExc_TypeError, "expected a list" ) );
|
|
for( i = 0; i < 3; i++ ) {
|
|
PyObject *xx = PyList_GetItem( listargs, i );
|
|
self->metaball->size[i] = (float)PyFloat_AsDouble( xx );
|
|
}
|
|
Py_INCREF( Py_None );
|
|
return Py_None;
|
|
}
|
|
|
|
static PyObject *Metaball_getWiresize( BPy_Metaball * self )
|
|
{
|
|
return PyFloat_FromDouble( self->metaball->wiresize );
|
|
}
|
|
|
|
static PyObject *Metaball_setWiresize( BPy_Metaball * self, PyObject * args )
|
|
{
|
|
|
|
float val;
|
|
if( !PyArg_ParseTuple( args, "f", &val ) )
|
|
return ( EXPP_ReturnPyObjError
|
|
( PyExc_TypeError, "expected float args" ) );
|
|
|
|
self->metaball->wiresize = val;
|
|
|
|
Py_INCREF( Py_None );
|
|
return Py_None;
|
|
|
|
}
|
|
static PyObject *Metaball_getRendersize( BPy_Metaball * self )
|
|
{
|
|
return PyFloat_FromDouble( self->metaball->rendersize );
|
|
}
|
|
|
|
static PyObject *Metaball_setRendersize( BPy_Metaball * self, PyObject * args )
|
|
{
|
|
|
|
float val;
|
|
if( !PyArg_ParseTuple( args, "f", &val ) )
|
|
return ( EXPP_ReturnPyObjError
|
|
( PyExc_TypeError, "expected float args" ) );
|
|
|
|
self->metaball->rendersize = val;
|
|
|
|
Py_INCREF( Py_None );
|
|
return Py_None;
|
|
|
|
}
|
|
static PyObject *Metaball_getThresh( BPy_Metaball * self )
|
|
{
|
|
return PyFloat_FromDouble( self->metaball->thresh );
|
|
}
|
|
|
|
static PyObject *Metaball_setThresh( BPy_Metaball * self, PyObject * args )
|
|
{
|
|
|
|
float val;
|
|
if( !PyArg_ParseTuple( args, "f", &val ) )
|
|
return ( EXPP_ReturnPyObjError
|
|
( PyExc_TypeError, "expected float args" ) );
|
|
|
|
self->metaball->thresh = val;
|
|
|
|
Py_INCREF( Py_None );
|
|
return Py_None;
|
|
|
|
}
|
|
|
|
|
|
/**************************************************************************/
|
|
/* get/set metaelems data, */
|
|
/***************************************************************************/
|
|
|
|
static PyObject *Metaball_getMetadata( BPy_Metaball * self, PyObject * args )
|
|
{
|
|
int num;
|
|
int i = 0;
|
|
char *name = NULL;
|
|
MetaElem *ptr;
|
|
|
|
if( !PyArg_ParseTuple( args, "si", &name, &num ) )
|
|
return ( EXPP_ReturnPyObjError( PyExc_TypeError,
|
|
"expected (string int) argument" ) );
|
|
/*jump to the num-th MetaElem */
|
|
ptr = self->metaball->elems.first;
|
|
if( !ptr )
|
|
return ( EXPP_ReturnPyObjError
|
|
( PyExc_TypeError, "no metaelem found" ) );
|
|
for( i = 0; i < num; i++ ) {
|
|
if( !ptr )
|
|
return ( EXPP_ReturnPyObjError
|
|
( PyExc_TypeError, "metaelem not found" ) );
|
|
ptr = ptr->next;
|
|
}
|
|
if( !strcmp( name, "type" ) )
|
|
return ( PyInt_FromLong( ptr->type ) );
|
|
if( !strcmp( name, "x" ) )
|
|
return ( PyFloat_FromDouble( ptr->x ) );
|
|
if( !strcmp( name, "y" ) )
|
|
return ( PyFloat_FromDouble( ptr->y ) );
|
|
if( !strcmp( name, "z" ) )
|
|
return ( PyFloat_FromDouble( ptr->z ) );
|
|
if( !strcmp( name, "expx" ) )
|
|
return ( PyFloat_FromDouble( ptr->expx ) );
|
|
if( !strcmp( name, "expy" ) )
|
|
return ( PyFloat_FromDouble( ptr->expy ) );
|
|
if( !strcmp( name, "expz" ) )
|
|
return ( PyFloat_FromDouble( ptr->expz ) );
|
|
if( !strcmp( name, "rad" ) )
|
|
return ( PyFloat_FromDouble( ptr->rad ) );
|
|
if( !strcmp( name, "rad2" ) )
|
|
return ( PyFloat_FromDouble( ptr->rad2 ) );
|
|
if( !strcmp( name, "s" ) )
|
|
return ( PyFloat_FromDouble( ptr->s ) );
|
|
if( !strcmp( name, "len" ) )
|
|
return ( PyFloat_FromDouble( ptr->len ) );
|
|
|
|
return ( EXPP_ReturnPyObjError( PyExc_TypeError, "unknown name " ) );
|
|
}
|
|
|
|
|
|
|
|
static PyObject *Metaball_setMetadata( BPy_Metaball * self, PyObject * args )
|
|
{
|
|
int num;
|
|
int i = 0;
|
|
char *name = NULL;
|
|
int intval = -1;
|
|
float floatval = 0;
|
|
MetaElem *ptr;
|
|
|
|
if( !PyArg_ParseTuple( args, "sif", &name, &num, &floatval ) )
|
|
return ( EXPP_ReturnPyObjError
|
|
( PyExc_TypeError,
|
|
"expected string, int, float arguments" ) );
|
|
intval = ( int ) floatval;
|
|
printf( "%f %d %s %d\n", floatval, intval, name, num );
|
|
/*jump to the num-th MetaElem */
|
|
ptr = self->metaball->elems.first;
|
|
if( !ptr )
|
|
return ( EXPP_ReturnPyObjError
|
|
( PyExc_TypeError, "metaelem not found" ) );
|
|
for( i = 0; i < num; i++ ) {
|
|
if( !ptr )
|
|
return ( EXPP_ReturnPyObjError
|
|
( PyExc_TypeError, "metaelem not found" ) );
|
|
ptr = ptr->next;
|
|
}
|
|
if( !strcmp( name, "type" ) ) {
|
|
ptr->type = (short)intval;
|
|
return ( PyInt_FromLong( intval ) );
|
|
}
|
|
if( !strcmp( name, "x" ) ) {
|
|
ptr->x = floatval;
|
|
printf( "%p %f\n", ptr, floatval );
|
|
return ( PyFloat_FromDouble( floatval ) );
|
|
}
|
|
if( !strcmp( name, "y" ) ) {
|
|
ptr->y = floatval;
|
|
return ( PyFloat_FromDouble( floatval ) );
|
|
}
|
|
if( !strcmp( name, "z" ) ) {
|
|
ptr->z = floatval;
|
|
return ( PyFloat_FromDouble( floatval ) );
|
|
}
|
|
if( !strcmp( name, "expx" ) ) {
|
|
ptr->expx = floatval;
|
|
return ( PyFloat_FromDouble( floatval ) );
|
|
}
|
|
if( !strcmp( name, "expy" ) ) {
|
|
ptr->expy = floatval;
|
|
return ( PyFloat_FromDouble( floatval ) );
|
|
}
|
|
if( !strcmp( name, "expz" ) ) {
|
|
ptr->expz = floatval;
|
|
return ( PyFloat_FromDouble( floatval ) );
|
|
}
|
|
if( !strcmp( name, "rad" ) ) {
|
|
ptr->rad = floatval;
|
|
return ( PyFloat_FromDouble( floatval ) );
|
|
}
|
|
if( !strcmp( name, "rad2" ) ) {
|
|
ptr->rad2 = floatval;
|
|
return ( PyFloat_FromDouble( floatval ) );
|
|
}
|
|
if( !strcmp( name, "s" ) ) {
|
|
ptr->s = floatval;
|
|
return ( PyFloat_FromDouble( floatval ) );
|
|
}
|
|
if( !strcmp( name, "len" ) ) {
|
|
ptr->len = floatval;
|
|
return ( PyFloat_FromDouble( floatval ) );
|
|
}
|
|
|
|
return ( EXPP_ReturnPyObjError( PyExc_TypeError, "unknown field " ) );
|
|
}
|
|
|
|
static PyObject *Metaball_getMetatype( BPy_Metaball * self, PyObject * args )
|
|
{
|
|
int num;
|
|
int i = 0;
|
|
MetaElem *ptr = self->metaball->elems.first;
|
|
if( !PyArg_ParseTuple( args, "i", &num ) )
|
|
return ( EXPP_ReturnPyObjError( PyExc_TypeError,
|
|
"expected int argument" ) );
|
|
if( !ptr )
|
|
return ( PyInt_FromLong( 0 ) );
|
|
for( i = 0; i < num; i++ ) {
|
|
ptr = ptr->next;
|
|
}
|
|
return ( PyInt_FromLong( ptr->type ) );
|
|
}
|
|
|
|
|
|
|
|
static PyObject *Metaball_setMetatype( BPy_Metaball * self, PyObject * args )
|
|
{
|
|
int num, val, i = 0;
|
|
MetaElem *ptr = self->metaball->elems.first;
|
|
if( !PyArg_ParseTuple( args, "ii", &num, &val ) )
|
|
return ( EXPP_ReturnPyObjError
|
|
( PyExc_TypeError, "expected int int arguments" ) );
|
|
if( !ptr )
|
|
return ( EXPP_ReturnPyObjError
|
|
( PyExc_TypeError, "No MetaElem" ) );
|
|
for( i = 0; i < num; i++ ) {
|
|
ptr = ptr->next;
|
|
}
|
|
ptr->type = (short)val;
|
|
|
|
Py_INCREF( Py_None );
|
|
return Py_None;
|
|
|
|
}
|
|
|
|
|
|
static PyObject *Metaball_getMetax( BPy_Metaball * self, PyObject * args )
|
|
{
|
|
MetaElem *ptr = self->metaball->elems.first;
|
|
int num;
|
|
int i = 0;
|
|
if( !PyArg_ParseTuple( args, "i", &num ) )
|
|
return ( EXPP_ReturnPyObjError
|
|
( PyExc_TypeError, "expected int argument" ) );
|
|
if( !ptr )
|
|
return ( PyFloat_FromDouble( 0 ) );
|
|
for( i = 0; i < num; i++ ) {
|
|
ptr = ptr->next;
|
|
}
|
|
return ( PyFloat_FromDouble( ptr->x ) );
|
|
}
|
|
|
|
|
|
|
|
static PyObject *Metaball_setMetax( BPy_Metaball * self, PyObject * args )
|
|
{
|
|
MetaElem *ptr = self->metaball->elems.first;
|
|
int num, i = 0;
|
|
float val;
|
|
if( !PyArg_ParseTuple( args, "if", &num, &val ) )
|
|
return ( EXPP_ReturnPyObjError
|
|
( PyExc_TypeError, "expected int float args" ) );
|
|
if( !ptr )
|
|
return ( EXPP_ReturnPyObjError
|
|
( PyExc_TypeError, "No MetaElem" ) );
|
|
for( i = 0; i < num; i++ ) {
|
|
ptr = ptr->next;
|
|
}
|
|
ptr->x = val;
|
|
|
|
Py_INCREF( Py_None );
|
|
return Py_None;
|
|
|
|
}
|
|
static PyObject *Metaball_getMetay( BPy_Metaball * self, PyObject * args )
|
|
{
|
|
MetaElem *ptr = self->metaball->elems.first;
|
|
int num;
|
|
int i = 0;
|
|
if( !PyArg_ParseTuple( args, "i", &num ) )
|
|
return ( EXPP_ReturnPyObjError
|
|
( PyExc_TypeError, "expected int argument" ) );
|
|
if( !ptr )
|
|
return ( PyFloat_FromDouble( 0 ) );
|
|
for( i = 0; i < num; i++ ) {
|
|
ptr = ptr->next;
|
|
}
|
|
return ( PyFloat_FromDouble( ptr->y ) );
|
|
}
|
|
|
|
|
|
|
|
static PyObject *Metaball_setMetay( BPy_Metaball * self, PyObject * args )
|
|
{
|
|
MetaElem *ptr = self->metaball->elems.first;
|
|
int num, i = 0;
|
|
float val;
|
|
if( !PyArg_ParseTuple( args, "if", &num, &val ) )
|
|
return ( EXPP_ReturnPyObjError
|
|
( PyExc_TypeError, "expected int float args" ) );
|
|
if( !ptr )
|
|
return ( EXPP_ReturnPyObjError
|
|
( PyExc_TypeError, "No MetaElem" ) );
|
|
for( i = 0; i < num; i++ ) {
|
|
ptr = ptr->next;
|
|
}
|
|
ptr->y = val;
|
|
|
|
Py_INCREF( Py_None );
|
|
return Py_None;
|
|
|
|
}
|
|
|
|
|
|
static PyObject *Metaball_getMetaz( BPy_Metaball * self, PyObject * args )
|
|
{
|
|
MetaElem *ptr = self->metaball->elems.first;
|
|
int num;
|
|
int i = 0;
|
|
if( !PyArg_ParseTuple( args, "i", &num ) )
|
|
return ( EXPP_ReturnPyObjError
|
|
( PyExc_TypeError, "expected int argument" ) );
|
|
if( !ptr )
|
|
return ( PyFloat_FromDouble( 0 ) );
|
|
for( i = 0; i < num; i++ ) {
|
|
ptr = ptr->next;
|
|
}
|
|
return ( PyFloat_FromDouble( ptr->z ) );
|
|
}
|
|
|
|
static PyObject *Metaball_setMetaz( BPy_Metaball * self, PyObject * args )
|
|
{
|
|
int num, i = 0;
|
|
MetaElem *ptr = self->metaball->elems.first;
|
|
float val;
|
|
if( !PyArg_ParseTuple( args, "if", &num, &val ) )
|
|
return ( EXPP_ReturnPyObjError
|
|
( PyExc_TypeError, "expected int float args" ) );
|
|
if( !ptr )
|
|
return ( EXPP_ReturnPyObjError
|
|
( PyExc_TypeError, "No MetaElem" ) );
|
|
for( i = 0; i < num; i++ ) {
|
|
ptr = ptr->next;
|
|
}
|
|
ptr->z = val;
|
|
|
|
Py_INCREF( Py_None );
|
|
return Py_None;
|
|
|
|
}
|
|
|
|
|
|
static PyObject *Metaball_getMetas( BPy_Metaball * self, PyObject * args )
|
|
{
|
|
MetaElem *ptr = self->metaball->elems.first;
|
|
int num;
|
|
int i = 0;
|
|
if( !PyArg_ParseTuple( args, "i", &num ) )
|
|
return ( EXPP_ReturnPyObjError
|
|
( PyExc_TypeError, "expected int argument" ) );
|
|
if( !ptr )
|
|
return ( PyFloat_FromDouble( 0 ) );
|
|
for( i = 0; i < num; i++ ) {
|
|
ptr = ptr->next;
|
|
}
|
|
return ( PyFloat_FromDouble( ptr->s ) );
|
|
}
|
|
|
|
static PyObject *Metaball_setMetas( BPy_Metaball * self, PyObject * args )
|
|
{
|
|
int num, i = 0;
|
|
MetaElem *ptr = self->metaball->elems.first;
|
|
float val;
|
|
if( !PyArg_ParseTuple( args, "if", &num, &val ) )
|
|
return ( EXPP_ReturnPyObjError
|
|
( PyExc_TypeError, "expected int float args" ) );
|
|
if( !ptr )
|
|
return ( EXPP_ReturnPyObjError
|
|
( PyExc_TypeError, "No MetaElem" ) );
|
|
for( i = 0; i < num; i++ ) {
|
|
ptr = ptr->next;
|
|
}
|
|
ptr->s = val;
|
|
|
|
Py_INCREF( Py_None );
|
|
return Py_None;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static PyObject *Metaball_getMetalen( BPy_Metaball * self, PyObject * args )
|
|
{
|
|
int num;
|
|
int i = 0;
|
|
MetaElem *ptr;
|
|
|
|
if( !PyArg_ParseTuple( args, "i", &num ) )
|
|
return ( EXPP_ReturnPyObjError
|
|
( PyExc_TypeError, "expected int argument" ) );
|
|
ptr = self->metaball->elems.first;
|
|
if( !ptr )
|
|
return ( PyFloat_FromDouble( 0 ) );
|
|
for( i = 0; i < num; i++ ) {
|
|
ptr = ptr->next;
|
|
}
|
|
return ( PyFloat_FromDouble( ptr->len ) );
|
|
}
|
|
|
|
static PyObject *Metaball_setMetalen( BPy_Metaball * self, PyObject * args )
|
|
{
|
|
int num, i = 0;
|
|
float val;
|
|
MetaElem *ptr;
|
|
|
|
if( !PyArg_ParseTuple( args, "if", &num, &val ) )
|
|
return ( EXPP_ReturnPyObjError
|
|
( PyExc_TypeError, "expected int float args" ) );
|
|
ptr = self->metaball->elems.first;
|
|
if( !ptr )
|
|
return ( EXPP_ReturnPyObjError
|
|
( PyExc_TypeError, "No MetaElem" ) );
|
|
for( i = 0; i < num; i++ ) {
|
|
ptr = ptr->next;
|
|
}
|
|
ptr->len = val;
|
|
|
|
Py_INCREF( Py_None );
|
|
return Py_None;
|
|
}
|
|
|
|
|
|
|
|
/*****************************************************************************/
|
|
/* Function: MetaballDeAlloc */
|
|
/* Description: This is a callback function for the BPy_Metaball type. It is */
|
|
/* the destructor function. */
|
|
/*****************************************************************************/
|
|
static void MetaballDeAlloc( BPy_Metaball * self )
|
|
{
|
|
PyObject_DEL( self );
|
|
}
|
|
|
|
|
|
/*****************************************************************************/
|
|
/* Function: MetaelemDeAlloc */
|
|
/* Description: This is a callback function for the BPy_Metaelem type. It is */
|
|
/* the destructor function. */
|
|
/*****************************************************************************/
|
|
static void MetaelemDeAlloc( BPy_Metaelem * self )
|
|
{
|
|
PyObject_DEL( self );
|
|
}
|
|
|
|
|
|
|
|
|
|
/*****************************************************************************/
|
|
/* Function: MetaballGetAttr */
|
|
/* Description: This is a callback function for the BPy_Metaball type. It is */
|
|
/* the function that accesses BPy_Metaball "member variables" */
|
|
/* and methods. */
|
|
/*****************************************************************************/
|
|
static PyObject *MetaballGetAttr( BPy_Metaball * self, char *name )
|
|
{
|
|
|
|
if( strcmp( name, "name" ) == 0 )
|
|
return Metaball_getName( self );
|
|
if( strcmp( name, "rot" ) == 0 )
|
|
return Metaball_getrot( self );
|
|
if( strcmp( name, "loc" ) == 0 )
|
|
return Metaball_getloc( self );
|
|
if( strcmp( name, "size" ) == 0 )
|
|
return Metaball_getsize( self );
|
|
if( strcmp( name, "users" ) == 0 )
|
|
return PyInt_FromLong( self->metaball->id.us );
|
|
return Py_FindMethod( BPy_Metaball_methods, ( PyObject * ) self,
|
|
name );
|
|
}
|
|
|
|
|
|
|
|
/****************************************************************************/
|
|
/* Function: MetaballSetAttr */
|
|
/* Description: This is a callback function for the BPy_Metaball type. */
|
|
/* It sets Metaball Data attributes (member variables).*/
|
|
/****************************************************************************/
|
|
static int MetaballSetAttr( BPy_Metaball * self, char *name, PyObject * value )
|
|
{
|
|
PyObject *result = NULL;
|
|
PyObject *valtuple = Py_BuildValue( "(O)", value );
|
|
|
|
if( !valtuple )
|
|
return EXPP_ReturnIntError( PyExc_MemoryError,
|
|
"MetaballSetAttr: couldn't create PyTuple" );
|
|
|
|
if( strcmp( name, "name" ) == 0 ) {
|
|
result = Metaball_setName( self, valtuple );
|
|
}
|
|
else if( strcmp( name, "rot" ) == 0 ) {
|
|
result = Metaball_setrot( self, valtuple );
|
|
}
|
|
else if( strcmp( name, "loc" ) == 0 ) {
|
|
result = Metaball_setloc( self, valtuple );
|
|
}
|
|
|
|
else if( strcmp( name, "size" ) == 0 ) {
|
|
result = Metaball_setsize( self, valtuple );
|
|
}
|
|
else {
|
|
Py_DECREF(valtuple);
|
|
return ( EXPP_ReturnIntError
|
|
( PyExc_KeyError, "attribute not found" ) );
|
|
}
|
|
Py_DECREF(valtuple);
|
|
if (result != Py_None) {
|
|
return -1;
|
|
}
|
|
Py_DECREF(Py_None);
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static PyObject *Metaelem_getdims( BPy_Metaelem * self )
|
|
{
|
|
PyObject *l = PyList_New( 0 );
|
|
PyList_Append( l, PyFloat_FromDouble( self->metaelem->expx ) );
|
|
PyList_Append( l, PyFloat_FromDouble( self->metaelem->expy ) );
|
|
PyList_Append( l, PyFloat_FromDouble( self->metaelem->expz ) );
|
|
return l;
|
|
}
|
|
|
|
|
|
static PyObject *Metaelem_setdims( BPy_Metaelem * self, PyObject * args )
|
|
{
|
|
|
|
PyObject *listargs = 0;
|
|
if( !PyArg_ParseTuple( args, "O", &listargs ) )
|
|
return ( EXPP_ReturnPyObjError
|
|
( PyExc_TypeError, "expected a list" ) );
|
|
if( !PyList_Check( listargs ) )
|
|
return ( EXPP_ReturnPyObjError
|
|
( PyExc_TypeError, "expected a list" ) );
|
|
self->metaelem->expx =
|
|
(float)PyFloat_AsDouble( PyList_GetItem( listargs, 0 ) );
|
|
self->metaelem->expy =
|
|
(float)PyFloat_AsDouble( PyList_GetItem( listargs, 1 ) );
|
|
self->metaelem->expz =
|
|
(float)PyFloat_AsDouble( PyList_GetItem( listargs, 2 ) );
|
|
Py_INCREF( Py_None );
|
|
return Py_None;
|
|
}
|
|
|
|
|
|
|
|
static PyObject *Metaelem_getcoords( BPy_Metaelem * self )
|
|
{
|
|
PyObject *l = PyList_New( 0 );
|
|
PyList_Append( l, PyFloat_FromDouble( self->metaelem->x ) );
|
|
PyList_Append( l, PyFloat_FromDouble( self->metaelem->y ) );
|
|
PyList_Append( l, PyFloat_FromDouble( self->metaelem->z ) );
|
|
return l;
|
|
}
|
|
|
|
|
|
static PyObject *Metaelem_setcoords( BPy_Metaelem * self, PyObject * args )
|
|
{
|
|
|
|
PyObject *listargs = 0;
|
|
if( !PyArg_ParseTuple( args, "O", &listargs ) )
|
|
return ( EXPP_ReturnPyObjError
|
|
( PyExc_TypeError, "expected a list" ) );
|
|
if( !PyList_Check( listargs ) )
|
|
return ( EXPP_ReturnPyObjError
|
|
( PyExc_TypeError, "expected a list" ) );
|
|
self->metaelem->x = (float)PyFloat_AsDouble( PyList_GetItem( listargs, 0 ) );
|
|
self->metaelem->y = (float)PyFloat_AsDouble( PyList_GetItem( listargs, 1 ) );
|
|
self->metaelem->z = (float)PyFloat_AsDouble( PyList_GetItem( listargs, 2 ) );
|
|
Py_INCREF( Py_None );
|
|
return Py_None;
|
|
}
|
|
|
|
|
|
/***************************************************************************/
|
|
/* Function: MetaelemGetAttr */
|
|
/* Description: This is a callback function for the BPy_Metaelem type. */
|
|
/* It accesses BPy_Metaelem "member variables". */
|
|
/*****************************************************************************/
|
|
static PyObject *MetaelemGetAttr( BPy_Metaelem * self, char *name )
|
|
{
|
|
|
|
if( !strcmp( name, "dims" ) )
|
|
return Metaelem_getdims( self );
|
|
if( !strcmp( name, "coords" ) )
|
|
return Metaelem_getcoords( self );
|
|
if( !strcmp( name, "rad" ) )
|
|
return PyFloat_FromDouble( self->metaelem->rad );
|
|
if( !strcmp( name, "stif" ) )
|
|
return PyFloat_FromDouble( self->metaelem->s );
|
|
return Py_FindMethod( BPy_Metaelem_methods, ( PyObject * ) self,
|
|
name );
|
|
}
|
|
|
|
|
|
|
|
/*****************************************************************************/
|
|
/* Function: MetaelemSetAttr */
|
|
/* Description: This is a callback function for the BPy_Metaelem type. */
|
|
/* It sets Metaelem Data attributes (member variables). */
|
|
/****************************************************************************/
|
|
static int MetaelemSetAttr( BPy_Metaelem * self, char *name, PyObject * value )
|
|
{
|
|
|
|
if( !strcmp( name, "coords" ) ) {
|
|
PyObject *valtuple = Py_BuildValue( "(O)", value );
|
|
if( !valtuple )
|
|
return EXPP_ReturnIntError( PyExc_MemoryError,
|
|
"MetaelemSetAttr: couldn't create PyTuple" );
|
|
Metaelem_setcoords( self, valtuple );
|
|
return 0;
|
|
}
|
|
if( !strcmp( name, "dims" ) ) {
|
|
PyObject *valtuple = Py_BuildValue( "(O)", value );
|
|
if( !valtuple )
|
|
return EXPP_ReturnIntError( PyExc_MemoryError,
|
|
"MetaelemSetAttr: couldn't create PyTuple" );
|
|
Metaelem_setdims( self, valtuple );
|
|
return 0;
|
|
}
|
|
if( !strcmp( name, "rad" ) ) {
|
|
self->metaelem->rad = (float)PyFloat_AsDouble( value );
|
|
return 0;
|
|
}
|
|
if( !strcmp( name, "stif" ) ) {
|
|
self->metaelem->s = (float)PyFloat_AsDouble( value );
|
|
return 0;
|
|
}
|
|
return ( EXPP_ReturnIntError
|
|
( PyExc_KeyError, "attribute not found" ) );
|
|
}
|
|
|
|
/****************************************************************************/
|
|
/* Function: MetaballRepr */
|
|
/* Description: This is a callback function for the BPy_Metaball type. It */
|
|
/* builds a meaninful string to represent metaball objects. */
|
|
/****************************************************************************/
|
|
static PyObject *MetaballRepr( BPy_Metaball * self )
|
|
{
|
|
return PyString_FromFormat( "[Metaball \"%s\"]",
|
|
self->metaball->id.name + 2 );
|
|
}
|
|
|
|
|
|
/****************************************************************************/
|
|
/* Function: MetaelemRepr */
|
|
/* Description: This is a callback function for the BPy_Metaelem type. It */
|
|
/* builds a meaninful string to represent metaelem objects. */
|
|
/*****************************************************************************/
|
|
static PyObject *MetaelemRepr( BPy_Metaelem * self )
|
|
{
|
|
return PyString_FromString( "Metaelem" );
|
|
}
|