[Bf-extensions-cvs] SVN commit: /data/svn/bf-extensions [3692] contrib/py/scripts/addons/ development_geometry_index_display.py: inital commit of index visualizer

Florian Meyer florianfelix at web.de
Fri Aug 31 02:56:13 CEST 2012


Revision: 3692
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-extensions&revision=3692
Author:   testscreenings
Date:     2012-08-31 00:56:12 +0000 (Fri, 31 Aug 2012)
Log Message:
-----------
inital commit of index visualizer

Added Paths:
-----------
    contrib/py/scripts/addons/development_geometry_index_display.py

Added: contrib/py/scripts/addons/development_geometry_index_display.py
===================================================================
--- contrib/py/scripts/addons/development_geometry_index_display.py	                        (rev 0)
+++ contrib/py/scripts/addons/development_geometry_index_display.py	2012-08-31 00:56:12 UTC (rev 3692)
@@ -0,0 +1,239 @@
+#Simplified BSD License
+#
+#Copyright (c) 2012, Florian Meyer
+#All rights reserved.
+#
+#Redistribution and use in source and binary forms, with or without
+#modification, are permitted provided that the following conditions are met: 
+#
+#1. Redistributions of source code must retain the above copyright notice, this
+#   list of conditions and the following disclaimer. 
+#2. Redistributions in binary form must reproduce the above copyright notice,
+#   this list of conditions and the following disclaimer in the documentation
+#   and/or other materials provided with the distribution. 
+#
+#THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+#ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+#WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+#DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+#ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+#(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+#LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+#ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+#(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+#SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+#################################################################
+bl_info = {
+    "name": "Geometry Index Display",
+    "author": "tstscr",
+    "version": (1, 0),
+    "blender": (2, 6, 3),
+    "location": "View3D > Properties Panel",
+    "description": "Display of mesh indicies (Verts, Edges, Faces)",
+    "warning": "",
+    "wiki_url": "http://wiki.blender.org/index.php/Extensions:2.6/Py/Scripts/Development/Geometry_Index_Display",
+    "tracker_url": "http://projects.blender.org/tracker/?func=detail&aid=32425",
+    "category": "Development"}
+###########################################################################
+import bpy, bgl, blf, bmesh
+from bpy.types import Operator, Menu, Panel, PropertyGroup, PointerProperty
+from bpy_extras.view3d_utils import location_3d_to_region_2d
+from bpy.props import *#BoolProperty, IntProperty
+###########################################################################
+def get_edge_coordinate(self, context, obj, edge):
+    v0 = edge.link_loops[0].vert
+    v1 = edge.link_loops[0].link_loop_next.vert
+    center= (v0.co + v1.co) * 0.5
+    co = location_3d_to_region_2d(context.region,
+                                  context.space_data.region_3d,
+                                  obj.matrix_world * center)
+    return co
+
+def get_data(self, context, options):
+    vert_data = []
+    edge_data = []
+    face_data = []
+    
+    if context.mode != 'EDIT_MESH':
+        return 
+    obj = context.active_object
+    me = obj.data
+    mesh = bmesh.from_edit_mesh(me)
+
+    #Vertex Indicies
+    if options.show_vertex_indicies:
+        vertices = mesh.verts
+        for vert in vertices:
+            if options.show_selected and not vert.select:
+                continue
+            co = location_3d_to_region_2d(context.region,
+                                          context.space_data.region_3d,
+                                          obj.matrix_world * vert.co)
+            idx = vert.index
+            vert_data.append((idx, co))
+    
+    #Edge Indicies
+    if options.show_edge_indicies:
+        edges = mesh.edges
+        for edge in edges:
+            if options.show_selected and not edge.select:
+                continue
+            co = get_edge_coordinate(self, context, obj, edge)
+            idx = edge.index
+            edge_data.append((idx, co))
+
+    #Face Indicies
+    if options.show_face_indicies:
+        faces = mesh.faces
+        for face in faces:
+            if options.show_selected and not face.select:
+                continue
+            co = location_3d_to_region_2d(context.region,
+                                          context.space_data.region_3d,
+                                          obj.matrix_world * face.calc_center_median())
+            idx = face.index
+            face_data.append((idx, co))
+
+    return vert_data, edge_data, face_data
+
+def draw_callback_indicies(self, context):
+    if context.mode != 'EDIT_MESH':
+        return
+    font_id = 0
+    options = context.scene.mesh_indicies_display_options
+    font_size = options.font_size
+    verts = []
+    edges = []
+    faces = []
+
+    ### Indicies
+    verts, edges, faces = get_data(self, context, options)
+
+    ### Vertex Indicies
+    bgl.glColor4f(1, 0, 0, 1)
+    if verts:
+        for vert in verts:
+            blf.position(font_id, vert[1][0], vert[1][1], 0)
+            blf.size(font_id, font_size, 72)
+            blf.draw(font_id, str(vert[0]))
+
+    ### Edge Indicies
+    bgl.glColor4f(0, 1, 0, 1)
+    if edges:
+        for edge in edges:
+            blf.position(font_id, edge[1][0], edge[1][1], 0)
+            blf.size(font_id, font_size, 72)
+            blf.draw(font_id, str(edge[0]))
+    
+    ### Face Indicies
+    bgl.glColor4f(0, 0, 1, 1)
+    if faces:
+        for face in faces:
+            blf.position(font_id, face[1][0], face[1][1], 0)
+            blf.size(font_id, font_size, 72)
+            blf.draw(font_id, str(face[0]))
+    
+    ### LinkLoop Drawing ## does nothing useful
+    #if options.loop_drawing:
+    #    draw_loops(context, font_id, font_size)
+
+    ### End
+    bgl.glEnd()
+    # restore opengl defaults
+    bgl.glLineWidth(1)
+    bgl.glDisable(bgl.GL_BLEND)
+    bgl.glColor4f(0.0, 0.0, 0.0, 1.0)
+
+
+class Mesh_Index_Display(Operator):
+    '''Draw mesh indicies'''
+    bl_idname = "view3d.mesh_indicies_display"
+    bl_label = "Mesh index display"
+    bl_description='Start Display / ESC to Cancel'
+
+    def modal(self, context, event):
+        context.area.tag_redraw()
+
+        if event.type in {'ESC'}:
+            context.region.callback_remove(self._handle)
+            return {'CANCELLED'}
+
+        return {'PASS_THROUGH'} #{'RUNNING_MODAL'}
+
+    def invoke(self, context, event):
+        try:
+            if self._handle:
+                context.region.callback_remove(self._handle)
+                return {'CANCELLED'}
+        except: pass
+        if context.area.type == 'VIEW_3D':
+            context.window_manager.modal_handler_add(self)
+
+            # Add the region OpenGL drawing callback
+            # draw in view space with 'POST_VIEW' and 'PRE_VIEW'
+            self._handle = context.region.callback_add(draw_callback_indicies, (self, context), 'POST_PIXEL')
+
+            self.mouse_path = []
+
+            return {'RUNNING_MODAL'}
+        else:
+            self.report({'WARNING'}, "View3D not found, cannot run operator")
+            return {'CANCELLED'}
+
+#############################################################
+class VIEW3D_PT_mesh_index_display_options(Panel):
+    bl_space_type = 'VIEW_3D'
+    bl_region_type = 'UI'
+    bl_label = "Mesh Index Display Options"
+    
+    @classmethod
+    def poll(cls, context):
+        view = context.space_data
+        return (view)
+
+    def draw(self, context):
+        geo = context.scene.mesh_indicies_display_options
+        layout = self.layout
+        col = layout.column()
+        col.operator('view3d.mesh_indicies_display', text='Start Display',)
+        row = layout.row()
+        row = row.split(1/3, align = True)
+        row.label(text='Indicies:')
+        row.prop(geo, 'show_vertex_indicies', toggle=True)
+        row.prop(geo, 'show_edge_indicies', toggle=True)
+        row.prop(geo, 'show_face_indicies', toggle=True)
+        col = layout.column(align=True)
+        col.separator()
+        col.prop(geo, 'show_selected', toggle=True)
+        col.prop(geo, 'font_size')
+        #col.prop(geo, 'loop_drawing')
+
+#############################################################
+# PropertyCollections
+class MeshIndexDisplayOptions(PropertyGroup):
+    show_vertex_indicies = BoolProperty(name='Vertex',
+                                   default=True)
+    show_edge_indicies = BoolProperty(name='Edge',
+                                   default=False)
+    show_face_indicies = BoolProperty(name='Face',
+                                   default=False)
+    font_size = IntProperty(name='Font Size',
+                            default=16,
+                            min=0, soft_min=0)
+    show_selected = BoolProperty(name='Show only selected',
+                                default=True)
+
+
+#############################################################
+def register():
+    bpy.utils.register_module(__name__)
+    bpy.types.Scene.mesh_indicies_display_options = PointerProperty(
+                                               type=MeshIndexDisplayOptions,
+                                               name='MeshIndexDisplayOptions')
+
+def unregister():
+    bpy.utils.unregister_module(__name__)
+    del(bpy.types.Scene.geometry_display_options)
+
+if __name__ == "__main__":
+    register()
\ No newline at end of file



More information about the Bf-extensions-cvs mailing list