renamed Blender.Image.SetCurrent(img) to img.makeCurrent() to be consistant with scene.

applied patch #4998 (array count), as well as adding other array settings, updated documentation as well.
added EXPP_setVec3Clamped() as a way to set a vector from getset attrs (used with array offset and scale)
This commit is contained in:
Campbell Barton 2006-09-17 02:31:16 +00:00
parent eaad4e4129
commit e472a3d852
6 changed files with 177 additions and 74 deletions

@ -106,6 +106,7 @@ static PyObject *Image_getMinXY( BPy_Image * self );
static PyObject *Image_save( BPy_Image * self );
static PyObject *Image_unpack( BPy_Image * self, PyObject * args );
static PyObject *Image_pack( BPy_Image * self );
static PyObject *Image_makeCurrent( BPy_Image * self );
/*****************************************************************************/
@ -172,7 +173,9 @@ static PyMethodDef BPy_Image_methods[] = {
{"unpack", ( PyCFunction ) Image_unpack, METH_VARARGS,
"(int) - Unpack image. Uses the values defined in Blender.UnpackModes."},
{"pack", ( PyCFunction ) Image_pack, METH_NOARGS,
"() Pack the image"},
"() - Pack the image"},
{"makeCurrent", ( PyCFunction ) Image_makeCurrent, METH_NOARGS,
"() - Make this the currently displayed image"},
{NULL, NULL, 0, NULL}
};
@ -196,10 +199,6 @@ static char M_Image_GetCurrent_doc[] =
"() - return the current image, from last active the uv/image view, \
returns None no image is in the view.\n";
static char M_Image_SetCurrent_doc[] =
"(image) - set the image to be the current, from last active the uv/image view, \
returns False if no image could be set.";
static char M_Image_Load_doc[] =
"(filename) - return image from file filename as Image Object, \
returns None if not found.\n";
@ -211,7 +210,6 @@ struct PyMethodDef M_Image_methods[] = {
{"New", M_Image_New, METH_VARARGS, M_Image_New_doc},
{"Get", M_Image_Get, METH_VARARGS, M_Image_Get_doc},
{"GetCurrent", ( PyCFunction ) M_Image_GetCurrent, METH_NOARGS, M_Image_GetCurrent_doc},
{"SetCurrent", ( PyCFunction ) M_Image_SetCurrent, METH_VARARGS, M_Image_SetCurrent_doc},
{"get", M_Image_Get, METH_VARARGS, M_Image_Get_doc},
{"Load", M_Image_Load, METH_VARARGS, M_Image_Load_doc},
{NULL, NULL, 0, NULL}
@ -332,27 +330,6 @@ static PyObject *M_Image_GetCurrent( PyObject * self )
return Image_CreatePyObject( G.sima->image );
}
/*****************************************************************************/
/* Function: M_Image_SetCurrent*/
/* Python equivalent: Blender.Image.SetCurrent */
/* Description: Sets the active current (G.sima) */
/* This will be the image last under the mouse cursor */
/* None if there is no Image. */
/*****************************************************************************/
static PyObject *M_Image_SetCurrent( PyObject * self, PyObject * args )
{
BPy_Image *image;
if (!G.sima)
Py_RETURN_FALSE;
if( !PyArg_ParseTuple( args, "O!", &Image_Type, &image) )
return ( EXPP_ReturnPyObjError( PyExc_TypeError,
"expected an image argument" ) );
G.sima->image= image->image;
Py_RETURN_TRUE;
}
/*****************************************************************************/
/* Function: M_Image_Load */
@ -721,6 +698,16 @@ static PyObject *Image_pack( BPy_Image * self )
}
static PyObject *Image_makeCurrent( BPy_Image * self )
{
if (!G.sima)
Py_RETURN_FALSE;
G.sima->image= self->image;
Py_RETURN_TRUE;
}
/* save image to file */
static PyObject *Image_save( BPy_Image * self )

