- New Blender.Draw method by Campbell Barton (Cam / ideasman):

PupStrInput, a wrapper for the Blender String popup (thanks!)
- Fixed bug #1374 reported by Gabriel Beloin (gabio, thanks too):
    http://projects.blender.org/tracker/?func=detail&atid=125&aid=1374&group_id=9
    There was a minor mistake in the import menu: vrml called dxf and vice-versa and shortcuts were wrong (removed them).
- Doc updates, minor updates elsewhere.
This commit is contained in:
Willian Padovani Germano 2004-06-16 01:18:57 +00:00
parent 23165676b7
commit ddec3db89d
7 changed files with 111 additions and 37 deletions

@ -15,7 +15,7 @@ Tip: 'Export to AC3D (.ac) format.'
# -------------------------------------------------------------------------- # --------------------------------------------------------------------------
# AC3DExport version 2.34 # AC3DExport version 2.34
# Program versions: Blender 2.34 and AC3Db files (means version 0xb) # Program versions: Blender 2.34 and AC3Db files (means version 0xb)
# new: minor tweaks, exporter didn't change # new: minor cosmetic tweaks, exporter itself didn't change
# -------------------------------------------------------------------------- # --------------------------------------------------------------------------
# ***** BEGIN GPL LICENSE BLOCK ***** # ***** BEGIN GPL LICENSE BLOCK *****
# #
@ -398,10 +398,12 @@ def b_event(evt):
Draw.Redraw(1) Draw.Redraw(1)
elif evt == 10: elif evt == 10:
ARG = 'all' ARG = 'all'
Blender.Window.FileSelector(fs_callback, "AC3D Export") fname = Blender.sys.makename(ext=".ac")
Blender.Window.FileSelector(fs_callback, "Export AC3D", fname)
elif evt == 11: elif evt == 11:
ARG = 'sel' ARG = 'sel'
Blender.Window.FileSelector(fs_callback, "AC3D Export") fname = Blender.sys.makename(ext=".ac")
Blender.Window.FileSelector(fs_callback, "Export AC3D", fname)
elif evt == 20: elif evt == 20:
HELPME = 1 - HELPME HELPME = 1 - HELPME
Draw.Redraw(1) Draw.Redraw(1)

