===Python API===

Initial commit for new Modifier API.  Probably does about 70-75% of what it
should, but it's a start.
This commit is contained in:
Ken Hughes 2006-04-23 02:34:50 +00:00
parent a7863efb8a
commit 8001a8b409
8 changed files with 1406 additions and 15 deletions

@ -75,6 +75,10 @@ extern void autocomplete_vgroup(char *str, void *arg_v);
extern void effects_panels(void);
extern void do_effects_panels(unsigned short event);
/* modifiers */
extern int mod_moveUp(void *ob_v, void *md_v);
extern int mod_moveDown(void *ob_v, void *md_v);
/* editing */
extern void editing_panels(void);
extern void do_common_editbuts(unsigned short event);

File diff suppressed because it is too large Load Diff

@ -0,0 +1,70 @@
/*
* $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): Ken Hughes
*
* ***** END GPL/BL DUAL LICENSE BLOCK *****
*/
#ifndef EXPP_MODIFIER_H
#define EXPP_MODIFIER_H
#include <Python.h>
#include "DNA_object_types.h"
#include "DNA_modifier_types.h"
#include "DNA_listBase.h"
/*****************************************************************************/
/* Python BPy_Modifier structure definition: */
/*****************************************************************************/
typedef struct {
PyObject_HEAD /* required macro */
Object *obj;
ModifierData *md;
} BPy_Modifier;
extern PyTypeObject Modifier_Type;
#define BPy_Modifier_Check(v) ((v)->ob_type == &Modifier_Type) /* for type checking */
/*
* prototypes
*/
PyObject *Modifier_CreatePyObject( Object *obj, ModifierData *md );
ModifierData *Modifier_FromPyObject( PyObject * py_obj );
int Modifier_CheckPyObject( PyObject * py_obj );
typedef struct {
PyObject_HEAD /* required macro */
Object *obj;
ModifierData *iter;
} BPy_ModSeq;
PyObject *ModSeq_CreatePyObject( Object *obj );
#endif /* EXPP_MODIFIER_H */

@ -108,6 +108,7 @@ struct rctf;
#include "Effect.h"
#include "Pose.h"
#include "Group.h"
#include "Modifier.h"
#include "gen_utils.h"
#include "BIF_editkey.h"
@ -3513,6 +3514,8 @@ static PyObject *Object_getAttr( BPy_Object * obj, char *name )
return Object_getDupliNoSpeed( obj );
if( StringEqual( name, "drawSize" ) )
return ( PyFloat_FromDouble( object->empty_drawsize ) );
if( StringEqual( name, "modifiers" ) )
return ModSeq_CreatePyObject( obj->object );
/* not an attribute, search the methods table */
return Py_FindMethod( BPy_Object_methods, ( PyObject * ) obj, name );

@ -59,6 +59,7 @@ extern PyTypeObject property_Type;
extern PyTypeObject buffer_Type, constant_Type, euler_Type;
extern PyTypeObject matrix_Type, quaternion_Type, rgbTuple_Type, vector_Type;
extern PyTypeObject point_Type;
extern PyTypeObject Modifier_Type, ModSeq_Type;
char M_Types_doc[] = "The Blender Types module\n\n\
This module is a dictionary of all Blender Python types";
@ -121,6 +122,9 @@ void types_InitAll( void )
vector_Type.ob_type = &PyType_Type;
property_Type.ob_type = &PyType_Type;
point_Type.ob_type = &PyType_Type;
PyType_Ready( &Modifier_Type );
PyType_Ready( &ModSeq_Type );
}
/*****************************************************************************/
@ -223,6 +227,10 @@ PyObject *Types_Init( void )
( PyObject * ) &property_Type );
PyDict_SetItemString( dict, "pointType",
( PyObject * ) &point_Type );
PyDict_SetItemString( dict, "ModifierType",
( PyObject * ) &Modifier_Type );
PyDict_SetItemString( dict, "ModSeqType",
( PyObject * ) &ModSeq_Type );
return submodule;
}

@ -15,7 +15,7 @@ The Blender Python API Reference
-----------
- L{Armature}
- L{NLA}
- L{BezTriple}
- L{BezTriple} (*)
- L{BGL}
- L{Camera}
- L{Curve}
@ -23,8 +23,8 @@ The Blender Python API Reference
- L{Effect}
- L{Group} (*)
- L{Image}
- L{Ipo}
- L{IpoCurve}
- L{Ipo} (*)
- L{IpoCurve} (*)
- L{Key} (*)
- L{Lamp}
- L{Lattice}
@ -33,6 +33,7 @@ The Blender Python API Reference
- L{Mathutils} (*)
- L{Mesh} (*)
- L{Metaball}
- L{Modifier} (*)
- L{NMesh} (*)
- L{Noise}
- L{Object} (*)

