Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTamito Kajiyama <rd6t-kjym@asahi-net.or.jp>2009-07-25 15:27:18 +0400
committerTamito Kajiyama <rd6t-kjym@asahi-net.or.jp>2009-07-25 15:27:18 +0400
commitfec3ddabb1d75ee6a3a28589813f2acc85215e18 (patch)
treefd50e11cb9540fdcfad454458f6887091b330281 /source/blender/freestyle/intern/python
parentd7bce7e10952ac47551132c93f64d9aa8e54f1db (diff)
* Better support for vector-like objects in method arguments.
Now the following methods in the Freestyle Python API accept not only Blender.Mathutils.Vector instances but also lists and tuples having an appropriate number of elements. FrsNoise::turbulence2() FrsNoise::turbulence3() FrsNoise::smoothNoise2() FrsNoise::smoothNoise3() SVertex::__init__() SVertex::setPoint3D() SVertex::setPoint2D() SVertex::AddNormal() FEdgeSharp::setNormalA() FEdgeSharp::setNormalB() FEdgeSmooth::setNormal() CalligraphicShader::__init__() StrokeAttribute::setAttributeVec2f() StrokeAttribute::setAttributeVec3f() StrokeAttribute::setColor() StrokeVertex::setPoint() * Added the following converters for the sake of the improvements mentioned above. Vec2f_ptr_from_PyObject() Vec3f_ptr_from_PyObject() Vec3r_ptr_from_PyObject() Vec2f_ptr_from_PyList() Vec3f_ptr_from_PyList() Vec3r_ptr_from_PyList() Vec2f_ptr_from_PyTuple() Vec3f_ptr_from_PyTuple() Vec3r_ptr_from_PyTuple() Those converters with the suffixes _PyList and _PyTuple accept only lists and tuples having an appropriate number of elements, respectively, while those with the suffix _PyObject accept lists, tuples, or Blender.Mathutils.Vector instances. * Fixed a null pointer reference in Interface0D___dealloc__(). * Corrected the names of 3 methods in the FEdgeSmooth class.
Diffstat (limited to 'source/blender/freestyle/intern/python')
-rw-r--r--source/blender/freestyle/intern/python/BPy_Convert.cpp85
-rw-r--r--source/blender/freestyle/intern/python/BPy_Convert.h9
-rw-r--r--source/blender/freestyle/intern/python/BPy_FrsNoise.cpp69
-rw-r--r--source/blender/freestyle/intern/python/BPy_Interface0D.cpp3
-rw-r--r--source/blender/freestyle/intern/python/BPy_StrokeAttribute.cpp64
-rw-r--r--source/blender/freestyle/intern/python/Interface0D/BPy_SVertex.cpp72
-rw-r--r--source/blender/freestyle/intern/python/Interface0D/CurvePoint/BPy_StrokeVertex.cpp22
-rw-r--r--source/blender/freestyle/intern/python/Interface1D/FEdge/BPy_FEdgeSharp.cpp34
-rw-r--r--source/blender/freestyle/intern/python/Interface1D/FEdge/BPy_FEdgeSmooth.cpp23
-rw-r--r--source/blender/freestyle/intern/python/StrokeShader/BPy_CalligraphicShader.cpp13
10 files changed, 218 insertions, 176 deletions
diff --git a/source/blender/freestyle/intern/python/BPy_Convert.cpp b/source/blender/freestyle/intern/python/BPy_Convert.cpp
index 1d9dc372bd0..332f6061c8f 100644
--- a/source/blender/freestyle/intern/python/BPy_Convert.cpp
+++ b/source/blender/freestyle/intern/python/BPy_Convert.cpp
@@ -376,6 +376,39 @@ Nature::EdgeNature EdgeNature_from_BPy_Nature( PyObject* obj ) {
return static_cast<Nature::EdgeNature>( PyInt_AsLong(obj) );
}
+Vec2f * Vec2f_ptr_from_PyObject( PyObject* obj ) {
+ Vec2f *v;
+ if( (v = Vec2f_ptr_from_Vector( obj )) )
+ return v;
+ if( (v = Vec2f_ptr_from_PyList( obj )) )
+ return v;
+ if( (v = Vec2f_ptr_from_PyTuple( obj )) )
+ return v;
+ return NULL;
+}
+
+Vec3f * Vec3f_ptr_from_PyObject( PyObject* obj ) {
+ Vec3f *v;
+ if( (v = Vec3f_ptr_from_Vector( obj )) )
+ return v;
+ if( (v = Vec3f_ptr_from_PyList( obj )) )
+ return v;
+ if( (v = Vec3f_ptr_from_PyTuple( obj )) )
+ return v;
+ return NULL;
+}
+
+Vec3r * Vec3r_ptr_from_PyObject( PyObject* obj ) {
+ Vec3r *v;
+ if( (v = Vec3r_ptr_from_Vector( obj )) )
+ return v;
+ if( (v = Vec3r_ptr_from_PyList( obj )) )
+ return v;
+ if( (v = Vec3r_ptr_from_PyTuple( obj )) )
+ return v;
+ return NULL;
+}
+
Vec2f * Vec2f_ptr_from_Vector( PyObject* obj ) {
PyObject *v;
if (!VectorObject_Check(obj) || ((VectorObject *)obj)->size != 2)
@@ -424,6 +457,58 @@ Vec3r * Vec3r_ptr_from_Vector( PyObject* obj ) {
return new Vec3r(x,y,z);
}
+Vec2f * Vec2f_ptr_from_PyList( PyObject* obj ) {
+ if( !PyList_Check(obj) || PyList_Size(obj) != 2 )
+ return NULL;
+ float x = PyFloat_AsDouble(PyList_GetItem(obj, 0));
+ float y = PyFloat_AsDouble(PyList_GetItem(obj, 1));
+ return new Vec2f(x,y);
+}
+
+Vec3f * Vec3f_ptr_from_PyList( PyObject* obj ) {
+ if( !PyList_Check(obj) || PyList_Size(obj) != 3 )
+ return NULL;
+ float x = PyFloat_AsDouble(PyList_GetItem(obj, 0));
+ float y = PyFloat_AsDouble(PyList_GetItem(obj, 1));
+ float z = PyFloat_AsDouble(PyList_GetItem(obj, 2));
+ return new Vec3f(x,y,z);
+}
+
+Vec3r * Vec3r_ptr_from_PyList( PyObject* obj ) {
+ if( !PyList_Check(obj) || PyList_Size(obj) != 3 )
+ return NULL;
+ float x = PyFloat_AsDouble(PyList_GetItem(obj, 0));
+ float y = PyFloat_AsDouble(PyList_GetItem(obj, 1));
+ float z = PyFloat_AsDouble(PyList_GetItem(obj, 2));
+ return new Vec3r(x,y,z);
+}
+
+Vec2f * Vec2f_ptr_from_PyTuple( PyObject* obj ) {
+ if( !PyTuple_Check(obj) || PyTuple_Size(obj) != 2 )
+ return NULL;
+ float x = PyFloat_AsDouble(PyTuple_GetItem(obj, 0));
+ float y = PyFloat_AsDouble(PyTuple_GetItem(obj, 1));
+ return new Vec2f(x,y);
+}
+
+Vec3f * Vec3f_ptr_from_PyTuple( PyObject* obj ) {
+ if( !PyTuple_Check(obj) || PyTuple_Size(obj) != 3 )
+ return NULL;
+ float x = PyFloat_AsDouble(PyTuple_GetItem(obj, 0));
+ float y = PyFloat_AsDouble(PyTuple_GetItem(obj, 1));
+ float z = PyFloat_AsDouble(PyTuple_GetItem(obj, 2));
+ return new Vec3f(x,y,z);
+}
+
+Vec3r * Vec3r_ptr_from_PyTuple( PyObject* obj ) {
+ if( !PyTuple_Check(obj) || PyTuple_Size(obj) != 3 )
+ return NULL;
+ float x = PyFloat_AsDouble(PyTuple_GetItem(obj, 0));
+ float y = PyFloat_AsDouble(PyTuple_GetItem(obj, 1));
+ float z = PyFloat_AsDouble(PyTuple_GetItem(obj, 2));
+ return new Vec3r(x,y,z);
+}
+
///////////////////////////////////////////////////////////////////////////////////////////
diff --git a/source/blender/freestyle/intern/python/BPy_Convert.h b/source/blender/freestyle/intern/python/BPy_Convert.h
index 3d0e3adf235..3d298c0db9a 100644
--- a/source/blender/freestyle/intern/python/BPy_Convert.h
+++ b/source/blender/freestyle/intern/python/BPy_Convert.h
@@ -115,9 +115,18 @@ bool bool_from_PyBool( PyObject *b );
IntegrationType IntegrationType_from_BPy_IntegrationType( PyObject* obj );
Stroke::MediumType MediumType_from_BPy_MediumType( PyObject* obj );
Nature::EdgeNature EdgeNature_from_BPy_Nature( PyObject* obj );
+Vec2f * Vec2f_ptr_from_PyObject( PyObject* obj );
+Vec3f * Vec3f_ptr_from_PyObject( PyObject* obj );
+Vec3r * Vec3r_ptr_from_PyObject( PyObject* obj );
Vec2f * Vec2f_ptr_from_Vector( PyObject* obj );
Vec3f * Vec3f_ptr_from_Vector( PyObject* obj );
Vec3r * Vec3r_ptr_from_Vector( PyObject* obj );
+Vec2f * Vec2f_ptr_from_PyList( PyObject* obj );
+Vec3f * Vec3f_ptr_from_PyList( PyObject* obj );
+Vec3r * Vec3r_ptr_from_PyList( PyObject* obj );
+Vec2f * Vec2f_ptr_from_PyTuple( PyObject* obj );
+Vec3f * Vec3f_ptr_from_PyTuple( PyObject* obj );
+Vec3r * Vec3r_ptr_from_PyTuple( PyObject* obj );
diff --git a/source/blender/freestyle/intern/python/BPy_FrsNoise.cpp b/source/blender/freestyle/intern/python/BPy_FrsNoise.cpp
index 8fc27ae462d..945cd9921cc 100644
--- a/source/blender/freestyle/intern/python/BPy_FrsNoise.cpp
+++ b/source/blender/freestyle/intern/python/BPy_FrsNoise.cpp
@@ -1,4 +1,5 @@
#include "BPy_FrsNoise.h"
+#include "BPy_Convert.h"
#include <sstream>
@@ -165,18 +166,16 @@ PyObject * FrsNoise_turbulence2( BPy_FrsNoise *self , PyObject *args) {
float f2, f3;
unsigned int i = 4;
- if(!( PyArg_ParseTuple(args, "O!ff|I", &PyList_Type, &obj1, &f2, &f3, &i) ))
+ if(!( PyArg_ParseTuple(args, "Off|I", &obj1, &f2, &f3, &i) ))
return NULL;
- if( PyList_Size(obj1) != 2 ) {
- stringstream msg("FrsNoise::turbulence2() accepts a list of 2 elements (");
- msg << PyList_Size(obj1) << " found)";
- PyErr_SetString(PyExc_TypeError, msg.str().c_str());
+ Vec2f *v = Vec2f_ptr_from_PyObject(obj1);
+ if( !v ) {
+ PyErr_SetString(PyExc_TypeError, "argument 1 must be a 2D vector (either a list of 2 elements or Vector)");
return NULL;
}
-
- Vec2f v( PyFloat_AsDouble(PyList_GetItem(obj1, 0)), PyFloat_AsDouble(PyList_GetItem(obj1, 1)) );
-
- return PyFloat_FromDouble( self->n->turbulence2(v, f2, f3, i) );
+ float t = self->n->turbulence2(*v, f2, f3, i);
+ delete v;
+ return PyFloat_FromDouble( t );
}
PyObject * FrsNoise_turbulence3( BPy_FrsNoise *self , PyObject *args) {
@@ -184,20 +183,16 @@ PyObject * FrsNoise_turbulence3( BPy_FrsNoise *self , PyObject *args) {
float f2, f3;
unsigned int i = 4;
- if(!( PyArg_ParseTuple(args, "O!ff|I", &PyList_Type, &obj1, &f2, &f3, &i) ))
+ if(!( PyArg_ParseTuple(args, "Off|I", &obj1, &f2, &f3, &i) ))
return NULL;
- if( PyList_Size(obj1) != 3 ) {
- stringstream msg("FrsNoise::turbulence3() accepts a list of 3 elements (");
- msg << PyList_Size(obj1) << " found)";
- PyErr_SetString(PyExc_TypeError, msg.str().c_str());
+ Vec3f *v = Vec3f_ptr_from_PyObject(obj1);
+ if( !v ) {
+ PyErr_SetString(PyExc_TypeError, "argument 1 must be a 3D vector (either a list of 3 elements or Vector)");
return NULL;
}
-
- Vec3f v( PyFloat_AsDouble(PyList_GetItem(obj1, 0)),
- PyFloat_AsDouble(PyList_GetItem(obj1, 1)),
- PyFloat_AsDouble(PyList_GetItem(obj1, 2)) );
-
- return PyFloat_FromDouble( self->n->turbulence3(v, f2, f3, i) );
+ float t = self->n->turbulence3(*v, f2, f3, i);
+ delete v;
+ return PyFloat_FromDouble( t );
}
PyObject * FrsNoise_smoothNoise1( BPy_FrsNoise *self , PyObject *args) {
@@ -212,37 +207,31 @@ PyObject * FrsNoise_smoothNoise1( BPy_FrsNoise *self , PyObject *args) {
PyObject * FrsNoise_smoothNoise2( BPy_FrsNoise *self , PyObject *args) {
PyObject *obj;
- if(!( PyArg_ParseTuple(args, "O", &PyList_Type, &obj) ))
+ if(!( PyArg_ParseTuple(args, "O", &obj) ))
return NULL;
- if( PyList_Size(obj) != 2 ) {
- stringstream msg("FrsNoise::smoothNoise2() accepts a list of 2 elements (");
- msg << PyList_Size(obj) << " found)";
- PyErr_SetString(PyExc_TypeError, msg.str().c_str());
+ Vec2f *v = Vec2f_ptr_from_PyObject(obj);
+ if( !v ) {
+ PyErr_SetString(PyExc_TypeError, "argument 1 must be a 2D vector (either a list of 2 elements or Vector)");
return NULL;
}
-
- Vec2f v( PyFloat_AsDouble(PyList_GetItem(obj, 0)), PyFloat_AsDouble(PyList_GetItem(obj, 1)) );
-
- return PyFloat_FromDouble( self->n->smoothNoise2(v) );
+ float t = self->n->smoothNoise2(*v);
+ delete v;
+ return PyFloat_FromDouble( t );
}
PyObject * FrsNoise_smoothNoise3( BPy_FrsNoise *self , PyObject *args) {
PyObject *obj;
- if(!( PyArg_ParseTuple(args, "O", &PyList_Type, &obj) ))
+ if(!( PyArg_ParseTuple(args, "O", &obj) ))
return NULL;
- if( PyList_Size(obj) != 3 ) {
- stringstream msg("FrsNoise::smoothNoise3() accepts a list of 3 elements (");
- msg << PyList_Size(obj) << " found)";
- PyErr_SetString(PyExc_TypeError, msg.str().c_str());
+ Vec3f *v = Vec3f_ptr_from_PyObject(obj);
+ if( !v ) {
+ PyErr_SetString(PyExc_TypeError, "argument 1 must be a 3D vector (either a list of 3 elements or Vector)");
return NULL;
}
-
- Vec3f v( PyFloat_AsDouble(PyList_GetItem(obj, 0)),
- PyFloat_AsDouble(PyList_GetItem(obj, 1)),
- PyFloat_AsDouble(PyList_GetItem(obj, 2)) );
-
- return PyFloat_FromDouble( self->n->smoothNoise3(v) );
+ float t = self->n->smoothNoise3(*v);
+ delete v;
+ return PyFloat_FromDouble( t );
}
diff --git a/source/blender/freestyle/intern/python/BPy_Interface0D.cpp b/source/blender/freestyle/intern/python/BPy_Interface0D.cpp
index fb8c27c4205..89eb3600665 100644
--- a/source/blender/freestyle/intern/python/BPy_Interface0D.cpp
+++ b/source/blender/freestyle/intern/python/BPy_Interface0D.cpp
@@ -189,8 +189,7 @@ int Interface0D___init__(BPy_Interface0D *self, PyObject *args, PyObject *kwds)
void Interface0D___dealloc__(BPy_Interface0D* self)
{
- if( self->if0D->py_if0D )
- delete self->if0D;
+ delete self->if0D;
self->ob_type->tp_free((PyObject*)self);
}
diff --git a/source/blender/freestyle/intern/python/BPy_StrokeAttribute.cpp b/source/blender/freestyle/intern/python/BPy_StrokeAttribute.cpp
index 6bc25ed8fdd..8f20e740580 100644
--- a/source/blender/freestyle/intern/python/BPy_StrokeAttribute.cpp
+++ b/source/blender/freestyle/intern/python/BPy_StrokeAttribute.cpp
@@ -328,14 +328,16 @@ PyObject * StrokeAttribute_setColor( BPy_StrokeAttribute *self, PyObject *args )
if(!( PyArg_ParseTuple(args, "O|OO", &obj1, &obj2, &obj3) ))
return NULL;
-
- if( PyList_Check(obj1) && !obj2 && !obj3 ){
-
- Vec3f v( PyFloat_AsDouble( PyList_GetItem(obj1, 0) ),
- PyFloat_AsDouble( PyList_GetItem(obj1, 1) ),
- PyFloat_AsDouble( PyList_GetItem(obj1, 2) ) );
-
- self->sa->setColor( v );
+
+ if( obj1 && !obj2 && !obj3 ){
+
+ Vec3f *v = Vec3f_ptr_from_PyObject(obj1);
+ if( !v ) {
+ PyErr_SetString(PyExc_TypeError, "argument 1 must be a 3D vector (either a list of 3 elements or Vector)");
+ return NULL;
+ }
+ self->sa->setColor( *v );
+ delete v;
} else if( obj1 && obj2 && obj3 ){
@@ -367,12 +369,15 @@ PyObject * StrokeAttribute_setThickness( BPy_StrokeAttribute *self, PyObject *ar
if(!( PyArg_ParseTuple(args, "O|O", &obj1, &obj2) ))
return NULL;
- if( PyList_Check(obj1) && !obj2 ){
+ if( obj1 && !obj2 ){
- Vec2f v( PyFloat_AsDouble( PyList_GetItem(obj1, 0) ),
- PyFloat_AsDouble( PyList_GetItem(obj1, 1) ) );
-
- self->sa->setThickness( v );
+ Vec2f *v = Vec2f_ptr_from_PyObject(obj1);
+ if( !v ) {
+ PyErr_SetString(PyExc_TypeError, "argument 1 must be a 2D vector (either a list of 2 elements or Vector)");
+ return NULL;
+ }
+ self->sa->setThickness( *v );
+ delete v;
} else if( obj1 && obj2 ){
@@ -416,19 +421,14 @@ PyObject * StrokeAttribute_setAttributeVec2f( BPy_StrokeAttribute *self, PyObjec
if(!( PyArg_ParseTuple(args, "sO", &s, &obj) ))
return NULL;
-
- if( PyList_Check(obj) && PyList_Size(obj) > 1) {
-
- Vec2f v( PyFloat_AsDouble( PyList_GetItem(obj, 0) ),
- PyFloat_AsDouble( PyList_GetItem(obj, 1) ) );
-
- self->sa->setAttributeVec2f( s, v );
-
- } else {
- PyErr_SetString(PyExc_TypeError, "invalid arguments");
+ Vec2f *v = Vec2f_ptr_from_PyObject(obj);
+ if( !v ) {
+ PyErr_SetString(PyExc_TypeError, "argument 2 must be a 2D vector (either a list of 2 elements or Vector)");
return NULL;
}
-
+ self->sa->setAttributeVec2f( s, *v );
+ delete v;
+
Py_RETURN_NONE;
}
@@ -438,19 +438,13 @@ PyObject * StrokeAttribute_setAttributeVec3f( BPy_StrokeAttribute *self, PyObjec
if(!( PyArg_ParseTuple(args, "sO", &s, &obj) ))
return NULL;
-
- if( PyList_Check(obj) && PyList_Size(obj) > 2 ) {
-
- Vec3f v( PyFloat_AsDouble( PyList_GetItem(obj, 0) ),
- PyFloat_AsDouble( PyList_GetItem(obj, 1) ),
- PyFloat_AsDouble( PyList_GetItem(obj, 2) ) );
-
- self->sa->setAttributeVec3f( s, v );
-
- } else {
- PyErr_SetString(PyExc_TypeError, "invalid arguments");
+ Vec3f *v = Vec3f_ptr_from_PyObject(obj);
+ if( !v ) {
+ PyErr_SetString(PyExc_TypeError, "argument 2 must be a 3D vector (either a list of 3 elements or Vector)");
return NULL;
}
+ self->sa->setAttributeVec3f( s, *v );
+ delete v;
Py_RETURN_NONE;
}
diff --git a/source/blender/freestyle/intern/python/Interface0D/BPy_SVertex.cpp b/source/blender/freestyle/intern/python/Interface0D/BPy_SVertex.cpp
index 87d3ef4ecd0..46fd1c64758 100644
--- a/source/blender/freestyle/intern/python/Interface0D/BPy_SVertex.cpp
+++ b/source/blender/freestyle/intern/python/Interface0D/BPy_SVertex.cpp
@@ -130,20 +130,26 @@ int SVertex___init__(BPy_SVertex *self, PyObject *args, PyObject *kwds)
{
PyObject *py_point = 0;
BPy_Id *py_id = 0;
+
- if (! PyArg_ParseTuple(args, "|OO", &py_point, &py_id) )
+ if (! PyArg_ParseTuple(args, "|OO!", &py_point, &Id_Type, &py_id) )
return -1;
- if( py_point && py_id && PyList_Check(py_point) && PyList_Size(py_point) == 3 ) {
- Vec3r v( PyFloat_AsDouble( PyList_GetItem(py_point, 0) ),
- PyFloat_AsDouble( PyList_GetItem(py_point, 1) ),
- PyFloat_AsDouble( PyList_GetItem(py_point, 2) ) );
-
- self->sv = new SVertex( v, *(py_id->id) );
- } else {
+ if( py_point && py_id ) {
+ Vec3r *v = Vec3r_ptr_from_PyObject(py_point);
+ if( !v ) {
+ PyErr_SetString(PyExc_TypeError, "argument 1 must be a 3D vector (either a list of 3 elements or Vector)");
+ return -1;
+ }
+ self->sv = new SVertex( *v, *(py_id->id) );
+ delete v;
+ } else if( !py_point && !py_id ) {
self->sv = new SVertex();
+ } else {
+ PyErr_SetString(PyExc_TypeError, "invalid argument(s)");
+ return -1;
}
-
+
self->py_if0D.if0D = self->sv;
return 0;
@@ -193,19 +199,15 @@ PyObject * SVertex_viewvertex( BPy_SVertex *self ) {
PyObject *SVertex_setPoint3D( BPy_SVertex *self , PyObject *args) {
PyObject *py_point;
- if(!( PyArg_ParseTuple(args, "O!", &PyList_Type, &py_point) ))
+ if(!( PyArg_ParseTuple(args, "O", &py_point) ))
return NULL;
- if( PyList_Size(py_point) != 3 ) {
- stringstream msg("SVertex::setPoint3D() accepts a list of 3 elements (");
- msg << PyList_Size(py_point) << " found)";
- PyErr_SetString(PyExc_TypeError, msg.str().c_str());
+ Vec3r *v = Vec3r_ptr_from_PyObject(py_point);
+ if( !v ) {
+ PyErr_SetString(PyExc_TypeError, "argument 1 must be a 3D vector (either a list of 3 elements or Vector)");
return NULL;
}
-
- Vec3r v( PyFloat_AsDouble( PyList_GetItem(py_point, 0) ),
- PyFloat_AsDouble( PyList_GetItem(py_point, 1) ),
- PyFloat_AsDouble( PyList_GetItem(py_point, 2) ) );
- self->sv->setPoint3D( v );
+ self->sv->setPoint3D( *v );
+ delete v;
Py_RETURN_NONE;
}
@@ -213,19 +215,15 @@ PyObject *SVertex_setPoint3D( BPy_SVertex *self , PyObject *args) {
PyObject *SVertex_setPoint2D( BPy_SVertex *self , PyObject *args) {
PyObject *py_point;
- if(!( PyArg_ParseTuple(args, "O!", &PyList_Type, &py_point) ))
+ if(!( PyArg_ParseTuple(args, "O", &py_point) ))
return NULL;
- if( PyList_Size(py_point) != 3 ) {
- stringstream msg("SVertex::setPoint2D() accepts a list of 3 elements (");
- msg << PyList_Size(py_point) << " found)";
- PyErr_SetString(PyExc_TypeError, msg.str().c_str());
+ Vec3r *v = Vec3r_ptr_from_PyObject(py_point);
+ if( !v ) {
+ PyErr_SetString(PyExc_TypeError, "argument 1 must be a 3D vector (either a list of 3 elements or Vector)");
return NULL;
}
-
- Vec3r v( PyFloat_AsDouble( PyList_GetItem(py_point, 0) ),
- PyFloat_AsDouble( PyList_GetItem(py_point, 1) ),
- PyFloat_AsDouble( PyList_GetItem(py_point, 2) ) );
- self->sv->setPoint2D( v );
+ self->sv->setPoint2D( *v );
+ delete v;
Py_RETURN_NONE;
}
@@ -233,19 +231,15 @@ PyObject *SVertex_setPoint2D( BPy_SVertex *self , PyObject *args) {
PyObject *SVertex_AddNormal( BPy_SVertex *self , PyObject *args) {
PyObject *py_normal;
- if(!( PyArg_ParseTuple(args, "O!", &PyList_Type, &py_normal) ))
+ if(!( PyArg_ParseTuple(args, "O", &py_normal) ))
return NULL;
- if( PyList_Size(py_normal) != 3 ) {
- stringstream msg("SVertex::AddNormal() accepts a list of 3 elements (");
- msg << PyList_Size(py_normal) << " found)";
- PyErr_SetString(PyExc_TypeError, msg.str().c_str());
+ Vec3r *n = Vec3r_ptr_from_PyObject(py_normal);
+ if( !n ) {
+ PyErr_SetString(PyExc_TypeError, "argument 1 must be a 3D vector (either a list of 3 elements or Vector)");
return NULL;
}
-
- Vec3r n( PyFloat_AsDouble( PyList_GetItem(py_normal, 0) ),
- PyFloat_AsDouble( PyList_GetItem(py_normal, 1) ),
- PyFloat_AsDouble( PyList_GetItem(py_normal, 2) ) );
- self->sv->AddNormal( n );
+ self->sv->AddNormal( *n );
+ delete n;
Py_RETURN_NONE;
}
diff --git a/source/blender/freestyle/intern/python/Interface0D/CurvePoint/BPy_StrokeVertex.cpp b/source/blender/freestyle/intern/python/Interface0D/CurvePoint/BPy_StrokeVertex.cpp
index 2c957dd7016..969aa1d7216 100644
--- a/source/blender/freestyle/intern/python/Interface0D/CurvePoint/BPy_StrokeVertex.cpp
+++ b/source/blender/freestyle/intern/python/Interface0D/CurvePoint/BPy_StrokeVertex.cpp
@@ -229,30 +229,18 @@ PyObject *StrokeVertex_setPoint( BPy_StrokeVertex *self , PyObject *args) {
if(!( PyArg_ParseTuple(args, "O|O", &obj1, &obj2) ))
return NULL;
- if( PyList_Check(obj1) && !obj2 ){
- if ( PyList_Size(obj1) != 2 ) {
- stringstream msg("StrokeVertex::setPoint() accepts a list of 2 elements (");
- msg << PyList_Size(obj1) << " found)";
- PyErr_SetString(PyExc_TypeError, msg.str().c_str());
+ if( obj1 && !obj2 ){
+ Vec2f *v = Vec2f_ptr_from_PyObject(obj1);
+ if( !v ) {
+ PyErr_SetString(PyExc_TypeError, "argument 1 must be a 2D vector (either a list of 2 elements or Vector)");
return NULL;
}
- Vec2f v( PyFloat_AsDouble( PyList_GetItem(obj1, 0) ),
- PyFloat_AsDouble( PyList_GetItem(obj1, 1) ) );
- self->sv->setPoint( v );
- } else if ( VectorObject_Check(obj1) && !obj2) {
- if ( ((VectorObject *)obj1)->size != 2 ) {
- stringstream msg("StrokeVertex::setPoint() accepts a vector of 2 elements (");
- msg << ((VectorObject *)obj1)->size << " found)";
- PyErr_SetString(PyExc_TypeError, msg.str().c_str());
- return NULL;
- }
- Vec2f *v = Vec2f_ptr_from_Vector( obj1 );
self->sv->setPoint( *v );
delete v;
} else if( PyFloat_Check(obj1) && obj2 && PyFloat_Check(obj2) ){
self->sv->setPoint( PyFloat_AsDouble(obj1), PyFloat_AsDouble(obj2) );
} else {
- PyErr_SetString(PyExc_TypeError, "StrokeVertex::setPoint(): unknown argument type");
+ PyErr_SetString(PyExc_TypeError, "invalid arguments");
return NULL;
}
diff --git a/source/blender/freestyle/intern/python/Interface1D/FEdge/BPy_FEdgeSharp.cpp b/source/blender/freestyle/intern/python/Interface1D/FEdge/BPy_FEdgeSharp.cpp
index c6bc201e37d..aa0ba7dfc46 100644
--- a/source/blender/freestyle/intern/python/Interface1D/FEdge/BPy_FEdgeSharp.cpp
+++ b/source/blender/freestyle/intern/python/Interface1D/FEdge/BPy_FEdgeSharp.cpp
@@ -184,20 +184,15 @@ PyObject * FEdgeSharp_bMaterial( BPy_FEdgeSharp *self ) {
PyObject * FEdgeSharp_setNormalA( BPy_FEdgeSharp *self, PyObject *args ) {
PyObject *obj = 0;
- if(!( PyArg_ParseTuple(args, "O!", &PyList_Type, &obj) ))
+ if(!( PyArg_ParseTuple(args, "O", &obj) ))
return NULL;
- if( PyList_Size(obj) != 3 ) {
- stringstream msg("FEdgeSharp::setNormalA() accepts a list of 3 elements (");
- msg << PyList_Size(obj) << " found)";
- PyErr_SetString(PyExc_TypeError, msg.str().c_str());
+ Vec3r *v = Vec3r_ptr_from_PyObject(obj);
+ if( !v ) {
+ PyErr_SetString(PyExc_TypeError, "argument 1 must be a 3D vector (either a list of 3 elements or Vector)");
return NULL;
}
-
- Vec3r v( PyFloat_AsDouble( PyList_GetItem(obj,0) ),
- PyFloat_AsDouble( PyList_GetItem(obj,1) ),
- PyFloat_AsDouble( PyList_GetItem(obj,2) ) );
-
- self->fes->setNormalA( v );
+ self->fes->setNormalA( *v );
+ delete v;
Py_RETURN_NONE;
}
@@ -205,20 +200,15 @@ PyObject * FEdgeSharp_setNormalA( BPy_FEdgeSharp *self, PyObject *args ) {
PyObject * FEdgeSharp_setNormalB( BPy_FEdgeSharp *self, PyObject *args ) {
PyObject *obj = 0;
- if(!( PyArg_ParseTuple(args, "O!", &PyList_Type, &obj) ))
+ if(!( PyArg_ParseTuple(args, "O", &obj) ))
return NULL;
- if( PyList_Size(obj) != 3 ) {
- stringstream msg("FEdgeSharp::setNormalB() accepts a list of 3 elements (");
- msg << PyList_Size(obj) << " found)";
- PyErr_SetString(PyExc_TypeError, msg.str().c_str());
+ Vec3r *v = Vec3r_ptr_from_PyObject(obj);
+ if( !v ) {
+ PyErr_SetString(PyExc_TypeError, "argument 1 must be a 3D vector (either a list of 3 elements or Vector)");
return NULL;
}
-
- Vec3r v( PyFloat_AsDouble( PyList_GetItem(obj,0) ),
- PyFloat_AsDouble( PyList_GetItem(obj,1) ),
- PyFloat_AsDouble( PyList_GetItem(obj,2) ) );
-
- self->fes->setNormalB( v );
+ self->fes->setNormalB( *v );
+ delete v;
Py_RETURN_NONE;
}
diff --git a/source/blender/freestyle/intern/python/Interface1D/FEdge/BPy_FEdgeSmooth.cpp b/source/blender/freestyle/intern/python/Interface1D/FEdge/BPy_FEdgeSmooth.cpp
index bb0e6eef4e4..9913503db58 100644
--- a/source/blender/freestyle/intern/python/Interface1D/FEdge/BPy_FEdgeSmooth.cpp
+++ b/source/blender/freestyle/intern/python/Interface1D/FEdge/BPy_FEdgeSmooth.cpp
@@ -23,9 +23,9 @@ static PyObject * FEdgeSmooth_setMaterialIndex( BPy_FEdgeSmooth *self, PyObject
static PyMethodDef BPy_FEdgeSmooth_methods[] = {
{"normal", ( PyCFunction ) FEdgeSmooth_normal, METH_NOARGS, "() Returns the normal to the Face it is running accross."},
{"materialIndex", ( PyCFunction ) FEdgeSmooth_materialIndex, METH_NOARGS, "() Returns the index of the material of the face it is running accross. "},
- {"aMaterial", ( PyCFunction ) FEdgeSmooth_material, METH_NOARGS, "() Returns the material of the face it is running accross. "},
- {"setNormalA", ( PyCFunction ) FEdgeSmooth_setNormal, METH_VARARGS, "([x,y,z]) Sets the normal to the Face it is running accross."},
- {"setaMaterialIndex", ( PyCFunction ) FEdgeSmooth_setMaterialIndex, METH_VARARGS, "(unsigned int i) Sets the index of the material of the face it is running accross. "},
+ {"material", ( PyCFunction ) FEdgeSmooth_material, METH_NOARGS, "() Returns the material of the face it is running accross. "},
+ {"setNormal", ( PyCFunction ) FEdgeSmooth_setNormal, METH_VARARGS, "([x,y,z]) Sets the normal to the Face it is running accross."},
+ {"setMaterialIndex", ( PyCFunction ) FEdgeSmooth_setMaterialIndex, METH_VARARGS, "(unsigned int i) Sets the index of the material of the face it is running accross. "},
{NULL, NULL, 0, NULL}
};
@@ -162,20 +162,15 @@ PyObject * FEdgeSmooth_material( BPy_FEdgeSmooth *self ) {
PyObject * FEdgeSmooth_setNormal( BPy_FEdgeSmooth *self, PyObject *args ) {
PyObject *obj = 0;
- if(!( PyArg_ParseTuple(args, "O!", &PyList_Type, &obj) ))
+ if(!( PyArg_ParseTuple(args, "O", &obj) ))
return NULL;
- if( PyList_Size(obj) != 3 ) {
- stringstream msg("FEdgeSmooth::setNormal() accepts a list of 3 elements (");
- msg << PyList_Size(obj) << " found)";
- PyErr_SetString(PyExc_TypeError, msg.str().c_str());
+ Vec3r *v = Vec3r_ptr_from_PyObject(obj);
+ if( !v ) {
+ PyErr_SetString(PyExc_TypeError, "argument 1 must be a 3D vector (either a list of 3 elements or Vector)");
return NULL;
}
-
- Vec3r v( PyFloat_AsDouble( PyList_GetItem(obj,0) ),
- PyFloat_AsDouble( PyList_GetItem(obj,1) ),
- PyFloat_AsDouble( PyList_GetItem(obj,2) ) );
-
- self->fes->setNormal( v );
+ self->fes->setNormal( *v );
+ delete v;
Py_RETURN_NONE;
}
diff --git a/source/blender/freestyle/intern/python/StrokeShader/BPy_CalligraphicShader.cpp b/source/blender/freestyle/intern/python/StrokeShader/BPy_CalligraphicShader.cpp
index 1d22be137e3..798b8a8e4ac 100644
--- a/source/blender/freestyle/intern/python/StrokeShader/BPy_CalligraphicShader.cpp
+++ b/source/blender/freestyle/intern/python/StrokeShader/BPy_CalligraphicShader.cpp
@@ -105,17 +105,16 @@ int CalligraphicShader___init__( BPy_CalligraphicShader* self, PyObject *args)
PyObject *obj3 = 0, *obj4 = 0;
- if(!( PyArg_ParseTuple(args, "ddO!O", &d1, &d2, &PyList_Type, &obj3, &obj4) ))
+ if(!( PyArg_ParseTuple(args, "ddOO", &d1, &d2, &obj3, &obj4) ))
return -1;
- if( PyList_Size(obj3) != 2 ) {
- stringstream msg("CalligraphicShader() accepts a list of 2 elements (");
- msg << PyList_Size(obj3) << " found)";
- PyErr_SetString(PyExc_TypeError, msg.str().c_str());
+ Vec2f *v = Vec2f_ptr_from_PyObject(obj3);
+ if( !v ) {
+ PyErr_SetString(PyExc_TypeError, "argument 3 must be a 2D vector (either a list of 2 elements or Vector)");
return -1;
}
+ self->py_ss.ss = new CalligraphicShader(d1, d2, *v, bool_from_PyBool(obj4) );
+ delete v;
- Vec2f v( PyFloat_AsDouble(PyList_GetItem(obj3,0)), PyFloat_AsDouble(PyList_GetItem(obj3,1)) );
- self->py_ss.ss = new CalligraphicShader(d1, d2, v, bool_from_PyBool(obj4) );
return 0;
}