[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [32107] branches/bmesh/blender: =BMesh: Super Knife Tool Alpha=

Joseph Eagar joeedh at gmail.com
Sat Sep 25 03:54:59 CEST 2010


Revision: 32107
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=32107
Author:   joeedh
Date:     2010-09-25 03:54:58 +0200 (Sat, 25 Sep 2010)

Log Message:
-----------
=BMesh: Super Knife Tool Alpha=

Implemented a new "super knife".  Activate with k.  Holding CTRL
will allow extended cutting ala old lines mode.  Confirm with enter 
and escape. You cannot cancel, btw, you can only confirm (and undo 
later if you want). Hopefully I'll support undo within the tool soon.

* Supports cutting edges, into faces, etc.  You can pretty much do whatever 
  you want.  Will snap to vertices too.
* Note that if you cut into a face, it must be valid topologically when 
  you press enter to confirm.
* It's pretty and graphical :)
* You can only cut visible geometry.
* UVs/vcols are a little buggy still

Now, thou shalt all cease and desist all lack of motivation for
testing!  No longer shall users put off testing until "it's cooler"!

:P

Modified Paths:
--------------
    branches/bmesh/blender/source/blender/blenkernel/intern/DerivedMesh.c
    branches/bmesh/blender/source/blender/blenkernel/intern/mesh.c
    branches/bmesh/blender/source/blender/blenlib/BLI_array.h
    branches/bmesh/blender/source/blender/blenlib/BLI_mempool.h
    branches/bmesh/blender/source/blender/blenlib/intern/BLI_mempool.c
    branches/bmesh/blender/source/blender/blenlib/intern/math_geom.c
    branches/bmesh/blender/source/blender/bmesh/bmesh_iterators.h
    branches/bmesh/blender/source/blender/bmesh/bmesh_operator_api.h
    branches/bmesh/blender/source/blender/bmesh/intern/bmesh_construct.c
    branches/bmesh/blender/source/blender/bmesh/intern/bmesh_iterators.c
    branches/bmesh/blender/source/blender/bmesh/intern/bmesh_mesh.c
    branches/bmesh/blender/source/blender/bmesh/intern/bmesh_mods.c
    branches/bmesh/blender/source/blender/bmesh/intern/bmesh_newcore.c
    branches/bmesh/blender/source/blender/bmesh/intern/bmesh_opdefines.c
    branches/bmesh/blender/source/blender/bmesh/intern/bmesh_operators.c
    branches/bmesh/blender/source/blender/bmesh/operators/createops.c
    branches/bmesh/blender/source/blender/bmesh/operators/mesh_conv.c
    branches/bmesh/blender/source/blender/editors/mesh/bmesh_select.c
    branches/bmesh/blender/source/blender/editors/mesh/bmesh_tools.c
    branches/bmesh/blender/source/blender/editors/mesh/editbmesh_bvh.c
    branches/bmesh/blender/source/blender/editors/mesh/editbmesh_bvh.h
    branches/bmesh/blender/source/blender/editors/mesh/loopcut.c
    branches/bmesh/blender/source/blender/editors/mesh/mesh_intern.h
    branches/bmesh/blender/source/blender/editors/mesh/mesh_ops.c
    branches/bmesh/blender/source/blender/editors/sculpt_paint/paint_image.c
    branches/bmesh/blender/source/blender/editors/sculpt_paint/paint_vertex.c
    branches/bmesh/blender/source/blender/editors/space_view3d/view3d_view.c
    branches/bmesh/blender/source/blender/makesrna/intern/rna_fcurve.c

Added Paths:
-----------
    branches/bmesh/blender/release/scripts/op/console_python.py
    branches/bmesh/blender/source/blender/blenlib/BLI_smallhash.h
    branches/bmesh/blender/source/blender/editors/include/ED_toolmode.h
    branches/bmesh/blender/source/blender/editors/mesh/knifetool.c

Added: branches/bmesh/blender/release/scripts/op/console_python.py
===================================================================
--- branches/bmesh/blender/release/scripts/op/console_python.py	                        (rev 0)
+++ branches/bmesh/blender/release/scripts/op/console_python.py	2010-09-25 01:54:58 UTC (rev 32107)
@@ -0,0 +1,284 @@
+# ##### BEGIN GPL 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.
+#
+#  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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# ##### END GPL LICENSE BLOCK #####
+
+# <pep8 compliant>
+import sys
+import bpy
+
+language_id = 'python'
+
+# store our own __main__ module, not 100% needed
+# but python expects this in some places
+_BPY_MAIN_OWN = True
+
+def add_scrollback(text, text_type):
+    for l in text.split('\n'):
+        bpy.ops.console.scrollback_append(text=l.replace('\t', '    '),
+            type=text_type)
+
+
+def get_console(console_id):
+    '''
+    helper function for console operators
+    currently each text datablock gets its own
+    console - code.InteractiveConsole()
+    ...which is stored in this function.
+
+    console_id can be any hashable type
+    '''
+    from code import InteractiveConsole
+
+    consoles = getattr(get_console, "consoles", None)
+    hash_next = hash(bpy.context.window_manager)
+
+    if consoles is None:
+        consoles = get_console.consoles = {}
+        get_console.consoles_namespace_hash = hash_next
+    else:
+        # check if clearning the namespace is needed to avoid a memory leak.
+        # the window manager is normally loaded with new blend files
+        # so this is a reasonable way to deal with namespace clearing.
+        # bpy.data hashing is reset by undo so cant be used.
+        hash_prev = getattr(get_console, "consoles_namespace_hash", 0)
+
+        if hash_prev != hash_next:
+            get_console.consoles_namespace_hash = hash_next
+            consoles.clear()
+
+    console_data = consoles.get(console_id)
+
+    if console_data:
+        console, stdout, stderr = console_data
+
+        # XXX, bug in python 3.1.2 ? (worked in 3.1.1)
+        # seems there is no way to clear StringIO objects for writing, have to make new ones each time.
+        import io
+        stdout = io.StringIO()
+        stderr = io.StringIO()
+    else:
+        if _BPY_MAIN_OWN:
+            import types
+            bpy_main_mod = types.ModuleType("__main__")
+            namespace = bpy_main_mod.__dict__
+        else:
+            namespace = {}
+        
+        namespace["__builtins__"] = sys.modules["builtins"]
+        namespace["bpy"] = bpy
+        namespace["C"] = bpy.context
+
+        console = InteractiveConsole(locals=namespace, filename="<blender_console>")
+        
+        if _BPY_MAIN_OWN:
+            console._bpy_main_mod = bpy_main_mod
+
+        import io
+        stdout = io.StringIO()
+        stderr = io.StringIO()
+
+        consoles[console_id] = console, stdout, stderr
+
+    return console, stdout, stderr
+
+
+# Both prompts must be the same length
+PROMPT = '>>> '
+PROMPT_MULTI = '... '
+
+
+def execute(context):
+    sc = context.space_data
+
+    try:
+        line_object = sc.history[-1]
+    except:
+        return {'CANCELLED'}
+
+    if sc.console_type != 'PYTHON':
+        return {'CANCELLED'}
+
+    console, stdout, stderr = get_console(hash(context.region))
+
+    # redirect output
+    sys.stdout = stdout
+    sys.stderr = stderr
+
+    # dont allow the stdin to be used, can lock blender.
+    stdin_backup = sys.stdin
+    sys.stdin = None
+
+    if _BPY_MAIN_OWN:
+        main_mod_back = sys.modules["__main__"]
+        sys.modules["__main__"] = console._bpy_main_mod
+
+    # incase exception happens
+    line = "" # incase of encodingf error
+    is_multiline = False
+
+    try:
+        line = line_object.body
+
+        # run the console, "\n" executes a multiline statement
+        line_exec = line if line.strip() else "\n"
+
+        is_multiline = console.push(line_exec)
+    except:
+        # unlikely, but this can happen with unicode errors for example.
+        import traceback
+        stderr.write(traceback.format_exc())
+
+    if _BPY_MAIN_OWN:
+        sys.modules["__main__"] = main_mod_back
+
+    stdout.seek(0)
+    stderr.seek(0)
+
+    output = stdout.read()
+    output_err = stderr.read()
+
+    # cleanup
+    sys.stdout = sys.__stdout__
+    sys.stderr = sys.__stderr__
+    sys.last_traceback = None
+
+    # So we can reuse, clear all data
+    stdout.truncate(0)
+    stderr.truncate(0)
+
+    bpy.ops.console.scrollback_append(text=sc.prompt + line, type='INPUT')
+
+    if is_multiline:
+        sc.prompt = PROMPT_MULTI
+    else:
+        sc.prompt = PROMPT
+
+    # insert a new blank line
+    bpy.ops.console.history_append(text="", current_character=0,
+        remove_duplicates=True)
+
+    # Insert the output into the editor
+    # not quite correct because the order might have changed,
+    # but ok 99% of the time.
+    if output:
+        add_scrollback(output, 'OUTPUT')
+    if output_err:
+        add_scrollback(output_err, 'ERROR')
+
+    # restore the stdin
+    sys.stdin = stdin_backup
+
+    return {'FINISHED'}
+
+
+def autocomplete(context):
+    from console import intellisense
+
+    sc = context.space_data
+
+    console = get_console(hash(context.region))[0]
+
+    if not console:
+        return {'CANCELLED'}
+
+    if sc.console_type != 'PYTHON':
+        return {'CANCELLED'}
+
+    # dont allow the stdin to be used, can lock blender.
+    # note: unlikely stdin would be used for autocomp. but its possible.
+    stdin_backup = sys.stdin
+    sys.stdin = None
+
+    scrollback = ""
+    scrollback_error = ""
+
+    if _BPY_MAIN_OWN:
+        main_mod_back = sys.modules["__main__"]
+        sys.modules["__main__"] = console._bpy_main_mod
+
+    try:
+        current_line = sc.history[-1]
+        line = current_line.body
+
+        # This function isnt aware of the text editor or being an operator
+        # just does the autocomp then copy its results back
+        current_line.body, current_line.current_character, scrollback = \
+            intellisense.expand(
+                line=current_line.body,
+                cursor=current_line.current_character,
+                namespace=console.locals,
+                private=bpy.app.debug)
+    except:
+        # unlikely, but this can happen with unicode errors for example.
+        # or if the api attribute access its self causes an error.
+        import traceback
+        scrollback_error = traceback.format_exc()
+
+    if _BPY_MAIN_OWN:
+        sys.modules["__main__"] = main_mod_back
+
+    # Separate automplete output by command prompts
+    if scrollback != '':
+        bpy.ops.console.scrollback_append(text=sc.prompt + current_line.body, type='INPUT')
+
+    # Now we need to copy back the line from blender back into the
+    # text editor. This will change when we dont use the text editor
+    # anymore
+    if scrollback:
+        add_scrollback(scrollback, 'INFO')
+
+    if scrollback_error:
+        add_scrollback(scrollback_error, 'ERROR')
+
+    # restore the stdin
+    sys.stdin = stdin_backup
+
+    context.area.tag_redraw()
+
+    return {'FINISHED'}
+
+
+def banner(context):
+    sc = context.space_data
+    version_string = sys.version.strip().replace('\n', ' ')
+
+    add_scrollback(" * Python Interactive Console %s *" % version_string, 'OUTPUT')
+    add_scrollback("Command History:  Up/Down Arrow", 'OUTPUT')
+    add_scrollback("Cursor:           Left/Right Home/End", 'OUTPUT')
+    add_scrollback("Remove:           Backspace/Delete", 'OUTPUT')
+    add_scrollback("Execute:          Enter", 'OUTPUT')
+    add_scrollback("Autocomplete:     Ctrl+Space", 'OUTPUT')
+    add_scrollback("Ctrl +/-  Wheel:  Zoom", 'OUTPUT')
+    add_scrollback("Builtin Modules: bpy, bpy.data, bpy.ops, bpy.props, bpy.types, bpy.context, bgl, blf, mathutils, geometry", 'OUTPUT')
+    add_scrollback("", 'OUTPUT')
+    add_scrollback("  WARNING!!! Blender 2.5 API is subject to change, see API reference for more info.", 'ERROR')
+    add_scrollback("", 'OUTPUT')
+    sc.prompt = PROMPT
+
+    return {'FINISHED'}
+
+
+def register():
+    pass
+
+
+def unregister():
+    pass
+
+
+if __name__ == "__main__":
+    register()


Property changes on: branches/bmesh/blender/release/scripts/op/console_python.py
___________________________________________________________________
Name: svn:executable
   + *

Modified: branches/bmesh/blender/source/blender/blenkernel/intern/DerivedMesh.c
===================================================================
--- branches/bmesh/blender/source/blender/blenkernel/intern/DerivedMesh.c	2010-09-24 17:49:33 UTC (rev 32106)
+++ branches/bmesh/blender/source/blender/blenkernel/intern/DerivedMesh.c	2010-09-25 01:54:58 UTC (rev 32107)
@@ -1075,7 +1075,7 @@
 					index = DM_get_edge_data_layer(dm, CD_ORIGINDEX);
 					for(i=0; i<dm->numEdgeData; i++) *index++= i;
 					index = DM_get_face_data_layer(dm, CD_ORIGINDEX);
-					for(i=0; i<dm->numFaceData; i++) *index++= i;
+					for(i=0; i<dm->numPolyData; i++) *index++= i;
 				}
 			}
 

Modified: branches/bmesh/blender/source/blender/blenkernel/intern/mesh.c
===================================================================
--- branches/bmesh/blender/source/blender/blenkernel/intern/mesh.c	2010-09-24 17:49:33 UTC (rev 32106)
+++ branches/bmesh/blender/source/blender/blenkernel/intern/mesh.c	2010-09-25 01:54:58 UTC (rev 32107)
@@ -1725,6 +1725,8 @@
 			mf[k].v1 = f->v1->keyindex;
 			mf[k].v2 = f->v2->keyindex;
 			mf[k].v3 = f->v3->keyindex;
+			mf[k].v4 = f->v1->tmp.l;
+			
 			mf[k].mat_nr = mp->mat_nr;
 			mf[k].flag = mp->flag;
 			origIndex[k] = use_face_origindex ? k : f->v1->tmp.l;
@@ -1766,7 +1768,9 @@
 		mf->v3 = mloop[mf->v3].v;
 
 		mesh_loops_to_corners(fdata, ldata, pdata,
-			lindex, i, origIndex[i], numTex, numCol);

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list