39
40
#include <BKE_library.h>
40
41
#include <BLI_blenlib.h>
41
42
#include <DNA_ipo_types.h>
43
#include <MEM_guardedalloc.h>
43
45
#include "constant.h"
44
46
#include "gen_utils.h"
47
/*****************************************************************************/
48
/* Python API function prototypes for the BezTriple module. */
49
/*****************************************************************************/
50
static PyObject *M_BezTriple_New (PyObject * self, PyObject * args);
51
static PyObject *M_BezTriple_Get (PyObject * self, PyObject * args);
53
/*****************************************************************************/
54
/* Python C_BezTriple instance methods declarations: */
55
/*****************************************************************************/
56
static PyObject *BezTriple_setPoints (C_BezTriple * self, PyObject * args);
57
static PyObject *BezTriple_getPoints (C_BezTriple * self);
58
static PyObject *BezTriple_getTriple (C_BezTriple * self);
60
/*****************************************************************************/
61
/* Python BezTriple_Type callback function prototypes: */
62
/*****************************************************************************/
63
static void BezTripleDeAlloc (C_BezTriple * self);
64
static int BezTripleSetAttr (C_BezTriple * self, char *name, PyObject * v);
65
static PyObject *BezTripleGetAttr (C_BezTriple * self, char *name);
66
static PyObject *BezTripleRepr (C_BezTriple * self);
68
/*****************************************************************************/
69
/* Python method structure definition for Blender.BezTriple module: */
70
/*****************************************************************************/
49
/***************************************************************************
50
Python API function prototypes for the BezTriple module.
51
***************************************************************************/
52
static PyObject *M_BezTriple_New( PyObject * self, PyObject * args );
53
static PyObject *M_BezTriple_Get( PyObject * self, PyObject * args );
55
/*************************************
56
Doc strings for the BezTriple module
57
*************************************/
59
static char M_BezTriple_doc[] = "The Blender BezTriple module\n";
61
/****************************************************************************
62
Python BPy_BezTriple instance methods declarations:
63
****************************************************************************/
64
static PyObject *BezTriple_setPoints( BPy_BezTriple * self, PyObject * args );
65
static PyObject *BezTriple_getPoints( BPy_BezTriple * self );
66
static PyObject *BezTriple_getTriple( BPy_BezTriple * self );
68
/****************************************************************************
69
Python BezTriple_Type callback function prototypes:
70
*****************************************************************************/
71
static void BezTripleDeAlloc( BPy_BezTriple * self );
72
static int BezTripleSetAttr( BPy_BezTriple * self, char *name, PyObject * v );
73
static PyObject *BezTripleGetAttr( BPy_BezTriple * self, char *name );
74
static PyObject *BezTripleRepr( BPy_BezTriple * self );
75
static PyObject *BezTriple_Str( BPy_BezTriple * self );
77
/****************************************************************************
78
Python method structure definition for Blender.BezTriple module:
79
****************************************************************************/
72
81
struct PyMethodDef M_BezTriple_methods[] = {
73
{"New", (PyCFunction) M_BezTriple_New, METH_VARARGS | METH_KEYWORDS, 0},
74
{"Get", M_BezTriple_Get, METH_VARARGS, 0},
75
{"get", M_BezTriple_Get, METH_VARARGS, 0},
79
/*****************************************************************************/
80
/* Python C_BezTriple methods table: */
81
/*****************************************************************************/
82
static PyMethodDef C_BezTriple_methods[] = {
83
/* name, method, flags, doc */
84
{"setPoints", (PyCFunction) BezTriple_setPoints, METH_VARARGS,
85
"(str) - Change BezTriple point coordinates"},
86
{"getPoints", (PyCFunction) BezTriple_getPoints, METH_NOARGS,
87
"() - return BezTriple knot point x and y coordinates"},
88
{"getTriple", (PyCFunction) BezTriple_getTriple, METH_NOARGS,
89
"() - return list of 3 floating point triplets. order is H1, knot, H2"},
94
/*****************************************************************************/
95
/* Python BezTriple_Type structure definition: */
82
{"New", ( PyCFunction ) M_BezTriple_New, METH_VARARGS | METH_KEYWORDS,
84
/* {"New", ( PyCFunction ) M_BezTriple_New, METH_O, 0}, */
85
{"Get", M_BezTriple_Get, METH_VARARGS, 0},
86
{"get", M_BezTriple_Get, METH_VARARGS, 0},
90
/*****************************************************************************/
91
/* Python BPy_BezTriple methods table: */
92
/*****************************************************************************/
93
static PyMethodDef BPy_BezTriple_methods[] = {
94
/* name, method, flags, doc */
95
{"setPoints", ( PyCFunction ) BezTriple_setPoints, METH_VARARGS,
96
"(str) - Change BezTriple point coordinates"},
97
{"getPoints", ( PyCFunction ) BezTriple_getPoints, METH_NOARGS,
98
"() - return BezTriple knot point x and y coordinates"},
99
{"getTriple", ( PyCFunction ) BezTriple_getTriple, METH_NOARGS,
100
"() - return list of 3 floating point triplets. order is H1, knot, H2"},
101
{NULL, NULL, 0, NULL}
105
/*****************************************************************************/
106
/* Python BezTriple_Type structure definition: */
96
107
/*****************************************************************************/
97
108
PyTypeObject BezTriple_Type = {
98
PyObject_HEAD_INIT (NULL) 0, /* ob_size */
99
"BezTriple", /* tp_name */
100
sizeof (C_BezTriple), /* tp_basicsize */
103
(destructor) BezTripleDeAlloc, /* tp_dealloc */
105
(getattrfunc) BezTripleGetAttr, /* tp_getattr */
106
(setattrfunc) BezTripleSetAttr, /* tp_setattr */
108
(reprfunc) BezTripleRepr, /* tp_repr */
109
0, /* tp_as_number */
110
0, /* tp_as_sequence */
111
0, /* tp_as_mapping */
116
C_BezTriple_methods, /* tp_methods */
109
PyObject_HEAD_INIT( NULL ) /* required python macro */
111
"BezTriple", /* tp_name */
112
sizeof( BPy_BezTriple ), /* tp_basicsize */
115
( destructor ) BezTripleDeAlloc, /* tp_dealloc */
117
( getattrfunc ) BezTripleGetAttr, /* tp_getattr */
118
( setattrfunc ) BezTripleSetAttr, /* tp_setattr */
120
( reprfunc ) BezTripleRepr, /* tp_repr */
121
0, /* tp_as_number */
122
0, /* tp_as_sequence */
123
0, /* tp_as_mapping */
126
0, /* ( reprfunc) BezTriple_Str, tp_str */
129
0, /* tp_as_buffer */
133
BPy_BezTriple_methods, /* tp_methods */
123
/*****************************************************************************/
124
/* Function: M_BezTriple_New */
125
/* Python equivalent: Blender.BezTriple.New */
126
/*****************************************************************************/
128
M_BezTriple_New (PyObject * self, PyObject * args)
133
/*****************************************************************************/
134
/* Function: M_BezTriple_Get */
135
/* Python equivalent: Blender.BezTriple.Get */
136
/* Description: Receives a string and returns the ipo data obj */
137
/* whose name matches the string. If no argument is */
138
/* passed in, a list of all ipo data names in the */
139
/* current scene is returned. */
140
/*****************************************************************************/
142
M_BezTriple_Get (PyObject * self, PyObject * args)
147
/*****************************************************************************/
148
/* Function: BezTripleDeAlloc */
149
/* Description: This is a callback function for the C_BezTriple type. It is */
150
/* the destructor function. */
151
/*****************************************************************************/
153
BezTripleDeAlloc (C_BezTriple * self)
159
BezTriple_getPoints (C_BezTriple * self)
161
struct BezTriple *bezt = self->beztriple;
162
PyObject *l = PyList_New (0);
164
for (i = 0; i < 2; i++)
166
PyList_Append (l, PyFloat_FromDouble (bezt->vec[1][i]));
140
/****************************************************************************
141
Function: M_BezTriple_New
142
Python equivalent: Blender.BezTriple.New
143
****************************************************************************/
145
static PyObject *M_BezTriple_New( PyObject* self, PyObject * args )
147
PyObject* in_args = NULL;
149
if( !PyArg_ParseTuple( args, "|O", &in_args) ) {
150
return( EXPP_ReturnPyObjError
151
( PyExc_AttributeError,
152
"expected sequence of 3 or 9 floats or nothing"));
156
in_args = Py_BuildValue( "(fff)", 0.0, 0.0, 0.0 );
159
return newBezTriple( in_args );
162
/****************************************************************************
163
Function: M_BezTriple_Get
164
Python equivalent: Blender.BezTriple.Get
165
Description: Receives a string and returns the ipo data obj
166
whose name matches the string. If no argument is
167
passed in, a list of all ipo data names in the
168
current scene is returned.
169
****************************************************************************/
170
static PyObject *M_BezTriple_Get( PyObject * self, PyObject * args )
175
/****************************************************************************
176
Function: BezTripleDeAlloc
177
Description: This is a callback function for the BPy_BezTriple type. It is
178
the destructor function.
179
****************************************************************************/
180
static void BezTripleDeAlloc( BPy_BezTriple * self )
183
if( self->own_memory)
184
MEM_freeN( self->beztriple );
186
PyObject_DEL( self );
189
static PyObject *BezTriple_getPoints( BPy_BezTriple * self )
191
struct BezTriple *bezt = self->beztriple;
192
PyObject *l = PyList_New( 0 );
194
for( i = 0; i < 2; i++ ) {
195
PyList_Append( l, PyFloat_FromDouble( bezt->vec[1][i] ) );
178
207
* each point consists of a list of x,y,z float values.
182
BezTriple_getTriple (C_BezTriple * self)
185
struct BezTriple *bezt = self->beztriple;
186
PyObject *retlist = PyList_New (0);
189
for (i = 0; i < 3; i++)
191
point = Py_BuildValue ("[fff]",
193
bezt->vec[i][1], bezt->vec[i][2]);
195
PyList_Append (retlist, point);
203
BezTriple_setPoints (C_BezTriple * self, PyObject * args)
207
struct BezTriple *bezt = self->beztriple;
210
if (!PyArg_ParseTuple (args, "O", &popo))
211
return (EXPP_ReturnPyObjError
212
(PyExc_TypeError, "expected sequence argument"));
214
if (PySequence_Check (popo) == 0)
216
puts ("error in BezTriple_setPoints - expected sequence");
224
this will become an overloaded args check
226
int size = PySequence_Size (popo);
227
printf ("\n dbg: sequence size is %d\n", size);
230
for (i = 0; i < 2; i++)
232
PyObject *o = PySequence_GetItem (popo, i);
234
printf ("\n bad o. o no!\n");
236
/* bezt->vec[1][i] = PyFloat_AsDouble (PyTuple_GetItem (popo, i)); */
237
bezt->vec[1][i] = PyFloat_AsDouble (o);
238
bezt->vec[0][i] = bezt->vec[1][i] - 1;
239
bezt->vec[2][i] = bezt->vec[1][i] + 1;
242
/* experimental fussing with handles - ipo.c: calchandles_ipocurve */
243
if (bezt->vec[0][0] > bezt->vec[1][0])
244
bezt->vec[0][0] = bezt->vec[1][0];
246
if (bezt->vec[2][0] < bezt->vec[1][0])
247
bezt->vec[2][0] = bezt->vec[1][0];
254
/*****************************************************************************/
255
/* Function: BezTripleGetAttr */
256
/* Description: This is a callback function for the C_BezTriple type. It is */
257
/* the function that accesses C_BezTriple "member variables" and */
259
/*****************************************************************************/
261
BezTripleGetAttr (C_BezTriple * self, char *name)
263
if (strcmp (name, "pt") == 0)
264
return BezTriple_getPoints (self);
265
else if (strcmp (name, "vec") == 0)
266
return BezTriple_getTriple (self);
268
/* look for default methods */
269
return Py_FindMethod (C_BezTriple_methods, (PyObject *) self, name);
272
/*****************************************************************************/
273
/* Function: BezTripleSetAttr */
274
/* Description: This is a callback function for the C_BezTriple type. It is the */
275
/* function that sets BezTriple Data attributes (member variables).*/
276
/*****************************************************************************/
278
BezTripleSetAttr (C_BezTriple * self, char *name, PyObject * value)
210
static PyObject *BezTriple_getTriple( BPy_BezTriple * self )
213
struct BezTriple *bezt = self->beztriple;
214
PyObject *retlist = PyList_New( 0 );
217
for( i = 0; i < 3; i++ ) {
218
point = Py_BuildValue( "[fff]",
220
bezt->vec[i][1], bezt->vec[i][2] );
222
PyList_Append( retlist, point );
229
static PyObject *BezTriple_setPoints( BPy_BezTriple * self, PyObject * args )
233
struct BezTriple *bezt = self->beztriple;
236
if( !PyArg_ParseTuple( args, "O", &popo ) )
237
return ( EXPP_ReturnPyObjError
238
( PyExc_TypeError, "expected sequence argument" ) );
240
if( PySequence_Check( popo ) == 0 ) {
241
puts( "error in BezTriple_setPoints - expected sequence" );
242
Py_INCREF( Py_None );
249
this will become an overloaded args check
251
int size = PySequence_Size( popo );
252
printf( "\n dbg: sequence size is %d\n", size );
255
for( i = 0; i < 2; i++ ) {
256
PyObject *o = PySequence_GetItem( popo, i );
258
printf( "\n bad o. o no!\n" );
260
/* bezt->vec[1][i] = PyFloat_AsDouble (PyTuple_GetItem (popo, i)); */
261
bezt->vec[1][i] = PyFloat_AsDouble( o );
262
bezt->vec[0][i] = bezt->vec[1][i] - 1;
263
bezt->vec[2][i] = bezt->vec[1][i] + 1;
266
/* experimental fussing with handles - ipo.c: calchandles_ipocurve */
267
if( bezt->vec[0][0] > bezt->vec[1][0] )
268
bezt->vec[0][0] = bezt->vec[1][0];
270
if( bezt->vec[2][0] < bezt->vec[1][0] )
271
bezt->vec[2][0] = bezt->vec[1][0];
273
Py_INCREF( Py_None );
278
/*****************************************************************************/
279
/* Function: BezTripleGetAttr */
280
/* Description: This is a callback function for the BPy_BezTriple type. It */
281
/* taccesses BPy_BezTriple "member variables" and methods. */
282
/*****************************************************************************/
283
static PyObject *BezTripleGetAttr( BPy_BezTriple * self, char *name )
285
if( strcmp( name, "pt" ) == 0 )
286
return BezTriple_getPoints( self );
287
else if( strcmp( name, "vec" ) == 0 )
288
return BezTriple_getTriple( self );
289
else if( strcmp( name, "tilt" ) == 0 )
290
return PyFloat_FromDouble(self->beztriple->alfa);
291
else if( strcmp( name, "__members__" ) == 0 )
292
return Py_BuildValue( "[s,s,s]", "pt", "vec", "tilt" );
294
/* look for default methods */
295
return Py_FindMethod( BPy_BezTriple_methods, ( PyObject * ) self, name );
298
/*****************************************************************************/
299
/* Function: BezTripleSetAttr */
300
/* Description: This is a callback function for the BPy_BezTriple type. It */
301
/* sets BezTriple Data attributes (member variables). */
302
/*****************************************************************************/
303
static int BezTripleSetAttr( BPy_BezTriple * self, char *name, PyObject * value )
282
this does not work at the moment: Wed Apr 7 2004
283
when the necessary code to make pt act like a sequence is
284
available, it will be reenabled
287
if (strcmp (name, "pt") == 0)
288
BezTriple_setPoints (self, value);
290
return 0; /* normal exit */
307
this does not work at the moment: Wed Apr 7 2004
308
when the necessary code to make pt act like a sequence is
309
available, it will be reenabled
312
if( strcmp( name, "pt" ) == 0 )
313
BezTriple_setPoints( self, value );
315
return 0; /* normal exit */
293
return (EXPP_ReturnIntError (PyExc_AttributeError,
294
"cannot set a read-only attribute"));
317
if( strcmp( name, "tilt" ) == 0 ) {
318
if (!PyFloat_Check( value ) )
319
return EXPP_ReturnIntError( PyExc_TypeError, "expected a float" );
321
self->beztriple->alfa = (float)PyFloat_AsDouble( value );
325
return ( EXPP_ReturnIntError( PyExc_AttributeError,
326
"cannot set a read-only attribute" ) );
297
329
/*****************************************************************************/
298
330
/* Function: BezTripleRepr */
299
/* Description: This is a callback function for the C_BezTriple type. It */
331
/* Description: This is a callback function for the BPy_BezTriple type. It */
300
332
/* builds a meaninful string to represent BezTriple objects. */
301
333
/*****************************************************************************/
303
BezTripleRepr (C_BezTriple * self)
309
char f1, f2, f3, hide;
313
"BezTriple %f %f %f %f %f %f %f %f %f %f\n %d %d %d %d %d %d %d %d %d %d %d %d\n",
314
self->beztriple->vec[0][0], self->beztriple->vec[0][1],
315
self->beztriple->vec[0][2], self->beztriple->vec[1][0],
316
self->beztriple->vec[1][1], self->beztriple->vec[1][2],
317
self->beztriple->vec[2][0], self->beztriple->vec[2][1],
318
self->beztriple->vec[2][2], self->beztriple->alfa,
319
self->beztriple->s[0][0], self->beztriple->s[0][1],
320
self->beztriple->s[1][0], self->beztriple->s[1][1],
321
self->beztriple->s[2][0], self->beztriple->s[1][1],
322
self->beztriple->h1, self->beztriple->h2, self->beztriple->f1,
323
self->beztriple->f2, self->beztriple->f3, self->beztriple->hide);
324
return PyString_FromString (str);
334
static PyObject *BezTripleRepr( BPy_BezTriple * self )
340
char f1, f2, f3, hide;
344
"BezTriple %f %f %f %f %f %f %f %f %f %f\n %d %d %d %d %d %d %d %d %d %d %d %d\n",
345
self->beztriple->vec[0][0], self->beztriple->vec[0][1],
346
self->beztriple->vec[0][2], self->beztriple->vec[1][0],
347
self->beztriple->vec[1][1], self->beztriple->vec[1][2],
348
self->beztriple->vec[2][0], self->beztriple->vec[2][1],
349
self->beztriple->vec[2][2], self->beztriple->alfa,
350
self->beztriple->s[0][0], self->beztriple->s[0][1],
351
self->beztriple->s[1][0], self->beztriple->s[1][1],
352
self->beztriple->s[2][0], self->beztriple->s[1][1],
353
self->beztriple->h1, self->beztriple->h2, self->beztriple->f1,
354
self->beztriple->f2, self->beztriple->f3,
355
self->beztriple->hide );
356
return PyString_FromString( str );
362
display object as string.
363
equivalent to python str(o)
366
static PyObject *BezTriple_Str( BPy_BezTriple * self )
368
BezTriple *p = self->beztriple;
371
return PyString_FromFormat(
372
"BezTriple (%f %f %f) (%f %f %f) (%f %f %f) alpha %f\n (%d %d) (%d %d) (%d %d) h1:%d h2:%d f1:%d f2:%d f3:%d hide:%d",
373
p->vec[0][0], p->vec[0][1], p->vec[0][2],
374
p->vec[1][0], p->vec[1][1], p->vec[1][2],
375
p->vec[2][0], p->vec[2][1], p->vec[2][2],
377
p->s[0][0], p->s[0][1],
378
p->s[1][0], p->s[1][1],
379
p->s[2][0], p->s[1][1],
391
PyObject *BezTriple_Init( void )
395
BezTriple_Type.ob_type = &PyType_Type;
397
submodule = Py_InitModule3( "Blender.BezTriple",
327
404
/* Three Python BezTriple_Type helper functions needed by the Object module: */
329
/*****************************************************************************/
330
/* Function: BezTriple_CreatePyObject */
331
/* Description: This function will create a new C_BezTriple from an existing */
332
/* Blender ipo structure. */
333
/*****************************************************************************/
335
BezTriple_CreatePyObject (BezTriple * bzt)
406
/****************************************************************************
407
Function: BezTriple_CreatePyObject
408
Description: This function will create a new BPy_BezTriple from an existing
409
Blender ipo structure.
410
****************************************************************************/
411
PyObject *BezTriple_CreatePyObject( BezTriple * bzt )
337
C_BezTriple *pybeztriple;
339
pybeztriple = (C_BezTriple *) PyObject_NEW (C_BezTriple, &BezTriple_Type);
342
return EXPP_ReturnPyObjError (PyExc_MemoryError,
343
"couldn't create C_BezTriple object");
345
pybeztriple->beztriple = bzt;
347
return (PyObject *) pybeztriple;
413
BPy_BezTriple *pybeztriple;
416
( BPy_BezTriple * ) PyObject_NEW( BPy_BezTriple, &BezTriple_Type );
419
return EXPP_ReturnPyObjError( PyExc_MemoryError,
420
"couldn't create BPy_BezTriple object" );
422
pybeztriple->beztriple = bzt;
424
return ( PyObject * ) pybeztriple;
350
428
/*****************************************************************************/
351
/* Function: BezTriple_CheckPyObject */
429
/* Function: BezTriple_CheckPyObject */
352
430
/* Description: This function returns true when the given PyObject is of the */
353
/* type BezTriple. Otherwise it will return false. */
431
/* type BezTriple. Otherwise it will return false. */
354
432
/*****************************************************************************/
356
BezTriple_CheckPyObject (PyObject * pyobj)
433
int BezTriple_CheckPyObject( PyObject * pyobj )
358
return (pyobj->ob_type == &BezTriple_Type);
435
return ( pyobj->ob_type == &BezTriple_Type );
361
438
/*****************************************************************************/
362
/* Function: BezTriple_FromPyObject */
363
/* Description: This function returns the Blender beztriple from the given */
439
/* Function: BezTriple_FromPyObject */
440
/* Description: This function returns the Blender beztriple from the given */
365
442
/*****************************************************************************/
367
BezTriple_FromPyObject (PyObject * pyobj)
369
return ((C_BezTriple *) pyobj)->beztriple;
443
BezTriple *BezTriple_FromPyObject( PyObject * pyobj )
445
return ( ( BPy_BezTriple * ) pyobj )->beztriple;
450
Create a new BezTriple
451
input args is a sequence - either 3 or 9 floats
454
PyObject *newBezTriple( PyObject *args)
456
BPy_BezTriple *pybez = NULL;
461
sequence of nine floats - x,y,z for h1, pt, h2
462
sequence of 3 floats - x,y,z for pt with zero len handles in AUTO mode
465
/* do we have a sequence of the right length? */
467
if( ! PySequence_Check( args )) {
468
return ( EXPP_ReturnPyObjError( PyExc_AttributeError,
469
"expected better stuff"));
472
length = PySequence_Length( args );
473
if( length != 9 && length != 3 )
474
return EXPP_ReturnPyObjError( PyExc_AttributeError,
475
"wrong number of points");
479
for( i = 0; i < length; i++) {
480
pyo = PySequence_GetItem( args, i );
482
return EXPP_ReturnPyObjError
483
( PyExc_AttributeError,
484
"wrong number of points");
485
if( !PyFloat_Check( pyo ))
486
return EXPP_ReturnPyObjError
487
( PyExc_AttributeError,
488
"sequence item not number");
490
numbuf[i] = (float) PyFloat_AsDouble( pyo );
491
Py_DECREF( pyo ); /* from GetItem() */
496
/* create our bpy object */
497
pybez = ( BPy_BezTriple* ) PyObject_New( BPy_BezTriple,
500
return EXPP_ReturnPyObjError( PyExc_MemoryError,
501
"PyObject_New failed");
502
pybez->beztriple = MEM_callocN( sizeof( BezTriple ), "new bpytriple");
505
pybez->own_memory = 1; /* we own it. must free later */
512
for( i = 0; i < 3; i++ ){
513
for( j = 0; j < 3; j++){
514
pybez->beztriple->vec[i][j] = numbuf[num ++];
522
/* set h1, pt, and h2 to the same values. */
523
for( i = 0; i < 3; i++ ) {
524
pybez->beztriple->vec[0][i] = numbuf[num];
525
pybez->beztriple->vec[1][i] = numbuf[num];
526
pybez->beztriple->vec[2][i] = numbuf[num];
532
/* we should not be here! */
537
pybez->beztriple->h1 = HD_AUTO;
538
pybez->beztriple->h2 = HD_AUTO;
540
return ( PyObject* ) pybez;