37
37
#include "gen_utils.h"
38
38
#include "BezTriple.h"
42
41
* forward declarations go here
46
44
static PyObject *M_CurNurb_New( PyObject * self, PyObject * args );
47
static PyObject *CurNurb_setMatIndex( BPy_CurNurb * self, PyObject * args );
45
static PyObject *CurNurb_oldsetMatIndex( BPy_CurNurb * self, PyObject * args );
46
static int CurNurb_setMatIndex( BPy_CurNurb * self, PyObject * args );
48
47
static PyObject *CurNurb_getMatIndex( BPy_CurNurb * self );
49
48
static PyObject *CurNurb_getFlagU( BPy_CurNurb * self );
50
static PyObject *CurNurb_setFlagU( BPy_CurNurb * self, PyObject * args );
49
static PyObject *CurNurb_oldsetFlagU( BPy_CurNurb * self, PyObject * args );
50
static int CurNurb_setFlagU( BPy_CurNurb * self, PyObject * args );
51
51
static PyObject *CurNurb_getFlagV( BPy_CurNurb * self );
52
static PyObject *CurNurb_setFlagV( BPy_CurNurb * self, PyObject * args );
52
static PyObject *CurNurb_oldsetFlagV( BPy_CurNurb * self, PyObject * args );
53
static int CurNurb_setFlagV( BPy_CurNurb * self, PyObject * args );
53
54
static PyObject *CurNurb_getType( BPy_CurNurb * self );
54
static PyObject *CurNurb_setType( BPy_CurNurb * self, PyObject * args );
55
static PyObject *CurNurb_oldsetType( BPy_CurNurb * self, PyObject * args );
56
static int CurNurb_setType( BPy_CurNurb * self, PyObject * args );
57
static PyObject *CurNurb_getKnotsU( BPy_CurNurb * self );
58
static PyObject *CurNurb_getKnotsV( BPy_CurNurb * self );
59
static PyObject *CurNurb_getPoints( BPy_CurNurb * self );
55
60
/* static PyObject* CurNurb_setXXX( BPy_CurNurb* self, PyObject* args ); */
56
61
static int CurNurb_setPoint( BPy_CurNurb * self, int index, PyObject * ob );
57
62
static int CurNurb_length( PyInstanceObject * inst );
72
77
CurNurb_Type callback function prototypes:
75
static void CurNurb_dealloc( BPy_CurNurb * self );
76
80
static int CurNurb_compare( BPy_CurNurb * a, BPy_CurNurb * b );
77
static PyObject *CurNurb_getAttr( BPy_CurNurb * self, char *name );
78
static int CurNurb_setAttr( BPy_CurNurb * self, char *name, PyObject * v );
79
81
static PyObject *CurNurb_repr( BPy_CurNurb * self );
84
84
table of module methods
85
85
these are the equivalent of class or static methods.
108
108
static PyMethodDef BPy_CurNurb_methods[] = {
109
109
/* name, method, flags, doc */
110
110
/* {"method", (PyCFunction) CurNurb_method, METH_NOARGS, " () - doc string"} */
111
{"setMatIndex", ( PyCFunction ) CurNurb_setMatIndex, METH_VARARGS,
111
{"setMatIndex", ( PyCFunction ) CurNurb_oldsetMatIndex, METH_VARARGS,
112
112
"( index ) - set index into materials list"},
113
113
{"getMatIndex", ( PyCFunction ) CurNurb_getMatIndex, METH_NOARGS,
114
114
"( ) - get current material index"},
115
{"setFlagU", ( PyCFunction ) CurNurb_setFlagU, METH_VARARGS,
115
{"setFlagU", ( PyCFunction ) CurNurb_oldsetFlagU, METH_VARARGS,
116
116
"( index ) - set flagU and recalculate the knots (0: uniform, 1: endpoints, 2: bezier)"},
117
117
{"getFlagU", ( PyCFunction ) CurNurb_getFlagU, METH_NOARGS,
118
118
"( ) - get flagU of the knots"},
119
{"setFlagV", ( PyCFunction ) CurNurb_setFlagV, METH_VARARGS,
119
{"setFlagV", ( PyCFunction ) CurNurb_oldsetFlagV, METH_VARARGS,
120
120
"( index ) - set flagV and recalculate the knots (0: uniform, 1: endpoints, 2: bezier)"},
121
121
{"getFlagV", ( PyCFunction ) CurNurb_getFlagV, METH_NOARGS,
122
122
"( ) - get flagV of the knots"},
123
{"setType", ( PyCFunction ) CurNurb_setType, METH_VARARGS,
123
{"setType", ( PyCFunction ) CurNurb_oldsetType, METH_VARARGS,
124
124
"( type ) - change the type of the curve (Poly: 0, Bezier: 1, NURBS: 4)"},
125
125
{"getType", ( PyCFunction ) CurNurb_getType, METH_NOARGS,
126
126
"( ) - get the type of the curve (Poly: 0, Bezier: 1, NURBS: 4)"},
159
static PyGetSetDef BPy_CurNurb_getseters[] = {
161
(getter)CurNurb_getMatIndex, (setter)CurNurb_setMatIndex,
162
"CurNurb's material index",
165
(getter)CurNurb_getPoints, (setter)NULL,
166
"The number of curve points",
169
(getter)CurNurb_getFlagU, (setter)CurNurb_setFlagU,
170
"The knot type in the U direction",
173
(getter)CurNurb_getFlagV, (setter)CurNurb_setFlagV,
174
"The knot type in the V direction",
177
(getter)CurNurb_getType, (setter)CurNurb_setType,
178
"The curve type (poly: bezier, or NURBS)",
181
(getter)CurNurb_getKnotsU, (setter)NULL,
182
"The The knot vector in the U direction",
185
(getter)CurNurb_getKnotsV, (setter)NULL,
186
"The The knot vector in the V direction",
189
{NULL,NULL,NULL,NULL,NULL} /* Sentinel */
162
193
Object Type definition
176
207
/* Methods to implement standard operations */
178
( destructor ) CurNurb_dealloc, /* destructor tp_dealloc; */
179
0, /* printfunc tp_print; */
180
( getattrfunc ) CurNurb_getAttr, /* getattrfunc tp_getattr; */
181
( setattrfunc ) CurNurb_setAttr, /* setattrfunc tp_setattr; */
209
NULL, /* destructor tp_dealloc; */
210
NULL, /* printfunc tp_print; */
211
NULL, /* getattrfunc tp_getattr; */
212
NULL, /* setattrfunc tp_setattr; */
182
213
( cmpfunc ) CurNurb_compare, /* cmpfunc tp_compare; */
183
214
( reprfunc ) CurNurb_repr, /* reprfunc tp_repr; */
225
256
/*** Attribute descriptor and subclassing stuff ***/
226
257
BPy_CurNurb_methods, /* struct PyMethodDef *tp_methods; */
227
258
0, /* struct PyMemberDef *tp_members; */
228
0, /* struct PyGetSetDef *tp_getset; */
259
BPy_CurNurb_getseters, /* struct PyGetSetDef *tp_getset; */
229
260
0, /* struct _typeobject *tp_base; */
230
261
0, /* PyObject *tp_dict; */
231
262
0, /* descrgetfunc tp_descr_get; */
253
void CurNurb_dealloc( BPy_CurNurb * self )
255
PyObject_DEL( self );
260
static PyObject *CurNurb_getAttr( BPy_CurNurb * self, char *name )
262
PyObject *attr = Py_None;
264
if( strcmp( name, "mat_index" ) == 0 )
265
attr = PyInt_FromLong( self->nurb->mat_nr );
267
else if( strcmp( name, "points" ) == 0 )
268
attr = PyInt_FromLong( self->nurb->pntsu );
270
else if( strcmp( name, "flagU" ) == 0 )
271
attr = CurNurb_getFlagU( self );
273
else if( strcmp( name, "flagV" ) == 0 )
274
attr = CurNurb_getFlagV( self );
276
else if( strcmp( name, "type" ) == 0 )
277
attr = CurNurb_getType( self );
279
else if( strcmp( name, "__members__" ) == 0 )
280
attr = Py_BuildValue( "[s,s,s,s,s]", "mat_index", "points", "flagU", "flagV", "type" );
283
return EXPP_ReturnPyObjError( PyExc_MemoryError,
284
"couldn't create PyObject" );
286
/* member attribute found, return it */
287
if( attr != Py_None )
290
/* not an attribute, search the methods table */
291
return Py_FindMethod( BPy_CurNurb_methods, ( PyObject * ) self, name );
299
static int CurNurb_setAttr( BPy_CurNurb * self, char *name, PyObject * value )
302
PyObject *error = NULL;
304
/* make a tuple to pass to our type methods */
305
valtuple = Py_BuildValue( "(O)", value );
308
return EXPP_ReturnIntError( PyExc_MemoryError,
309
"CurNurb.setAttr: cannot create pytuple" );
311
if( strcmp( name, "mat_index" ) == 0 )
312
error = CurNurb_setMatIndex( self, valtuple );
314
else if( strcmp( name, "flagU" ) == 0 )
315
error = CurNurb_setFlagU( self, valtuple );
317
else if( strcmp( name, "flagV" ) == 0 )
318
error = CurNurb_setFlagV( self, valtuple );
320
else if( strcmp( name, "type" ) == 0 )
321
error = CurNurb_setType( self, valtuple );
323
else { /* error - no match for name */
324
Py_DECREF( valtuple );
326
if( ( strcmp( name, "ZZZZ" ) == 0 ) || /* user tried to change a */
327
( strcmp( name, "ZZZZ" ) == 0 ) ) /* constant dict type ... */
328
return EXPP_ReturnIntError( PyExc_AttributeError,
329
"constant dictionary -- cannot be changed" );
331
return EXPP_ReturnIntError( PyExc_KeyError,
332
"attribute not found" );
336
Py_DECREF( valtuple ); /* since it is not being returned */
337
if( error != Py_None )
340
Py_DECREF( Py_None );
341
return 0; /* normal exit */
346
283
in this case, we consider two CurNurbs equal, if they point to the same
406
343
* Convert the curve using Blender's convertspline fonction
408
static PyObject *CurNurb_setType( BPy_CurNurb * self, PyObject * args )
345
static int CurNurb_setType( BPy_CurNurb * self, PyObject * args )
410
Nurb *nurb = self->nurb;
413
/* parameter type checking */
414
if( !PyArg_ParseTuple( args, "h", &type ) )
415
return EXPP_ReturnPyObjError
416
( PyExc_TypeError, "expected integer argument" );
347
PyObject* integer = PyNumber_Int( args );
351
return EXPP_ReturnIntError( PyExc_TypeError,
352
"expected integer argument" );
354
value = ( short )PyInt_AS_LONG( integer );
355
Py_DECREF( integer );
418
357
/* parameter value checking */
419
if (type != CU_POLY &&
422
return EXPP_ReturnPyObjError
423
( PyExc_ValueError, "expected integer argument" );
358
if (value != CU_POLY && value != CU_BEZIER && value != CU_NURBS)
359
return EXPP_ReturnIntError( PyExc_ValueError,
360
"expected integer argument" );
425
362
/* convert and raise error if impossible */
426
if (convertspline(type, nurb))
427
return EXPP_ReturnPyObjError
428
( PyExc_ValueError, "Conversion Impossible" );
430
return EXPP_incr_ret( Py_None );
363
if (convertspline(value, self->nurb))
364
return EXPP_ReturnIntError( PyExc_ValueError,
365
"Conversion Impossible" );
373
* returns curve's knotsU in a tuple. Empty tuple is returned if curve
374
* isn't Nurbs or it doesn't have knots in U
377
static PyObject *CurNurb_getKnotsU( BPy_CurNurb * self )
379
if(self->nurb->knotsu) {
380
int len = KNOTSU(self->nurb);
382
PyObject *knotsu = PyTuple_New(len);
384
return EXPP_ReturnPyObjError( PyExc_RuntimeError,
385
"could not get CurNurb.knotsU attribute" );
387
for(i = 0; i < len; ++i)
388
PyTuple_SetItem(knotsu, i,
389
PyFloat_FromDouble(self->nurb->knotsu[i]));
393
return PyTuple_New(0);
399
* returns curve's knotsV in a tuple. Empty tuple is returned if curve doesn't have knots in V
402
static PyObject *CurNurb_getKnotsV( BPy_CurNurb * self )
404
if(self->nurb->knotsv) {
405
int len = KNOTSV(self->nurb);
407
PyObject *knotsv = PyTuple_New(len);
409
return EXPP_ReturnPyObjError( PyExc_RuntimeError,
410
"could not get CurNurb.knotsV index" );
412
for(i = 0; i < len; ++i)
413
PyTuple_SetItem(knotsv, i,
414
PyFloat_FromDouble(self->nurb->knotsv[i] ));
418
return PyTuple_New(0);
421
static PyObject *CurNurb_getPoints( BPy_CurNurb * self )
423
PyObject *attr = PyInt_FromLong( ( long ) self->nurb->pntsu );
428
return EXPP_ReturnPyObjError( PyExc_RuntimeError,
429
"could not get number of points" );
436
433
* CurNurb_append( point )
587
584
* set index into material list
590
static PyObject *CurNurb_setMatIndex( BPy_CurNurb * self, PyObject * args )
587
static int CurNurb_setMatIndex( BPy_CurNurb * self, PyObject * args )
594
if( !PyArg_ParseTuple( args, "i", &( index ) ) )
595
return ( EXPP_ReturnPyObjError
596
( PyExc_AttributeError,
597
"expected integer argument" ) );
599
/* fixme: some range checking would be nice! */
600
self->nurb->mat_nr = (short)index;
602
Py_INCREF( Py_None );
589
printf ("%d\n", self->nurb->mat_nr);
590
return EXPP_setIValueRange( args, &self->nurb->mat_nr, 0, 15, 'h' );
646
633
* bit 0 controls CU_CYCLIC
649
static PyObject *CurNurb_setFlagU( BPy_CurNurb * self, PyObject * args )
636
static int CurNurb_setFlagU( BPy_CurNurb * self, PyObject * args )
653
if( !PyArg_ParseTuple( args, "i", &( flagu ) ) )
654
return EXPP_ReturnPyObjError( PyExc_TypeError,
655
"expected integer argument in range [0,5]" );
657
if( flagu < 0 || flagu > 5 )
658
return EXPP_ReturnPyObjError( PyExc_AttributeError,
659
"expected integer argument in range [0,5]" );
661
if( self->nurb->flagu != flagu ) {
662
self->nurb->flagu = (short)flagu;
638
PyObject* integer = PyNumber_Int( args );
642
return EXPP_ReturnIntError( PyExc_TypeError,
643
"expected integer argument" );
645
value = ( short )PyInt_AS_LONG( integer );
646
Py_DECREF( integer );
648
if( value < 0 || value > 5 )
649
return EXPP_ReturnIntError( PyExc_ValueError,
650
"expected integer argument in range [0,5]" );
652
if( self->nurb->flagu != value ) {
653
self->nurb->flagu = (short)value;
663
654
makeknots( self->nurb, 1, self->nurb->flagu >> 1 );
666
Py_INCREF( Py_None );
692
682
* Possible values: 0 - uniform, 1 - endpoints, 2 - bezier
695
static PyObject *CurNurb_setFlagV( BPy_CurNurb * self, PyObject * args )
685
static int CurNurb_setFlagV( BPy_CurNurb * self, PyObject * args )
699
if( !PyArg_ParseTuple( args, "i", &( flagv ) ) )
700
return EXPP_ReturnPyObjError( PyExc_TypeError,
701
"expected integer argument in range [0,5]" );
703
if( flagv < 0 || flagv > 5 )
704
return EXPP_ReturnPyObjError( PyExc_AttributeError,
705
"expected integer argument in range [0,5]" );
707
if( self->nurb->flagv != flagv ) {
708
self->nurb->flagv = (short)flagv;
687
PyObject* integer = PyNumber_Int( args );
691
return EXPP_ReturnIntError( PyExc_TypeError,
692
"expected integer argument" );
694
value = ( short )PyInt_AS_LONG( integer );
695
Py_DECREF( integer );
697
if( value < 0 || value > 5 )
698
return EXPP_ReturnIntError( PyExc_ValueError,
699
"expected integer argument in range [0,5]" );
701
if( self->nurb->flagv != value ) {
702
self->nurb->flagv = (short)value;
709
703
makeknots( self->nurb, 2, self->nurb->flagv >> 1 );
712
Py_INCREF( Py_None );
877
868
/* check index limits */
878
869
if( index < 0 || index >= nurb->pntsu )
879
870
return EXPP_ReturnIntError( PyExc_IndexError,
880
"array assignment index out of range\n" );
871
"array assignment index out of range" );
883
874
/* branch by curve type */
884
875
if ((nurb->type & 7)==CU_BEZIER) { /* BEZIER */
885
876
/* check parameter type */
886
if( !BezTriple_CheckPyObject( pyOb ) )
877
if( !BPy_BezTriple_Check( pyOb ) )
887
878
return EXPP_ReturnIntError( PyExc_TypeError,
888
"expected a BezTriple\n" );
879
"expected a BezTriple" );
890
881
/* copy bezier in array */
891
882
memcpy( nurb->bezt + index,
899
890
/* check parameter type */
900
891
if (!PySequence_Check( pyOb ))
901
892
return EXPP_ReturnIntError( PyExc_TypeError,
902
"expected a list of 4 (or optionaly 5 if the curve is 3D) floats\n" );
893
"expected a list of 4 (or optionally 5 if the curve is 3D) floats" );
904
895
size = PySequence_Size( pyOb );
906
897
/* check sequence size */
907
898
if( size != 4 && size != 5 )
908
899
return EXPP_ReturnIntError( PyExc_TypeError,
909
"expected a list of 4 (or optionaly 5 if the curve is 3D) floats\n" );
900
"expected a list of 4 (or optionally 5 if the curve is 3D) floats" );
911
902
/* copy x, y, z, w */
912
903
for( i = 0; i < 4; ++i ) {
971
962
} else /* something is horribly wrong */
972
963
/* neither bp or bezt is set && pntsu != 0 */
973
return ( EXPP_ReturnPyObjError( PyExc_SystemError,
974
"inconsistant structure found" ) );
980
int CurNurb_CheckPyObject( PyObject * py_obj )
982
return ( py_obj->ob_type == &CurNurb_Type );
986
PyObject *CurNurb_Init( void )
990
CurNurb_Type.ob_type = &PyType_Type;
993
Py_InitModule3( "Blender.CurNurb", M_CurNurb_methods,
995
return ( submodule );
964
return EXPP_ReturnPyObjError( PyExc_SystemError,
965
"inconsistant structure found" );
1006
978
Nurb *nurb = self->nurb;
1007
979
int npoints = 0;
1009
if( ! self->nurb ){ /* bail on error */
1010
printf("\n no Nurb in this CurNurb");
982
return EXPP_ReturnPyObjError( PyExc_RuntimeError,
983
"no Nurb in this CurNurb");
1014
985
printf(" type: %d, mat_nr: %d hide: %d flag: %d",
1015
986
nurb->type, nurb->mat_nr, nurb->hide, nurb->flag);
1076
1047
Py_RETURN_NONE;
1079
PyObject *CurNurb_switchDirection( BPy_CurNurb * self ) {
1080
Nurb *nurb = self->nurb;
1081
if( ! self->nurb ){ /* bail on error */
1082
printf("\n no Nurb in this CurNurb");
1050
PyObject *CurNurb_switchDirection( BPy_CurNurb * self )
1053
return EXPP_ReturnPyObjError( PyExc_RuntimeError,
1054
"no Nurb in this CurNurb");
1086
switchdirectionNurb( nurb );
1056
switchdirectionNurb( self->nurb );
1088
1058
Py_RETURN_NONE;
1061
PyObject *CurNurb_Init( void )
1063
if( PyType_Ready( &CurNurb_Type ) < 0)
1066
return Py_InitModule3( "Blender.CurNurb", M_CurNurb_methods,
1070
/* #####DEPRECATED###### */
1072
static PyObject *CurNurb_oldsetType( BPy_CurNurb * self, PyObject * args )
1074
return EXPP_setterWrapper( (void *)self, args,
1075
(setter)CurNurb_setType );
1078
static PyObject *CurNurb_oldsetMatIndex( BPy_CurNurb * self, PyObject * args )
1080
return EXPP_setterWrapper( (void *)self, args,
1081
(setter)CurNurb_setMatIndex );
1084
static PyObject *CurNurb_oldsetFlagU( BPy_CurNurb * self, PyObject * args )
1086
return EXPP_setterWrapper( (void *)self, args,
1087
(setter)CurNurb_setFlagU );
1090
static PyObject *CurNurb_oldsetFlagV( BPy_CurNurb * self, PyObject * args )
1092
return EXPP_setterWrapper( (void *)self, args,
1093
(setter)CurNurb_setFlagV );