@ -45,6 +45,7 @@
#include "mydevice.h"
#include "Object.h"
#include "Mathutils.h"
#include "gen_utils.h"
enum mod_constants {
@ -60,6 +61,7 @@ enum mod_constants {
EXPP_MOD_LIMIT, /*ARRAY, MIRROR*/
EXPP_MOD_FLAG, /*MIRROR, WAVE*/
EXPP_MOD_COUNT, /*DECIMATOR, ARRAY*/
EXPP_MOD_LENGTH, /*BUILD, ARRAY*/
/*SUBSURF SPESIFIC*/
EXPP_MOD_TYPES,
@ -71,9 +73,15 @@ enum mod_constants {
/*ARMATURE SPESIFIC*/
EXPP_MOD_ENVELOPES,
/*ARRAY SPESIFIC*/
EXPP_MOD_OBJECT_OFFSET,
EXPP_MOD_OBJECT_CURVE,
EXPP_MOD_OFFSET_VEC,
EXPP_MOD_SCALE_VEC,
EXPP_MOD_MERGE_DIST,
/*BUILD SPESIFIC*/
EXPP_MOD_START,
EXPP_MOD_LENGTH,
EXPP_MOD_SEED,
EXPP_MOD_RANDOMIZE,
@ -99,7 +107,7 @@ enum mod_constants {
/* yet to be implemented */
/* EXPP_MOD_HOOK_,*/
/* EXPP_MOD_ARRAY_, */
/* , */
};
/*****************************************************************************/
@ -610,6 +618,71 @@ static int wave_setter( BPy_Modifier *self, int type, PyObject *value )
}
}
static PyObject *array_getter( BPy_Modifier * self, int type )
{
ArrayModifierData *md = (ArrayModifierData *)(self->md);
if( type == EXPP_MOD_OBJECT_OFFSET )
return Object_CreatePyObject( md->offset_ob );
else if( type == EXPP_MOD_OBJECT_CURVE )
return Object_CreatePyObject( md->curve_ob );
else if( type == EXPP_MOD_COUNT )
return PyInt_FromLong( (long)md->count );
else if( type == EXPP_MOD_LENGTH )
return PyFloat_FromDouble( md->length );
else if( type == EXPP_MOD_MERGE_DIST )
return PyFloat_FromDouble( md->merge_dist );
else if( type == EXPP_MOD_MERGE_DIST )
return PyFloat_FromDouble( md->merge_dist );
else if( type == EXPP_MOD_OFFSET_VEC)
return newVectorObject( md->offset, 3, Py_NEW );
else if( type == EXPP_MOD_SCALE_VEC)
return newVectorObject( md->scale, 3, Py_NEW );
return EXPP_ReturnPyObjError( PyExc_KeyError, "key not found" );
}
static int array_setter( BPy_Modifier *self, int type, PyObject *value )
{
ArrayModifierData *md = (ArrayModifierData *)(self->md);
switch( type ) {
case EXPP_MOD_OBJECT_OFFSET: {
Object *obj = (( BPy_Object * )value)->object;
if( !BPy_Object_Check( value ) )
return EXPP_ReturnIntError( PyExc_TypeError,
"expected BPy object argument" );
if(obj == self->obj )
return EXPP_ReturnIntError( PyExc_TypeError,
"Cannot lattice deform an object with its self" );
md->offset_ob = obj;
return 0;
}
case EXPP_MOD_OBJECT_CURVE: {
Object *obj = (( BPy_Object * )value)->object;
if( !BPy_Object_Check( value ) || obj->type != OB_CURVE )
return EXPP_ReturnIntError( PyExc_TypeError,
"expected BPy object argument" );
if(obj == self->obj )
return EXPP_ReturnIntError( PyExc_TypeError,
"Cannot lattice deform an object with its self" );
md->curve_ob = obj;
return 0;
}
case EXPP_MOD_COUNT:
return EXPP_setIValueClamped( value, &md->count, 1, 1000, 'i' );
case EXPP_MOD_LENGTH:
return EXPP_setFloatClamped( value, &md->length, 0.0, 1000.0 );
case EXPP_MOD_MERGE_DIST:
return EXPP_setFloatClamped( value, &md->merge_dist, 0.0, 1000.0 );
case EXPP_MOD_OFFSET_VEC:
return EXPP_setVec3Clamped( value, &md->offset, -10000.0, 10000.0 );
case EXPP_MOD_SCALE_VEC:
return EXPP_setVec3Clamped( value, &md->scale, -10000.0, 10000.0 );
default:
return EXPP_ReturnIntError( PyExc_KeyError, "key not found" );
}
}
static PyObject *boolean_getter( BPy_Modifier * self, int type )
{
BooleanModifierData *md = (BooleanModifierData *)(self->md);
@ -693,6 +766,7 @@ static PyObject *Modifier_getData( BPy_Modifier * self, PyObject * key )
case eModifierType_Hook:
case eModifierType_Softbody:
case eModifierType_Array:
return array_getter( self, setting );
case eModifierType_None:
Py_RETURN_NONE;
}
@ -745,6 +819,8 @@ static int Modifier_setData( BPy_Modifier * self, PyObject * key,
return build_setter( self, key_int, arg );
case eModifierType_Mirror:
return mirror_setter( self, key_int, arg );
case eModifierType_Array:
return array_setter( self, key_int, arg );
case eModifierType_Decimate:
return decimate_setter( self, key_int, arg );
case eModifierType_Wave:
@ -753,7 +829,6 @@ static int Modifier_setData( BPy_Modifier * self, PyObject * key,
return boolean_setter( self, key_int, arg );
case eModifierType_Hook:
case eModifierType_Softbody:
case eModifierType_Array:
case eModifierType_None:
return 0;
}
@ -1156,6 +1231,8 @@ static PyObject *M_Modifier_TypeDict( void )
PyInt_FromLong( eModifierType_Wave ) );
PyConstant_Insert( d, "BOOLEAN",
PyInt_FromLong( eModifierType_Boolean ) );
PyConstant_Insert( d, "ARRAY",
PyInt_FromLong( eModifierType_Array ) );
}
return S;
}
@ -1175,7 +1252,7 @@ st='''
EXPP_MOD_RENDER = 0,
EXPP_MOD_REALTIME,
EXPP_MOD_EDITMODE,
........ and so on, copy from above
etc.. copy from above
'''
base= '''
@ -1189,7 +1266,7 @@ for var in st.replace(',','').split('\n'):
var= var[0]
if (not var) or var.startswith('/'): continue
var=var.split('_')[-1]
var='_'.join(var.split('_')[2:])
print base % (var, var),
# END PYSCRIPT
*/
@ -1213,6 +1290,8 @@ for var in st.replace(',','').split('\n'):
PyInt_FromLong( EXPP_MOD_FLAG ) );
PyConstant_Insert( d, "COUNT",
PyInt_FromLong( EXPP_MOD_COUNT ) );
PyConstant_Insert( d, "LENGTH",
PyInt_FromLong( EXPP_MOD_LENGTH ) );
PyConstant_Insert( d, "TYPES",
PyInt_FromLong( EXPP_MOD_TYPES ) );
PyConstant_Insert( d, "LEVELS",
@ -1225,10 +1304,18 @@ for var in st.replace(',','').split('\n'):
PyInt_FromLong( EXPP_MOD_UV ) );
PyConstant_Insert( d, "ENVELOPES",
PyInt_FromLong( EXPP_MOD_ENVELOPES ) );
PyConstant_Insert( d, "OBJECT_OFFSET",
PyInt_FromLong( EXPP_MOD_OBJECT_OFFSET ) );
PyConstant_Insert( d, "OBJECT_CURVE",
PyInt_FromLong( EXPP_MOD_OBJECT_CURVE ) );
PyConstant_Insert( d, "OFFSET_VEC",
PyInt_FromLong( EXPP_MOD_OFFSET_VEC ) );
PyConstant_Insert( d, "SCALE_VEC",
PyInt_FromLong( EXPP_MOD_SCALE_VEC ) );
PyConstant_Insert( d, "MERGE_DIST",
PyInt_FromLong( EXPP_MOD_MERGE_DIST ) );
PyConstant_Insert( d, "START",
PyInt_FromLong( EXPP_MOD_START ) );
PyConstant_Insert( d, "LENGTH",
PyInt_FromLong( EXPP_MOD_LENGTH ) );
PyConstant_Insert( d, "SEED",
PyInt_FromLong( EXPP_MOD_SEED ) );
PyConstant_Insert( d, "RANDOMIZE",

@ -65,16 +65,6 @@ def GetCurrent ():
@return: The Current Blender Image, If there is no current image it returns None.
"""
def SetCurrent (image):
"""
Set the currently displayed Image from Blenders UV/Image window.
When multiple images are displayed, the last active UV/Image windows image is used.
@type image: Blender Image
@param image: The image to display in the image view.
@rtype: bool
@return: True if the current image could be set, if no window was available, it will be set to False.
"""
class Image:
"""
The Image object
@ -337,3 +327,12 @@ class Image:
@rtype: none
@type mode: int
"""
def SetCurrent (image):
"""
Set the currently displayed Image from Blenders UV/Image window.
When multiple images are displayed, the last active UV/Image windows image is used.
@type image: Blender Image
@param image: The image to display in the image view.
@rtype: bool
@return: True if the current image could be set, if no window was available, return False.
"""

@ -59,45 +59,51 @@ Example::
@type Settings: readonly dictionary
@var Settings: Constant Modifier dict used for changing modifier settings.
- RENDER - Used for all modifiers
- REALTIME - Used for all modifiers
- EDITMODE - Used for all modifiers
- ONCAGE - Used for all modifiers
- RENDER - Used for all modifiers (bool)
- REALTIME - Used for all modifiers (bool)
- EDITMODE - Used for all modifiers (bool)
- ONCAGE - Used for all modifiers (bool)
- OBJECT - Used for Armature, Lattice, Curve, Boolean and Array
- VERTGROUP - Used for Armature, Lattice and Curve
- LIMIT - Array and Mirror
- FLAG - Mirror and Wave
- COUNT - Decimator and Array
- OBJECT - Used for Armature, Lattice, Curve, Boolean and Array (Object)
- VERTGROUP - Used for Armature, Lattice and Curve (String)
- LIMIT - Array and Mirror (float [0.0 - 1.0])
- FLAG - Mirror and Wave (int)
- COUNT - Decimator Polycount (readonly) and Array (int)
- LENGTH - Build [1.0-300000.0] and Array [0.0 - 10000.0] (float)
- TYPES - Used for Subsurf only
- LEVELS - Used for Subsurf only
- RENDLEVELS - Used for Subsurf only
- OPTIMAL - Used for Subsurf only
- UV - Used for Subsurf only
- LEVELS - Used for Subsurf only (int [0 - 6])
- RENDLEVELS - Used for Subsurf only (int [0 - 6])
- OPTIMAL - Used for Subsurf only (bool)
- UV - Used for Subsurf only (bool)
- OBJECT_OFFSET - Used for Array only (Object)
- OBJECT_CURVE - Used for Array only (Curve Object)
- OFFSET_VEC - Used for Array only (3d Vector)
- SCALE_VEC - Used for Array only (3d Vector)
- MERGE_DIST - Used for Array only (float)
- ENVELOPES - Used for Armature only
- ENVELOPES - Used for Armature only (bool)
- START - Used for Build only
- LENGTH - Used for Build only
- SEED - Used for Build only
- RANDOMIZE - Used for Build only
- START - Used for Build only (int)
- SEED - Used for Build only (int)
- RANDOMIZE - Used for Build only (bool)
- AXIS - Used for Mirror only
- AXIS - Used for Mirror only (int [0 - 2])
- RATIO - Used for Decimate only
- RATIO - Used for Decimate only (float [0.0 - 1.0])
- STARTX - Used for Wave only
- STARTY - Used for Wave only
- HEIGHT - Used for Wave only
- WIDTH - Used for Wave only
- NARROW - Used for Wave only
- SPEED - Used for Wave only
- DAMP - Used for Wave only
- LIFETIME - Used for Wave only
- TIMEOFFS - Used for Wave only
- OPERATION - Used for Wave only
- STARTX - Used for Wave only (float [-100.0 - 100.0])
- STARTY - Used for Wave only (float [-100.0 - 100.0])
- HEIGHT - Used for Wave only (float [-2.0 - 2.0])
- WIDTH - Used for Wave only (float [0.0 - 5.0])
- NARROW - Used for Wave only (float [0.0 - 10.0])
- SPEED - Used for Wave only (float [-2.0 - 2.0])
- DAMP - Used for Wave only (float [-1000.0 - 1000.0])
- LIFETIME - Used for Wave only (float [-1000.0 - 1000.0])
- TIMEOFFS - Used for Wave only (float [-1000.0 - 1000.0])
- OPERATION - Used for boolean only (int 0,1,2 : Intersect, Union, Difference)
"""
class Modifiers:

@ -39,6 +39,8 @@
#include "BKE_global.h"
#include "BKE_main.h"
#include "Mathutils.h"
#include "constant.h"
//---------------------- EXPP_FloatsAreEqual -------------------------
@ -683,6 +685,26 @@ int EXPP_setIValueClamped( PyObject *value, void *param,
}
}
int EXPP_setVec3Clamped( PyObject *value, float *param[3],
float min, float max )
{
if( VectorObject_Check( value ) ) {
VectorObject *vect = (VectorObject *)value;
if( vect->size == 3 ) {
*param[0] = EXPP_ClampFloat( vect->vec[0], min, max );
*param[1] = EXPP_ClampFloat( vect->vec[1], min, max );
*param[2] = EXPP_ClampFloat( vect->vec[2], min, max );
return 0;
}
}
if (1) {
char errstr[128];
sprintf ( errstr, "expected vector argument in [%f,%f]", min, max );
return EXPP_ReturnIntError( PyExc_TypeError, errstr );
}
}
/*
* Utility routines to range-check and store various datatypes. The object

@ -114,6 +114,8 @@ int EXPP_setIValueClamped( PyObject *value, void *param,
int min, int max, char type );
int EXPP_setFloatClamped ( PyObject *value, float *param,
float min, float max);
int EXPP_setVec3Clamped ( PyObject *value, float *param[3],
float min, float max);
int EXPP_setIValueRange( PyObject *value, void *param,
int min, int max, char type );
int EXPP_setFloatRange ( PyObject *value, float *param,