7
$\begingroup$

I want to use a keyboard shortcut to bring up a text field for renaming the active object.

As far as I know, currently no such shortcut exists, and making one will require an addon. I seem to remember reading about just such an addon before, but now I can't remember where (it was a while ago). If I remember correctly, it had some other features too (batch renaming or something).

Anyway, if this functionality or an addon supplying it already exists, where can I find it?

$\endgroup$
14
$\begingroup$

I just found one ;)

With the following Add-on enabled, you can press CtrlR to enter a 'new name' for the active object as well as rename its data block (optional). In order to speed up the process you can hit Return followed by O to confirm, after typing the 'new name':

enter image description here Click to enlarge

viewport-rename.py

# ##### 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 bpy
import re

bl_info = {
    "name": "Viewport Rename",
    "author": "poor",
    "version": (0, 3),
    "blender": (2, 77, 0),
    "location": "3D View > Ctrl+R",
    "category": "3D View"
}


class ViewportRenameOperator(bpy.types.Operator):
    """Rename Objects in 3D View"""
    bl_idname = "view3d.viewport_rename"
    bl_label = "Viewport Rename"
    bl_options = {'REGISTER', 'UNDO'}
    type = bpy.props.StringProperty()
    data_flag = bpy.props.BoolProperty(default=False)

    @classmethod
    def poll(cls, context):
        return bool(context.selected_objects)

    def execute(self, context):
        user_input = self.type
        reverse = False
        if user_input.endswith("#r"):
            reverse = True
            user_input = user_input[:-1]

        suff = re.findall("#+$", user_input)
        if user_input and suff:
            number = ('%0'+str(len(suff[0]))+'d', len(suff[0]))
            real_name = re.sub("#", '', user_input)           

            objs = context.selected_objects[::-1] if reverse else context.selected_objects
            names_before = [n.name for n in objs]
            for c, o in enumerate(objs, start=1):
                o.name = (real_name + (number[0] % c))
                if self.data_flag and o.data is not None:
                    o.data.name = (real_name + (number[0] % c))
            self.report({'INFO'}, "Renamed {}".format(", ".join(names_before)))
            return {'FINISHED'}

        elif user_input:
            old_name = context.active_object.name
            context.active_object.name = user_input
            if self.data_flag and context.active_object.data is not None:
                context.active_object.data.name = user_input
            self.report({'INFO'}, "{} renamed to {}".format(old_name, user_input))
            return {'FINISHED'}

        else:
            self.report({'INFO'}, "No input, operation cancelled")
            return {'CANCELLED'}

    def invoke(self, context, event):
        wm = context.window_manager
        self.type = context.active_object.name
        return wm.invoke_props_dialog(self)

    def draw(self, context):
        row = self.layout
        row.prop(self, "type", text="New name")
        row.prop(self, "data_flag", text="Rename Data-Block")


# ------------------------------------------------------------------------
#    register and unregister functions
# ------------------------------------------------------------------------

addon_keymaps = []


def register():
    bpy.utils.register_module(__name__)

    # handle the keymap
    wm = bpy.context.window_manager
    kc = wm.keyconfigs.addon
    if kc:
        km = wm.keyconfigs.addon.keymaps.new(name='3D View', space_type='VIEW_3D')
        kmi = km.keymap_items.new(ViewportRenameOperator.bl_idname, type='R', value='PRESS', ctrl=True)
        addon_keymaps.append((km, kmi))


def unregister():
    for km, kmi in addon_keymaps:
        km.keymap_items.remove(kmi)
    addon_keymaps.clear()

    bpy.utils.unregister_module(__name__)
    del bpy.types.Scene.viewport_rename

if __name__ == "__main__":
    register()

The Add-on also allows to batch rename all objects in the current selection. The suffix is determined by the given number of hash characters at the end of the string. You can simply type Cube-### to get 'Cube-001', 'Cube-002' and 'Cube-003' as well as Cube-###r to get a reversed list:

enter image description here

Repository: https://github.com/p2or/blender-viewport-rename

$\endgroup$
  • 1
    $\begingroup$ Brilliant, thanks! Great find ;) I wonder if there's a way to get the text field to have focus by default..? $\endgroup$ – gandalf3 Aug 14 '16 at 20:54
  • 2
    $\begingroup$ Nice add-on, and a great way to demonstrate the use of draw, invoke, execute, etc. in a simple operator! $\endgroup$ – JakeD Jan 22 '17 at 21:08
1
$\begingroup$

This may end up being a bit of an overkill solution to achieve it, but you could use the Name Panel Addon (available in Free and Commercial flavors) to rename your active object.

It's a great addon and I strongly recommend it's use, though it may over complicate in this case, because the addon is a lot more complex and is mainly concerned with batch naming and name copying, among other involved functionality.

It does not assign one hot key by default as far as I know, but you can go to the user preferences and manually assign it yourself.

Just browse to the File > User Preferences > Input > 3D View >3D View Global and add a new operator wm.batch_name with the desired key combination.

It should call out the operator popup with the (potentially overly complex) popup dialog

Edit

Not sure if this is what you want, but to set the name automatically to a specific predefined name you can add another operator wm.context_set_enum with Context Attributes set to `scene.BatchName.customName and Value set to whatever name you want, but I could not do it all (set the name and actual renaming) at once with a single key press. Perhaps with some additional scripting?

$\endgroup$
1
$\begingroup$

I made a quick rename addon myself for exactly this purpose. It doesn't have the capacity of batch renaming like "viewport-rename" do. But it propose renaming options according to current name (if available).

quick rename pop-up with proposition

Trigger it with alt-N, like ALTernative Name (ctrl-r is really good but already taken for bone roll in armature edit mode)

$\endgroup$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.