For those of us who prefer to select with the Left Mouse Button, and wish to avoid navigating with the Middle Mouse Button, the addon presented here offers a safe and elegant solution.
Usage instructions for beginners are in a short YouTube tutorial. For advanced users, full details and some additional options are at the top of the script itself.
You can download the tab-indented Python file from Google Drive here:
BVP_NoMMB_Navigation.py
If you prefer, you can copy and paste the space-indented text of the addon manually from here:
# ##### 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 #####
# ##### BEGIN ADVANCED SETTINGS AND INFO #####
#
# This addon provides *additional* mousing keymap items for users who wish to avoid using
# the Middle Mouse Button for navigation in Blender windows. Advantage is taken of the fact
# that the keymap space reserved by Blender for addons will override settings in the main
# keymap. It is thus possible to offer additional keymap items without making any changes to
# the main keymap.
#
# --- MAIN ITEMS ---
# For 2D windows, such as Timeline, Image Editor etc., the offered alternatives are:
#
# Pan View: Alt-ACTIONMOUSE
# Zoom View: Ctrl-Alt-ACTIONMOUSE
#
# Which mouse button is active as ACTIONMOUSE depends on an Input preference setting. By default,
# the Right Mouse Button is set as SELECTMOUSE, and Left is therefore the ACTIONMOUSE. Many users,
# however, perhaps the majority of new users, switch to Select with the Left Mouse Button, to more
# closely match their experience in other applications. Then the Right button is the ACTIONMOUSE.
#
# For 3D View, the offered alternatives to MMB navigation are:
#
# Rotate View: ACTIONMOUSE (no modifiers)
# Move(Pan) View: Alt-ACTIONMOUSE
# Zoom View: Ctrl-Alt-ACTIONMOUSE
# Dolly View: Shift-Ctrl-Alt-ACTIONMOUSE
#
# If you would prefer to press the Alt modifier for rotating rather than for moving/panning the
# 3D View, then set the PressAltForRotation value to 1
PressAltForRotation = 0
# --- STENCIL PAINT MODE ---
# The offered navigation commands do not work in stencil painting mode in 3D View and Image Editor
# because the mousing keymap items are already taken up for stencil transformations. They also don't
# work in Sculpt, Vertex, Weight and Texture Paint modes if Left Mouse Button is the ACTIONMOUSE.
#
# The problem is solved by involving the OSKey, so Alt-ACTIONMOUSE becomes Alt-Oskey-ACTIONMOUSE, etc.
# (The OSKey is the Win key on Windows and Command key on Mac.)
#
# Because the OSKey solution may be problematic for some users, an additional alternative to
# Middle Mouse Button navigation during painting operations is offered: ACTIONMOUSE pressed together
# with key modifiers: COMMA for rotation (3D View only), PERIOD for move/pan, SLASH for zoom.
# For consistency, these items also work outside painting operations (same for the OSKey solution).
#
# These key-modifier items are by default disabled because they change the Pivot Center setting.
# Additionally, pressing the comma in Image Editor during painting will throw up a rather ugly looking
# error. It happens whether or not this addon is enabled.
#
# These key-modifier items are quite comfortable to use though, so feel free to enable them by
# changing the value of EnableKeyModifiers to 1
EnableKeyModifiers = 0
# If you know what you're doing, you can easily change the key modifiers from COMMA, PERIOD, SLASH
# to some other keys. Be careful though, there are not many keys that can safely be used, as most
# are active in the Blender keymap. These values should really only be changed by those who use
# other keymaps. These settings have no effect if key modifiers are turned off with EnableKeyModifiers
# option above being set to 0.
#
# Depending on your keyboard, another good option here might be SLASH, BACK_SLASH and SEMI_COLON, which
# would not interfere with any existing Blender keymap items.
keyModifierRotation = 'COMMA'
keyModifierMovePan = 'PERIOD'
keyModifierZoom = 'SLASH'
# You can see the full list of available key modifiers here:
#
# http://www.blender.org/api/blender_python_api_2_73a_release/bpy.types.KeyMapItem.html#bpy.types.KeyMapItem.key_modifier
#
# --- OVERRIDE CORRECTIONS ---
# Provision is made for correction of the 3 conflicting overrides of the new navigation commands.
#
# 3D View > Cursor positioning: Shift-Ctrl-ACTIONMOUSE
# File Browser > Select with Extend and Fill: Shift-Alt-RIGHTMOUSE
# Node Editor > Backimage Sample: Shift-Ctrl-ACTIONMOUSE
#
# The File Browser correction is needed only if Right Mouse Button is the ACTIONMOUSE
#
# --- EXCEPTIONS ---
# The navigation mousing commands of this addon do not work in Grease Pencil continuous drawing mode,
# and when using the Knife Tool. The usual methods remain available: Middle Mouse Button, and Mouse
# Wheel shortcuts. You don't lose anything by using this addon, but in these two cases you don't gain
# anything either.
#
# ##### END ADVANCED SETTINGS AND INFO #####
bl_info = {
"name": "BVP No Middle Mouse Button Navigation",
"author": "BVP, blendervisionpro.blogspot.com",
"version": (0,1),
"blender": (2, 73, 0),
"location": "None",
"description": "Additional mousing keymap items to enable viewport navigation without middle mouse button",
"category": "User Interface"}
import bpy
addon_keymaps = []
def register():
wm = bpy.context.window_manager
# Provide alternative to MMB panning and zooming in all windows with Alt- and Ctrl-Alt-ACTIONMOUSE:
# View 2D
km = wm.keyconfigs.addon.keymaps.new(name='View2D', space_type='EMPTY', region_type='WINDOW')
kmi = km.keymap_items.new('view2d.pan', 'ACTIONMOUSE', 'PRESS', alt=True)
kmi = km.keymap_items.new('view2d.zoom', 'ACTIONMOUSE', 'PRESS', ctrl=True, alt=True)
kmi = km.keymap_items.new('view2d.pan', 'ACTIONMOUSE', 'PRESS', alt=True, oskey=True)
kmi = km.keymap_items.new('view2d.zoom', 'ACTIONMOUSE', 'PRESS', ctrl=True, alt=True, oskey=True)
if EnableKeyModifiers:
kmi = km.keymap_items.new('view2d.pan', 'ACTIONMOUSE', 'PRESS', key_modifier=keyModifierMovePan)
kmi = km.keymap_items.new('view2d.zoom', 'ACTIONMOUSE', 'PRESS', key_modifier=keyModifierZoom)
# View 2D Buttons List
km = wm.keyconfigs.addon.keymaps.new(name='View2D Buttons List', space_type='EMPTY', region_type='WINDOW')
kmi = km.keymap_items.new('view2d.pan', 'ACTIONMOUSE', 'PRESS', alt=True)
kmi = km.keymap_items.new('view2d.zoom', 'ACTIONMOUSE', 'PRESS', ctrl=True, alt=True)
kmi = km.keymap_items.new('view2d.pan', 'ACTIONMOUSE', 'PRESS', alt=True, oskey=True)
kmi = km.keymap_items.new('view2d.zoom', 'ACTIONMOUSE', 'PRESS', ctrl=True, alt=True, oskey=True)
if EnableKeyModifiers:
kmi = km.keymap_items.new('view2d.pan', 'ACTIONMOUSE', 'PRESS', key_modifier=keyModifierMovePan)
kmi = km.keymap_items.new('view2d.zoom', 'ACTIONMOUSE', 'PRESS', key_modifier=keyModifierZoom)
# Clip Editor
km = wm.keyconfigs.addon.keymaps.new(name='Clip Editor', space_type='CLIP_EDITOR', region_type='WINDOW')
kmi = km.keymap_items.new('clip.view_pan', 'ACTIONMOUSE', 'PRESS', alt=True)
kmi = km.keymap_items.new('clip.view_zoom', 'ACTIONMOUSE', 'PRESS', ctrl=True, alt=True)
kmi = km.keymap_items.new('clip.view_pan', 'ACTIONMOUSE', 'PRESS', alt=True, oskey=True)
kmi = km.keymap_items.new('clip.view_zoom', 'ACTIONMOUSE', 'PRESS', ctrl=True, alt=True, oskey=True)
if EnableKeyModifiers:
kmi = km.keymap_items.new('clip.view_pan', 'ACTIONMOUSE', 'PRESS', key_modifier=keyModifierMovePan)
kmi = km.keymap_items.new('clip.view_zoom', 'ACTIONMOUSE', 'PRESS', key_modifier=keyModifierZoom)
# Image Editor
km = wm.keyconfigs.addon.keymaps.new(name='Image', space_type='IMAGE_EDITOR', region_type='WINDOW')
kmi = km.keymap_items.new('image.view_pan', 'ACTIONMOUSE', 'PRESS', alt=True)
kmi = km.keymap_items.new('image.view_zoom', 'ACTIONMOUSE', 'PRESS', ctrl=True, alt=True)
kmi = km.keymap_items.new('image.view_pan', 'ACTIONMOUSE', 'PRESS', alt=True, oskey=True)
kmi = km.keymap_items.new('image.view_zoom', 'ACTIONMOUSE', 'PRESS', ctrl=True, alt=True, oskey=True)
if EnableKeyModifiers:
kmi = km.keymap_items.new('image.view_pan', 'ACTIONMOUSE', 'PRESS', key_modifier=keyModifierMovePan)
kmi = km.keymap_items.new('image.view_zoom', 'ACTIONMOUSE', 'PRESS', key_modifier=keyModifierZoom)
# Text Editor
km = wm.keyconfigs.addon.keymaps.new(name='Text', space_type='TEXT_EDITOR', region_type='WINDOW')
kmi = km.keymap_items.new('text.scroll', 'ACTIONMOUSE', 'PRESS', alt=True)
kmi = km.keymap_items.new('text.scroll', 'ACTIONMOUSE', 'PRESS', alt=True, oskey=True) # for consistency
# View 3D - special case because of view rotation and cursor
km = wm.keyconfigs.addon.keymaps.new(name='3D View', space_type='VIEW_3D', region_type='WINDOW')
kmi = km.keymap_items.new('view3d.cursor3d', 'ACTIONMOUSE', 'PRESS', shift=True, ctrl=True)
if PressAltForRotation:
kmi = km.keymap_items.new('view3d.rotate', 'ACTIONMOUSE', 'PRESS', alt=True)
kmi = km.keymap_items.new('view3d.move', 'ACTIONMOUSE', 'PRESS')
else:
kmi = km.keymap_items.new('view3d.rotate', 'ACTIONMOUSE', 'PRESS')
kmi = km.keymap_items.new('view3d.move', 'ACTIONMOUSE', 'PRESS', alt=True)
kmi = km.keymap_items.new('view3d.zoom', 'ACTIONMOUSE', 'PRESS', ctrl=True, alt=True)
kmi = km.keymap_items.new('view3d.dolly', 'ACTIONMOUSE', 'PRESS', shift=True, ctrl=True, alt=True)
if PressAltForRotation:
kmi = km.keymap_items.new('view3d.rotate', 'ACTIONMOUSE', 'PRESS', alt=True, oskey=True)
kmi = km.keymap_items.new('view3d.move', 'ACTIONMOUSE', 'PRESS', oskey=True)
else:
kmi = km.keymap_items.new('view3d.rotate', 'ACTIONMOUSE', 'PRESS', oskey=True)
kmi = km.keymap_items.new('view3d.move', 'ACTIONMOUSE', 'PRESS', alt=True, oskey=True)
kmi = km.keymap_items.new('view3d.zoom', 'ACTIONMOUSE', 'PRESS', ctrl=True, alt=True, oskey=True)
if EnableKeyModifiers:
kmi = km.keymap_items.new('view3d.rotate', 'ACTIONMOUSE', 'PRESS', key_modifier=keyModifierRotation)
kmi = km.keymap_items.new('view3d.move', 'ACTIONMOUSE', 'PRESS', key_modifier=keyModifierMovePan)
kmi = km.keymap_items.new('view3d.zoom', 'ACTIONMOUSE', 'PRESS', key_modifier=keyModifierZoom)
# Image Paint in Image Editor
km = wm.keyconfigs.addon.keymaps.new(name='Image Paint', space_type='EMPTY', region_type='WINDOW')
kmi = km.keymap_items.new('image.view_pan', 'ACTIONMOUSE', 'PRESS', key_modifier=keyModifierMovePan)
kmi = km.keymap_items.new('image.view_zoom', 'ACTIONMOUSE', 'PRESS', key_modifier=keyModifierZoom)
# Mask Editing
km = wm.keyconfigs.addon.keymaps.new(name='Mask Editing', space_type='EMPTY', region_type='WINDOW')
kmi = km.keymap_items.new('image.view_pan', 'ACTIONMOUSE', 'PRESS', key_modifier=keyModifierMovePan)
kmi = km.keymap_items.new('image.view_zoom', 'ACTIONMOUSE', 'PRESS', key_modifier=keyModifierZoom)
# UV Editor
km = wm.keyconfigs.addon.keymaps.new(name='UV Editor', space_type='EMPTY', region_type='WINDOW')
kmi = km.keymap_items.new('image.view_pan', 'ACTIONMOUSE', 'PRESS', alt=True, oskey=True)
kmi = km.keymap_items.new('image.view_zoom', 'ACTIONMOUSE', 'PRESS', ctrl=True, alt=True, oskey=True)
if EnableKeyModifiers:
kmi = km.keymap_items.new('image.view_pan', 'ACTIONMOUSE', 'PRESS', key_modifier=keyModifierMovePan)
kmi = km.keymap_items.new('image.view_zoom', 'ACTIONMOUSE', 'PRESS', key_modifier=keyModifierZoom)
# UV Sculpt
km = wm.keyconfigs.addon.keymaps.new(name='UV Sculpt', space_type='EMPTY', region_type='WINDOW')
kmi = km.keymap_items.new('image.view_pan', 'ACTIONMOUSE', 'PRESS', alt=True, oskey=True)
kmi = km.keymap_items.new('image.view_zoom', 'ACTIONMOUSE', 'PRESS', ctrl=True, alt=True, oskey=True)
if EnableKeyModifiers:
kmi = km.keymap_items.new('image.view_pan', 'ACTIONMOUSE', 'PRESS', key_modifier=keyModifierMovePan)
kmi = km.keymap_items.new('image.view_zoom', 'ACTIONMOUSE', 'PRESS', key_modifier=keyModifierZoom)
# Image Paint in 3D View
km = wm.keyconfigs.addon.keymaps.new(name='Image Paint', space_type='EMPTY', region_type='WINDOW')
kmi = km.keymap_items.new('view3d.rotate', 'ACTIONMOUSE', 'PRESS', key_modifier=keyModifierRotation)
kmi = km.keymap_items.new('view3d.move', 'ACTIONMOUSE', 'PRESS', key_modifier=keyModifierMovePan)
kmi = km.keymap_items.new('view3d.zoom', 'ACTIONMOUSE', 'PRESS', key_modifier=keyModifierZoom)
# Vertex Paint
km = wm.keyconfigs.addon.keymaps.new(name='Vertex Paint', space_type='EMPTY', region_type='WINDOW')
kmi = km.keymap_items.new('view3d.rotate', 'ACTIONMOUSE', 'PRESS', key_modifier=keyModifierRotation)
kmi = km.keymap_items.new('view3d.move', 'ACTIONMOUSE', 'PRESS', key_modifier=keyModifierMovePan)
kmi = km.keymap_items.new('view3d.zoom', 'ACTIONMOUSE', 'PRESS', key_modifier=keyModifierZoom)
# Weight Paint
km = wm.keyconfigs.addon.keymaps.new(name='Weight Paint', space_type='EMPTY', region_type='WINDOW')
kmi = km.keymap_items.new('view3d.rotate', 'ACTIONMOUSE', 'PRESS', key_modifier=keyModifierRotation)
kmi = km.keymap_items.new('view3d.move', 'ACTIONMOUSE', 'PRESS', key_modifier=keyModifierMovePan)
kmi = km.keymap_items.new('view3d.zoom', 'ACTIONMOUSE', 'PRESS', key_modifier=keyModifierZoom)
# Sculpt
km = wm.keyconfigs.addon.keymaps.new(name='Sculpt', space_type='EMPTY', region_type='WINDOW')
kmi = km.keymap_items.new('view3d.rotate', 'ACTIONMOUSE', 'PRESS', key_modifier=keyModifierRotation)
kmi = km.keymap_items.new('view3d.move', 'ACTIONMOUSE', 'PRESS', key_modifier=keyModifierMovePan)
kmi = km.keymap_items.new('view3d.zoom', 'ACTIONMOUSE', 'PRESS', key_modifier=keyModifierZoom)
# Corrections for the above overrides without existing alternatives, plus some alternatives to MMB:
# Node Editor
km = wm.keyconfigs.addon.keymaps.new(name='Node Editor', space_type='NODE_EDITOR', region_type='WINDOW')
# The following two items will themselves override some quite pointlessly repetitive selection
# commands in Node Editor, which have plenty of alternatives, namely selection with SELECTMOUSE
kmi = km.keymap_items.new('node.backimage_move', 'ACTIONMOUSE', 'PRESS', shift=True, alt=True)
kmi = km.keymap_items.new('node.backimage_sample', 'ACTIONMOUSE', 'PRESS', shift=True, ctrl=True) # override correction
# The following mousing keymap items are alternative to existing MMB keymaps for modal commands,
# but they do not seem to register, although they register correctly on addon reload.
# They are small features, but if you don't have MMB, you may like to add them to main keymap manually
# Knife Tool - panning the 3D View while using Knife
km = wm.keyconfigs.addon.keymaps.new(name='Knife Tool Modal Map', space_type='EMPTY', region_type='WINDOW', modal=True)
kmi = km.keymap_items.new_modal('PANNING', 'ACTIONMOUSE', 'PRESS', alt=True)
# View3D Fly Modal - panning the 3D View in Fly Mode
km = wm.keyconfigs.addon.keymaps.new(name='View3D Fly Modal', space_type='EMPTY', region_type='WINDOW', modal=True)
kmi = km.keymap_items.new_modal('PAN_DISABLE', 'ACTIONMOUSE', 'RELEASE', alt=True)
kmi = km.keymap_items.new_modal('PAN_ENABLE', 'ACTIONMOUSE', 'PRESS', alt=True)
# Gesture Zoom Border - drawing rectangle border for zooming out in 3D View
km = wm.keyconfigs.addon.keymaps.new(name='Gesture Zoom Border', space_type='EMPTY', region_type='WINDOW', modal=True)
kmi = km.keymap_items.new_modal('OUT', 'ACTIONMOUSE', 'RELEASE', alt=True)
kmi = km.keymap_items.new_modal('BEGIN', 'ACTIONMOUSE', 'PRESS', alt=True)
# File Browser
km = wm.keyconfigs.addon.keymaps.new(name='File Browser Main', space_type='FILE_BROWSER', region_type='WINDOW')
kmi = km.keymap_items.new('file.select', 'RIGHTMOUSE', 'CLICK', shift=True, alt=True) # override correction
kmi.properties['extend'] = 1
kmi.properties['fill'] = 1
addon_keymaps.append((km, kmi))
def unregister():
for km, kmi in addon_keymaps:
km.keymap_items.remove(kmi)
addon_keymaps.clear()
if __name__ == '__main__':
register()
Great, this is just what I needed.
ReplyDeleteI don"t know what happened, but my MMB stopped working yesterday, so I had no way to rotate view in blender without changing the RMB as my select button, which didn't want to do.
THANK YOU this will definitely help me. :)
got a laptop - perfect!
ReplyDelete