diff options
author | Campbell Barton <ideasman42@gmail.com> | 2007-03-27 15:37:54 +0400 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2007-03-27 15:37:54 +0400 |
commit | 66238eab7c618286f4097254e255db44b29d4e61 (patch) | |
tree | b10ecf479d94c4ef6f9bb12ae883d8f5e60c1ccf /source/blender | |
parent | 0326ec77a939e3377e77c5e250848c9ea6362312 (diff) |
PyAPI
curve - added curve_type() to return the curve type
BPyModule & gen_library - works with text3d now, can also make new text3d through bpy.curves.new
Added Draw.Label() so scripts can draw can using freetype.
widgetwizard - use Draw.Label
Diffstat (limited to 'source/blender')
-rw-r--r-- | source/blender/blenkernel/BKE_curve.h | 1 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/curve.c | 28 | ||||
-rw-r--r-- | source/blender/python/api2_2x/BPyModule.c | 70 | ||||
-rw-r--r-- | source/blender/python/api2_2x/Draw.c | 24 | ||||
-rw-r--r-- | source/blender/python/api2_2x/doc/Bpy.py | 119 | ||||
-rw-r--r-- | source/blender/python/api2_2x/doc/Draw.py | 10 | ||||
-rw-r--r-- | source/blender/python/api2_2x/gen_library.c | 31 |
7 files changed, 165 insertions, 118 deletions
diff --git a/source/blender/blenkernel/BKE_curve.h b/source/blender/blenkernel/BKE_curve.h index 655b5e5284a..19c3c620419 100644 --- a/source/blender/blenkernel/BKE_curve.h +++ b/source/blender/blenkernel/BKE_curve.h @@ -51,6 +51,7 @@ void free_curve( struct Curve *cu); struct Curve *add_curve(char *name, int type); struct Curve *copy_curve( struct Curve *cu); void make_local_curve( struct Curve *cu); +short curve_type( struct Curve *cu); void test_curve_type( struct Object *ob); void tex_space_curve( struct Curve *cu); int count_curveverts( struct ListBase *nurb); diff --git a/source/blender/blenkernel/intern/curve.c b/source/blender/blenkernel/intern/curve.c index 076727093f1..e2a8e2ec00e 100644 --- a/source/blender/blenkernel/intern/curve.c +++ b/source/blender/blenkernel/intern/curve.c @@ -226,28 +226,24 @@ void make_local_curve(Curve *cu) } } - -void test_curve_type(Object *ob) +short curve_type(Curve *cu) { Nurb *nu; - Curve *cu; - - cu= ob->data; if(cu->vfont) { - ob->type= OB_FONT; - return; + return OB_FONT; } - else { - nu= cu->nurb.first; - while(nu) { - if(nu->pntsv>1) { - ob->type= OB_SURF; - return; - } - nu= nu->next; + for (nu= cu->nurb.first; nu; nu= nu->next) { + if(nu->pntsv>1) { + return OB_SURF; } } - ob->type= OB_CURVE; + + return OB_CURVE; +} + +void test_curve_type(Object *ob) +{ + ob->type = curve_type(ob->data); } void tex_space_curve(Curve *cu) diff --git a/source/blender/python/api2_2x/BPyModule.c b/source/blender/python/api2_2x/BPyModule.c index 6a49aa56a79..8ca3f28912c 100644 --- a/source/blender/python/api2_2x/BPyModule.c +++ b/source/blender/python/api2_2x/BPyModule.c @@ -114,6 +114,7 @@ #include "DNA_space_types.h" #include "DNA_screen_types.h" +extern VFont *get_builtin_font(void); static PyObject *LibBlockSeq_CreatePyObject( Link *iter, int type ) { @@ -393,9 +394,9 @@ Mesh *add_mesh__internal(char *name) PyObject *LibBlockSeq_new(BPy_LibBlockSeq *self, PyObject * args, PyObject *kwd) { ID *id = NULL; - char *name=NULL, *filename=NULL, *ipo_type; + char *name=NULL, *filename=NULL, *data_type=NULL; int img_width=256, img_height=256; - short ipo_code = 0; + short data_code = 0; int user_count = 0; /* Load from file */ @@ -461,37 +462,37 @@ PyObject *LibBlockSeq_new(BPy_LibBlockSeq *self, PyObject * args, PyObject *kwd) "one string and two ints expected as arguments" ); CLAMP(img_width, 4, 5000); CLAMP(img_height, 4, 5000); + + } else if (self->type == ID_CU) { + /* Curve, needs name and type strings */ + if( !PyArg_ParseTuple( args, "ss", &name, &data_type ) ) + return EXPP_ReturnPyObjError( PyExc_TypeError, + "two strings expected as arguments" ); + if( !strcmp( data_type, "Curve" ) ) data_code = OB_CURVE; + else if( !strcmp( data_type, "Text3d" ) ) data_code = OB_FONT;/* + else if( !strcmp( data_type, "Surf" ) ) data_code = OB_SURF;*/ + else return EXPP_ReturnPyObjError( PyExc_TypeError, + "Second argument for Curve type incorrect\t\nmust be a string in (Curve or Text - Surf is not supported yet)" ); + } else if (self->type == ID_IP) { /* IPO, needs name and type strings */ - if( !PyArg_ParseTuple( args, "ss", &name, &ipo_type ) ) + if( !PyArg_ParseTuple( args, "ss", &name, &data_type ) ) return EXPP_ReturnPyObjError( PyExc_TypeError, "two strings expected as arguments" ); - if( !strcmp( ipo_type, "Object" ) ) - ipo_code = ID_OB; - else if( !strcmp( ipo_type, "Camera" ) ) - ipo_code = ID_CA; - else if( !strcmp( ipo_type, "World" ) ) - ipo_code = ID_WO; - else if( !strcmp( ipo_type, "Material" ) ) - ipo_code = ID_MA; - else if( !strcmp( ipo_type, "Texture" ) ) - ipo_code = ID_TE; - else if( !strcmp( ipo_type, "Lamp" ) ) - ipo_code = ID_LA; - else if( !strcmp( ipo_type, "Action" ) ) - ipo_code = ID_PO; - else if( !strcmp( ipo_type, "Constraint" ) ) - ipo_code = ID_CO; - else if( !strcmp( ipo_type, "Sequence" ) ) - ipo_code = ID_SEQ; - else if( !strcmp( ipo_type, "Curve" ) ) - ipo_code = ID_CU; - else if( !strcmp( ipo_type, "Key" ) ) - ipo_code = ID_KE; - else - return EXPP_ReturnPyObjError( PyExc_TypeError, + if( !strcmp( data_type, "Object" ) ) data_code = ID_OB; + else if( !strcmp( data_type, "Camera" ) ) data_code = ID_CA; + else if( !strcmp( data_type, "World" ) ) data_code = ID_WO; + else if( !strcmp( data_type, "Material" ) ) data_code = ID_MA; + else if( !strcmp( data_type, "Texture" ) ) data_code = ID_TE; + else if( !strcmp( data_type, "Lamp" ) ) data_code = ID_LA; + else if( !strcmp( data_type, "Action" ) ) data_code = ID_PO; + else if( !strcmp( data_type, "Constraint" ) ) data_code = ID_CO; + else if( !strcmp( data_type, "Sequence" ) ) data_code = ID_SEQ; + else if( !strcmp( data_type, "Curve" ) ) data_code = ID_CU; + else if( !strcmp( data_type, "Key" ) ) data_code = ID_KE; + else return EXPP_ReturnPyObjError( PyExc_TypeError, "Second argument for IPO type incorrect\t\nmust be a string in (Object, Camera, World, Material, Texture, Lamp, Action, Sequence, Curve, Key)" ); } else { @@ -513,7 +514,18 @@ PyObject *LibBlockSeq_new(BPy_LibBlockSeq *self, PyObject * args, PyObject *kwd) id = (ID *)add_mesh__internal( name ); break; case ID_CU: - id = (ID *)add_curve( name, OB_CURVE ); + id = (ID *)add_curve( name, data_code ); + if (data_code==OB_FONT) { + Text3d *text3d = (Text3d *)id; + text3d->vfont= get_builtin_font(); + text3d->vfont->id.us++; + text3d->str= MEM_mallocN(sizeof(wchar_t), "str"); + text3d->str[0] = '\0'; + text3d->totbox= text3d->actbox= 1; + text3d->tb= MEM_callocN(MAXTEXTBOX*sizeof(TextBox), "textbox"); + text3d->tb[0].w = text3d->tb[0].h = 0.0; + + } /*else { CURVE - Dont need to do anything } */ break; case ID_MB: id = (ID *)add_mball( name ); @@ -543,7 +555,7 @@ PyObject *LibBlockSeq_new(BPy_LibBlockSeq *self, PyObject * args, PyObject *kwd) id = (ID *)add_camera( name ); break; case ID_IP: - id = (ID *)add_ipo( name, ipo_code ); + id = (ID *)add_ipo( name, data_code ); break; case ID_WO: id = (ID *)add_world( name ); diff --git a/source/blender/python/api2_2x/Draw.c b/source/blender/python/api2_2x/Draw.c index e547aafb998..63eb5bc5454 100644 --- a/source/blender/python/api2_2x/Draw.c +++ b/source/blender/python/api2_2x/Draw.c @@ -110,6 +110,7 @@ static PyObject *Method_Number( PyObject * self, PyObject * args ); static PyObject *Method_String( PyObject * self, PyObject * args ); static PyObject *Method_GetStringWidth( PyObject * self, PyObject * args ); static PyObject *Method_Text( PyObject * self, PyObject * args ); +static PyObject *Method_Label( PyObject * self, PyObject * args ); static PyObject *Method_PupMenu( PyObject * self, PyObject * args ); /* next Five by Campbell: */ static PyObject *Method_PupIntInput( PyObject * self, PyObject * args ); @@ -273,6 +274,11 @@ static char Method_Text_doc[] = (font) The font size: 'normal' (default), 'small' or 'tiny'.\n\n\ This function returns the width of the drawn string."; +static char Method_Label_doc[] = + "(text, x, y) - Draw a text label onscreen\n\n\ +(text) The text to draw\n\ +(x, y) The lower left coordinate of the lable"; + static char Method_PupMenu_doc[] = "(string, maxrow = None) - Display a pop-up menu at the screen.\n\ The contents of the pop-up are specified through the 'string' argument,\n\ @@ -359,6 +365,7 @@ static struct PyMethodDef Draw_methods[] = { MethodDef( String ), MethodDef( GetStringWidth ), MethodDef( Text ), + MethodDef( Label ), MethodDef( PupMenu ), MethodDef( PupIntInput ), MethodDef( PupFloatInput ), @@ -1459,6 +1466,23 @@ static PyObject *Method_Text( PyObject * self, PyObject * args ) return PyInt_FromLong( BMF_GetStringWidth( font, text ) ); } +static PyObject *Method_Label( PyObject * self, PyObject * args ) +{ + uiBlock *block; + char *text; + int x, y, w, h; + + if( !PyArg_ParseTuple( args, "siiii", &text, &x, &y, &w, &h ) ) + return EXPP_ReturnPyObjError( PyExc_TypeError, + "expected a string and four ints" ); + + block = Get_uiBlock( ); + uiDefBut(block, LABEL, 0, text, x, y, w, h, 0, 0, 0, 0, 0, ""); + + Py_RETURN_NONE; +} + + static PyObject *Method_PupMenu( PyObject * self, PyObject * args ) { char *text; diff --git a/source/blender/python/api2_2x/doc/Bpy.py b/source/blender/python/api2_2x/doc/Bpy.py index ef755c64976..8ba9ef20469 100644 --- a/source/blender/python/api2_2x/doc/Bpy.py +++ b/source/blender/python/api2_2x/doc/Bpy.py @@ -92,51 +92,51 @@ Example:: Window.RedrawAll() -@var scenes: iterator for L{scene<Scene.Scene>} data -@type scenes: L{LibBlockSeq} -@var objects: iterator for L{object<Object.Object>} data -@type objects: L{LibBlockSeq} -@var meshes: iterator for L{mesh<Mesh.Mesh>} data -@type meshes: L{LibBlockSeq} -@var curves: iterator for L{curve<Curve.Curve>} data -@type curves: L{LibBlockSeq} -@var metaballs: iterator for L{metaball<Metaball.Metaball>} data -@type metaballs: L{LibBlockSeq} -@var materials: iterator for L{material<Material.Material>} data -@type materials: L{LibBlockSeq} -@var textures: iterator for L{texture<Texture.Texture>} data -@type textures: L{LibBlockSeq} -@var images: iterator for L{image<Image.Image>} data -@type images: L{LibBlockSeq} -@var lattices: iterator for L{lattice<Lattice.Lattice>} data -@type lattices: L{LibBlockSeq} -@var lamps: iterator for L{lamp<Lamp.Lamp>} data -@type lamps: L{LibBlockSeq} -@var cameras: iterator for L{camera<Camera.Camera>} data -@type cameras: L{LibBlockSeq} -@var ipos: iterator for L{ipo<Ipo.Ipo>} data -@type ipos: L{LibBlockSeq} -@var worlds: iterator for L{world<World.World>} data -@type worlds: L{LibBlockSeq} -@var fonts: iterator for L{font<Font.Font>} data -@type fonts: L{LibBlockSeq} -@var texts: iterator for L{text<Text.Text>} data -@type texts: L{LibBlockSeq} -@var sounds: iterator for L{sound<Sound.Sound>} data -@type sounds: L{LibBlockSeq} -@var groups: iterator for L{group<Group.Group>} data -@type groups: L{LibBlockSeq} -@var armatures: iterator for L{armature<Armature.Armature>} data -@type armatures: L{LibBlockSeq} -@var actions: iterator for L{action<NLA.Action>} data -@type actions: L{LibBlockSeq} +@var scenes: sequence for L{scene<Scene.Scene>} data +@type scenes: L{libBlockSeq} +@var objects: sequence for L{object<Object.Object>} data +@type objects: L{libBlockSeq} +@var meshes: sequence for L{mesh<Mesh.Mesh>} data +@type meshes: L{libBlockSeq} +@var curves: sequence for L{curve<Curve.Curve>} data, used to store Curve, Surface and Text3d data. +@type curves: L{libBlockSeq} +@var metaballs: sequence for L{metaball<Metaball.Metaball>} data +@type metaballs: L{libBlockSeq} +@var materials: sequence for L{material<Material.Material>} data +@type materials: L{libBlockSeq} +@var textures: sequence for L{texture<Texture.Texture>} data +@type textures: L{libBlockSeq} +@var images: sequence for L{image<Image.Image>} data +@type images: L{libBlockSeq} +@var lattices: sequence for L{lattice<Lattice.Lattice>} data +@type lattices: L{libBlockSeq} +@var lamps: sequence for L{lamp<Lamp.Lamp>} data +@type lamps: L{libBlockSeq} +@var cameras: sequence for L{camera<Camera.Camera>} data +@type cameras: L{libBlockSeq} +@var ipos: sequence for L{ipo<Ipo.Ipo>} data +@type ipos: L{libBlockSeq} +@var worlds: sequence for L{world<World.World>} data +@type worlds: L{libBlockSeq} +@var fonts: sequence for L{font<Font.Font>} data +@type fonts: L{libBlockSeq} +@var texts: sequence for L{text<Text.Text>} data +@type texts: L{libBlockSeq} +@var sounds: sequence for L{sound<Sound.Sound>} data +@type sounds: L{libBlockSeq} +@var groups: sequence for L{group<Group.Group>} data +@type groups: L{libBlockSeq} +@var armatures: sequence for L{armature<Armature.Armature>} data +@type armatures: L{libBlockSeq} +@var actions: sequence for L{action<NLA.Action>} data +@type actions: L{libBlockSeq} @var libraries: L{librarySeq<LibData>} submodule @type libraries: L{librarySeq<LibData>} """ -class LibBlockSeq: +class libBlockSeq: """ Generic Data Access =================== @@ -156,8 +156,8 @@ class LibBlockSeq: B{Library distinctions} - Blender doesn't allow naming collisions within its own pool of data, but it's - possible to run into naming collisions when you have data linked from an external file. + Blender doesn't allow naming collisions within its own data, but it's + possible to run into naming collisions when you have data linked from an external blend file. You can specify where the data is from by using a (name, library) pair as the key. @@ -167,11 +167,11 @@ class LibBlockSeq: >>> group = bpy.groups['mygroup', None] # always returns local data - Iterator + Sequence ======== generic_datablock's are not lists; however they can be used like lists. - An iterator allows you to loop through data, without wasting resources on a large list. + An sequence allows you to loop through data, without wasting resources on a large list. >>> for me in bpy.meshes: ... print me.name @@ -212,24 +212,41 @@ class LibBlockSeq: """ - def new(name="", filename=""): + def new(name): """ This function returns a new datablock containing no data or loaded from a file. - Exceptions - ========== + Most datatypes accept a name for their argument except for L{sounds}, L{fonts}, L{ipos} and L{curves} that need an additional argument. - Use the filename keyword string values to load data from a file, this works with L{images}, L{texts}, L{sounds}, L{fonts} only. + Loading From File + ================= + For L{images}, L{texts}, L{sounds}, L{fonts} types you can use the filename keyword to make a new datablock from a file. + + New L{sounds}, L{fonts} can only be made with the a filename given. + + The filename can a keyword or the second argument, use the keyword only for the datablocks new name to be set by the filename. >>> sound = bpy.sounds.new('newsound', '~/mysound.wav') # uses the first string given for the name. >>> sound = bpy.sounds.new(filename = '~/mysound.wav') # will use the filename to make the name. + Images + ====== + Images optionally accept extra 2 arguments for width and height, values between 4 and 5000 if no args are given they will be 256. - Images optionally accept 3 arguments: bpy.images.new(name, width=256, height=256) - The width and height must br between 4 and 5000 if no args are given they will be 256. + >>> img = bpy.images.new(name, 512, 512) + + Curves + ====== + Curves need 2 arguments: bpy.curves.new(name, type) type must be one of the following... + - 'Curve' + - 'Text3d' - Ipos need 2 arguments: bpy.ipos.new(name, type) type must be a string (use in place of filename) can be... + >>> text3d = bpy.curves.new('MyCurve', 'Text3d') + + Ipos + ==== + Ipos need 2 arguments: bpy.ipos.new(name, type) type must be one of the following... - 'Camera' - 'World' - 'Material' @@ -247,7 +264,7 @@ class LibBlockSeq: >>> scn = bpy.scenes.active ... ob = scn.objects.new(bpy.meshes.new('mymesh')) - + @rtype: datablock """ diff --git a/source/blender/python/api2_2x/doc/Draw.py b/source/blender/python/api2_2x/doc/Draw.py index 5292083c452..13724657503 100644 --- a/source/blender/python/api2_2x/doc/Draw.py +++ b/source/blender/python/api2_2x/doc/Draw.py @@ -741,6 +741,16 @@ def Text(string, fontsize = 'normal'): @note: For drawing text in the 3d view see the workaround in L{BGL.glRasterPos} """ +def Label(string, x, y, w, h): + """ + Draw a text lable on the screen. + + @type string: string + @param string: The text string to draw. + @rtype: None + @return: None + """ + def Image(image, x, y, zoomx=1.0, zoomy=1.0, clipx=0, clipy=0, clipw=-1, cliph=-1): """ Draw an image on the screen. diff --git a/source/blender/python/api2_2x/gen_library.c b/source/blender/python/api2_2x/gen_library.c index a93bb2f879a..a637bb509b4 100644 --- a/source/blender/python/api2_2x/gen_library.c +++ b/source/blender/python/api2_2x/gen_library.c @@ -8,6 +8,7 @@ #include "BKE_global.h" #include "BKE_main.h" #include "BKE_library.h" +#include "BKE_curve.h" /* GenericLib */ #include "World.h" @@ -20,6 +21,7 @@ #include "Armature.h" #include "Lamp.h" #include "Text.h" +#include "Text3d.h" #include "Sound.h" #include "Scene.h" #include "Mesh.h" @@ -31,7 +33,6 @@ #include "DNA_ipo_types.h" - /* Generic get/set attrs */ PyObject *GenericLib_getName( void *self ) { @@ -276,61 +277,47 @@ PyObject *GetPyObjectFromID( ID * id ) switch ( MAKE_ID2( id->name[0], id->name[1] ) ) { case ID_SCE: return Scene_CreatePyObject( ( Scene *) id ); - break; case ID_OB: return Object_CreatePyObject( (Object *) id ); - break; case ID_ME: return Mesh_CreatePyObject( (Mesh *)id, NULL ); - break; - case ID_CU: /*todo, support curnurbs?*/ - return Curve_CreatePyObject((Curve *)id); - break; + case ID_CU: + switch (curve_type((Curve *)id)) { + case OB_FONT: + return Text3d_CreatePyObject( (Text3d *)id ); + default: + return Curve_CreatePyObject( (Curve *)id ); + } case ID_MB: return Metaball_CreatePyObject((MetaBall *)id); - break; case ID_MA: return Material_CreatePyObject((Material *)id); - break; case ID_TE: return Texture_CreatePyObject((Tex *)id); - break; case ID_IM: return Image_CreatePyObject((Image *)id); - break; case ID_LT: return Lattice_CreatePyObject((Lattice *)id); - break; case ID_LA: return Lamp_CreatePyObject((Lamp *)id); - break; case ID_CA: return Camera_CreatePyObject((Camera *)id); - break; case ID_IP: return Ipo_CreatePyObject((Ipo *)id); - break; case ID_WO: return World_CreatePyObject((World *)id); - break; case ID_VF: return Font_CreatePyObject((VFont *)id); - break; case ID_TXT: return Text_CreatePyObject((Text *)id); - break; case ID_SO: return Sound_CreatePyObject((bSound *)id); - break; case ID_GR: return Group_CreatePyObject((Group *)id); - break; case ID_AR: return Armature_CreatePyObject((bArmature *)id); - break; case ID_AC: return Action_CreatePyObject((bAction *)id); - break; } Py_RETURN_NONE; } |