Added Mesh.New() method; can now create new meshes within the module

Changed Object.link() to allow link objects with both BPython-type meshes
Changed Object.getData() to allow retrieving both types of BPython-type meshes

Added new mesh types to Types module
This commit is contained in:
Ken Hughes 2005-10-04 15:17:27 +00:00
parent 772459f15c
commit ac668ea561
10 changed files with 130 additions and 22 deletions

@ -2878,9 +2878,11 @@ static PyObject *Mesh_calcNormals( BPy_Mesh * self )
static PyObject *Mesh_vertexShade( BPy_Mesh * self )
{
Base *base = FIRSTBASE;
if( G.obedit )
return EXPP_ReturnPyObjError(PyExc_RuntimeError,
"can't shade vertices while in edit mode" );
while( base ) {
if( base->object->type == OB_MESH &&
base->object->data == self->mesh ) {
@ -3368,6 +3370,10 @@ PyTypeObject Mesh_Type = {
NULL
};
/*
* get one or all mesh data objects
*/
static PyObject *M_Mesh_Get( PyObject * self, PyObject * args )
{
char *name = NULL;
@ -3412,6 +3418,45 @@ static PyObject *M_Mesh_Get( PyObject * self, PyObject * args )
}
}
/*
* create a new mesh data object
*/
static PyObject *M_Mesh_New( PyObject * self, PyObject * args )
{
char *name = "Mesh";
PyObject *ret = NULL;
Mesh *mesh;
BPy_Mesh *obj;
char buf[21];
if( !PyArg_ParseTuple( args, "|s", &name ) )
return EXPP_ReturnPyObjError( PyExc_TypeError,
"expected nothing or a string as argument" );
obj = (BPy_Mesh *)PyObject_NEW( BPy_Mesh, &Mesh_Type );
if( !obj )
return EXPP_ReturnPyObjError( PyExc_RuntimeError,
"PyObject_New() failed" );
mesh = add_mesh(); /* doesn't return NULL now, but might someday */
if( !mesh ) {
Py_DECREF ( obj );
return EXPP_ReturnPyObjError( PyExc_RuntimeError,
"FATAL: could not create mesh object" );
}
mesh->id.us = 0;
G.totmesh++;
PyOS_snprintf( buf, sizeof( buf ), "%s", name );
rename_id( &mesh->id, buf );
obj->mesh = mesh;
return (PyObject *)obj;
}
#define SUBDIVIDE_EXPERIMENT
#undef SUBDIVIDE_EXPERIMENT
@ -3466,6 +3511,8 @@ static PyObject *M_Mesh_Subdivide( PyObject * self, PyObject * args )
#endif
static struct PyMethodDef M_Mesh_methods[] = {
{"New", (PyCFunction)M_Mesh_New, METH_VARARGS,
"Create a new mesh"},
{"Get", (PyCFunction)M_Mesh_Get, METH_VARARGS,
"Get a mesh by name"},
#ifdef SUBDIVIDE_EXPERIMENT
@ -3524,3 +3571,11 @@ int Mesh_CheckPyObject( PyObject * pyobj )
return ( pyobj->ob_type == &Mesh_Type );
}
Mesh *Mesh_FromPyObject( PyObject * pyobj )
{
BPy_Mesh *blen_obj;
blen_obj = ( BPy_Mesh * ) pyobj;
return blen_obj->mesh;
}

@ -119,5 +119,6 @@ typedef struct {
PyObject *Mesh_Init( void );
PyObject *Mesh_CreatePyObject( Mesh * me );
int Mesh_CheckPyObject( PyObject * pyobj );
Mesh *Mesh_FromPyObject( PyObject * pyobj );
#endif /* EXPP_MESH_H */

@ -3374,7 +3374,7 @@ int NMesh_CheckPyObject( PyObject * pyobj )
return ( pyobj->ob_type == &NMesh_Type );
}
Mesh *Mesh_FromPyObject( PyObject * pyobj, Object * ob )
Mesh *NMesh_FromPyObject( PyObject * pyobj, Object * ob )
{
if( pyobj->ob_type == &NMesh_Type ) {
Mesh *mesh;

@ -139,7 +139,7 @@ extern void test_object_materials( ID * id ); /* declared in BKE_material.h */
PyObject *NMesh_Init( void );
PyObject *NMesh_CreatePyObject( Mesh * me, Object * ob );
Mesh *Mesh_FromPyObject( PyObject * pyobj, Object * ob );
Mesh *NMesh_FromPyObject( PyObject * pyobj, Object * ob );
int NMesh_CheckPyObject( PyObject * pyobj );

@ -72,6 +72,7 @@ struct rctf;
#include "blendef.h"
#include "Scene.h"
#include "Mathutils.h"
#include "Mesh.h"
#include "NMesh.h"
#include "Curve.h"
#include "Ipo.h"
@ -280,7 +281,7 @@ hierarchy (faster)"},
mode\n\t2: Keep object transform\nfast\n\t>0: Don't update scene \
hierarchy (faster)"},
{"getData", ( PyCFunction ) Object_getData, METH_VARARGS | METH_KEYWORDS,
"(name_only = 0) - Returns the datablock object containing the object's \
"(name_only = 0, mesh = 0) - Returns the datablock object containing the object's \
data, e.g. Mesh.\n\
If 'name_only' is nonzero or True, only the name of the datablock is returned"},
{"getDeltaLocation", ( PyCFunction ) Object_getDeltaLocation,
@ -989,9 +990,10 @@ static PyObject *Object_getData( BPy_Object *self, PyObject *args, PyObject *kwd
PyObject *data_object;
Object *object = self->object;
int name_only = 0;
static char *kwlist[] = {"name_only", NULL};
int mesh = 0; /* default mesh type = NMesh */
static char *kwlist[] = {"name_only", "mesh", NULL};
if (!PyArg_ParseTupleAndKeywords(args, kwd, "|i", kwlist, &name_only))
if (!PyArg_ParseTupleAndKeywords(args, kwd, "|ii", kwlist, &name_only, &mesh))
return EXPP_ReturnPyObjError( PyExc_AttributeError,
"expected nothing or bool keyword 'name_only' as argument" );
@ -1041,7 +1043,10 @@ static PyObject *Object_getData( BPy_Object *self, PyObject *args, PyObject *kwd
case ID_MA:
break;
case OB_MESH:
data_object = NMesh_CreatePyObject( object->data, object );
if( !mesh ) /* get as NMesh (default) */
data_object = NMesh_CreatePyObject( object->data, object );
else /* else get as Mesh */
data_object = Mesh_CreatePyObject( object->data );
break;
case ID_OB:
data_object = Object_CreatePyObject( object->data );
@ -1472,21 +1477,24 @@ static PyObject *Object_link( BPy_Object * self, PyObject * args )
return ( EXPP_ReturnPyObjError( PyExc_AttributeError,
"expected an object as argument" ) );
}
if( Armature_CheckPyObject( py_data ) )
data = ( void * ) Armature_FromPyObject( py_data );
if( Camera_CheckPyObject( py_data ) )
else if( Camera_CheckPyObject( py_data ) )
data = ( void * ) Camera_FromPyObject( py_data );
if( Lamp_CheckPyObject( py_data ) )
else if( Lamp_CheckPyObject( py_data ) )
data = ( void * ) Lamp_FromPyObject( py_data );
if( Curve_CheckPyObject( py_data ) )
else if( Curve_CheckPyObject( py_data ) )
data = ( void * ) Curve_FromPyObject( py_data );
if( NMesh_CheckPyObject( py_data ) )
data = ( void * ) Mesh_FromPyObject( py_data, self->object );
if( Lattice_CheckPyObject( py_data ) )
else if( NMesh_CheckPyObject( py_data ) )
data = ( void * ) NMesh_FromPyObject( py_data, self->object );
else if( Mesh_CheckPyObject( py_data ) )
data = ( void * ) Mesh_FromPyObject( py_data );
else if( Lattice_CheckPyObject( py_data ) )
data = ( void * ) Lattice_FromPyObject( py_data );
if( Metaball_CheckPyObject( py_data ) )
else if( Metaball_CheckPyObject( py_data ) )
data = ( void * ) Metaball_FromPyObject( py_data );
if( Text3d_CheckPyObject( py_data ) )
else if( Text3d_CheckPyObject( py_data ) )
data = ( void * ) Text3d_FromPyObject( py_data );
/* have we set data to something good? */

@ -68,6 +68,12 @@ void types_InitAll( void )
NMFace_Type.ob_type = &PyType_Type;
NMVert_Type.ob_type = &PyType_Type;
NMesh_Type.ob_type = &PyType_Type;
Mesh_Type.ob_type = &PyType_Type;
MFace_Type.ob_type = &PyType_Type;
MVert_Type.ob_type = &PyType_Type;
MEdge_Type.ob_type = &PyType_Type;
MCol_Type.ob_type = &PyType_Type;
Mesh_Type.ob_type = &PyType_Type;
Object_Type.ob_type = &PyType_Type;
Particle_Type.ob_type = &PyType_Type;
RenderData_Type.ob_type = &PyType_Type;
@ -117,6 +123,15 @@ PyObject *Types_Init( void )
( PyObject * ) &NMVert_Type );
PyDict_SetItemString( dict, "NMColType", ( PyObject * ) &NMCol_Type );
PyDict_SetItemString( dict, "MeshType", ( PyObject * ) &Mesh_Type );
PyDict_SetItemString( dict, "MFaceType",
( PyObject * ) &MFace_Type );
PyDict_SetItemString( dict, "MEdgeType",
( PyObject * ) &MEdge_Type );
PyDict_SetItemString( dict, "MVertType",
( PyObject * ) &MVert_Type );
PyDict_SetItemString( dict, "MColType", ( PyObject * ) &MCol_Type );
PyDict_SetItemString( dict, "ArmatureType",
( PyObject * ) &Armature_Type );
PyDict_SetItemString( dict, "BoneType", ( PyObject * ) &Bone_Type );

@ -45,6 +45,7 @@ extern PyTypeObject Image_Type, Ipo_Type, IpoCurve_Type;
extern PyTypeObject Lamp_Type, Lattice_Type;
extern PyTypeObject Material_Type, Metaball_Type, MTex_Type;
extern PyTypeObject NMFace_Type, NMVert_Type, NMCol_Type, NMesh_Type;
extern PyTypeObject MFace_Type, MVert_Type, MEdge_Type, MCol_Type, Mesh_Type;
extern PyTypeObject Object_Type;
extern PyTypeObject Particle_Type;
extern PyTypeObject Scene_Type, RenderData_Type;

@ -47,6 +47,15 @@ def Get(name=None):
If no parameter is given, it returns all the meshs in the current scene.
"""
def New(name='Mesh'):
"""
Create a new mesh data object called I{name}.
@type name: string
@param name: The name of the mesh data object.
@rtype: Mesh
@return: a new Blender mesh.
"""
class MCol:
"""
The MCol object

@ -4,8 +4,9 @@
The Blender.Object submodule
B{New}:
- L{Object.getData} now accepts an optional bool keyword argument to
define if the user wants the data object or just its name.
- L{Object.getData} now accepts two optional bool keyword argument to
define (1) if the user wants the data object or just its name
and (2) if a mesh object should use NMesh or Mesh.
- L{Object.clearScriptLinks} accepts a parameter now.
- Object attributes: renamed Layer to L{Layers<Object.Object.Layers>} and
added the easier L{layers<Object.Object.layers>}. The old form "Layer"
@ -206,11 +207,19 @@ class Object:
other value, or no value at all will update the scene hierarchy.
"""
def getData(name_only = False):
def getData(name_only=False, mesh=False):
"""
Returns the Datablock object (Mesh, Lamp, Camera, etc.) linked to this Object. If the keyword parameter 'name_only' is True, only the Datablock name is returned as a string.
Returns the Datablock object (Mesh, Lamp, Camera, etc.) linked to this
Object. If the keyword parameter 'name_only' is True, only the Datablock
name is returned as a string. It the object is of type Mesh, then the
'mesh' keyword can also be used; the data return is a Mesh object if
True, otherwise it is an NMesh object (the default).
@type name_only: bool
@param name_only: This is a keyword parameter. if True (or nonzero), only the name of the data object is returned. The default value is False.
@param name_only: This is a keyword parameter. If True (or nonzero),
only the name of the data object is returned.
@type mesh: bool
@param mesh: This is a keyword parameter. If True (or nonzero),
a Mesh data object is returned.
@rtype: specific Object type or string
@return: Depends on the type of Datablock linked to the Object. If name_only is True, it returns a string.
"""

@ -31,7 +31,13 @@ Example::
@var NMFaceType: Blender NMFace. A mesh face, with one (a point), two (an edge),
three (a triangular face) or four (a quad face) vertices.
@var NMVertType: Blender NMVert. A mesh vertex.
@var NMColType: Blender NMCol. A mesh rgba colour.
@var NMColType: Blender NMCol. A mesh rgba color.
@var MeshType: Blender Mesh. The mesh structure.
@var MFaceType: Blender MFace. A mesh face, with
three (a triangular face) or four (a quad face) vertices.
@var MEdgeType: Blender MEdge. A mesh edge, with two vertices
@var MVertType: Blender MVert. A mesh vertex.
@var MColType: Blender MCol. A mesh rgba color.
@var ArmatureType: Blender Armature. The "skeleton", for animating and deforming
objects.
@var BoneType: Blender Bone. Bones are, obviously, the "pieces" of an Armature.
@ -42,13 +48,17 @@ objects.
@var ImageType: Blender Image.
@var LampType: Blender Lamp.
@var TextType: Blender Text.
@var Text3dType: Blender Text3d.
@var MaterialType: Blender Material.
@var SceneType: A Blender Scene. Container of all other objects.
@var ButtonType: Blender Button. One of the Draw widgets.
@var vectorType: Blender vector. Used in NMesh.
@var vectorType: Blender vector. Used in NMesh, Mesh and elsewhere.
@var matrix_Type: Blender matrix.
@var quaternionType: Blender quaternion. Used in armatures.
@var eulerType: Blender euler.
@var bufferType: Blender buffer. A contiguous piece of storage, used in BGL.
@var constantType: Blender constant. A constant dictionary.
@var rgbTupleType: Blender rgbTuple. A (red, green, blue) triplet.
@var TextureType: Blender Texture.
@var MTexType: Blender MTex -- it links materials to a texture.
@var MTexType: Blender MTex. Links materials to a texture.
"""