From 4255f3c7abe5c0bc7e9d2bc407ec6671e6ae6c45 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Tue, 6 May 2008 17:54:55 +0000 Subject: [PATCH] made python add mesh module respect blenders user settings for editmode and view align. added sys.cleanpath() was a patch in the tracker but blender's internal path cleaning is now more general and can be used from python. --- release/scripts/bpymodules/BPyAddMesh.py | 22 ++++++++++++------- source/blender/python/api2_2x/Blender.c | 8 +++++-- source/blender/python/api2_2x/Sys.c | 28 +++++++++++++++++++++++- source/blender/python/api2_2x/doc/Sys.py | 11 +++++++++- 4 files changed, 57 insertions(+), 12 deletions(-) diff --git a/release/scripts/bpymodules/BPyAddMesh.py b/release/scripts/bpymodules/BPyAddMesh.py index 6ffb394320a..bd3ee845d21 100644 --- a/release/scripts/bpymodules/BPyAddMesh.py +++ b/release/scripts/bpymodules/BPyAddMesh.py @@ -16,13 +16,17 @@ def add_mesh_simple(name, verts, edges, faces): scn = bpy.data.scenes.active if scn.lib: return ob_act = scn.objects.active - + + is_editmode = EditMode() + cursor = GetCursorPos() - try: quat = Blender.Mathutils.Quaternion(GetViewQuat()) - except: quat = None + quat = None + if is_editmode or Blender.Get('add_view_align'): # Aligning seems odd for editmode, but blender does it, oh well + try: quat = Blender.Mathutils.Quaternion(GetViewQuat()) + except: pass # Exist editmode for non mesh types - if ob_act and ob_act.type != 'Mesh' and EditMode(): + if ob_act and ob_act.type != 'Mesh' and is_editmode: EditMode(0) # We are in mesh editmode @@ -65,8 +69,9 @@ def add_mesh_simple(name, verts, edges, faces): # Mesh with no data, unlikely me.edges.extend(edges) me.faces.extend(faces) - - EditMode(1) + + if is_editmode or Blender.Get('add_editmode'): + EditMode(1) else: @@ -90,8 +95,9 @@ def add_mesh_simple(name, verts, edges, faces): ob_act.setMatrix(mat) ob_act.loc = cursor - - EditMode(1) + + if is_editmode or Blender.Get('add_editmode'): + EditMode(1) def write_mesh_script(filepath, me): diff --git a/source/blender/python/api2_2x/Blender.c b/source/blender/python/api2_2x/Blender.c index daba0c36fdf..7c2895d96be 100644 --- a/source/blender/python/api2_2x/Blender.c +++ b/source/blender/python/api2_2x/Blender.c @@ -545,8 +545,12 @@ static PyObject *Blender_Get( PyObject * self, PyObject * value ) else if(StringEqual( str, "compressfile" )) ret = PyInt_FromLong( (U.flag & USER_FILECOMPRESS) >> 15 ); else if(StringEqual( str, "mipmap" )) - ret = PyInt_FromLong( (U.gameflags & USER_DISABLE_MIPMAP) == 0 ); - else + ret = PyInt_FromLong( (U.gameflags & USER_DISABLE_MIPMAP)!=0 ); + else if(StringEqual( str, "add_view_align" )) + ret = PyInt_FromLong( ((U.flag & USER_ADD_VIEWALIGNED)!=0) ); + else if(StringEqual( str, "add_editmode" )) + ret = PyInt_FromLong( ((U.flag & USER_ADD_EDITMODE)!=0) ); + else return EXPP_ReturnPyObjError( PyExc_AttributeError, "unknown attribute" ); if (ret) return ret; diff --git a/source/blender/python/api2_2x/Sys.c b/source/blender/python/api2_2x/Sys.c index 9de4e344e8c..3863cc12227 100644 --- a/source/blender/python/api2_2x/Sys.c +++ b/source/blender/python/api2_2x/Sys.c @@ -58,6 +58,7 @@ static PyObject *M_sys_exists( PyObject * self, PyObject * value ); static PyObject *M_sys_time( PyObject * self ); static PyObject *M_sys_sleep( PyObject * self, PyObject * args ); static PyObject *M_sys_expandpath( PyObject *self, PyObject *value); +static PyObject *M_sys_cleanpath( PyObject *self, PyObject *value); /*****************************************************************************/ /* The following string definitions are used for documentation strings. */ @@ -120,10 +121,13 @@ static char M_sys_expandpath_doc[] = (path) - the string path to convert.\n\n\ Note: internally Blender paths can contain two special character sequences:\n\ - '//' (at start) for base path directory (the current .blend's dir path);\n\ -- '#' (at ending) for current frame number.\n\n\ +- '#' characters in the filename will be replaced by the frame number.\n\n\ This function expands these to their actual content, returning a valid path.\n\ If the special chars are not found in the given path, it is simply returned."; +static char M_sys_cleanpath_doc[] = +"(path) - Removes parts of a path that are not needed paths such as '../foo/../bar/' and '//./././'"; + /*****************************************************************************/ /* Python method structure definition for Blender.sys module: */ /*****************************************************************************/ @@ -139,6 +143,7 @@ struct PyMethodDef M_sys_methods[] = { {"sleep", M_sys_sleep, METH_VARARGS, M_sys_sleep_doc}, {"time", ( PyCFunction ) M_sys_time, METH_NOARGS, M_sys_time_doc}, {"expandpath", M_sys_expandpath, METH_O, M_sys_expandpath_doc}, + {"cleanpath", M_sys_cleanpath, METH_O, M_sys_cleanpath_doc}, {NULL, NULL, 0, NULL} }; @@ -396,3 +401,24 @@ static PyObject *M_sys_expandpath( PyObject * self, PyObject * value ) return PyString_FromString(expanded); } + +static PyObject *M_sys_cleanpath( PyObject * self, PyObject * value ) +{ + char *path = PyString_AsString(value); + char cleaned[FILE_MAXDIR + FILE_MAXFILE]; + int trailing_slash = 0; + if (!path) + return EXPP_ReturnPyObjError( PyExc_TypeError, + "expected string argument" ); + if (strstr(path, "/") || strstr(path, "\\")) { + trailing_slash = 1; + } + BLI_strncpy(cleaned, path, FILE_MAXDIR + FILE_MAXFILE); + BLI_cleanup_file(NULL, cleaned); + + if (trailing_slash) { + BLI_add_slash(cleaned); + } + + return PyString_FromString(cleaned); +} diff --git a/source/blender/python/api2_2x/doc/Sys.py b/source/blender/python/api2_2x/doc/Sys.py index f1efeeb2344..d7c62f2cb02 100644 --- a/source/blender/python/api2_2x/doc/Sys.py +++ b/source/blender/python/api2_2x/doc/Sys.py @@ -153,7 +153,7 @@ def expandpath (path): Internally, Blender recognizes two special character sequences in paths: - '//' (used at the beginning): means base path -- the current .blend file's dir; - - '#' (used at the end): means current frame number. + - '#' characters in the filename will be replaced by the frame number. The expanded string can be passed to generic python functions that don't understand Blender's internal relative paths. @note: this function is also useful for obtaining the name of the image @@ -165,3 +165,12 @@ def expandpath (path): @rtype: string @return: the expanded (if necessary) path. """ + +def cleanpath (path): + """ + Clean the given 'path' by removing unneeded components such as "/./" and "/test/../" + @type path: string + @param path: a path name. + @rtype: string + @return: the cleaned (if necessary) path. + """