Skip to content
Snippets Groups Projects
space_view3d_property_chart.py 4 KiB
Newer Older
  • Learn to ignore specific revisions
  • #
    # ***** 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., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
    #
    # ***** END GPL LICENCE BLOCK *****
    
    '''List properties of selected objects'''
    
    bl_addon_info = {
    
        'name': '3D View: Object Property Chart',
        'author': 'Campbell Barton (ideasman42)',
        'version': '0.1',
        'blender': (2, 5, 3),
        'location': 'Tool Shelf',
        'description': 'Edit arbitrary selected properties for objects of the same type',
        'wiki_url':
        'http://wiki.blender.org/index.php/Extensions:2.5/Py/' \
            'Scripts/',
        'tracker_url': 'https://projects.blender.org/projects/bf-extensions/',
        'category': '3D View'}
    
    
    import bpy
    
    
    class View3DEditProps(bpy.types.Panel):
        bl_space_type = 'VIEW_3D'
        bl_region_type = 'UI'
        
        bl_label = "Property Chart"
        bl_context = "objectmode"
        
        _PROP_STORAGE_ID = "view3d_edit_props"
    
        def draw(self, context):
            layout = self.layout
            obj = context.object
            
            if obj is None:
                return
    
    
            selected_objects = context.selected_objects
    
                return
    
            # box = layout.separator()
            
            id_storage = context.scene
            
            strings = id_storage.get(self._PROP_STORAGE_ID)
            
            if strings is None:
    
                strings = id_storage[self._PROP_STORAGE_ID] = "data data.name"
    
                
                def obj_prop_get(obj, attr_string):
                    """return a pair (rna_base, "rna_property") to give to the rna UI property function"""
                    attrs = attr_string.split(".")
                    val_new = obj
                    for i, attr in enumerate(attrs):
                        val_old = val_new
                        val_new = getattr(val_old, attr, Ellipsis)
                        
                        if val_new == Ellipsis:
                            return None, None                        
                    return val_old, attrs[-1]
    
    
                for obj in selected_objects:
                    prop_pairs = []
                    prop_found = False
    
                    for attr_string in strings:
    
                        prop_pairs.append(obj_prop_get(obj, attr_string))
                        if prop_found == False and prop_pairs[-1] != (None, None): 
    
                    if prop_found:
                        prop_all.append((obj, prop_pairs))
    
    
                for obj, prop_pairs in prop_all:
    
    
                for i in range(len(strings)):
                    col = row.column()
                    col.label(text=strings[i].rsplit(".", 1)[-1])
                    for obj, prop_pairs in prop_all:
    
                        data, attr = prop_pairs[i]
                        if data:
                            col.prop(data, attr, text="")
    
            col.label(text="Object Properties")
    
            col.prop(id_storage, '["%s"]' % self._PROP_STORAGE_ID, text="")
    
    
    def register():
        bpy.types.register(View3DEditProps)
    
    
    def unregister():
        bpy.types.unregister(View3DEditProps)
    
    if __name__ == "__main__":
        register()