@ -45,6 +45,7 @@
#include "BLI_winstuff.h" #include "BLI_winstuff.h"
#endif #endif
#include "BLI_blenlib.h"
#include "MEM_guardedalloc.h" #include "MEM_guardedalloc.h"
#include "BMF_Api.h" #include "BMF_Api.h"
@ -107,9 +108,10 @@ static PyObject *Method_String (PyObject * self, PyObject * args);
static PyObject *Method_GetStringWidth (PyObject * self, PyObject * args); static PyObject *Method_GetStringWidth (PyObject * self, PyObject * args);
static PyObject *Method_Text (PyObject * self, PyObject * args); static PyObject *Method_Text (PyObject * self, PyObject * args);
static PyObject *Method_PupMenu (PyObject * self, PyObject * args); static PyObject *Method_PupMenu (PyObject * self, PyObject * args);
/* next two by Campbell: */ /* next three by Campbell: */
static PyObject *Method_PupIntInput (PyObject * self, PyObject * args); static PyObject *Method_PupIntInput (PyObject * self, PyObject * args);
static PyObject *Method_PupFloatInput (PyObject * self, PyObject * args); static PyObject *Method_PupFloatInput (PyObject * self, PyObject * args);
static PyObject *Method_PupStrInput (PyObject * self, PyObject * args);
static uiBlock *Get_uiBlock (void); static uiBlock *Get_uiBlock (void);
static void py_slider_update (void *butv, void *data2_unused); static void py_slider_update (void *butv, void *data2_unused);
@ -150,7 +152,8 @@ static char Method_Button_doc[] =
(event) The event number to pass to the button event function when activated\n\ (event) The event number to pass to the button event function when activated\n\
(x, y) The lower left coordinate of the button\n\ (x, y) The lower left coordinate of the button\n\
(width, height) The button width and height\n\ (width, height) The button width and height\n\
[tooltip=] The button's tooltip"; [tooltip=] The button's tooltip\n\n\
This function can be called as Button() or PushButton().";
static char Method_Menu_doc[] = static char Method_Menu_doc[] =
"(name, event, x, y, width, height, default, [tooltip]) - Create a new Menu \ "(name, event, x, y, width, height, default, [tooltip]) - Create a new Menu \
@ -251,18 +254,25 @@ Ex: Draw.PupMenu('OK?%t|QUIT BLENDER') # should be familiar ...";
static char Method_PupIntInput_doc[] = static char Method_PupIntInput_doc[] =
"(text, default, min, max) - Display an int pop-up input.\n\ "(text, default, min, max) - Display an int pop-up input.\n\
(text) - text string to display at the button;\n\ (text) - text string to display on the button;\n\
(default, min, max) - the default, min and max int values for the button;\n\ (default, min, max) - the default, min and max int values for the button;\n\
Return the value selected or None"; Return the user input value or None on user exit";
static char Method_PupFloatInput_doc[] = static char Method_PupFloatInput_doc[] =
"(text, default, min, max, clickStep, floatLen) - Display a float pop-up input.\n\ "(text, default, min, max, clickStep, floatLen) - Display a float pop-up input.\n\
(text) - text string to display at the button;\n\ (text) - text string to display on the button;\n\
(default, min, max) - the default, min and max float values for the button;\n\ (default, min, max) - the default, min and max float values for the button;\n\
(clickStep) - float increment/decrement for each click on the button arrows;\n\ (clickStep) - float increment/decrement for each click on the button arrows;\n\
(floatLen) - an integer defining the precision (number of decimal places) of \n\ (floatLen) - an integer defining the precision (number of decimal places) of \n\
the float value show.\n\ the float value show.\n\
Return the value selected or None"; Return the user input value or None on user exit";
static char Method_PupStrInput_doc[] =
"(text, default, max = 20) - Display a float pop-up input.\n\
(text) - text string to display on the button;\n\
(default) - the initial string to display (truncated to 'max' chars);\n\
(max = 20) - The maximum number of chars the user can input;\n\
Return the user input value or None on user exit";
static char Method_Exit_doc[] = "() - Exit the windowing interface"; static char Method_Exit_doc[] = "() - Exit the windowing interface";
@ -293,10 +303,12 @@ static struct PyMethodDef Draw_methods[] = {
MethodDef (PupMenu), MethodDef (PupMenu),
MethodDef (PupIntInput), MethodDef (PupIntInput),
MethodDef (PupFloatInput), MethodDef (PupFloatInput),
MethodDef (PupStrInput),
MethodDef (Exit), MethodDef (Exit),
MethodDef (Redraw), MethodDef (Redraw),
MethodDef (Draw), MethodDef (Draw),
MethodDef (Register), MethodDef (Register),
{"PushButton", Method_Button, METH_VARARGS, Method_Button_doc},
{NULL, NULL,0,NULL} {NULL, NULL,0,NULL}
}; };
@ -356,7 +368,7 @@ static int Button_setattr (PyObject *self, char *name, PyObject *v)
/* if the length of the new string is the same as */ /* if the length of the new string is the same as */
/* the old one, just copy, else delete and realloc. */ /* the old one, just copy, else delete and realloc. */
if (but->slen == strlen (newstr)) { if (but->slen == strlen (newstr)) {
strncpy (but->val.asstr, newstr, but->slen); BLI_strncpy (but->val.asstr, newstr, but->slen);
} }
else { else {
MEM_freeN (but->val.asstr); MEM_freeN (but->val.asstr);
@ -1084,10 +1096,10 @@ static PyObject *Method_PupMenu (PyObject *self, PyObject *args)
static PyObject *Method_PupIntInput (PyObject *self, PyObject *args) static PyObject *Method_PupIntInput (PyObject *self, PyObject *args)
{ {
char *text; char *text = NULL;
int min, max; int min = 0, max = 1;
short var; short var = 0;
PyObject *ret; PyObject *ret = NULL;
if (!PyArg_ParseTuple (args, "s|hii", &text, &var, &min, &max)) if (!PyArg_ParseTuple (args, "s|hii", &text, &var, &min, &max))
return EXPP_ReturnPyObjError (PyExc_TypeError, return EXPP_ReturnPyObjError (PyExc_TypeError,
@ -1105,9 +1117,9 @@ static PyObject *Method_PupIntInput (PyObject *self, PyObject *args)
static PyObject *Method_PupFloatInput (PyObject *self, PyObject *args) static PyObject *Method_PupFloatInput (PyObject *self, PyObject *args)
{ {
char *text; char *text = NULL;
float min, max, var, a1, a2; float min = 0, max = 1, var = 0, a1 = 10, a2 = 2;
PyObject *ret; PyObject *ret = NULL;
if (!PyArg_ParseTuple (args, "s|fffff", &text, &var, &min, &max, &a1, &a2)) if (!PyArg_ParseTuple (args, "s|fffff", &text, &var, &min, &max, &a1, &a2))
return EXPP_ReturnPyObjError (PyExc_TypeError, return EXPP_ReturnPyObjError (PyExc_TypeError,
@ -1123,6 +1135,39 @@ static PyObject *Method_PupFloatInput (PyObject *self, PyObject *args)
return EXPP_ReturnPyObjError (PyExc_MemoryError, "couldn't create a PyFloat"); return EXPP_ReturnPyObjError (PyExc_MemoryError, "couldn't create a PyFloat");
} }
static PyObject *Method_PupStrInput (PyObject *self, PyObject *args)
{
char *text = NULL, *textMsg = NULL;
char tmp[101];
char max = 20;
PyObject *ret = NULL;
if (!PyArg_ParseTuple (args, "ss|b", &textMsg, &text, &max))
return EXPP_ReturnPyObjError (PyExc_TypeError,
"expected 2 strings and 1 int");
if ((max <= 0) || (max > 100))
return EXPP_ReturnPyObjError (PyExc_AttributeError,
"max string length value must be in the range [1, 100].");
/* copying the text string handles both cases:
* max < strlen(text) (by truncating) and
* max > strlen(text) (by expanding to strlen(tmp)) */
BLI_strncpy(tmp, text, max);
if (sbutton (tmp, 0, max, textMsg) == 0) {
Py_INCREF (Py_None);
return Py_None;
}
ret = Py_BuildValue ("s", tmp);
if (ret) return ret;
return EXPP_ReturnPyObjError(PyExc_MemoryError, "couldn't create a PyString");
}
PyObject *Draw_Init (void) PyObject *Draw_Init (void)
{ {
PyObject *submodule, *dict; PyObject *submodule, *dict;

@ -56,8 +56,8 @@ void initDraw (void);
typedef struct _Button typedef struct _Button
{ {
PyObject_VAR_HEAD /* required Py Macro */ PyObject_VAR_HEAD /* required Py Macro */
int type; /*@ 1 == int, 2 == float, 3 == string */ int type; /*@ 1 == int, 2 == float, 3 == string */
int slen; /*@ length of string (if type == 3) */ unsigned int slen; /*@ length of string (if type == 3) */
union union
{ {
int asint; int asint;

@ -158,7 +158,7 @@ static PyObject *M_sys_basename (PyObject *self, PyObject *args)
if (n > FILE_MAXFILE) if (n > FILE_MAXFILE)
return EXPP_ReturnPyObjError(PyExc_RuntimeError, "path too long"); return EXPP_ReturnPyObjError(PyExc_RuntimeError, "path too long");
strncpy(basename, p+1, n); /* + 1 to skip the sep */ BLI_strncpy(basename, p+1, n); /* + 1 to skip the sep */
basename[n] = '\0'; basename[n] = '\0';
return Py_BuildValue("s", basename); return Py_BuildValue("s", basename);
} }
@ -190,7 +190,7 @@ static PyObject *M_sys_dirname (PyObject *self, PyObject *args)
if (n > FILE_MAXDIR) if (n > FILE_MAXDIR)
return EXPP_ReturnPyObjError (PyExc_RuntimeError, "path too long"); return EXPP_ReturnPyObjError (PyExc_RuntimeError, "path too long");
strncpy(dirname, name, n); BLI_strncpy(dirname, name, n);
dirname[n] = '\0'; dirname[n] = '\0';
return Py_BuildValue("s", dirname); return Py_BuildValue("s", dirname);
} }
@ -233,9 +233,9 @@ static PyObject *M_sys_splitext (PyObject *self, PyObject *args)
if (n > FILE_MAXFILE || (len - n ) > FILE_MAXFILE) if (n > FILE_MAXFILE || (len - n ) > FILE_MAXFILE)
EXPP_ReturnPyObjError(PyExc_RuntimeError, "path too long"); EXPP_ReturnPyObjError(PyExc_RuntimeError, "path too long");
strncpy(ext, dot, n); BLI_strncpy(ext, dot, n);
ext[n] = '\0'; ext[n] = '\0';
strncpy(path, name, dot - name); BLI_strncpy(path, name, dot - name);
path[dot - name] = '\0'; path[dot - name] = '\0';
return Py_BuildValue("ss", path, ext); return Py_BuildValue("ss", path, ext);
@ -271,11 +271,11 @@ static PyObject *M_sys_makename(PyObject *self, PyObject *args, PyObject *kw)
if (p && strip) { if (p && strip) {
n = path + len - p - 1; /* - 1 because we don't want the sep */ n = path + len - p - 1; /* - 1 because we don't want the sep */
strncpy(basename, p+1, n); /* + 1 to skip the sep */ BLI_strncpy(basename, p+1, n); /* + 1 to skip the sep */
basename[n] = 0; basename[n] = 0;
} }
else { else {
strncpy(basename, path, len); BLI_strncpy(basename, path, len);
n = len; n = len;
basename[n] = '\0'; basename[n] = '\0';
} }
@ -291,7 +291,7 @@ static PyObject *M_sys_makename(PyObject *self, PyObject *args, PyObject *kw)
if (dot) n = dot - basename; if (dot) n = dot - basename;
else n = strlen(basename); else n = strlen(basename);
strncpy(basename + n, ext, lenext); BLI_strncpy(basename + n, ext, lenext);
basename[n+lenext] = '\0'; basename[n+lenext] = '\0';
} }
} }

@ -6,6 +6,8 @@ The Blender.Draw submodule.
Draw Draw
==== ====
B{New}: L{PupIntInput}, L{PupFloatInput}, L{PupStrInput}.
This module provides access to a B{windowing interface} in Blender. Its widgets This module provides access to a B{windowing interface} in Blender. Its widgets
include many kinds of buttons: push, toggle, menu, number, string, slider, include many kinds of buttons: push, toggle, menu, number, string, slider,
scrollbar, plus support for text drawing. It also includes keyboard keys and scrollbar, plus support for text drawing. It also includes keyboard keys and
@ -73,6 +75,8 @@ not necessary to re-register the callbacks, they will stay until Draw.Exit
is called. It's enough to redraw the screen when a relevant event is caught. is called. It's enough to redraw the screen when a relevant event is caught.
Apologies for the confusion. Apologies for the confusion.
@note: function Button has a new alias: L{PushButton}.
@warn: Inside the windowing loop (after Draw.Register() has been executed and @warn: Inside the windowing loop (after Draw.Register() has been executed and
before Draw.Exit() is called), don't use the redraw functions from other before Draw.Exit() is called), don't use the redraw functions from other
modules (Blender and Window). The Draw submodule has its own Draw.Redraw() and modules (Blender and Window). The Draw submodule has its own Draw.Redraw() and
@ -124,11 +128,9 @@ def Create(value):
@return: The Button created. @return: The Button created.
""" """
def Button_(name, event, x, y, width, height, tooltip = None): def PushButton(name, event, x, y, width, height, tooltip = None):
""" """
Create a new (push) Button object. Please note there is no '_' character at the end of 'Button'. Create a new (push) Button object.
This is due to a bug in our doc generation program. Use Button(....) instead.
And stop laughing.
@type name: string @type name: string
@param name: The string to display on the button. @param name: The string to display on the button.
@type event: int @type event: int
@ -145,6 +147,10 @@ def Button_(name, event, x, y, width, height, tooltip = None):
@type tooltip: string @type tooltip: string
@param tooltip: The button's tooltip (the string that appears when the mouse @param tooltip: The button's tooltip (the string that appears when the mouse
is kept over the button). is kept over the button).
@note: This function used to be called only "Button". We added an
alternative alias to avoid a name clash with the L{Button} class/type that
caused trouble in this documentation's generation. The old name shouldn't
be deprecated, use Button or PushButton (better) at your choice.
""" """
def PupMenu(name, maxrow = None): def PupMenu(name, maxrow = None):
@ -193,7 +199,7 @@ def PupIntInput(text, default, min, max):
@type text: string @type text: string
@param text: The text that is displayed in the popup. @param text: The text that is displayed in the popup.
@type default: int @type default: int
@param default: The value that the popup is set to initialy. @param default: The value that the popup is set to initially.
@type min: int @type min: int
@param min: The lowest value the popup will allow. @param min: The lowest value the popup will allow.
@type max: int @type max: int
@ -225,7 +231,7 @@ def PupFloatInput(text, default, min, max, clickStep, floatLen):
@type text: string @type text: string
@param text: The text that is displayed in the popup. @param text: The text that is displayed in the popup.
@type default: float @type default: float
@param default: The value that the popup is set to initialy. @param default: The value that the popup is set to initially.
@type min: float @type min: float
@param min: The lowest value the popup will allow. @param min: The lowest value the popup will allow.
@type max: float @type max: float
@ -238,6 +244,27 @@ def PupFloatInput(text, default, min, max, clickStep, floatLen):
@return: the number chosen or None if none was chosen. @return: the number chosen or None if none was chosen.
""" """
def PupStrInput(text, default, max = 20):
"""
Create a string input pop-up.
This allows python to use Blender's string popup input.
Example::
Blender.Draw.PupStrInput("Name:", "untitled", 25)
@type text: string
@param text: The text that is displayed in the popup.
@type default: string
@param default: The value that the popup is set to initially. If it's longer
then 'max', it's truncated.
@type max: int
@param max: The most characters the popup input will allow. If not given
it defaults to 20 chars. It should be in the range [1, 100].
@rtype: string
@return: The text entered by the user or None if none was chosen.
"""
def Menu(name, event, x, y, width, height, default, tooltip = None): def Menu(name, event, x, y, width, height, default, tooltip = None):
""" """
Create a new Menu Button object. Create a new Menu Button object.

@ -6,7 +6,7 @@ The Blender.sys submodule.
sys sys
=== ===
B{New}: L{exists} B{New}: L{exists}, L{makename}.
This module provides a minimal set of helper functions and data. Its purpose This module provides a minimal set of helper functions and data. Its purpose
is to avoid the need for the standard Python module 'os', in special 'os.path', is to avoid the need for the standard Python module 'os', in special 'os.path',

@ -715,11 +715,11 @@ static uiBlock *info_file_importmenu(void *arg_unused)
uiBlockSetButmFunc(block, do_info_file_importmenu, NULL); uiBlockSetButmFunc(block, do_info_file_importmenu, NULL);
//uiBlockSetXOfs(block, -50); // offset to parent button //uiBlockSetXOfs(block, -50); // offset to parent button
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "VRML 1.0...|Ctrl F2", uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "VRML 1.0...",
0, yco-=20, 120, 19, NULL, 0.0, 0.0, 1, 0, "");
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "DXF...|Shift F2",
0, yco-=20, 120, 19, NULL, 0.0, 0.0, 1, 1, ""); 0, yco-=20, 120, 19, NULL, 0.0, 0.0, 1, 1, "");
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "VideoScape...|Alt W", uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "DXF...",
0, yco-=20, 120, 19, NULL, 0.0, 0.0, 1, 0, "");
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "VideoScape...",
0, yco-=20, 120, 19, NULL, 0.0, 0.0, 1, 2, ""); 0, yco-=20, 120, 19, NULL, 0.0, 0.0, 1, 2, "");
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "STL...", uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "STL...",
0, yco-=20, 120, 19, NULL, 0.0, 0.0, 1, 3, ""); 0, yco-=20, 120, 19, NULL, 0.0, 0.0, 1, 3, "");