@ -0,0 +1,122 @@
# Blender.Modifier module and the Modifier PyType object
"""
The Blender.Modifier submodule
B{New}:
- provides access to Blender's modifier stack
This module provides access to the Modifier Data in Blender.
Example::
from Blender import *
ob = Object.Get('Cube') # retrieve an object
mods = ob.modifiers # get the object's modifiers
for mod in mods:
print mod,mod.name # print each modifier and its name
mod = mods.append(mod.SUBSURF) # add a new subsurf modifier
mod[mod.keys().LEVELS] = 3 # set subsurf subdivision levels to 3
"""
class ModSeq:
"""
The ModSeq object
=================
This object provides access to list of modifiers for a particular object.
"""
def __getitem__(index):
"""
This operator returns one of the object's modifiers.
@type index: int
@return: an Modifier object
@rtype: Modifier
@raise KeyError: index was out of range
"""
def __len__():
"""
Returns the number of modifiers in the object's modifier stack.
@return: number of Modifiers
@rtype: int
"""
def append(type):
"""
Appends a new modifier to the end of the object's modifier stack.
@type type: a constant specifying the type of modifier to create
@rtype: Modifier
@return: the new Modifier
"""
class Modifier:
"""
The Modifier object
===================
This object provides access to a modifier for a particular object.
"""
def __getitem__(key):
"""
This operator returns one of the modifier's data attributes.
@type key: value from modifier's L{key()} constant
@return: the requested data
@rtype: varies
@raise KeyError: the key does not exist for the modifier
"""
def __setitem__(key):
"""
This operator modifiers one of the modifier's data attributes.
@type key: value from modifier's L{key()} constant
@raise KeyError: the key does not exist for the modifier
"""
def up():
"""
Moves the modifier up in the object's modifier stack.
@rtype: PyNone
@raise RuntimeError: request to move above another modifier requiring
original data
"""
def down():
"""
Moves the modifier down in the object's modifier stack.
@rtype: PyNone
@raise RuntimeError: request to move modifier beyond a non-deforming
modifier
"""
def keys():
"""
Get the sequence of keys for the modifier.
For example, a subsurf modifier can be accessed by::
from Blender import *
ob = Object.Get('Cube') # retrieve an object
mod = ob.modifiers[0] # get the object's modifiers
mod[mod.keys().LEVELS] = 3 # set subsurf subdivision levels to 3
The valid keys are:
- Common keys (all modifiers contain these keys): RENDER, REALTIME,
EDITMODE, ONCAGE
- Armature keys: ENVELOPES, OBJECT, VERTGROUPS
- Boolean keys: OBJECT, OPERATION
- Build keys: START, LENGTH, SEED, RANDOMIZE
- Curve keys: OBJECT, VERTGROUP
- Decimate keys: RATIO, FACE_COUNT
- Lattice keys: OBJECT, VERTGROUP
- Mirror keys: LIMIT, FLAG, AXIS
- Subsurf keys: TYPE, LEVELS, RENDER_LEVELS, OPTIMAL, UV
- Wave keys: START_X, START_Y, HEIGHT, WIDTH, NARROW, SPEED, DAMP,
LIFETIME, TIME_OFFS, FLAG
@rtype: PyConstant
@return: the keys for the modifier
@raise RuntimeError: request to move modifier beyond a non-deforming
modifier
"""

@ -812,7 +812,7 @@ static void modifiers_del(void *ob_v, void *md_v)
BIF_undo_push("Del modifier");
}
static void modifiers_moveUp(void *ob_v, void *md_v)
int mod_moveUp(void *ob_v, void *md_v)
{
Object *ob = ob_v;
ModifierData *md = md_v;
@ -823,20 +823,26 @@ static void modifiers_moveUp(void *ob_v, void *md_v)
if (mti->type!=eModifierTypeType_OnlyDeform) {
ModifierTypeInfo *nmti = modifierType_getInfo(md->prev->type);
if (nmti->flags&eModifierTypeFlag_RequiresOriginalData) {
error("Cannot move above a modifier requiring original data.");
return;
}
if (nmti->flags&eModifierTypeFlag_RequiresOriginalData)
return -1;
}
BLI_remlink(&ob->modifiers, md);
BLI_insertlink(&ob->modifiers, md->prev->prev, md);
}
BIF_undo_push("Move modifier");
return 0;
}
static void modifiers_moveDown(void *ob_v, void *md_v)
static void modifiers_moveUp(void *ob_v, void *md_v)
{
if( mod_moveUp( ob_v, md_v ) )
error("Cannot move above a modifier requiring original data.");
else
BIF_undo_push("Move modifier");
}
int mod_moveDown(void *ob_v, void *md_v)
{
Object *ob = ob_v;
ModifierData *md = md_v;
@ -847,17 +853,23 @@ static void modifiers_moveDown(void *ob_v, void *md_v)
if (mti->flags&eModifierTypeFlag_RequiresOriginalData) {
ModifierTypeInfo *nmti = modifierType_getInfo(md->next->type);
if (nmti->type!=eModifierTypeType_OnlyDeform) {
error("Cannot move beyond a non-deforming modifier.");
return;
}
if (nmti->type!=eModifierTypeType_OnlyDeform)
return -1;
}
BLI_remlink(&ob->modifiers, md);
BLI_insertlink(&ob->modifiers, md->next, md);
}
BIF_undo_push("Move modifier");
return 0;
}
static void modifiers_moveDown(void *ob_v, void *md_v)
{
if( mod_moveDown( ob_v, md_v ) )
error("Cannot move beyond a non-deforming modifier.");
else
BIF_undo_push("Move modifier");
}
static void modifier_testLatticeObj(char *name, ID **idpp)