2009-11-01 15:21:20 +00:00
|
|
|
# ##### 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.
|
2009-11-03 07:23:02 +00:00
|
|
|
#
|
2009-11-01 15:21:20 +00:00
|
|
|
# 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.
|
2009-11-03 07:23:02 +00:00
|
|
|
#
|
2009-11-01 15:21:20 +00:00
|
|
|
# You should have received a copy of the GNU General Public License
|
|
|
|
# along with this program; if not, write to the Free Software Foundation,
|
2010-02-12 13:34:04 +00:00
|
|
|
# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
2009-11-01 15:21:20 +00:00
|
|
|
#
|
|
|
|
# ##### END GPL LICENSE BLOCK #####
|
2009-10-31 20:16:59 +00:00
|
|
|
|
2009-10-31 23:35:56 +00:00
|
|
|
# <pep8 compliant>
|
2009-07-11 13:32:20 +00:00
|
|
|
import bpy
|
2011-09-22 19:50:41 +00:00
|
|
|
from bpy.types import Header, Menu, Panel
|
2017-10-21 12:41:42 +11:00
|
|
|
from .properties_grease_pencil_common import (
|
2017-10-19 11:24:01 +11:00
|
|
|
GreasePencilDataPanel,
|
|
|
|
GreasePencilPaletteColorPanel,
|
|
|
|
)
|
2017-10-21 12:41:42 +11:00
|
|
|
from .properties_paint_common import UnifiedPaintPanel
|
2013-03-28 15:41:43 +00:00
|
|
|
from bpy.app.translations import contexts as i18n_contexts
|
2009-10-12 21:06:03 +00:00
|
|
|
|
2011-06-24 03:30:50 +00:00
|
|
|
|
2011-08-12 06:57:00 +00:00
|
|
|
class VIEW3D_HT_header(Header):
|
2009-10-31 19:31:45 +00:00
|
|
|
bl_space_type = 'VIEW_3D'
|
|
|
|
|
|
|
|
def draw(self, context):
|
|
|
|
layout = self.layout
|
|
|
|
|
2009-11-29 02:42:47 +00:00
|
|
|
view = context.space_data
|
2018-04-29 09:44:57 +02:00
|
|
|
shading = view.shading
|
2014-04-25 05:31:20 +10:00
|
|
|
# mode_string = context.mode
|
2009-11-28 23:37:56 +00:00
|
|
|
obj = context.active_object
|
2010-01-16 14:31:21 +00:00
|
|
|
toolsettings = context.tool_settings
|
2009-12-04 17:54:48 +00:00
|
|
|
|
2010-05-20 03:52:35 +00:00
|
|
|
row = layout.row(align=True)
|
2009-10-31 19:31:45 +00:00
|
|
|
row.template_header()
|
2009-12-04 17:54:48 +00:00
|
|
|
|
2018-05-01 20:12:06 +02:00
|
|
|
mode = 'OBJECT' if obj is None else obj.mode
|
|
|
|
act_mode_item = bpy.types.Object.bl_rna.properties['mode'].enum_items[mode]
|
|
|
|
layout.operator_menu_enum("object.mode_set", "mode", text=act_mode_item.name, icon=act_mode_item.icon)
|
|
|
|
del act_mode_item
|
|
|
|
|
|
|
|
layout.template_header_3D_mode()
|
|
|
|
|
2014-01-27 18:38:53 +11:00
|
|
|
VIEW3D_MT_editor_menus.draw_collapsible(context, layout)
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2011-07-23 22:08:37 +00:00
|
|
|
# Contains buttons like Mode, Pivot, Manipulator, Layer, Mesh Select Mode...
|
2011-11-15 19:25:28 +00:00
|
|
|
row = layout
|
2018-05-05 14:47:50 +02:00
|
|
|
shading_type = view.shading.type
|
|
|
|
shading_item = bpy.types.View3DShading.bl_rna.properties['type'].enum_items[shading_type]
|
|
|
|
row.popover(space_type='VIEW_3D', region_type='HEADER', panel_type="VIEW3D_PT_shading", text=shading_item.name, icon=shading_item.icon)
|
|
|
|
row.popover(space_type='VIEW_3D', region_type='HEADER', panel_type="VIEW3D_PT_overlay", text="Overlays", icon='WIRE')
|
2018-04-29 08:47:14 +02:00
|
|
|
|
2011-11-15 19:25:28 +00:00
|
|
|
layout.template_header_3D()
|
2011-10-23 00:53:50 +00:00
|
|
|
|
2010-02-12 11:34:25 +00:00
|
|
|
if obj:
|
2018-05-01 20:12:06 +02:00
|
|
|
# Set above:
|
|
|
|
# mode = obj.mode
|
|
|
|
|
2016-12-28 17:30:58 +01:00
|
|
|
# Particle edit
|
|
|
|
if mode == 'PARTICLE_EDIT':
|
|
|
|
row.prop(toolsettings.particle_edit, "select_mode", text="", expand=True)
|
2010-02-12 11:34:25 +00:00
|
|
|
|
|
|
|
# Occlude geometry
|
2018-04-29 09:44:57 +02:00
|
|
|
if ((shading.type not in {'BOUNDBOX', 'WIREFRAME'} and (mode == 'PARTICLE_EDIT' or (mode == 'EDIT' and obj.type == 'MESH'))) or
|
2017-09-29 17:10:15 +10:00
|
|
|
(mode in {'WEIGHT_PAINT', 'VERTEX_PAINT'})):
|
2010-08-17 07:49:53 +00:00
|
|
|
row.prop(view, "use_occlude_geometry", text="")
|
2010-02-12 11:34:25 +00:00
|
|
|
|
|
|
|
# Proportional editing
|
Grease Pencil - Storyboarding Features (merge from GPencil_EditStrokes branch)
This merge-commit brings in a number of new features and workflow/UI improvements for
working with Grease Pencil. While these were originally targetted at improving
the workflow for creating 3D storyboards in Blender using the Grease Pencil,
many of these changes should also prove useful in other workflows too.
The main highlights here are:
1) It is now possible to edit Grease Pencil strokes
- Use D Tab, or toggle the "Enable Editing" toggles in the Toolbar/Properties regions
to enter "Stroke Edit Mode". In this mode, many common editing tools will
operate on Grease Pencil stroke points instead.
- Tools implemented include Select, Select All/Border/Circle/Linked/More/Less,
Grab, Rotate, Scale, Bend, Shear, To Sphere, Mirror, Duplicate, Delete.
- Proportional Editing works when using the transform tools
2) Grease Pencil stroke settings can now be animated
NOTE: Currently drivers don't work, but if time allows, this may still be
added before the release.
3) Strokes can be drawn with "filled" interiors, using a separate set of
colour/opacity settings to the ones used for the lines themselves.
This makes use of OpenGL filled polys, which has the limitation of only
being able to fill convex shapes. Some artifacts may be visible on concave
shapes (e.g. pacman's mouth will be overdrawn)
4) "Volumetric Strokes" - An alternative drawing technique for stroke drawing
has been added which draws strokes as a series of screen-aligned discs.
While this was originally a partial experimental technique at getting better
quality 3D lines, the effects possible using this technique were interesting
enough to warrant making this a dedicated feature. Best results when partial
opacity and large stroke widths are used.
5) Improved Onion Skinning Support
- Different colours can be selected for the before/after ghosts. To do so,
enable the "colour wheel" toggle beside the Onion Skinning toggle, and set
the colours accordingly.
- Different numbers of ghosts can be shown before/after the current frame
6) Grease Pencil datablocks are now attached to the scene by default instead of
the active object.
- For a long time, the object-attachment has proved to be quite problematic
for users to keep track of. Now that this is done at scene level, it is
easier for most users to use.
- An exception for old files (and for any addons which may benefit from object
attachment instead), is that if the active object has a Grease Pencil datablock,
that will be used instead.
- It is not currently possible to choose object-attachment from the UI, but
it is simple to do this from the console instead, by doing:
context.active_object.grease_pencil = bpy.data.grease_pencil["blah"]
7) Various UI Cleanups
- The layers UI has been cleaned up to use a list instead of the nested-panels
design. Apart from saving space, this is also much nicer to look at now.
- The UI code is now all defined in Python. To support this, it has been necessary
to add some new context properties to make it easier to access these settings.
e.g. "gpencil_data" for the datablock
"active_gpencil_layer" and "active_gpencil_frame" for active data,
"editable_gpencil_strokes" for the strokes that can be edited
- The "stroke placement/alignment" settings (previously "Drawing Settings" at the
bottom of the Grease Pencil panel in the Properties Region) is now located in
the toolbar. These were more toolsettings than properties for how GPencil got drawn.
- "Use Sketching Sessions" has been renamed "Continuous Drawing", as per a
suggestion for an earlier discussion on developer.blender.org
- By default, the painting operator will wait for a mouse button to be pressed
before it starts creating the stroke. This is to make it easier to include
this operator in various toolbars/menus/etc. To get it immediately starting
(as when you hold down DKEy to draw), set "wait_for_input" to False.
- GPencil Layers can be rearranged in the "Grease Pencil" mode of the Action Editor
- Toolbar panels have been added to all the other editors which support these.
8) Pie menus for quick-access to tools
A set of experimental pie menus has been included for quick access to many
tools and settings. It is not necessary to use these to get things done,
but they have been designed to help make certain common tasks easier.
- Ctrl-D = The main pie menu. Reveals tools in a context sensitive and
spatially stable manner.
- D Q = "Quick Settings" pie. This allows quick access to the active
layer's settings. Notably, colours, thickness, and turning
onion skinning on/off.
2014-12-01 01:52:06 +13:00
|
|
|
if context.gpencil_data and context.gpencil_data.use_stroke_edit_mode:
|
|
|
|
row = layout.row(align=True)
|
|
|
|
row.prop(toolsettings, "proportional_edit", icon_only=True)
|
|
|
|
if toolsettings.proportional_edit != 'DISABLED':
|
|
|
|
row.prop(toolsettings, "proportional_edit_falloff", icon_only=True)
|
2016-12-28 17:30:58 +01:00
|
|
|
elif mode in {'EDIT', 'PARTICLE_EDIT'}:
|
2010-02-12 11:34:25 +00:00
|
|
|
row = layout.row(align=True)
|
2014-01-30 16:31:57 +11:00
|
|
|
row.prop(toolsettings, "proportional_edit", icon_only=True)
|
2010-08-18 03:24:52 +00:00
|
|
|
if toolsettings.proportional_edit != 'DISABLED':
|
2014-01-30 16:31:57 +11:00
|
|
|
row.prop(toolsettings, "proportional_edit_falloff", icon_only=True)
|
2012-07-29 14:07:57 +00:00
|
|
|
elif mode == 'OBJECT':
|
2010-08-02 02:55:12 +00:00
|
|
|
row = layout.row(align=True)
|
2014-01-30 16:31:57 +11:00
|
|
|
row.prop(toolsettings, "use_proportional_edit_objects", icon_only=True)
|
2010-08-18 03:24:52 +00:00
|
|
|
if toolsettings.use_proportional_edit_objects:
|
2014-01-30 16:31:57 +11:00
|
|
|
row.prop(toolsettings, "proportional_edit_falloff", icon_only=True)
|
2014-12-01 12:36:05 +13:00
|
|
|
else:
|
|
|
|
# Proportional editing
|
|
|
|
if context.gpencil_data and context.gpencil_data.use_stroke_edit_mode:
|
|
|
|
row = layout.row(align=True)
|
|
|
|
row.prop(toolsettings, "proportional_edit", icon_only=True)
|
|
|
|
if toolsettings.proportional_edit != 'DISABLED':
|
|
|
|
row.prop(toolsettings, "proportional_edit_falloff", icon_only=True)
|
2010-02-22 23:32:58 +00:00
|
|
|
|
2009-11-28 22:35:56 +00:00
|
|
|
# Snap
|
2016-06-21 16:17:05 +10:00
|
|
|
show_snap = False
|
|
|
|
if obj is None:
|
|
|
|
show_snap = True
|
|
|
|
else:
|
|
|
|
if mode not in {'SCULPT', 'VERTEX_PAINT', 'WEIGHT_PAINT', 'TEXTURE_PAINT'}:
|
|
|
|
show_snap = True
|
|
|
|
else:
|
|
|
|
paint_settings = UnifiedPaintPanel.paint_settings(context)
|
|
|
|
if paint_settings:
|
|
|
|
brush = paint_settings.brush
|
|
|
|
if brush and brush.stroke_method == 'CURVE':
|
|
|
|
show_snap = True
|
|
|
|
|
|
|
|
if show_snap:
|
2012-02-17 06:59:32 +00:00
|
|
|
snap_element = toolsettings.snap_element
|
|
|
|
row = layout.row(align=True)
|
|
|
|
row.prop(toolsettings, "use_snap", text="")
|
2014-01-30 16:31:57 +11:00
|
|
|
row.prop(toolsettings, "snap_element", icon_only=True)
|
2015-06-30 18:57:17 +10:00
|
|
|
if snap_element == 'INCREMENT':
|
|
|
|
row.prop(toolsettings, "use_snap_grid_absolute", text="")
|
|
|
|
else:
|
2012-02-17 06:59:32 +00:00
|
|
|
row.prop(toolsettings, "snap_target", text="")
|
|
|
|
if obj:
|
2016-09-19 15:49:43 +02:00
|
|
|
if mode == 'EDIT':
|
2012-02-17 06:59:32 +00:00
|
|
|
row.prop(toolsettings, "use_snap_self", text="")
|
2016-09-19 15:49:43 +02:00
|
|
|
if mode in {'OBJECT', 'POSE', 'EDIT'} and snap_element != 'VOLUME':
|
|
|
|
row.prop(toolsettings, "use_snap_align_rotation", text="")
|
2012-02-17 06:59:32 +00:00
|
|
|
|
|
|
|
if snap_element == 'VOLUME':
|
|
|
|
row.prop(toolsettings, "use_snap_peel_object", text="")
|
|
|
|
elif snap_element == 'FACE':
|
|
|
|
row.prop(toolsettings, "use_snap_project", text="")
|
2009-11-28 22:35:56 +00:00
|
|
|
|
2013-03-24 12:13:13 +00:00
|
|
|
# AutoMerge editing
|
|
|
|
if obj:
|
|
|
|
if (mode == 'EDIT' and obj.type == 'MESH'):
|
|
|
|
layout.prop(toolsettings, "use_mesh_automerge", text="", icon='AUTOMERGE_ON')
|
|
|
|
|
2009-11-28 22:35:56 +00:00
|
|
|
# OpenGL render
|
|
|
|
row = layout.row(align=True)
|
2010-03-08 16:36:53 +00:00
|
|
|
row.operator("render.opengl", text="", icon='RENDER_STILL')
|
2013-08-23 20:41:21 +00:00
|
|
|
row.operator("render.opengl", text="", icon='RENDER_ANIMATION').animation = True
|
2009-11-28 22:35:56 +00:00
|
|
|
|
|
|
|
# Pose
|
2012-07-29 14:07:57 +00:00
|
|
|
if obj and mode == 'POSE':
|
2009-11-28 22:35:56 +00:00
|
|
|
row = layout.row(align=True)
|
2009-12-10 10:23:53 +00:00
|
|
|
row.operator("pose.copy", text="", icon='COPYDOWN')
|
2015-01-29 17:34:05 +01:00
|
|
|
row.operator("pose.paste", text="", icon='PASTEDOWN').flipped = False
|
|
|
|
row.operator("pose.paste", text="", icon='PASTEFLIPDOWN').flipped = True
|
2009-11-28 22:35:56 +00:00
|
|
|
|
2015-12-13 21:03:13 +13:00
|
|
|
# GPencil
|
|
|
|
if context.gpencil_data and context.gpencil_data.use_stroke_edit_mode:
|
|
|
|
row = layout.row(align=True)
|
|
|
|
row.operator("gpencil.copy", text="", icon='COPYDOWN')
|
|
|
|
row.operator("gpencil.paste", text="", icon='PASTEDOWN')
|
|
|
|
|
2016-08-01 11:54:02 +10:00
|
|
|
# XXX: icon
|
|
|
|
layout.prop(context.gpencil_data, "use_onion_skinning", text="Onion Skins", icon='PARTICLE_PATH')
|
2016-02-09 00:51:07 +13:00
|
|
|
|
2016-08-03 23:31:48 +02:00
|
|
|
row = layout.row(align=True)
|
|
|
|
row.prop(context.tool_settings.gpencil_sculpt, "use_select_mask")
|
|
|
|
row.prop(context.tool_settings.gpencil_sculpt, "selection_alpha", slider=True)
|
2016-02-09 00:51:07 +13:00
|
|
|
|
2009-11-28 22:35:56 +00:00
|
|
|
|
2014-01-27 18:38:53 +11:00
|
|
|
class VIEW3D_MT_editor_menus(Menu):
|
|
|
|
bl_space_type = 'VIEW3D_MT_editor_menus'
|
|
|
|
bl_label = ""
|
|
|
|
|
|
|
|
def draw(self, context):
|
|
|
|
self.draw_menus(self.layout, context)
|
|
|
|
|
|
|
|
@staticmethod
|
|
|
|
def draw_menus(layout, context):
|
|
|
|
obj = context.active_object
|
|
|
|
mode_string = context.mode
|
|
|
|
edit_object = context.edit_object
|
2015-12-13 21:03:13 +13:00
|
|
|
gp_edit = context.gpencil_data and context.gpencil_data.use_stroke_edit_mode
|
2014-01-27 18:38:53 +11:00
|
|
|
|
|
|
|
layout.menu("VIEW3D_MT_view")
|
|
|
|
|
|
|
|
# Select Menu
|
2015-12-13 21:03:13 +13:00
|
|
|
if gp_edit:
|
|
|
|
layout.menu("VIEW3D_MT_select_gpencil")
|
|
|
|
elif mode_string in {'PAINT_WEIGHT', 'PAINT_VERTEX', 'PAINT_TEXTURE'}:
|
2014-01-27 18:38:53 +11:00
|
|
|
mesh = obj.data
|
|
|
|
if mesh.use_paint_mask:
|
|
|
|
layout.menu("VIEW3D_MT_select_paint_mask")
|
2017-09-29 17:10:15 +10:00
|
|
|
elif mesh.use_paint_mask_vertex and mode_string in {'PAINT_WEIGHT', 'PAINT_VERTEX'}:
|
2014-01-27 18:38:53 +11:00
|
|
|
layout.menu("VIEW3D_MT_select_paint_mask_vertex")
|
2014-04-30 00:52:43 +10:00
|
|
|
elif mode_string != 'SCULPT':
|
2014-01-27 18:38:53 +11:00
|
|
|
layout.menu("VIEW3D_MT_select_%s" % mode_string.lower())
|
|
|
|
|
2015-12-13 21:03:13 +13:00
|
|
|
if gp_edit:
|
|
|
|
pass
|
|
|
|
elif mode_string == 'OBJECT':
|
2014-01-27 18:38:53 +11:00
|
|
|
layout.menu("INFO_MT_add", text="Add")
|
|
|
|
elif mode_string == 'EDIT_MESH':
|
|
|
|
layout.menu("INFO_MT_mesh_add", text="Add")
|
|
|
|
elif mode_string == 'EDIT_CURVE':
|
|
|
|
layout.menu("INFO_MT_curve_add", text="Add")
|
|
|
|
elif mode_string == 'EDIT_SURFACE':
|
|
|
|
layout.menu("INFO_MT_surface_add", text="Add")
|
|
|
|
elif mode_string == 'EDIT_METABALL':
|
|
|
|
layout.menu("INFO_MT_metaball_add", text="Add")
|
|
|
|
elif mode_string == 'EDIT_ARMATURE':
|
|
|
|
layout.menu("INFO_MT_edit_armature_add", text="Add")
|
|
|
|
|
2015-12-13 21:03:13 +13:00
|
|
|
if gp_edit:
|
|
|
|
layout.menu("VIEW3D_MT_edit_gpencil")
|
|
|
|
elif edit_object:
|
2014-01-27 18:38:53 +11:00
|
|
|
layout.menu("VIEW3D_MT_edit_%s" % edit_object.type.lower())
|
|
|
|
elif obj:
|
2015-04-14 10:29:11 +10:00
|
|
|
if mode_string != 'PAINT_TEXTURE':
|
2014-01-27 18:38:53 +11:00
|
|
|
layout.menu("VIEW3D_MT_%s" % mode_string.lower())
|
|
|
|
if mode_string in {'SCULPT', 'PAINT_VERTEX', 'PAINT_WEIGHT', 'PAINT_TEXTURE'}:
|
|
|
|
layout.menu("VIEW3D_MT_brush")
|
|
|
|
if mode_string == 'SCULPT':
|
|
|
|
layout.menu("VIEW3D_MT_hide_mask")
|
|
|
|
else:
|
|
|
|
layout.menu("VIEW3D_MT_object")
|
|
|
|
|
|
|
|
|
2009-08-15 20:21:49 +00:00
|
|
|
# ********** Menu **********
|
2009-07-24 22:09:30 +00:00
|
|
|
|
2013-11-04 22:49:49 +00:00
|
|
|
|
2009-08-23 22:13:56 +00:00
|
|
|
# ********** Utilities **********
|
|
|
|
|
2009-10-31 23:35:56 +00:00
|
|
|
|
2015-01-29 15:35:06 +11:00
|
|
|
class ShowHideMenu:
|
2011-09-15 13:20:18 +00:00
|
|
|
bl_label = "Show/Hide"
|
2009-10-31 19:31:45 +00:00
|
|
|
_operator_name = ""
|
2009-08-23 22:13:56 +00:00
|
|
|
|
2009-10-31 19:31:45 +00:00
|
|
|
def draw(self, context):
|
|
|
|
layout = self.layout
|
|
|
|
|
2011-09-21 15:18:38 +00:00
|
|
|
layout.operator("%s.reveal" % self._operator_name, text="Show Hidden")
|
2012-04-24 17:50:01 +00:00
|
|
|
layout.operator("%s.hide" % self._operator_name, text="Hide Selected").unselected = False
|
2011-09-21 15:18:38 +00:00
|
|
|
layout.operator("%s.hide" % self._operator_name, text="Hide Unselected").unselected = True
|
2009-08-23 22:13:56 +00:00
|
|
|
|
2009-10-31 23:35:56 +00:00
|
|
|
|
2012-05-06 06:37:07 +00:00
|
|
|
# Standard transforms which apply to all cases
|
|
|
|
# NOTE: this doesn't seem to be able to be used directly
|
|
|
|
class VIEW3D_MT_transform_base(Menu):
|
2011-09-15 13:20:18 +00:00
|
|
|
bl_label = "Transform"
|
2009-11-22 06:19:30 +00:00
|
|
|
|
|
|
|
# TODO: get rid of the custom text strings?
|
|
|
|
def draw(self, context):
|
|
|
|
layout = self.layout
|
2009-11-28 23:37:56 +00:00
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.separator()
|
2009-11-28 23:37:56 +00:00
|
|
|
|
2011-09-21 15:18:38 +00:00
|
|
|
layout.operator("transform.tosphere", text="To Sphere")
|
|
|
|
layout.operator("transform.shear", text="Shear")
|
2013-11-20 12:14:10 +11:00
|
|
|
layout.operator("transform.bend", text="Bend")
|
2011-09-21 15:18:38 +00:00
|
|
|
layout.operator("transform.push_pull", text="Push/Pull")
|
2015-05-26 17:55:34 +10:00
|
|
|
|
|
|
|
if context.mode != 'OBJECT':
|
|
|
|
layout.operator("transform.vertex_warp", text="Warp")
|
|
|
|
layout.operator("transform.vertex_random", text="Randomize")
|
2010-09-16 07:14:48 +00:00
|
|
|
|
2012-05-06 06:37:07 +00:00
|
|
|
|
|
|
|
# Generic transform menu - geometry types
|
|
|
|
class VIEW3D_MT_transform(VIEW3D_MT_transform_base):
|
|
|
|
def draw(self, context):
|
|
|
|
# base menu
|
|
|
|
VIEW3D_MT_transform_base.draw(self, context)
|
2012-05-15 18:50:51 +00:00
|
|
|
|
2012-05-06 06:37:07 +00:00
|
|
|
# generic...
|
|
|
|
layout = self.layout
|
2012-11-09 06:06:50 +00:00
|
|
|
layout.operator("transform.shrink_fatten", text="Shrink Fatten")
|
|
|
|
|
2011-01-05 17:27:26 +00:00
|
|
|
layout.separator()
|
|
|
|
|
2011-09-21 15:18:38 +00:00
|
|
|
layout.operator("transform.translate", text="Move Texture Space").texture_space = True
|
|
|
|
layout.operator("transform.resize", text="Scale Texture Space").texture_space = True
|
2011-01-05 17:27:26 +00:00
|
|
|
|
|
|
|
|
2012-05-06 06:37:07 +00:00
|
|
|
# Object-specific extensions to Transform menu
|
|
|
|
class VIEW3D_MT_transform_object(VIEW3D_MT_transform_base):
|
|
|
|
def draw(self, context):
|
2012-07-29 10:03:46 +00:00
|
|
|
layout = self.layout
|
2012-07-29 12:07:06 +00:00
|
|
|
|
2012-05-06 06:37:07 +00:00
|
|
|
# base menu
|
|
|
|
VIEW3D_MT_transform_base.draw(self, context)
|
2012-05-15 18:50:51 +00:00
|
|
|
|
2012-05-06 06:37:07 +00:00
|
|
|
# object-specific option follow...
|
|
|
|
layout.separator()
|
2010-09-16 07:14:48 +00:00
|
|
|
|
2012-05-06 06:37:07 +00:00
|
|
|
layout.operator("transform.translate", text="Move Texture Space").texture_space = True
|
|
|
|
layout.operator("transform.resize", text="Scale Texture Space").texture_space = True
|
2012-05-15 18:50:51 +00:00
|
|
|
|
2012-05-06 06:37:07 +00:00
|
|
|
layout.separator()
|
2012-05-15 18:50:51 +00:00
|
|
|
|
2012-05-06 06:37:07 +00:00
|
|
|
layout.operator_context = 'EXEC_REGION_WIN'
|
2017-03-20 09:43:18 +11:00
|
|
|
# XXX see alignmenu() in edit.c of b2.4x to get this working
|
|
|
|
layout.operator("transform.transform", text="Align to Transform Orientation").mode = 'ALIGN'
|
2009-11-28 23:37:56 +00:00
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.separator()
|
2009-11-28 23:37:56 +00:00
|
|
|
|
2009-11-22 06:19:30 +00:00
|
|
|
layout.operator_context = 'EXEC_AREA'
|
2009-11-28 23:37:56 +00:00
|
|
|
|
2011-09-21 15:18:38 +00:00
|
|
|
layout.operator("object.origin_set", text="Geometry to Origin").type = 'GEOMETRY_ORIGIN'
|
|
|
|
layout.operator("object.origin_set", text="Origin to Geometry").type = 'ORIGIN_GEOMETRY'
|
|
|
|
layout.operator("object.origin_set", text="Origin to 3D Cursor").type = 'ORIGIN_CURSOR'
|
2017-08-21 15:24:40 +10:00
|
|
|
layout.operator("object.origin_set", text="Origin to Center of Mass (Surface)").type = 'ORIGIN_CENTER_OF_MASS'
|
|
|
|
layout.operator("object.origin_set", text="Origin to Center of Mass (Volume)").type = 'ORIGIN_CENTER_OF_VOLUME'
|
2011-04-12 15:12:05 +00:00
|
|
|
layout.separator()
|
|
|
|
|
|
|
|
layout.operator("object.randomize_transform")
|
|
|
|
layout.operator("object.align")
|
|
|
|
|
2017-08-06 19:47:25 +10:00
|
|
|
# TODO: there is a strange context bug here.
|
|
|
|
"""
|
|
|
|
layout.operator_context = 'INVOKE_REGION_WIN'
|
|
|
|
layout.operator("object.transform_axis_target")
|
|
|
|
"""
|
|
|
|
|
2009-11-28 23:37:56 +00:00
|
|
|
|
2012-05-06 06:37:07 +00:00
|
|
|
# Armature EditMode extensions to Transform menu
|
|
|
|
class VIEW3D_MT_transform_armature(VIEW3D_MT_transform_base):
|
|
|
|
def draw(self, context):
|
2012-07-29 10:03:46 +00:00
|
|
|
layout = self.layout
|
2012-07-29 12:07:06 +00:00
|
|
|
|
2012-05-06 06:37:07 +00:00
|
|
|
# base menu
|
|
|
|
VIEW3D_MT_transform_base.draw(self, context)
|
2012-05-15 18:50:51 +00:00
|
|
|
|
2012-05-06 06:37:07 +00:00
|
|
|
# armature specific extensions follow...
|
|
|
|
obj = context.object
|
2018-04-05 18:20:27 +02:00
|
|
|
if obj.type == 'ARMATURE' and obj.mode in {'EDIT', 'POSE'}:
|
2014-01-10 00:44:03 +13:00
|
|
|
if obj.data.draw_type == 'BBONE':
|
2017-10-19 15:10:41 +11:00
|
|
|
layout.separator()
|
|
|
|
|
2014-01-10 00:44:03 +13:00
|
|
|
layout.operator("transform.transform", text="Scale BBone").mode = 'BONE_SIZE'
|
|
|
|
elif obj.data.draw_type == 'ENVELOPE':
|
2017-10-19 15:10:41 +11:00
|
|
|
layout.separator()
|
|
|
|
|
2014-01-10 00:44:03 +13:00
|
|
|
layout.operator("transform.transform", text="Scale Envelope Distance").mode = 'BONE_SIZE'
|
|
|
|
layout.operator("transform.transform", text="Scale Radius").mode = 'BONE_ENVELOPE'
|
2012-05-06 06:37:07 +00:00
|
|
|
|
|
|
|
if context.edit_object and context.edit_object.type == 'ARMATURE':
|
2017-10-19 15:10:41 +11:00
|
|
|
layout.separator()
|
|
|
|
|
2012-05-06 06:37:07 +00:00
|
|
|
layout.operator("armature.align")
|
|
|
|
|
|
|
|
|
2011-08-12 06:57:00 +00:00
|
|
|
class VIEW3D_MT_mirror(Menu):
|
2011-09-15 13:20:18 +00:00
|
|
|
bl_label = "Mirror"
|
2009-11-22 06:19:30 +00:00
|
|
|
|
|
|
|
def draw(self, context):
|
|
|
|
layout = self.layout
|
|
|
|
|
2011-09-21 15:18:38 +00:00
|
|
|
layout.operator("transform.mirror", text="Interactive Mirror")
|
2009-11-28 23:37:56 +00:00
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.separator()
|
2009-11-28 23:37:56 +00:00
|
|
|
|
2009-11-27 00:34:46 +00:00
|
|
|
layout.operator_context = 'INVOKE_REGION_WIN'
|
2009-11-28 23:37:56 +00:00
|
|
|
|
2011-09-21 15:18:38 +00:00
|
|
|
props = layout.operator("transform.mirror", text="X Global")
|
2009-11-22 06:19:30 +00:00
|
|
|
props.constraint_axis = (True, False, False)
|
|
|
|
props.constraint_orientation = 'GLOBAL'
|
2011-09-21 15:18:38 +00:00
|
|
|
props = layout.operator("transform.mirror", text="Y Global")
|
2009-11-22 06:19:30 +00:00
|
|
|
props.constraint_axis = (False, True, False)
|
|
|
|
props.constraint_orientation = 'GLOBAL'
|
2011-09-21 15:18:38 +00:00
|
|
|
props = layout.operator("transform.mirror", text="Z Global")
|
2009-11-22 06:19:30 +00:00
|
|
|
props.constraint_axis = (False, False, True)
|
|
|
|
props.constraint_orientation = 'GLOBAL'
|
2009-11-28 23:37:56 +00:00
|
|
|
|
2009-11-22 06:19:30 +00:00
|
|
|
if context.edit_object:
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.separator()
|
2009-11-28 23:37:56 +00:00
|
|
|
|
2011-09-21 15:18:38 +00:00
|
|
|
props = layout.operator("transform.mirror", text="X Local")
|
2009-11-22 06:19:30 +00:00
|
|
|
props.constraint_axis = (True, False, False)
|
|
|
|
props.constraint_orientation = 'LOCAL'
|
2011-09-21 15:18:38 +00:00
|
|
|
props = layout.operator("transform.mirror", text="Y Local")
|
2009-11-22 06:19:30 +00:00
|
|
|
props.constraint_axis = (False, True, False)
|
|
|
|
props.constraint_orientation = 'LOCAL'
|
2011-09-21 15:18:38 +00:00
|
|
|
props = layout.operator("transform.mirror", text="Z Local")
|
2009-11-22 06:19:30 +00:00
|
|
|
props.constraint_axis = (False, False, True)
|
|
|
|
props.constraint_orientation = 'LOCAL'
|
2009-11-28 23:37:56 +00:00
|
|
|
|
2010-01-15 17:28:00 +00:00
|
|
|
layout.operator("object.vertex_group_mirror")
|
|
|
|
|
2009-11-28 23:37:56 +00:00
|
|
|
|
2011-08-12 06:57:00 +00:00
|
|
|
class VIEW3D_MT_snap(Menu):
|
2011-09-15 13:20:18 +00:00
|
|
|
bl_label = "Snap"
|
2009-10-31 19:31:45 +00:00
|
|
|
|
|
|
|
def draw(self, context):
|
|
|
|
layout = self.layout
|
|
|
|
|
2011-09-21 15:18:38 +00:00
|
|
|
layout.operator("view3d.snap_selected_to_grid", text="Selection to Grid")
|
2013-08-23 20:41:21 +00:00
|
|
|
layout.operator("view3d.snap_selected_to_cursor", text="Selection to Cursor").use_offset = False
|
|
|
|
layout.operator("view3d.snap_selected_to_cursor", text="Selection to Cursor (Offset)").use_offset = True
|
2016-07-15 17:07:18 +10:00
|
|
|
layout.operator("view3d.snap_selected_to_active", text="Selection to Active")
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.separator()
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2011-09-21 15:18:38 +00:00
|
|
|
layout.operator("view3d.snap_cursor_to_selected", text="Cursor to Selected")
|
|
|
|
layout.operator("view3d.snap_cursor_to_center", text="Cursor to Center")
|
|
|
|
layout.operator("view3d.snap_cursor_to_grid", text="Cursor to Grid")
|
|
|
|
layout.operator("view3d.snap_cursor_to_active", text="Cursor to Active")
|
2009-08-23 22:13:56 +00:00
|
|
|
|
2009-11-14 13:35:44 +00:00
|
|
|
|
2011-08-12 06:57:00 +00:00
|
|
|
class VIEW3D_MT_uv_map(Menu):
|
2011-09-15 13:20:18 +00:00
|
|
|
bl_label = "UV Mapping"
|
2009-11-03 18:20:03 +00:00
|
|
|
|
|
|
|
def draw(self, context):
|
|
|
|
layout = self.layout
|
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.operator("uv.unwrap")
|
2011-03-31 08:46:41 +00:00
|
|
|
|
|
|
|
layout.operator_context = 'INVOKE_DEFAULT'
|
2011-03-29 14:13:11 +00:00
|
|
|
layout.operator("uv.smart_project")
|
|
|
|
layout.operator("uv.lightmap_pack")
|
|
|
|
layout.operator("uv.follow_active_quads")
|
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
2011-12-07 11:22:29 +00:00
|
|
|
layout.operator_context = 'EXEC_REGION_WIN'
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.operator("uv.cube_project")
|
|
|
|
layout.operator("uv.cylinder_project")
|
|
|
|
layout.operator("uv.sphere_project")
|
2011-03-29 14:13:11 +00:00
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
2013-04-19 15:50:17 +00:00
|
|
|
layout.operator_context = 'INVOKE_REGION_WIN'
|
2012-01-14 06:30:27 +00:00
|
|
|
layout.operator("uv.project_from_view").scale_to_bounds = False
|
2011-09-21 15:18:38 +00:00
|
|
|
layout.operator("uv.project_from_view", text="Project from View (Bounds)").scale_to_bounds = True
|
2009-11-03 18:20:03 +00:00
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.separator()
|
2009-11-03 18:20:03 +00:00
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.operator("uv.reset")
|
2011-03-30 07:21:41 +00:00
|
|
|
|
2009-11-03 18:20:03 +00:00
|
|
|
|
2016-09-04 23:40:41 +02:00
|
|
|
class VIEW3D_MT_edit_proportional(Menu):
|
|
|
|
bl_label = "Proportional Editing"
|
|
|
|
|
|
|
|
def draw(self, context):
|
|
|
|
layout = self.layout
|
|
|
|
|
2016-09-05 00:55:44 +02:00
|
|
|
layout.props_enum(context.tool_settings, "proportional_edit")
|
2016-09-04 23:40:41 +02:00
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
|
|
|
layout.label("Falloff:")
|
2016-09-05 00:55:44 +02:00
|
|
|
layout.props_enum(context.tool_settings, "proportional_edit_falloff")
|
2016-09-04 23:40:41 +02:00
|
|
|
|
|
|
|
|
2009-08-15 20:21:49 +00:00
|
|
|
# ********** View menus **********
|
2009-07-11 13:32:20 +00:00
|
|
|
|
2009-10-31 23:35:56 +00:00
|
|
|
|
2011-08-12 06:57:00 +00:00
|
|
|
class VIEW3D_MT_view(Menu):
|
2011-09-15 13:20:18 +00:00
|
|
|
bl_label = "View"
|
2009-10-31 19:31:45 +00:00
|
|
|
|
|
|
|
def draw(self, context):
|
|
|
|
layout = self.layout
|
2017-10-19 12:35:58 +11:00
|
|
|
view = context.space_data
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2009-12-10 10:23:53 +00:00
|
|
|
layout.operator("view3d.properties", icon='MENU_PANEL')
|
2010-01-12 07:50:14 +00:00
|
|
|
layout.operator("view3d.toolshelf", icon='MENU_PANEL')
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.separator()
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2017-10-19 12:35:58 +11:00
|
|
|
layout.operator("view3d.view_selected").use_all_regions = False
|
|
|
|
if view.region_quadviews:
|
|
|
|
layout.operator("view3d.view_selected", text="View Selected (Quad View)").use_all_regions = True
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2017-10-19 12:35:58 +11:00
|
|
|
layout.operator("view3d.view_all").center = False
|
|
|
|
layout.operator("view3d.view_persportho")
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.separator()
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2017-10-19 12:35:58 +11:00
|
|
|
layout.menu("VIEW3D_MT_view_cameras", text="Cameras")
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.separator()
|
2017-10-19 12:35:58 +11:00
|
|
|
layout.menu("VIEW3D_MT_view_viewpoint")
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.menu("VIEW3D_MT_view_navigation")
|
|
|
|
layout.menu("VIEW3D_MT_view_align")
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.separator()
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2009-11-16 13:59:27 +00:00
|
|
|
layout.operator_context = 'INVOKE_REGION_WIN'
|
2017-10-19 12:35:58 +11:00
|
|
|
layout.menu("VIEW3D_MT_view_borders", text="View Borders")
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.separator()
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2011-09-21 15:18:38 +00:00
|
|
|
layout.operator("view3d.layers", text="Show All Layers").nr = 0
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.separator()
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2011-09-21 15:18:38 +00:00
|
|
|
layout.operator("screen.animation_play", text="Playback Animation")
|
2009-12-04 17:54:48 +00:00
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.separator()
|
2009-12-04 17:54:48 +00:00
|
|
|
|
2009-12-03 16:28:50 +00:00
|
|
|
layout.operator("screen.area_dupli")
|
2009-12-04 00:49:02 +00:00
|
|
|
layout.operator("screen.region_quadview")
|
2016-06-22 07:41:25 +10:00
|
|
|
layout.operator("screen.screen_full_area")
|
|
|
|
layout.operator("screen.screen_full_area", text="Toggle Fullscreen Area").use_hide_panels = True
|
2009-12-03 16:28:50 +00:00
|
|
|
|
2009-10-31 23:35:56 +00:00
|
|
|
|
2017-10-19 12:35:58 +11:00
|
|
|
class VIEW3D_MT_view_cameras(Menu):
|
|
|
|
bl_label = "Cameras"
|
|
|
|
|
|
|
|
def draw(self, context):
|
|
|
|
layout = self.layout
|
|
|
|
|
|
|
|
layout.operator("view3d.object_as_camera")
|
|
|
|
layout.operator("view3d.viewnumpad", text="Active Camera").type = 'CAMERA'
|
|
|
|
|
|
|
|
|
|
|
|
class VIEW3D_MT_view_viewpoint(Menu):
|
|
|
|
bl_label = "Viewpoint"
|
|
|
|
|
|
|
|
def draw(self, context):
|
|
|
|
layout = self.layout
|
|
|
|
|
|
|
|
layout.operator("view3d.viewnumpad", text="Camera").type = 'CAMERA'
|
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
|
|
|
layout.operator("view3d.viewnumpad", text="Top").type = 'TOP'
|
|
|
|
layout.operator("view3d.viewnumpad", text="Bottom").type = 'BOTTOM'
|
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
|
|
|
layout.operator("view3d.viewnumpad", text="Front").type = 'FRONT'
|
|
|
|
layout.operator("view3d.viewnumpad", text="Back").type = 'BACK'
|
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
|
|
|
layout.operator("view3d.viewnumpad", text="Right").type = 'RIGHT'
|
|
|
|
layout.operator("view3d.viewnumpad", text="Left").type = 'LEFT'
|
|
|
|
|
|
|
|
|
2011-08-12 06:57:00 +00:00
|
|
|
class VIEW3D_MT_view_navigation(Menu):
|
2011-09-15 13:20:18 +00:00
|
|
|
bl_label = "Navigation"
|
2009-10-31 19:31:45 +00:00
|
|
|
|
|
|
|
def draw(self, context):
|
2013-09-01 14:17:43 +00:00
|
|
|
from math import pi
|
2009-10-31 19:31:45 +00:00
|
|
|
layout = self.layout
|
|
|
|
|
2011-02-18 06:07:41 +00:00
|
|
|
layout.operator_enum("view3d.view_orbit", "type")
|
2015-03-13 04:45:40 +11:00
|
|
|
props = layout.operator("view3d.view_orbit", "Orbit Opposite")
|
|
|
|
props.type = 'ORBITRIGHT'
|
|
|
|
props.angle = pi
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.separator()
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2016-02-01 11:01:00 +11:00
|
|
|
layout.operator("view3d.view_roll", text="Roll Left").type = 'LEFT'
|
|
|
|
layout.operator("view3d.view_roll", text="Roll Right").type = 'RIGHT'
|
2013-09-01 14:17:43 +00:00
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
2011-02-18 06:07:41 +00:00
|
|
|
layout.operator_enum("view3d.view_pan", "type")
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.separator()
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2011-09-21 15:18:38 +00:00
|
|
|
layout.operator("view3d.zoom", text="Zoom In").delta = 1
|
|
|
|
layout.operator("view3d.zoom", text="Zoom Out").delta = -1
|
2017-10-19 12:35:58 +11:00
|
|
|
layout.operator("view3d.zoom_border", text="Zoom Border...")
|
2011-09-21 15:18:38 +00:00
|
|
|
layout.operator("view3d.zoom_camera_1_to_1", text="Zoom Camera 1:1")
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.separator()
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.operator("view3d.fly")
|
2013-12-03 03:14:09 -02:00
|
|
|
layout.operator("view3d.walk")
|
2009-08-15 20:21:49 +00:00
|
|
|
|
2009-10-31 23:35:56 +00:00
|
|
|
|
2011-08-12 06:57:00 +00:00
|
|
|
class VIEW3D_MT_view_align(Menu):
|
2011-09-15 13:20:18 +00:00
|
|
|
bl_label = "Align View"
|
2009-10-31 19:31:45 +00:00
|
|
|
|
|
|
|
def draw(self, context):
|
|
|
|
layout = self.layout
|
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.menu("VIEW3D_MT_view_align_selected")
|
2009-11-06 21:10:45 +00:00
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.separator()
|
2009-11-06 21:10:45 +00:00
|
|
|
|
2011-09-21 15:18:38 +00:00
|
|
|
layout.operator("view3d.view_all", text="Center Cursor and View All").center = True
|
|
|
|
layout.operator("view3d.camera_to_view", text="Align Active Camera to View")
|
2011-11-14 03:54:23 +00:00
|
|
|
layout.operator("view3d.camera_to_view_selected", text="Align Active Camera to Selected")
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.operator("view3d.view_center_cursor")
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2012-05-05 16:38:23 +00:00
|
|
|
layout.separator()
|
|
|
|
|
|
|
|
layout.operator("view3d.view_lock_to_active")
|
|
|
|
layout.operator("view3d.view_lock_clear")
|
|
|
|
|
2009-10-31 23:35:56 +00:00
|
|
|
|
2011-08-12 06:57:00 +00:00
|
|
|
class VIEW3D_MT_view_align_selected(Menu):
|
2014-06-17 15:27:59 +10:00
|
|
|
bl_label = "Align View to Active"
|
2009-11-06 21:10:45 +00:00
|
|
|
|
|
|
|
def draw(self, context):
|
|
|
|
layout = self.layout
|
|
|
|
|
2011-09-21 15:18:38 +00:00
|
|
|
props = layout.operator("view3d.viewnumpad", text="Top")
|
2009-11-06 21:10:45 +00:00
|
|
|
props.align_active = True
|
|
|
|
props.type = 'TOP'
|
2012-07-29 12:07:06 +00:00
|
|
|
|
2011-09-21 15:18:38 +00:00
|
|
|
props = layout.operator("view3d.viewnumpad", text="Bottom")
|
2009-11-06 21:10:45 +00:00
|
|
|
props.align_active = True
|
|
|
|
props.type = 'BOTTOM'
|
2012-07-29 12:07:06 +00:00
|
|
|
|
2011-09-21 15:18:38 +00:00
|
|
|
props = layout.operator("view3d.viewnumpad", text="Front")
|
2009-11-06 21:10:45 +00:00
|
|
|
props.align_active = True
|
|
|
|
props.type = 'FRONT'
|
2012-07-29 12:07:06 +00:00
|
|
|
|
2011-09-21 15:18:38 +00:00
|
|
|
props = layout.operator("view3d.viewnumpad", text="Back")
|
2009-11-06 21:10:45 +00:00
|
|
|
props.align_active = True
|
|
|
|
props.type = 'BACK'
|
2012-07-29 12:07:06 +00:00
|
|
|
|
2011-09-21 15:18:38 +00:00
|
|
|
props = layout.operator("view3d.viewnumpad", text="Right")
|
2009-11-06 21:10:45 +00:00
|
|
|
props.align_active = True
|
|
|
|
props.type = 'RIGHT'
|
2012-07-29 12:07:06 +00:00
|
|
|
|
2011-09-21 15:18:38 +00:00
|
|
|
props = layout.operator("view3d.viewnumpad", text="Left")
|
2009-11-06 21:10:45 +00:00
|
|
|
props.align_active = True
|
|
|
|
props.type = 'LEFT'
|
|
|
|
|
|
|
|
|
2017-10-19 12:35:58 +11:00
|
|
|
class VIEW3D_MT_view_borders(Menu):
|
|
|
|
bl_label = "View Borders"
|
2009-10-31 19:31:45 +00:00
|
|
|
|
|
|
|
def draw(self, context):
|
|
|
|
layout = self.layout
|
2017-10-19 12:35:58 +11:00
|
|
|
layout.operator("view3d.clip_border", text="Clipping Border...")
|
|
|
|
layout.operator("view3d.render_border", text="Render Border...").camera_only = False
|
2009-08-23 22:13:56 +00:00
|
|
|
|
2017-10-19 12:35:58 +11:00
|
|
|
layout.separator()
|
|
|
|
|
|
|
|
layout.operator("view3d.clear_render_border")
|
2009-08-23 22:13:56 +00:00
|
|
|
|
2016-01-14 09:41:11 +11:00
|
|
|
|
2009-08-16 03:40:00 +00:00
|
|
|
# ********** Select menus, suffix from context.mode **********
|
2009-08-15 19:40:09 +00:00
|
|
|
|
2016-01-14 09:41:11 +11:00
|
|
|
class VIEW3D_MT_select_object_more_less(Menu):
|
|
|
|
bl_label = "Select More/Less"
|
|
|
|
|
|
|
|
def draw(self, context):
|
|
|
|
layout = self.layout
|
|
|
|
|
|
|
|
layout = self.layout
|
|
|
|
|
|
|
|
layout.operator("object.select_more", text="More")
|
|
|
|
layout.operator("object.select_less", text="Less")
|
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
|
|
|
props = layout.operator("object.select_hierarchy", text="Parent")
|
|
|
|
props.extend = False
|
|
|
|
props.direction = 'PARENT'
|
|
|
|
|
|
|
|
props = layout.operator("object.select_hierarchy", text="Child")
|
|
|
|
props.extend = False
|
|
|
|
props.direction = 'CHILD'
|
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
|
|
|
props = layout.operator("object.select_hierarchy", text="Extend Parent")
|
|
|
|
props.extend = True
|
|
|
|
props.direction = 'PARENT'
|
|
|
|
|
|
|
|
props = layout.operator("object.select_hierarchy", text="Extend Child")
|
|
|
|
props.extend = True
|
|
|
|
props.direction = 'CHILD'
|
|
|
|
|
2009-10-31 23:35:56 +00:00
|
|
|
|
2011-08-12 06:57:00 +00:00
|
|
|
class VIEW3D_MT_select_object(Menu):
|
2011-09-15 13:20:18 +00:00
|
|
|
bl_label = "Select"
|
2009-08-15 19:40:09 +00:00
|
|
|
|
2009-10-31 19:31:45 +00:00
|
|
|
def draw(self, context):
|
|
|
|
layout = self.layout
|
2009-08-15 19:40:09 +00:00
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.operator("view3d.select_border")
|
|
|
|
layout.operator("view3d.select_circle")
|
2009-08-15 19:40:09 +00:00
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.separator()
|
2009-08-15 19:40:09 +00:00
|
|
|
|
2012-03-17 19:14:08 +00:00
|
|
|
layout.operator("object.select_all").action = 'TOGGLE'
|
2012-01-14 06:30:27 +00:00
|
|
|
layout.operator("object.select_all", text="Inverse").action = 'INVERT'
|
2011-09-21 15:18:38 +00:00
|
|
|
layout.operator("object.select_random", text="Random")
|
|
|
|
layout.operator("object.select_mirror", text="Mirror")
|
|
|
|
layout.operator_menu_enum("object.select_by_type", "type", text="Select All by Type...")
|
|
|
|
layout.operator("object.select_camera", text="Select Camera")
|
2009-11-03 07:23:02 +00:00
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.separator()
|
2009-11-03 07:23:02 +00:00
|
|
|
|
2016-01-14 09:41:11 +11:00
|
|
|
layout.menu("VIEW3D_MT_select_object_more_less")
|
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
2011-09-21 15:18:38 +00:00
|
|
|
layout.operator_menu_enum("object.select_grouped", "type", text="Grouped")
|
|
|
|
layout.operator_menu_enum("object.select_linked", "type", text="Linked")
|
|
|
|
layout.operator("object.select_pattern", text="Select Pattern...")
|
2009-08-15 19:40:09 +00:00
|
|
|
|
2009-10-31 23:35:56 +00:00
|
|
|
|
2016-01-14 09:41:11 +11:00
|
|
|
class VIEW3D_MT_select_pose_more_less(Menu):
|
|
|
|
bl_label = "Select More/Less"
|
2009-10-31 19:31:45 +00:00
|
|
|
|
|
|
|
def draw(self, context):
|
|
|
|
layout = self.layout
|
|
|
|
|
2016-01-14 09:41:11 +11:00
|
|
|
layout = self.layout
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2015-01-29 17:34:05 +01:00
|
|
|
props = layout.operator("pose.select_hierarchy", text="Parent")
|
|
|
|
props.extend = False
|
|
|
|
props.direction = 'PARENT'
|
|
|
|
|
|
|
|
props = layout.operator("pose.select_hierarchy", text="Child")
|
|
|
|
props.extend = False
|
|
|
|
props.direction = 'CHILD'
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.separator()
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2011-09-21 15:18:38 +00:00
|
|
|
props = layout.operator("pose.select_hierarchy", text="Extend Parent")
|
2009-10-31 19:31:45 +00:00
|
|
|
props.extend = True
|
|
|
|
props.direction = 'PARENT'
|
|
|
|
|
2011-09-21 15:18:38 +00:00
|
|
|
props = layout.operator("pose.select_hierarchy", text="Extend Child")
|
2009-10-31 19:31:45 +00:00
|
|
|
props.extend = True
|
|
|
|
props.direction = 'CHILD'
|
2009-12-04 17:54:48 +00:00
|
|
|
|
2016-01-14 09:41:11 +11:00
|
|
|
|
|
|
|
class VIEW3D_MT_select_pose(Menu):
|
|
|
|
bl_label = "Select"
|
|
|
|
|
|
|
|
def draw(self, context):
|
|
|
|
layout = self.layout
|
|
|
|
|
|
|
|
layout.operator("view3d.select_border")
|
|
|
|
layout.operator("view3d.select_circle")
|
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
|
|
|
layout.operator("pose.select_all").action = 'TOGGLE'
|
|
|
|
layout.operator("pose.select_all", text="Inverse").action = 'INVERT'
|
|
|
|
layout.operator("pose.select_mirror", text="Flip Active")
|
2017-10-19 15:10:41 +11:00
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
2016-01-14 09:41:11 +11:00
|
|
|
layout.operator("pose.select_constraint_target", text="Constraint Target")
|
|
|
|
layout.operator("pose.select_linked", text="Linked")
|
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
|
|
|
layout.menu("VIEW3D_MT_select_pose_more_less")
|
|
|
|
|
2010-01-25 10:16:36 +00:00
|
|
|
layout.separator()
|
|
|
|
|
2011-09-21 15:18:38 +00:00
|
|
|
layout.operator_menu_enum("pose.select_grouped", "type", text="Grouped")
|
|
|
|
layout.operator("object.select_pattern", text="Select Pattern...")
|
2009-08-15 19:40:09 +00:00
|
|
|
|
2009-10-31 23:35:56 +00:00
|
|
|
|
2016-12-28 17:30:58 +01:00
|
|
|
class VIEW3D_MT_select_particle(Menu):
|
|
|
|
bl_label = "Select"
|
|
|
|
|
|
|
|
def draw(self, context):
|
|
|
|
layout = self.layout
|
|
|
|
|
|
|
|
layout.operator("view3d.select_border")
|
2016-11-15 15:55:54 +01:00
|
|
|
layout.operator("view3d.select_circle")
|
2016-12-28 17:30:58 +01:00
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
|
|
|
layout.operator("particle.select_all").action = 'TOGGLE'
|
|
|
|
layout.operator("particle.select_linked")
|
|
|
|
layout.operator("particle.select_all", text="Inverse").action = 'INVERT'
|
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
|
|
|
layout.operator("particle.select_more")
|
|
|
|
layout.operator("particle.select_less")
|
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
|
|
|
layout.operator("particle.select_random")
|
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
|
|
|
layout.operator("particle.select_roots", text="Roots")
|
|
|
|
layout.operator("particle.select_tips", text="Tips")
|
|
|
|
|
|
|
|
|
2014-09-27 18:30:48 +10:00
|
|
|
class VIEW3D_MT_edit_mesh_select_similar(Menu):
|
|
|
|
bl_label = "Select Similar"
|
|
|
|
|
|
|
|
def draw(self, context):
|
|
|
|
layout = self.layout
|
|
|
|
|
|
|
|
layout.operator_enum("mesh.select_similar", "type")
|
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
|
|
|
layout.operator("mesh.select_similar_region", text="Face Regions")
|
|
|
|
|
|
|
|
|
2016-01-08 04:07:20 +11:00
|
|
|
class VIEW3D_MT_edit_mesh_select_by_trait(Menu):
|
|
|
|
bl_label = "Select All by Trait"
|
|
|
|
|
|
|
|
def draw(self, context):
|
|
|
|
layout = self.layout
|
|
|
|
if context.scene.tool_settings.mesh_select_mode[2] is False:
|
|
|
|
layout.operator("mesh.select_non_manifold", text="Non Manifold")
|
|
|
|
layout.operator("mesh.select_loose", text="Loose Geometry")
|
|
|
|
layout.operator("mesh.select_interior_faces", text="Interior Faces")
|
2017-10-19 14:45:56 +11:00
|
|
|
layout.operator("mesh.select_face_by_sides", text="Faces by Sides")
|
2016-01-08 04:07:20 +11:00
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
|
|
|
layout.operator("mesh.select_ungrouped", text="Ungrouped Verts")
|
|
|
|
|
|
|
|
|
2016-01-08 04:42:17 +11:00
|
|
|
class VIEW3D_MT_edit_mesh_select_more_less(Menu):
|
|
|
|
bl_label = "Select More/Less"
|
|
|
|
|
|
|
|
def draw(self, context):
|
|
|
|
layout = self.layout
|
|
|
|
|
|
|
|
layout.operator("mesh.select_more", text="More")
|
|
|
|
layout.operator("mesh.select_less", text="Less")
|
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
|
|
|
layout.operator("mesh.select_next_item", text="Next Active")
|
|
|
|
layout.operator("mesh.select_prev_item", text="Previous Active")
|
|
|
|
|
|
|
|
|
2017-10-19 14:45:56 +11:00
|
|
|
class VIEW3D_MT_edit_mesh_select_linked(Menu):
|
|
|
|
bl_label = "Select Linked"
|
|
|
|
|
|
|
|
def draw(self, context):
|
|
|
|
layout = self.layout
|
|
|
|
|
|
|
|
layout.operator("mesh.select_linked", text="Linked")
|
|
|
|
layout.operator("mesh.shortest_path_select", text="Shortest Path")
|
|
|
|
layout.operator("mesh.faces_select_linked_flat", text="Linked Flat Faces")
|
|
|
|
|
|
|
|
|
|
|
|
class VIEW3D_MT_edit_mesh_select_loops(Menu):
|
|
|
|
bl_label = "Select Loops"
|
|
|
|
|
|
|
|
def draw(self, context):
|
|
|
|
layout = self.layout
|
|
|
|
|
|
|
|
layout.operator("mesh.loop_multi_select", text="Edge Loops").ring = False
|
|
|
|
layout.operator("mesh.loop_multi_select", text="Edge Rings").ring = True
|
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
|
|
|
layout.operator("mesh.loop_to_region")
|
|
|
|
layout.operator("mesh.region_to_loop")
|
|
|
|
|
|
|
|
|
2011-08-12 06:57:00 +00:00
|
|
|
class VIEW3D_MT_select_edit_mesh(Menu):
|
2011-09-15 13:20:18 +00:00
|
|
|
bl_label = "Select"
|
2009-10-31 19:31:45 +00:00
|
|
|
|
|
|
|
def draw(self, context):
|
|
|
|
layout = self.layout
|
2009-08-15 19:40:09 +00:00
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.operator("view3d.select_border")
|
|
|
|
layout.operator("view3d.select_circle")
|
2009-08-15 19:40:09 +00:00
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.separator()
|
2009-08-15 19:40:09 +00:00
|
|
|
|
2013-05-01 05:59:58 +00:00
|
|
|
# primitive
|
2012-03-17 19:14:08 +00:00
|
|
|
layout.operator("mesh.select_all").action = 'TOGGLE'
|
2012-01-14 06:30:27 +00:00
|
|
|
layout.operator("mesh.select_all", text="Inverse").action = 'INVERT'
|
2009-08-15 19:40:09 +00:00
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.separator()
|
2009-08-15 19:40:09 +00:00
|
|
|
|
2013-05-01 05:59:58 +00:00
|
|
|
# numeric
|
2011-09-21 15:18:38 +00:00
|
|
|
layout.operator("mesh.select_random", text="Random")
|
2012-11-01 05:07:15 +00:00
|
|
|
layout.operator("mesh.select_nth")
|
2013-05-01 05:59:58 +00:00
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
|
|
|
# geometric
|
2011-09-21 15:18:38 +00:00
|
|
|
layout.operator("mesh.edges_select_sharp", text="Sharp Edges")
|
2009-08-15 19:40:09 +00:00
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.separator()
|
2009-08-15 19:40:09 +00:00
|
|
|
|
2016-01-08 04:07:20 +11:00
|
|
|
# other ...
|
|
|
|
layout.menu("VIEW3D_MT_edit_mesh_select_similar")
|
2013-05-01 05:59:58 +00:00
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
2016-01-08 04:07:20 +11:00
|
|
|
layout.menu("VIEW3D_MT_edit_mesh_select_by_trait")
|
2009-08-15 19:40:09 +00:00
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.separator()
|
2009-08-15 19:40:09 +00:00
|
|
|
|
2016-01-08 04:42:17 +11:00
|
|
|
layout.menu("VIEW3D_MT_edit_mesh_select_more_less")
|
2009-08-15 19:40:09 +00:00
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.separator()
|
2009-08-15 19:40:09 +00:00
|
|
|
|
2017-10-19 14:45:56 +11:00
|
|
|
layout.menu("VIEW3D_MT_edit_mesh_select_loops")
|
2009-08-15 19:40:09 +00:00
|
|
|
|
2017-10-19 14:45:56 +11:00
|
|
|
layout.separator()
|
|
|
|
|
|
|
|
layout.menu("VIEW3D_MT_edit_mesh_select_linked")
|
2009-08-15 19:40:09 +00:00
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.separator()
|
2009-08-15 19:40:09 +00:00
|
|
|
|
2017-10-19 14:45:56 +11:00
|
|
|
layout.operator("mesh.select_axis", text="Side of Active")
|
|
|
|
layout.operator("mesh.select_mirror", text="Mirror")
|
2009-08-15 19:40:09 +00:00
|
|
|
|
2009-10-31 23:35:56 +00:00
|
|
|
|
2011-08-12 06:57:00 +00:00
|
|
|
class VIEW3D_MT_select_edit_curve(Menu):
|
2011-09-15 13:20:18 +00:00
|
|
|
bl_label = "Select"
|
2009-08-15 19:40:09 +00:00
|
|
|
|
2009-10-31 19:31:45 +00:00
|
|
|
def draw(self, context):
|
|
|
|
layout = self.layout
|
2009-08-15 19:40:09 +00:00
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.operator("view3d.select_border")
|
|
|
|
layout.operator("view3d.select_circle")
|
2009-08-15 19:40:09 +00:00
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.separator()
|
2009-08-15 19:40:09 +00:00
|
|
|
|
2012-03-17 19:14:08 +00:00
|
|
|
layout.operator("curve.select_all").action = 'TOGGLE'
|
2012-01-14 06:30:27 +00:00
|
|
|
layout.operator("curve.select_all", text="Inverse").action = 'INVERT'
|
2017-10-19 15:10:41 +11:00
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.operator("curve.select_random")
|
2013-02-26 16:39:41 +00:00
|
|
|
layout.operator("curve.select_nth")
|
2012-05-15 15:34:49 +00:00
|
|
|
layout.operator("curve.select_linked", text="Select Linked")
|
2015-07-09 02:58:40 +10:00
|
|
|
layout.operator("curve.select_similar", text="Select Similar")
|
2009-08-15 19:40:09 +00:00
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.separator()
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.operator("curve.de_select_first")
|
|
|
|
layout.operator("curve.de_select_last")
|
|
|
|
layout.operator("curve.select_next")
|
|
|
|
layout.operator("curve.select_previous")
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.separator()
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.operator("curve.select_more")
|
|
|
|
layout.operator("curve.select_less")
|
2009-08-15 19:40:09 +00:00
|
|
|
|
2009-10-31 23:35:56 +00:00
|
|
|
|
2011-08-12 06:57:00 +00:00
|
|
|
class VIEW3D_MT_select_edit_surface(Menu):
|
2011-09-15 13:20:18 +00:00
|
|
|
bl_label = "Select"
|
2009-10-31 19:31:45 +00:00
|
|
|
|
|
|
|
def draw(self, context):
|
|
|
|
layout = self.layout
|
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.operator("view3d.select_border")
|
|
|
|
layout.operator("view3d.select_circle")
|
2009-08-15 19:40:09 +00:00
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.separator()
|
2009-08-15 19:40:09 +00:00
|
|
|
|
2012-03-17 19:14:08 +00:00
|
|
|
layout.operator("curve.select_all").action = 'TOGGLE'
|
2012-01-14 06:30:27 +00:00
|
|
|
layout.operator("curve.select_all", text="Inverse").action = 'INVERT'
|
2017-10-19 15:10:41 +11:00
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.operator("curve.select_random")
|
2013-02-26 16:39:41 +00:00
|
|
|
layout.operator("curve.select_nth")
|
2012-05-15 15:34:49 +00:00
|
|
|
layout.operator("curve.select_linked", text="Select Linked")
|
2015-07-09 02:58:40 +10:00
|
|
|
layout.operator("curve.select_similar", text="Select Similar")
|
2009-08-15 19:40:09 +00:00
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.separator()
|
2009-08-15 19:40:09 +00:00
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.operator("curve.select_row")
|
2009-08-15 19:40:09 +00:00
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.separator()
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.operator("curve.select_more")
|
|
|
|
layout.operator("curve.select_less")
|
2009-08-15 19:40:09 +00:00
|
|
|
|
2009-10-31 23:35:56 +00:00
|
|
|
|
2013-12-29 23:43:19 +11:00
|
|
|
class VIEW3D_MT_select_edit_text(Menu):
|
|
|
|
# intentional name mis-match
|
|
|
|
# select menu for 3d-text doesn't make sense
|
|
|
|
bl_label = "Edit"
|
|
|
|
|
|
|
|
def draw(self, context):
|
|
|
|
layout = self.layout
|
|
|
|
|
2017-10-19 15:38:34 +11:00
|
|
|
layout.menu("VIEW3D_MT_undo_redo")
|
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
2013-12-29 23:43:19 +11:00
|
|
|
layout.operator("font.text_paste", text="Paste")
|
2017-10-19 15:10:41 +11:00
|
|
|
layout.operator("font.text_cut", text="Cut")
|
|
|
|
layout.operator("font.text_copy", text="Copy")
|
2013-12-29 23:43:19 +11:00
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
2014-01-06 00:36:09 +11:00
|
|
|
layout.operator("font.text_paste_from_file")
|
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
2013-12-29 23:43:19 +11:00
|
|
|
layout.operator("font.select_all")
|
|
|
|
|
|
|
|
|
2011-08-12 06:57:00 +00:00
|
|
|
class VIEW3D_MT_select_edit_metaball(Menu):
|
2011-09-15 13:20:18 +00:00
|
|
|
bl_label = "Select"
|
2009-10-31 19:31:45 +00:00
|
|
|
|
|
|
|
def draw(self, context):
|
|
|
|
layout = self.layout
|
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.operator("view3d.select_border")
|
2013-02-26 15:42:33 +00:00
|
|
|
layout.operator("view3d.select_circle")
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.separator()
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2011-01-04 13:10:46 +00:00
|
|
|
layout.operator("mball.select_all").action = 'TOGGLE'
|
2012-03-18 20:04:41 +00:00
|
|
|
layout.operator("mball.select_all", text="Inverse").action = 'INVERT'
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.separator()
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.operator("mball.select_random_metaelems")
|
2009-08-15 19:40:09 +00:00
|
|
|
|
2013-10-25 06:22:15 +00:00
|
|
|
layout.separator()
|
|
|
|
|
|
|
|
layout.operator_menu_enum("mball.select_similar", "type", text="Similar")
|
|
|
|
|
2009-10-31 23:35:56 +00:00
|
|
|
|
2011-08-12 06:57:00 +00:00
|
|
|
class VIEW3D_MT_select_edit_lattice(Menu):
|
2011-09-15 13:20:18 +00:00
|
|
|
bl_label = "Select"
|
2009-10-31 19:31:45 +00:00
|
|
|
|
|
|
|
def draw(self, context):
|
|
|
|
layout = self.layout
|
2009-08-15 19:40:09 +00:00
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.operator("view3d.select_border")
|
2013-04-11 13:29:01 +00:00
|
|
|
layout.operator("view3d.select_circle")
|
2009-08-15 19:40:09 +00:00
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.separator()
|
2009-08-15 19:40:09 +00:00
|
|
|
|
2012-03-18 19:55:42 +00:00
|
|
|
layout.operator("lattice.select_all").action = 'TOGGLE'
|
2012-03-16 23:01:37 +00:00
|
|
|
layout.operator("lattice.select_all", text="Inverse").action = 'INVERT'
|
2009-08-15 19:40:09 +00:00
|
|
|
|
2013-03-16 16:11:50 +00:00
|
|
|
layout.separator()
|
|
|
|
|
2017-10-19 15:10:41 +11:00
|
|
|
layout.operator("lattice.select_mirror")
|
|
|
|
layout.operator("lattice.select_random")
|
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
2013-03-16 16:11:50 +00:00
|
|
|
layout.operator("lattice.select_ungrouped", text="Ungrouped Verts")
|
|
|
|
|
2009-10-31 23:35:56 +00:00
|
|
|
|
2011-08-12 06:57:00 +00:00
|
|
|
class VIEW3D_MT_select_edit_armature(Menu):
|
2011-09-15 13:20:18 +00:00
|
|
|
bl_label = "Select"
|
2009-10-31 19:31:45 +00:00
|
|
|
|
|
|
|
def draw(self, context):
|
|
|
|
layout = self.layout
|
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.operator("view3d.select_border")
|
2013-04-11 13:29:01 +00:00
|
|
|
layout.operator("view3d.select_circle")
|
2009-11-03 07:23:02 +00:00
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.separator()
|
2009-08-15 19:40:09 +00:00
|
|
|
|
2012-03-17 19:14:08 +00:00
|
|
|
layout.operator("armature.select_all").action = 'TOGGLE'
|
2012-01-14 21:41:13 +00:00
|
|
|
layout.operator("armature.select_all", text="Inverse").action = 'INVERT'
|
2013-11-05 21:47:35 +00:00
|
|
|
layout.operator("armature.select_mirror", text="Mirror").extend = False
|
2009-08-15 19:40:09 +00:00
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.separator()
|
2009-08-15 19:40:09 +00:00
|
|
|
|
2013-07-19 10:51:54 +00:00
|
|
|
layout.operator("armature.select_more", text="More")
|
|
|
|
layout.operator("armature.select_less", text="Less")
|
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
2015-01-29 17:34:05 +01:00
|
|
|
props = layout.operator("armature.select_hierarchy", text="Parent")
|
|
|
|
props.extend = False
|
|
|
|
props.direction = 'PARENT'
|
|
|
|
|
|
|
|
props = layout.operator("armature.select_hierarchy", text="Child")
|
|
|
|
props.extend = False
|
|
|
|
props.direction = 'CHILD'
|
2009-08-15 19:40:09 +00:00
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.separator()
|
2009-08-21 12:57:47 +00:00
|
|
|
|
2011-09-21 15:18:38 +00:00
|
|
|
props = layout.operator("armature.select_hierarchy", text="Extend Parent")
|
2009-10-31 19:31:45 +00:00
|
|
|
props.extend = True
|
|
|
|
props.direction = 'PARENT'
|
|
|
|
|
2011-09-21 15:18:38 +00:00
|
|
|
props = layout.operator("armature.select_hierarchy", text="Extend Child")
|
2009-10-31 19:31:45 +00:00
|
|
|
props.extend = True
|
|
|
|
props.direction = 'CHILD'
|
2009-12-04 17:54:48 +00:00
|
|
|
|
2012-09-23 18:50:56 +00:00
|
|
|
layout.operator_menu_enum("armature.select_similar", "type", text="Similar")
|
2011-09-21 15:18:38 +00:00
|
|
|
layout.operator("object.select_pattern", text="Select Pattern...")
|
2009-08-15 19:40:09 +00:00
|
|
|
|
2009-10-31 23:35:56 +00:00
|
|
|
|
2015-12-13 21:03:13 +13:00
|
|
|
class VIEW3D_MT_select_gpencil(Menu):
|
|
|
|
bl_label = "Select"
|
2016-02-01 00:47:10 +11:00
|
|
|
|
2015-12-13 21:03:13 +13:00
|
|
|
def draw(self, context):
|
|
|
|
layout = self.layout
|
|
|
|
|
|
|
|
layout.operator("gpencil.select_border")
|
|
|
|
layout.operator("gpencil.select_circle")
|
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
|
|
|
layout.operator("gpencil.select_all", text="(De)select All").action = 'TOGGLE'
|
|
|
|
layout.operator("gpencil.select_all", text="Inverse").action = 'INVERT'
|
2017-10-19 15:10:41 +11:00
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
2015-12-13 21:03:13 +13:00
|
|
|
layout.operator("gpencil.select_linked", text="Linked")
|
2016-08-26 16:38:31 +12:00
|
|
|
layout.operator_menu_enum("gpencil.select_grouped", "type", text="Grouped")
|
2015-12-13 21:03:13 +13:00
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
2016-05-09 17:23:15 +12:00
|
|
|
layout.operator("gpencil.select_first")
|
|
|
|
layout.operator("gpencil.select_last")
|
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
2015-12-13 21:03:13 +13:00
|
|
|
layout.operator("gpencil.select_more")
|
|
|
|
layout.operator("gpencil.select_less")
|
|
|
|
|
|
|
|
|
2013-02-26 15:42:33 +00:00
|
|
|
class VIEW3D_MT_select_paint_mask(Menu):
|
2009-10-31 19:31:45 +00:00
|
|
|
bl_label = "Select"
|
2009-08-15 19:40:09 +00:00
|
|
|
|
2009-10-31 19:31:45 +00:00
|
|
|
def draw(self, context):
|
2013-02-26 15:42:33 +00:00
|
|
|
layout = self.layout
|
|
|
|
|
|
|
|
layout.operator("view3d.select_border")
|
|
|
|
layout.operator("view3d.select_circle")
|
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
|
|
|
layout.operator("paint.face_select_all").action = 'TOGGLE'
|
|
|
|
layout.operator("paint.face_select_all", text="Inverse").action = 'INVERT'
|
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
|
|
|
layout.operator("paint.face_select_linked", text="Linked")
|
|
|
|
|
|
|
|
|
|
|
|
class VIEW3D_MT_select_paint_mask_vertex(Menu):
|
2011-09-15 13:20:18 +00:00
|
|
|
bl_label = "Select"
|
2009-08-15 19:40:09 +00:00
|
|
|
|
2009-10-31 19:31:45 +00:00
|
|
|
def draw(self, context):
|
2013-02-26 15:42:33 +00:00
|
|
|
layout = self.layout
|
|
|
|
|
|
|
|
layout.operator("view3d.select_border")
|
|
|
|
layout.operator("view3d.select_circle")
|
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
|
|
|
layout.operator("paint.vert_select_all").action = 'TOGGLE'
|
|
|
|
layout.operator("paint.vert_select_all", text="Inverse").action = 'INVERT'
|
2009-11-28 23:37:56 +00:00
|
|
|
|
2013-03-16 16:11:50 +00:00
|
|
|
layout.separator()
|
|
|
|
|
|
|
|
layout.operator("paint.vert_select_ungrouped", text="Ungrouped Verts")
|
|
|
|
|
2015-02-24 11:56:26 +01:00
|
|
|
|
|
|
|
class VIEW3D_MT_angle_control(Menu):
|
|
|
|
bl_label = "Angle Control"
|
|
|
|
|
|
|
|
@classmethod
|
|
|
|
def poll(cls, context):
|
|
|
|
settings = UnifiedPaintPanel.paint_settings(context)
|
|
|
|
if not settings:
|
|
|
|
return False
|
|
|
|
|
|
|
|
brush = settings.brush
|
|
|
|
tex_slot = brush.texture_slot
|
|
|
|
|
|
|
|
return tex_slot.has_texture_angle and tex_slot.has_texture_angle_source
|
|
|
|
|
|
|
|
def draw(self, context):
|
|
|
|
layout = self.layout
|
|
|
|
|
|
|
|
settings = UnifiedPaintPanel.paint_settings(context)
|
|
|
|
brush = settings.brush
|
|
|
|
|
2015-04-22 16:26:00 +10:00
|
|
|
sculpt = (context.sculpt_object is not None)
|
2015-02-24 11:56:26 +01:00
|
|
|
|
|
|
|
tex_slot = brush.texture_slot
|
|
|
|
|
|
|
|
layout.prop(tex_slot, "use_rake", text="Rake")
|
|
|
|
|
|
|
|
if brush.brush_capabilities.has_random_texture_angle and tex_slot.has_random_texture_angle:
|
|
|
|
if sculpt:
|
|
|
|
if brush.sculpt_capabilities.has_random_texture_angle:
|
|
|
|
layout.prop(tex_slot, "use_random", text="Random")
|
|
|
|
else:
|
|
|
|
layout.prop(tex_slot, "use_random", text="Random")
|
|
|
|
|
|
|
|
|
2017-10-19 15:10:41 +11:00
|
|
|
# XXX: INFO_MT_ names used to keep backwards compatibility (Add-ons etc. that hook into the menu)
|
2013-11-04 22:49:49 +00:00
|
|
|
class INFO_MT_mesh_add(Menu):
|
|
|
|
bl_idname = "INFO_MT_mesh_add"
|
|
|
|
bl_label = "Mesh"
|
|
|
|
|
|
|
|
def draw(self, context):
|
|
|
|
layout = self.layout
|
|
|
|
|
|
|
|
layout.operator_context = 'INVOKE_REGION_WIN'
|
2014-03-20 01:32:44 +11:00
|
|
|
|
2018-04-24 16:13:03 +02:00
|
|
|
layout.operator("mesh.primitive_plane_add", text="Plane", icon='MESH_PLANE')
|
|
|
|
layout.operator("mesh.primitive_cube_add", text="Cube", icon='MESH_CUBE')
|
|
|
|
layout.operator("mesh.primitive_circle_add", text="Circle", icon='MESH_CIRCLE')
|
|
|
|
layout.operator("mesh.primitive_uv_sphere_add", text="UV Sphere", icon='MESH_UVSPHERE')
|
|
|
|
layout.operator("mesh.primitive_ico_sphere_add", text="Ico Sphere", icon='MESH_ICOSPHERE')
|
|
|
|
layout.operator("mesh.primitive_cylinder_add", text="Cylinder", icon='MESH_CYLINDER')
|
|
|
|
layout.operator("mesh.primitive_cone_add", text="Cone", icon='MESH_CONE')
|
|
|
|
layout.operator("mesh.primitive_torus_add", text="Torus", icon='MESH_TORUS')
|
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
|
|
|
layout.operator("mesh.primitive_grid_add", text="Grid", icon='MESH_GRID')
|
|
|
|
layout.operator("mesh.primitive_monkey_add", text="Monkey", icon='MESH_MONKEY')
|
2013-11-04 22:49:49 +00:00
|
|
|
|
|
|
|
|
|
|
|
class INFO_MT_curve_add(Menu):
|
|
|
|
bl_idname = "INFO_MT_curve_add"
|
|
|
|
bl_label = "Curve"
|
|
|
|
|
|
|
|
def draw(self, context):
|
|
|
|
layout = self.layout
|
|
|
|
|
|
|
|
layout.operator_context = 'INVOKE_REGION_WIN'
|
2014-03-20 01:32:44 +11:00
|
|
|
|
2018-04-24 16:13:03 +02:00
|
|
|
layout.operator("curve.primitive_bezier_curve_add", text="Bezier", icon='CURVE_BEZCURVE')
|
|
|
|
layout.operator("curve.primitive_bezier_circle_add", text="Circle", icon='CURVE_BEZCIRCLE')
|
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
|
|
|
layout.operator("curve.primitive_nurbs_curve_add", text="Nurbs Curve", icon='CURVE_NCURVE')
|
|
|
|
layout.operator("curve.primitive_nurbs_circle_add", text="Nurbs Circle", icon='CURVE_NCIRCLE')
|
|
|
|
layout.operator("curve.primitive_nurbs_path_add", text="Path", icon='CURVE_PATH')
|
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
|
|
|
layout.operator("curve.draw", icon='LINE_DATA')
|
2014-03-20 01:32:44 +11:00
|
|
|
|
2013-11-04 22:49:49 +00:00
|
|
|
|
|
|
|
class INFO_MT_surface_add(Menu):
|
|
|
|
bl_idname = "INFO_MT_surface_add"
|
|
|
|
bl_label = "Surface"
|
|
|
|
|
|
|
|
def draw(self, context):
|
|
|
|
layout = self.layout
|
|
|
|
|
|
|
|
layout.operator_context = 'INVOKE_REGION_WIN'
|
2014-03-20 01:32:44 +11:00
|
|
|
|
2018-04-24 16:13:03 +02:00
|
|
|
layout.operator("curve.primitive_bezier_curve_add", text="Bezier", icon='CURVE_BEZCURVE')
|
|
|
|
layout.operator("curve.primitive_bezier_circle_add", text="Circle", icon='CURVE_BEZCIRCLE')
|
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
|
|
|
layout.operator("curve.primitive_nurbs_curve_add", text="Nurbs Curve", icon='CURVE_NCURVE')
|
|
|
|
layout.operator("curve.primitive_nurbs_circle_add", text="Nurbs Circle", icon='CURVE_NCIRCLE')
|
|
|
|
layout.operator("curve.primitive_nurbs_path_add", text="Path", icon='CURVE_PATH')
|
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
|
|
|
layout.operator("curve.draw", icon='LINE_DATA')
|
2013-11-04 22:49:49 +00:00
|
|
|
|
|
|
|
|
2013-11-19 17:16:15 +11:00
|
|
|
class INFO_MT_metaball_add(Menu):
|
|
|
|
bl_idname = "INFO_MT_metaball_add"
|
|
|
|
bl_label = "Metaball"
|
|
|
|
|
|
|
|
def draw(self, context):
|
|
|
|
layout = self.layout
|
|
|
|
|
|
|
|
layout.operator_context = 'INVOKE_REGION_WIN'
|
|
|
|
layout.operator_enum("object.metaball_add", "type")
|
|
|
|
|
|
|
|
|
2014-01-03 01:34:35 +06:00
|
|
|
class INFO_MT_edit_curve_add(Menu):
|
|
|
|
bl_idname = "INFO_MT_edit_curve_add"
|
|
|
|
bl_label = "Add"
|
|
|
|
|
|
|
|
def draw(self, context):
|
|
|
|
is_surf = context.active_object.type == 'SURFACE'
|
|
|
|
|
|
|
|
layout = self.layout
|
|
|
|
layout.operator_context = 'EXEC_REGION_WIN'
|
|
|
|
|
|
|
|
if is_surf:
|
|
|
|
INFO_MT_surface_add.draw(self, context)
|
|
|
|
else:
|
|
|
|
INFO_MT_curve_add.draw(self, context)
|
|
|
|
|
|
|
|
|
2013-12-14 13:47:18 +01:00
|
|
|
class INFO_MT_edit_armature_add(Menu):
|
|
|
|
bl_idname = "INFO_MT_edit_armature_add"
|
|
|
|
bl_label = "Armature"
|
2013-11-04 22:49:49 +00:00
|
|
|
|
|
|
|
def draw(self, context):
|
|
|
|
layout = self.layout
|
|
|
|
|
2013-12-14 13:47:18 +01:00
|
|
|
layout.operator_context = 'EXEC_REGION_WIN'
|
|
|
|
layout.operator("armature.bone_primitive_add", text="Single Bone", icon='BONE_DATA')
|
2013-11-04 22:49:49 +00:00
|
|
|
|
|
|
|
|
|
|
|
class INFO_MT_armature_add(Menu):
|
|
|
|
bl_idname = "INFO_MT_armature_add"
|
|
|
|
bl_label = "Armature"
|
|
|
|
|
|
|
|
def draw(self, context):
|
|
|
|
layout = self.layout
|
|
|
|
|
|
|
|
layout.operator_context = 'EXEC_REGION_WIN'
|
|
|
|
layout.operator("object.armature_add", text="Single Bone", icon='BONE_DATA')
|
|
|
|
|
|
|
|
|
2015-04-12 11:38:18 +01:00
|
|
|
class INFO_MT_lamp_add(Menu):
|
|
|
|
bl_idname = "INFO_MT_lamp_add"
|
|
|
|
bl_label = "Lamp"
|
|
|
|
|
|
|
|
def draw(self, context):
|
|
|
|
layout = self.layout
|
|
|
|
|
|
|
|
layout.operator_context = 'INVOKE_REGION_WIN'
|
|
|
|
layout.operator_enum("object.lamp_add", "type")
|
|
|
|
|
|
|
|
|
2017-06-12 20:59:54 +10:00
|
|
|
class INFO_MT_lightprobe_add(Menu):
|
|
|
|
bl_idname = "INFO_MT_lightprobe_add"
|
|
|
|
bl_label = "Light Probe"
|
2017-06-07 18:32:27 +02:00
|
|
|
|
|
|
|
def draw(self, context):
|
|
|
|
layout = self.layout
|
|
|
|
|
|
|
|
layout.operator_context = 'INVOKE_REGION_WIN'
|
2017-06-12 20:59:54 +10:00
|
|
|
layout.operator_enum("object.lightprobe_add", "type")
|
2017-06-07 18:32:27 +02:00
|
|
|
|
|
|
|
|
2017-03-23 20:42:44 +11:00
|
|
|
class INFO_MT_camera_add(Menu):
|
|
|
|
bl_idname = "INFO_MT_camera_add"
|
|
|
|
bl_label = "Camera"
|
|
|
|
|
|
|
|
def draw(self, context):
|
|
|
|
layout = self.layout
|
|
|
|
layout.operator_context = 'EXEC_REGION_WIN'
|
|
|
|
layout.operator("object.camera_add", text="Camera", icon='OUTLINER_OB_CAMERA')
|
|
|
|
|
|
|
|
|
2013-11-04 22:49:49 +00:00
|
|
|
class INFO_MT_add(Menu):
|
|
|
|
bl_label = "Add"
|
|
|
|
|
|
|
|
def draw(self, context):
|
|
|
|
layout = self.layout
|
|
|
|
|
|
|
|
# note, don't use 'EXEC_SCREEN' or operators wont get the 'v3d' context.
|
|
|
|
|
|
|
|
# Note: was EXEC_AREA, but this context does not have the 'rv3d', which prevents
|
|
|
|
# "align_view" to work on first call (see [#32719]).
|
|
|
|
layout.operator_context = 'EXEC_REGION_WIN'
|
|
|
|
|
2017-10-19 15:10:41 +11:00
|
|
|
# layout.operator_menu_enum("object.mesh_add", "type", text="Mesh", icon='OUTLINER_OB_MESH')
|
2013-11-04 22:49:49 +00:00
|
|
|
layout.menu("INFO_MT_mesh_add", icon='OUTLINER_OB_MESH')
|
|
|
|
|
2017-10-19 15:10:41 +11:00
|
|
|
# layout.operator_menu_enum("object.curve_add", "type", text="Curve", icon='OUTLINER_OB_CURVE')
|
2013-11-04 22:49:49 +00:00
|
|
|
layout.menu("INFO_MT_curve_add", icon='OUTLINER_OB_CURVE')
|
2017-10-19 15:10:41 +11:00
|
|
|
# layout.operator_menu_enum("object.surface_add", "type", text="Surface", icon='OUTLINER_OB_SURFACE')
|
2013-11-04 22:49:49 +00:00
|
|
|
layout.menu("INFO_MT_surface_add", icon='OUTLINER_OB_SURFACE')
|
2013-11-19 17:16:15 +11:00
|
|
|
layout.menu("INFO_MT_metaball_add", text="Metaball", icon='OUTLINER_OB_META')
|
2013-11-04 22:49:49 +00:00
|
|
|
layout.operator("object.text_add", text="Text", icon='OUTLINER_OB_FONT')
|
|
|
|
layout.separator()
|
|
|
|
|
|
|
|
layout.menu("INFO_MT_armature_add", icon='OUTLINER_OB_ARMATURE')
|
|
|
|
layout.operator("object.add", text="Lattice", icon='OUTLINER_OB_LATTICE').type = 'LATTICE'
|
|
|
|
layout.operator_menu_enum("object.empty_add", "type", text="Empty", icon='OUTLINER_OB_EMPTY')
|
|
|
|
layout.separator()
|
|
|
|
|
|
|
|
layout.operator("object.speaker_add", text="Speaker", icon='OUTLINER_OB_SPEAKER')
|
|
|
|
layout.separator()
|
|
|
|
|
2017-03-23 20:42:44 +11:00
|
|
|
if INFO_MT_camera_add.is_extended():
|
|
|
|
layout.menu("INFO_MT_camera_add", icon='OUTLINER_OB_CAMERA')
|
|
|
|
else:
|
|
|
|
INFO_MT_camera_add.draw(self, context)
|
|
|
|
|
2015-04-12 11:38:18 +01:00
|
|
|
layout.menu("INFO_MT_lamp_add", icon='OUTLINER_OB_LAMP')
|
2017-06-22 17:20:39 +02:00
|
|
|
layout.separator()
|
2018-05-11 16:02:09 +02:00
|
|
|
layout.menu("INFO_MT_lightprobe_add", icon='OUTLINER_OB_LIGHTPROBE')
|
2013-11-04 22:49:49 +00:00
|
|
|
layout.separator()
|
|
|
|
|
2017-06-10 16:41:58 +02:00
|
|
|
layout.operator_menu_enum("object.effector_add", "type", text="Force Field", icon='OUTLINER_OB_FORCE_FIELD')
|
2013-11-04 22:49:49 +00:00
|
|
|
layout.separator()
|
|
|
|
|
|
|
|
if len(bpy.data.groups) > 10:
|
|
|
|
layout.operator_context = 'INVOKE_REGION_WIN'
|
2017-06-10 16:41:58 +02:00
|
|
|
layout.operator("object.group_instance_add", text="Group Instance...", icon='OUTLINER_OB_GROUP_INSTANCE')
|
2013-11-04 22:49:49 +00:00
|
|
|
else:
|
2017-10-19 11:24:01 +11:00
|
|
|
layout.operator_menu_enum(
|
|
|
|
"object.group_instance_add",
|
|
|
|
"group",
|
|
|
|
text="Group Instance",
|
|
|
|
icon='OUTLINER_OB_GROUP_INSTANCE',
|
|
|
|
)
|
2013-11-04 22:49:49 +00:00
|
|
|
|
2009-08-15 19:40:09 +00:00
|
|
|
|
2017-10-19 15:38:34 +11:00
|
|
|
class VIEW3D_MT_undo_redo(Menu):
|
|
|
|
bl_label = "Undo/Redo"
|
|
|
|
_operator_name = ""
|
|
|
|
|
|
|
|
def draw(self, context):
|
|
|
|
layout = self.layout
|
|
|
|
|
|
|
|
layout.operator("ed.undo")
|
|
|
|
layout.operator("ed.redo")
|
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
|
|
|
layout.operator("ed.undo_history")
|
2009-08-15 22:28:48 +00:00
|
|
|
|
2011-01-01 07:20:34 +00:00
|
|
|
|
2017-10-19 16:09:21 +11:00
|
|
|
class VIEW3D_MT_object_relations(Menu):
|
|
|
|
bl_label = "Relations"
|
|
|
|
|
|
|
|
def draw(self, context):
|
|
|
|
layout = self.layout
|
|
|
|
|
|
|
|
layout.operator("object.proxy_make", text="Make Proxy...")
|
|
|
|
|
|
|
|
layout.operator("object.make_dupli_face")
|
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
|
|
|
layout.operator_menu_enum("object.make_local", "type", text="Make Local...")
|
|
|
|
layout.menu("VIEW3D_MT_make_single_user")
|
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
|
|
|
layout.operator("object.data_transfer")
|
|
|
|
layout.operator("object.datalayout_transfer")
|
|
|
|
|
|
|
|
|
2011-08-12 06:57:00 +00:00
|
|
|
class VIEW3D_MT_object(Menu):
|
2009-10-31 19:31:45 +00:00
|
|
|
bl_context = "objectmode"
|
2011-09-15 13:20:18 +00:00
|
|
|
bl_label = "Object"
|
2009-10-31 19:31:45 +00:00
|
|
|
|
|
|
|
def draw(self, context):
|
|
|
|
layout = self.layout
|
|
|
|
|
2017-10-19 15:38:34 +11:00
|
|
|
layout.menu("VIEW3D_MT_undo_redo")
|
2010-09-18 16:17:32 +00:00
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
2017-10-19 16:09:21 +11:00
|
|
|
layout.operator("object.delete", text="Delete...").use_global = False
|
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
2012-05-06 06:37:07 +00:00
|
|
|
layout.menu("VIEW3D_MT_transform_object")
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.menu("VIEW3D_MT_mirror")
|
|
|
|
layout.menu("VIEW3D_MT_object_clear")
|
|
|
|
layout.menu("VIEW3D_MT_object_apply")
|
2018-04-25 07:25:08 +02:00
|
|
|
layout.menu("VIEW3D_MT_object_shading")
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.separator()
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2017-10-19 16:09:21 +11:00
|
|
|
layout.menu("VIEW3D_MT_object_parent")
|
|
|
|
layout.menu("VIEW3D_MT_object_group")
|
|
|
|
layout.menu("VIEW3D_MT_snap")
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.separator()
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.operator("object.duplicate_move")
|
2010-01-14 04:36:27 +00:00
|
|
|
layout.operator("object.duplicate_move_linked")
|
2017-10-19 16:09:21 +11:00
|
|
|
layout.operator("object.join")
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.separator()
|
2011-09-21 15:18:38 +00:00
|
|
|
layout.menu("VIEW3D_MT_make_links", text="Make Links...")
|
2017-10-19 16:09:21 +11:00
|
|
|
layout.menu("VIEW3D_MT_object_relations")
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.menu("VIEW3D_MT_object_constraints")
|
2017-10-19 16:09:21 +11:00
|
|
|
layout.menu("VIEW3D_MT_object_track")
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.separator()
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2017-10-19 16:09:21 +11:00
|
|
|
layout.menu("VIEW3D_MT_object_animation")
|
2018-04-24 20:46:18 +02:00
|
|
|
layout.menu("VIEW3D_MT_object_rigid_body")
|
2010-06-03 06:41:24 +00:00
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
2011-10-06 05:45:06 +00:00
|
|
|
layout.menu("VIEW3D_MT_object_quick_effects")
|
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.operator_menu_enum("object.convert", "target")
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2009-10-31 23:35:56 +00:00
|
|
|
|
2011-08-12 06:57:00 +00:00
|
|
|
class VIEW3D_MT_object_animation(Menu):
|
2011-09-15 13:20:18 +00:00
|
|
|
bl_label = "Animation"
|
2010-09-18 16:17:32 +00:00
|
|
|
|
|
|
|
def draw(self, context):
|
|
|
|
layout = self.layout
|
|
|
|
|
2011-09-21 15:18:38 +00:00
|
|
|
layout.operator("anim.keyframe_insert_menu", text="Insert Keyframe...")
|
2012-10-04 10:58:03 +00:00
|
|
|
layout.operator("anim.keyframe_delete_v3d", text="Delete Keyframes...")
|
|
|
|
layout.operator("anim.keyframe_clear_v3d", text="Clear Keyframes...")
|
2011-09-21 15:18:38 +00:00
|
|
|
layout.operator("anim.keying_set_active_set", text="Change Keying Set...")
|
2010-09-18 16:17:32 +00:00
|
|
|
|
2012-02-08 14:01:47 +00:00
|
|
|
layout.separator()
|
|
|
|
|
|
|
|
layout.operator("nla.bake", text="Bake Action...")
|
|
|
|
|
2010-09-18 16:17:32 +00:00
|
|
|
|
2018-04-24 20:46:18 +02:00
|
|
|
class VIEW3D_MT_object_rigid_body(Menu):
|
|
|
|
bl_label = "Rigid Body"
|
|
|
|
|
|
|
|
def draw(self, context):
|
|
|
|
layout = self.layout
|
|
|
|
|
|
|
|
layout.operator("rigidbody.objects_add", text="Add Active").type = 'ACTIVE'
|
|
|
|
layout.operator("rigidbody.objects_add", text="Add Passive").type = 'PASSIVE'
|
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
|
|
|
layout.operator("rigidbody.objects_remove", text="Remove")
|
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
|
|
|
layout.operator("rigidbody.shape_change", text="Change Shape")
|
|
|
|
layout.operator("rigidbody.mass_calculate", text="Calculate Mass")
|
|
|
|
layout.operator("rigidbody.object_settings_copy", text="Copy from Active")
|
|
|
|
layout.operator("object.visual_transform_apply", text="Apply Transformation")
|
|
|
|
layout.operator("rigidbody.bake_to_keyframes", text="Bake To Keyframes")
|
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
|
|
|
layout.operator("rigidbody.connect", text="Connect")
|
|
|
|
|
|
|
|
|
2011-08-12 06:57:00 +00:00
|
|
|
class VIEW3D_MT_object_clear(Menu):
|
2011-09-15 13:20:18 +00:00
|
|
|
bl_label = "Clear"
|
2009-10-31 19:31:45 +00:00
|
|
|
|
|
|
|
def draw(self, context):
|
|
|
|
layout = self.layout
|
|
|
|
|
2017-02-03 16:10:00 +01:00
|
|
|
layout.operator("object.location_clear", text="Location").clear_delta = False
|
|
|
|
layout.operator("object.rotation_clear", text="Rotation").clear_delta = False
|
|
|
|
layout.operator("object.scale_clear", text="Scale").clear_delta = False
|
2017-10-19 15:10:41 +11:00
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
2012-01-17 17:57:20 +00:00
|
|
|
layout.operator("object.origin_clear", text="Origin")
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2009-10-31 23:35:56 +00:00
|
|
|
|
2011-08-12 06:57:00 +00:00
|
|
|
class VIEW3D_MT_object_specials(Menu):
|
2011-09-15 13:20:18 +00:00
|
|
|
bl_label = "Specials"
|
2010-02-21 14:05:02 +00:00
|
|
|
|
2010-08-09 01:37:09 +00:00
|
|
|
@classmethod
|
|
|
|
def poll(cls, context):
|
2010-02-21 14:05:02 +00:00
|
|
|
# add more special types
|
2010-05-20 15:30:28 +00:00
|
|
|
return context.object
|
2010-02-21 14:05:02 +00:00
|
|
|
|
|
|
|
def draw(self, context):
|
|
|
|
layout = self.layout
|
|
|
|
|
2013-06-06 11:18:39 +00:00
|
|
|
scene = context.scene
|
2010-02-21 14:05:02 +00:00
|
|
|
obj = context.object
|
2013-06-06 11:18:39 +00:00
|
|
|
|
2010-06-26 19:00:44 +00:00
|
|
|
if obj.type == 'CAMERA':
|
2010-02-21 14:05:02 +00:00
|
|
|
layout.operator_context = 'INVOKE_REGION_WIN'
|
|
|
|
|
2011-06-24 03:41:07 +00:00
|
|
|
if obj.data.type == 'PERSP':
|
2011-09-21 15:18:38 +00:00
|
|
|
props = layout.operator("wm.context_modal_mouse", text="Camera Lens Angle")
|
2011-06-24 03:41:07 +00:00
|
|
|
props.data_path_iter = "selected_editable_objects"
|
|
|
|
props.data_path_item = "data.lens"
|
|
|
|
props.input_scale = 0.1
|
2012-02-25 19:49:23 +00:00
|
|
|
if obj.data.lens_unit == 'MILLIMETERS':
|
|
|
|
props.header_text = "Camera Lens Angle: %.1fmm"
|
|
|
|
else:
|
|
|
|
props.header_text = "Camera Lens Angle: %.1f\u00B0"
|
|
|
|
|
2011-06-24 03:41:07 +00:00
|
|
|
else:
|
2011-09-21 15:18:38 +00:00
|
|
|
props = layout.operator("wm.context_modal_mouse", text="Camera Lens Scale")
|
2011-06-24 03:41:07 +00:00
|
|
|
props.data_path_iter = "selected_editable_objects"
|
|
|
|
props.data_path_item = "data.ortho_scale"
|
|
|
|
props.input_scale = 0.01
|
2012-02-25 19:49:23 +00:00
|
|
|
props.header_text = "Camera Lens Scale: %.3f"
|
2010-06-26 19:00:44 +00:00
|
|
|
|
|
|
|
if not obj.data.dof_object:
|
2015-01-14 08:01:40 +11:00
|
|
|
view = context.space_data
|
|
|
|
if view and view.camera == obj and view.region_3d.view_perspective == 'CAMERA':
|
|
|
|
props = layout.operator("ui.eyedropper_depth", text="DOF Distance (Pick)")
|
|
|
|
else:
|
|
|
|
props = layout.operator("wm.context_modal_mouse", text="DOF Distance")
|
|
|
|
props.data_path_iter = "selected_editable_objects"
|
|
|
|
props.data_path_item = "data.dof_distance"
|
|
|
|
props.input_scale = 0.02
|
|
|
|
props.header_text = "DOF Distance: %.3f"
|
|
|
|
del view
|
2010-06-26 19:00:44 +00:00
|
|
|
|
2011-03-07 13:23:45 +00:00
|
|
|
if obj.type in {'CURVE', 'FONT'}:
|
2010-06-26 19:00:44 +00:00
|
|
|
layout.operator_context = 'INVOKE_REGION_WIN'
|
|
|
|
|
2011-09-21 15:18:38 +00:00
|
|
|
props = layout.operator("wm.context_modal_mouse", text="Extrude Size")
|
2010-06-26 19:00:44 +00:00
|
|
|
props.data_path_iter = "selected_editable_objects"
|
|
|
|
props.data_path_item = "data.extrude"
|
2010-02-21 14:05:02 +00:00
|
|
|
props.input_scale = 0.01
|
2012-02-25 19:49:23 +00:00
|
|
|
props.header_text = "Extrude Size: %.3f"
|
2010-02-22 23:32:58 +00:00
|
|
|
|
2011-09-21 15:18:38 +00:00
|
|
|
props = layout.operator("wm.context_modal_mouse", text="Width Size")
|
2010-06-14 03:52:10 +00:00
|
|
|
props.data_path_iter = "selected_editable_objects"
|
2010-08-20 06:09:58 +00:00
|
|
|
props.data_path_item = "data.offset"
|
2010-06-26 19:00:44 +00:00
|
|
|
props.input_scale = 0.01
|
2012-02-25 19:49:23 +00:00
|
|
|
props.header_text = "Width Size: %.3f"
|
2010-06-26 19:00:44 +00:00
|
|
|
|
|
|
|
if obj.type == 'EMPTY':
|
|
|
|
layout.operator_context = 'INVOKE_REGION_WIN'
|
2010-02-22 23:32:58 +00:00
|
|
|
|
2011-09-21 15:18:38 +00:00
|
|
|
props = layout.operator("wm.context_modal_mouse", text="Empty Draw Size")
|
2010-06-14 03:52:10 +00:00
|
|
|
props.data_path_iter = "selected_editable_objects"
|
2010-06-26 19:00:44 +00:00
|
|
|
props.data_path_item = "empty_draw_size"
|
|
|
|
props.input_scale = 0.01
|
2012-02-25 19:49:23 +00:00
|
|
|
props.header_text = "Empty Draw Size: %.3f"
|
2010-06-26 19:00:44 +00:00
|
|
|
|
|
|
|
if obj.type == 'LAMP':
|
2013-06-10 19:01:40 +00:00
|
|
|
lamp = obj.data
|
|
|
|
|
2010-06-26 19:00:44 +00:00
|
|
|
layout.operator_context = 'INVOKE_REGION_WIN'
|
2013-06-10 19:01:40 +00:00
|
|
|
|
Remove Blender Internal and legacy viewport from Blender 2.8.
Brecht authored this commit, but he gave me the honours to actually
do it. Here it goes; Blender Internal. Bye bye, you did great!
* Point density, voxel data, ocean, environment map textures were removed,
as these only worked within BI rendering. Note that the ocean modifier
and the Cycles point density shader node continue to work.
* Dynamic paint using material shading was removed, as this only worked
with BI. If we ever wanted to support this again probably it should go
through the baking API.
* GPU shader export through the Python API was removed. This only worked
for the old BI GLSL shaders, which no longer exists. Doing something
similar for Eevee would be significantly more complicated because it
uses a lot of multiplass rendering and logic outside the shader, it's
probably impractical.
* Collada material import / export code is mostly gone, as it only worked
for BI materials. We need to add Cycles / Eevee material support at some
point.
* The mesh noise operator was removed since it only worked with BI
material texture slots. A displacement modifier can be used instead.
* The delete texture paint slot operator was removed since it only worked
for BI material texture slots. Could be added back with node support.
* Not all legacy viewport features are supported in the new viewport, but
their code was removed. If we need to bring anything back we can look at
older git revisions.
* There is some legacy viewport code that I could not remove yet, and some
that I probably missed.
* Shader node execution code was left mostly intact, even though it is not
used anywhere now. We may eventually use this to replace the texture
nodes with Cycles / Eevee shader nodes.
* The Cycles Bake panel now includes settings for baking multires normal
and displacement maps. The underlying code needs to be merged properly,
and we plan to add back support for multires AO baking and add support
to Cycles baking for features like vertex color, displacement, and other
missing baking features.
* This commit removes DNA and the Python API for BI material, lamp, world
and scene settings. This breaks a lot of addons.
* There is more DNA that can be removed or renamed, where Cycles or Eevee
are reusing some old BI properties but the names are not really correct
anymore.
* Texture slots for materials, lamps and world were removed. They remain
for brushes, particles and freestyle linestyles.
* 'BLENDER_RENDER' remains in the COMPAT_ENGINES of UI panels. Cycles and
other renderers use this to find all panels to show, minus a few panels
that they have their own replacement for.
2018-04-19 17:34:44 +02:00
|
|
|
emission_node = None
|
|
|
|
if lamp.node_tree:
|
|
|
|
for node in lamp.node_tree.nodes:
|
|
|
|
if getattr(node, "type", None) == 'EMISSION':
|
|
|
|
emission_node = node
|
|
|
|
break
|
2013-06-18 06:23:30 +00:00
|
|
|
|
Remove Blender Internal and legacy viewport from Blender 2.8.
Brecht authored this commit, but he gave me the honours to actually
do it. Here it goes; Blender Internal. Bye bye, you did great!
* Point density, voxel data, ocean, environment map textures were removed,
as these only worked within BI rendering. Note that the ocean modifier
and the Cycles point density shader node continue to work.
* Dynamic paint using material shading was removed, as this only worked
with BI. If we ever wanted to support this again probably it should go
through the baking API.
* GPU shader export through the Python API was removed. This only worked
for the old BI GLSL shaders, which no longer exists. Doing something
similar for Eevee would be significantly more complicated because it
uses a lot of multiplass rendering and logic outside the shader, it's
probably impractical.
* Collada material import / export code is mostly gone, as it only worked
for BI materials. We need to add Cycles / Eevee material support at some
point.
* The mesh noise operator was removed since it only worked with BI
material texture slots. A displacement modifier can be used instead.
* The delete texture paint slot operator was removed since it only worked
for BI material texture slots. Could be added back with node support.
* Not all legacy viewport features are supported in the new viewport, but
their code was removed. If we need to bring anything back we can look at
older git revisions.
* There is some legacy viewport code that I could not remove yet, and some
that I probably missed.
* Shader node execution code was left mostly intact, even though it is not
used anywhere now. We may eventually use this to replace the texture
nodes with Cycles / Eevee shader nodes.
* The Cycles Bake panel now includes settings for baking multires normal
and displacement maps. The underlying code needs to be merged properly,
and we plan to add back support for multires AO baking and add support
to Cycles baking for features like vertex color, displacement, and other
missing baking features.
* This commit removes DNA and the Python API for BI material, lamp, world
and scene settings. This breaks a lot of addons.
* There is more DNA that can be removed or renamed, where Cycles or Eevee
are reusing some old BI properties but the names are not really correct
anymore.
* Texture slots for materials, lamps and world were removed. They remain
for brushes, particles and freestyle linestyles.
* 'BLENDER_RENDER' remains in the COMPAT_ENGINES of UI panels. Cycles and
other renderers use this to find all panels to show, minus a few panels
that they have their own replacement for.
2018-04-19 17:34:44 +02:00
|
|
|
if emission_node is not None:
|
|
|
|
props = layout.operator("wm.context_modal_mouse", text="Strength")
|
2013-06-06 11:18:39 +00:00
|
|
|
props.data_path_iter = "selected_editable_objects"
|
Remove Blender Internal and legacy viewport from Blender 2.8.
Brecht authored this commit, but he gave me the honours to actually
do it. Here it goes; Blender Internal. Bye bye, you did great!
* Point density, voxel data, ocean, environment map textures were removed,
as these only worked within BI rendering. Note that the ocean modifier
and the Cycles point density shader node continue to work.
* Dynamic paint using material shading was removed, as this only worked
with BI. If we ever wanted to support this again probably it should go
through the baking API.
* GPU shader export through the Python API was removed. This only worked
for the old BI GLSL shaders, which no longer exists. Doing something
similar for Eevee would be significantly more complicated because it
uses a lot of multiplass rendering and logic outside the shader, it's
probably impractical.
* Collada material import / export code is mostly gone, as it only worked
for BI materials. We need to add Cycles / Eevee material support at some
point.
* The mesh noise operator was removed since it only worked with BI
material texture slots. A displacement modifier can be used instead.
* The delete texture paint slot operator was removed since it only worked
for BI material texture slots. Could be added back with node support.
* Not all legacy viewport features are supported in the new viewport, but
their code was removed. If we need to bring anything back we can look at
older git revisions.
* There is some legacy viewport code that I could not remove yet, and some
that I probably missed.
* Shader node execution code was left mostly intact, even though it is not
used anywhere now. We may eventually use this to replace the texture
nodes with Cycles / Eevee shader nodes.
* The Cycles Bake panel now includes settings for baking multires normal
and displacement maps. The underlying code needs to be merged properly,
and we plan to add back support for multires AO baking and add support
to Cycles baking for features like vertex color, displacement, and other
missing baking features.
* This commit removes DNA and the Python API for BI material, lamp, world
and scene settings. This breaks a lot of addons.
* There is more DNA that can be removed or renamed, where Cycles or Eevee
are reusing some old BI properties but the names are not really correct
anymore.
* Texture slots for materials, lamps and world were removed. They remain
for brushes, particles and freestyle linestyles.
* 'BLENDER_RENDER' remains in the COMPAT_ENGINES of UI panels. Cycles and
other renderers use this to find all panels to show, minus a few panels
that they have their own replacement for.
2018-04-19 17:34:44 +02:00
|
|
|
props.data_path_item = "data.node_tree" \
|
|
|
|
".nodes[\"" + emission_node.name + "\"]" \
|
|
|
|
".inputs[\"Strength\"].default_value"
|
|
|
|
props.header_text = "Lamp Strength: %.3f"
|
|
|
|
props.input_scale = 0.1
|
2013-06-06 11:18:39 +00:00
|
|
|
|
Remove Blender Internal and legacy viewport from Blender 2.8.
Brecht authored this commit, but he gave me the honours to actually
do it. Here it goes; Blender Internal. Bye bye, you did great!
* Point density, voxel data, ocean, environment map textures were removed,
as these only worked within BI rendering. Note that the ocean modifier
and the Cycles point density shader node continue to work.
* Dynamic paint using material shading was removed, as this only worked
with BI. If we ever wanted to support this again probably it should go
through the baking API.
* GPU shader export through the Python API was removed. This only worked
for the old BI GLSL shaders, which no longer exists. Doing something
similar for Eevee would be significantly more complicated because it
uses a lot of multiplass rendering and logic outside the shader, it's
probably impractical.
* Collada material import / export code is mostly gone, as it only worked
for BI materials. We need to add Cycles / Eevee material support at some
point.
* The mesh noise operator was removed since it only worked with BI
material texture slots. A displacement modifier can be used instead.
* The delete texture paint slot operator was removed since it only worked
for BI material texture slots. Could be added back with node support.
* Not all legacy viewport features are supported in the new viewport, but
their code was removed. If we need to bring anything back we can look at
older git revisions.
* There is some legacy viewport code that I could not remove yet, and some
that I probably missed.
* Shader node execution code was left mostly intact, even though it is not
used anywhere now. We may eventually use this to replace the texture
nodes with Cycles / Eevee shader nodes.
* The Cycles Bake panel now includes settings for baking multires normal
and displacement maps. The underlying code needs to be merged properly,
and we plan to add back support for multires AO baking and add support
to Cycles baking for features like vertex color, displacement, and other
missing baking features.
* This commit removes DNA and the Python API for BI material, lamp, world
and scene settings. This breaks a lot of addons.
* There is more DNA that can be removed or renamed, where Cycles or Eevee
are reusing some old BI properties but the names are not really correct
anymore.
* Texture slots for materials, lamps and world were removed. They remain
for brushes, particles and freestyle linestyles.
* 'BLENDER_RENDER' remains in the COMPAT_ENGINES of UI panels. Cycles and
other renderers use this to find all panels to show, minus a few panels
that they have their own replacement for.
2018-04-19 17:34:44 +02:00
|
|
|
if lamp.type == 'AREA':
|
|
|
|
props = layout.operator("wm.context_modal_mouse", text="Size X")
|
2013-06-06 11:18:39 +00:00
|
|
|
props.data_path_iter = "selected_editable_objects"
|
Remove Blender Internal and legacy viewport from Blender 2.8.
Brecht authored this commit, but he gave me the honours to actually
do it. Here it goes; Blender Internal. Bye bye, you did great!
* Point density, voxel data, ocean, environment map textures were removed,
as these only worked within BI rendering. Note that the ocean modifier
and the Cycles point density shader node continue to work.
* Dynamic paint using material shading was removed, as this only worked
with BI. If we ever wanted to support this again probably it should go
through the baking API.
* GPU shader export through the Python API was removed. This only worked
for the old BI GLSL shaders, which no longer exists. Doing something
similar for Eevee would be significantly more complicated because it
uses a lot of multiplass rendering and logic outside the shader, it's
probably impractical.
* Collada material import / export code is mostly gone, as it only worked
for BI materials. We need to add Cycles / Eevee material support at some
point.
* The mesh noise operator was removed since it only worked with BI
material texture slots. A displacement modifier can be used instead.
* The delete texture paint slot operator was removed since it only worked
for BI material texture slots. Could be added back with node support.
* Not all legacy viewport features are supported in the new viewport, but
their code was removed. If we need to bring anything back we can look at
older git revisions.
* There is some legacy viewport code that I could not remove yet, and some
that I probably missed.
* Shader node execution code was left mostly intact, even though it is not
used anywhere now. We may eventually use this to replace the texture
nodes with Cycles / Eevee shader nodes.
* The Cycles Bake panel now includes settings for baking multires normal
and displacement maps. The underlying code needs to be merged properly,
and we plan to add back support for multires AO baking and add support
to Cycles baking for features like vertex color, displacement, and other
missing baking features.
* This commit removes DNA and the Python API for BI material, lamp, world
and scene settings. This breaks a lot of addons.
* There is more DNA that can be removed or renamed, where Cycles or Eevee
are reusing some old BI properties but the names are not really correct
anymore.
* Texture slots for materials, lamps and world were removed. They remain
for brushes, particles and freestyle linestyles.
* 'BLENDER_RENDER' remains in the COMPAT_ENGINES of UI panels. Cycles and
other renderers use this to find all panels to show, minus a few panels
that they have their own replacement for.
2018-04-19 17:34:44 +02:00
|
|
|
props.data_path_item = "data.size"
|
|
|
|
props.header_text = "Lamp Size X: %.3f"
|
2013-06-06 11:18:39 +00:00
|
|
|
|
Remove Blender Internal and legacy viewport from Blender 2.8.
Brecht authored this commit, but he gave me the honours to actually
do it. Here it goes; Blender Internal. Bye bye, you did great!
* Point density, voxel data, ocean, environment map textures were removed,
as these only worked within BI rendering. Note that the ocean modifier
and the Cycles point density shader node continue to work.
* Dynamic paint using material shading was removed, as this only worked
with BI. If we ever wanted to support this again probably it should go
through the baking API.
* GPU shader export through the Python API was removed. This only worked
for the old BI GLSL shaders, which no longer exists. Doing something
similar for Eevee would be significantly more complicated because it
uses a lot of multiplass rendering and logic outside the shader, it's
probably impractical.
* Collada material import / export code is mostly gone, as it only worked
for BI materials. We need to add Cycles / Eevee material support at some
point.
* The mesh noise operator was removed since it only worked with BI
material texture slots. A displacement modifier can be used instead.
* The delete texture paint slot operator was removed since it only worked
for BI material texture slots. Could be added back with node support.
* Not all legacy viewport features are supported in the new viewport, but
their code was removed. If we need to bring anything back we can look at
older git revisions.
* There is some legacy viewport code that I could not remove yet, and some
that I probably missed.
* Shader node execution code was left mostly intact, even though it is not
used anywhere now. We may eventually use this to replace the texture
nodes with Cycles / Eevee shader nodes.
* The Cycles Bake panel now includes settings for baking multires normal
and displacement maps. The underlying code needs to be merged properly,
and we plan to add back support for multires AO baking and add support
to Cycles baking for features like vertex color, displacement, and other
missing baking features.
* This commit removes DNA and the Python API for BI material, lamp, world
and scene settings. This breaks a lot of addons.
* There is more DNA that can be removed or renamed, where Cycles or Eevee
are reusing some old BI properties but the names are not really correct
anymore.
* Texture slots for materials, lamps and world were removed. They remain
for brushes, particles and freestyle linestyles.
* 'BLENDER_RENDER' remains in the COMPAT_ENGINES of UI panels. Cycles and
other renderers use this to find all panels to show, minus a few panels
that they have their own replacement for.
2018-04-19 17:34:44 +02:00
|
|
|
if lamp.shape == 'RECTANGLE':
|
|
|
|
props = layout.operator("wm.context_modal_mouse", text="Size Y")
|
2013-06-06 11:18:39 +00:00
|
|
|
props.data_path_iter = "selected_editable_objects"
|
Remove Blender Internal and legacy viewport from Blender 2.8.
Brecht authored this commit, but he gave me the honours to actually
do it. Here it goes; Blender Internal. Bye bye, you did great!
* Point density, voxel data, ocean, environment map textures were removed,
as these only worked within BI rendering. Note that the ocean modifier
and the Cycles point density shader node continue to work.
* Dynamic paint using material shading was removed, as this only worked
with BI. If we ever wanted to support this again probably it should go
through the baking API.
* GPU shader export through the Python API was removed. This only worked
for the old BI GLSL shaders, which no longer exists. Doing something
similar for Eevee would be significantly more complicated because it
uses a lot of multiplass rendering and logic outside the shader, it's
probably impractical.
* Collada material import / export code is mostly gone, as it only worked
for BI materials. We need to add Cycles / Eevee material support at some
point.
* The mesh noise operator was removed since it only worked with BI
material texture slots. A displacement modifier can be used instead.
* The delete texture paint slot operator was removed since it only worked
for BI material texture slots. Could be added back with node support.
* Not all legacy viewport features are supported in the new viewport, but
their code was removed. If we need to bring anything back we can look at
older git revisions.
* There is some legacy viewport code that I could not remove yet, and some
that I probably missed.
* Shader node execution code was left mostly intact, even though it is not
used anywhere now. We may eventually use this to replace the texture
nodes with Cycles / Eevee shader nodes.
* The Cycles Bake panel now includes settings for baking multires normal
and displacement maps. The underlying code needs to be merged properly,
and we plan to add back support for multires AO baking and add support
to Cycles baking for features like vertex color, displacement, and other
missing baking features.
* This commit removes DNA and the Python API for BI material, lamp, world
and scene settings. This breaks a lot of addons.
* There is more DNA that can be removed or renamed, where Cycles or Eevee
are reusing some old BI properties but the names are not really correct
anymore.
* Texture slots for materials, lamps and world were removed. They remain
for brushes, particles and freestyle linestyles.
* 'BLENDER_RENDER' remains in the COMPAT_ENGINES of UI panels. Cycles and
other renderers use this to find all panels to show, minus a few panels
that they have their own replacement for.
2018-04-19 17:34:44 +02:00
|
|
|
props.data_path_item = "data.size_y"
|
|
|
|
props.header_text = "Lamp Size Y: %.3f"
|
|
|
|
|
|
|
|
elif lamp.type in {'SPOT', 'POINT', 'SUN'}:
|
|
|
|
props = layout.operator("wm.context_modal_mouse", text="Size")
|
|
|
|
props.data_path_iter = "selected_editable_objects"
|
|
|
|
props.data_path_item = "data.shadow_soft_size"
|
|
|
|
props.header_text = "Lamp Size: %.3f"
|
2010-06-26 19:00:44 +00:00
|
|
|
|
2013-06-10 19:01:40 +00:00
|
|
|
if lamp.type == 'SPOT':
|
2010-06-26 19:00:44 +00:00
|
|
|
layout.separator()
|
2011-09-21 15:18:38 +00:00
|
|
|
props = layout.operator("wm.context_modal_mouse", text="Spot Size")
|
2010-06-26 19:00:44 +00:00
|
|
|
props.data_path_iter = "selected_editable_objects"
|
|
|
|
props.data_path_item = "data.spot_size"
|
|
|
|
props.input_scale = 0.01
|
2012-02-25 19:49:23 +00:00
|
|
|
props.header_text = "Spot Size: %.2f"
|
2010-06-26 19:00:44 +00:00
|
|
|
|
2011-09-21 15:18:38 +00:00
|
|
|
props = layout.operator("wm.context_modal_mouse", text="Spot Blend")
|
2010-06-26 19:00:44 +00:00
|
|
|
props.data_path_iter = "selected_editable_objects"
|
|
|
|
props.data_path_item = "data.spot_blend"
|
|
|
|
props.input_scale = -0.01
|
2012-02-25 19:49:23 +00:00
|
|
|
props.header_text = "Spot Blend: %.2f"
|
2010-06-26 19:00:44 +00:00
|
|
|
|
|
|
|
layout.separator()
|
2010-05-20 15:30:28 +00:00
|
|
|
|
|
|
|
props = layout.operator("object.isolate_type_render")
|
2010-07-30 23:25:26 +00:00
|
|
|
props = layout.operator("object.hide_render_clear_all")
|
2010-02-21 14:05:02 +00:00
|
|
|
|
2010-09-07 15:17:42 +00:00
|
|
|
|
2018-04-25 07:25:08 +02:00
|
|
|
class VIEW3D_MT_object_shading(Menu):
|
|
|
|
# XXX, this menu is a place to store shading operator in object mode
|
|
|
|
bl_label = "Shading"
|
|
|
|
|
|
|
|
def draw(self, context):
|
|
|
|
layout = self.layout
|
|
|
|
layout.operator("object.shade_smooth", text="Smooth")
|
|
|
|
layout.operator("object.shade_flat", text="Flat")
|
|
|
|
|
|
|
|
|
2011-08-12 06:57:00 +00:00
|
|
|
class VIEW3D_MT_object_apply(Menu):
|
2011-09-15 13:20:18 +00:00
|
|
|
bl_label = "Apply"
|
2009-10-31 19:31:45 +00:00
|
|
|
|
|
|
|
def draw(self, context):
|
|
|
|
layout = self.layout
|
|
|
|
|
2013-03-28 15:41:43 +00:00
|
|
|
props = layout.operator("object.transform_apply", text="Location", text_ctxt=i18n_contexts.default)
|
2012-01-14 06:30:27 +00:00
|
|
|
props.location, props.rotation, props.scale = True, False, False
|
|
|
|
|
2013-03-28 15:41:43 +00:00
|
|
|
props = layout.operator("object.transform_apply", text="Rotation", text_ctxt=i18n_contexts.default)
|
2012-01-14 06:30:27 +00:00
|
|
|
props.location, props.rotation, props.scale = False, True, False
|
|
|
|
|
2013-03-28 15:41:43 +00:00
|
|
|
props = layout.operator("object.transform_apply", text="Scale", text_ctxt=i18n_contexts.default)
|
2012-01-14 06:30:27 +00:00
|
|
|
props.location, props.rotation, props.scale = False, False, True
|
2013-03-28 15:41:43 +00:00
|
|
|
props = layout.operator("object.transform_apply", text="Rotation & Scale", text_ctxt=i18n_contexts.default)
|
2012-01-14 06:30:27 +00:00
|
|
|
props.location, props.rotation, props.scale = False, True, True
|
2011-05-03 07:09:02 +00:00
|
|
|
|
2016-07-04 12:52:51 +12:00
|
|
|
layout.separator()
|
2016-08-01 11:54:02 +10:00
|
|
|
|
2017-10-19 11:24:01 +11:00
|
|
|
layout.operator(
|
|
|
|
"object.transforms_to_deltas",
|
|
|
|
text="Location to Deltas",
|
|
|
|
text_ctxt=i18n_contexts.default,
|
|
|
|
).mode = 'LOC'
|
|
|
|
layout.operator(
|
|
|
|
"object.transforms_to_deltas",
|
|
|
|
text="Rotation to Deltas",
|
|
|
|
text_ctxt=i18n_contexts.default,
|
|
|
|
).mode = 'ROT'
|
|
|
|
layout.operator(
|
|
|
|
"object.transforms_to_deltas",
|
|
|
|
text="Scale to Deltas",
|
|
|
|
text_ctxt=i18n_contexts.default,
|
|
|
|
).mode = 'SCALE'
|
|
|
|
|
|
|
|
layout.operator(
|
|
|
|
"object.transforms_to_deltas",
|
|
|
|
text="All Transforms to Deltas",
|
|
|
|
text_ctxt=i18n_contexts.default,
|
|
|
|
).mode = 'ALL'
|
2016-07-04 12:52:51 +12:00
|
|
|
layout.operator("object.anim_transforms_to_deltas")
|
2016-08-01 11:54:02 +10:00
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.separator()
|
2011-05-03 07:09:02 +00:00
|
|
|
|
2017-10-19 11:24:01 +11:00
|
|
|
layout.operator(
|
|
|
|
"object.visual_transform_apply",
|
|
|
|
text="Visual Transform",
|
|
|
|
text_ctxt=i18n_contexts.default,
|
|
|
|
)
|
|
|
|
layout.operator(
|
|
|
|
"object.convert",
|
|
|
|
text="Visual Geometry to Mesh",
|
|
|
|
text_ctxt=i18n_contexts.default,
|
|
|
|
).target = 'MESH'
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.operator("object.duplicates_make_real")
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2009-10-15 20:15:21 +00:00
|
|
|
|
2011-08-12 06:57:00 +00:00
|
|
|
class VIEW3D_MT_object_parent(Menu):
|
2011-09-15 13:20:18 +00:00
|
|
|
bl_label = "Parent"
|
2009-10-31 19:31:45 +00:00
|
|
|
|
|
|
|
def draw(self, context):
|
|
|
|
layout = self.layout
|
|
|
|
|
2012-11-04 00:54:12 +00:00
|
|
|
layout.operator_enum("object.parent_set", "type")
|
2017-10-19 15:10:41 +11:00
|
|
|
|
2012-11-04 00:54:12 +00:00
|
|
|
layout.separator()
|
2017-10-19 15:10:41 +11:00
|
|
|
|
2012-11-04 00:54:12 +00:00
|
|
|
layout.operator_enum("object.parent_clear", "type")
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2009-10-31 23:35:56 +00:00
|
|
|
|
2011-08-12 06:57:00 +00:00
|
|
|
class VIEW3D_MT_object_track(Menu):
|
2011-09-15 13:20:18 +00:00
|
|
|
bl_label = "Track"
|
2009-10-31 19:31:45 +00:00
|
|
|
|
|
|
|
def draw(self, context):
|
|
|
|
layout = self.layout
|
|
|
|
|
2012-11-04 00:54:12 +00:00
|
|
|
layout.operator_enum("object.track_set", "type")
|
2017-10-19 15:10:41 +11:00
|
|
|
|
2012-11-04 00:54:12 +00:00
|
|
|
layout.separator()
|
2017-10-19 15:10:41 +11:00
|
|
|
|
2012-11-04 00:54:12 +00:00
|
|
|
layout.operator_enum("object.track_clear", "type")
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2009-10-31 23:35:56 +00:00
|
|
|
|
2011-08-12 06:57:00 +00:00
|
|
|
class VIEW3D_MT_object_group(Menu):
|
2011-09-15 13:20:18 +00:00
|
|
|
bl_label = "Group"
|
2009-10-31 19:31:45 +00:00
|
|
|
|
|
|
|
def draw(self, context):
|
|
|
|
layout = self.layout
|
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.operator("group.create")
|
2012-06-20 14:13:22 +00:00
|
|
|
# layout.operator_menu_enum("group.objects_remove", "group") # BUGGY
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.operator("group.objects_remove")
|
2012-06-20 14:13:22 +00:00
|
|
|
layout.operator("group.objects_remove_all")
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.separator()
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.operator("group.objects_add_active")
|
|
|
|
layout.operator("group.objects_remove_active")
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2009-10-31 23:35:56 +00:00
|
|
|
|
2011-08-12 06:57:00 +00:00
|
|
|
class VIEW3D_MT_object_constraints(Menu):
|
2011-09-15 13:20:18 +00:00
|
|
|
bl_label = "Constraints"
|
2009-10-31 19:31:45 +00:00
|
|
|
|
|
|
|
def draw(self, context):
|
|
|
|
layout = self.layout
|
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.operator("object.constraint_add_with_targets")
|
2010-05-27 11:56:31 +00:00
|
|
|
layout.operator("object.constraints_copy")
|
2017-10-19 15:10:41 +11:00
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.operator("object.constraints_clear")
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2009-10-31 23:35:56 +00:00
|
|
|
|
2011-10-06 05:45:06 +00:00
|
|
|
class VIEW3D_MT_object_quick_effects(Menu):
|
|
|
|
bl_label = "Quick Effects"
|
|
|
|
|
|
|
|
def draw(self, context):
|
|
|
|
layout = self.layout
|
|
|
|
|
|
|
|
layout.operator("object.quick_fur")
|
|
|
|
layout.operator("object.quick_explode")
|
|
|
|
layout.operator("object.quick_smoke")
|
|
|
|
layout.operator("object.quick_fluid")
|
|
|
|
|
|
|
|
|
2011-08-12 06:57:00 +00:00
|
|
|
class VIEW3D_MT_make_single_user(Menu):
|
2011-09-15 13:20:18 +00:00
|
|
|
bl_label = "Make Single User"
|
2009-10-31 19:31:45 +00:00
|
|
|
|
|
|
|
def draw(self, context):
|
|
|
|
layout = self.layout
|
|
|
|
|
2011-09-21 15:18:38 +00:00
|
|
|
props = layout.operator("object.make_single_user", text="Object")
|
2009-10-31 19:31:45 +00:00
|
|
|
props.object = True
|
2014-03-23 11:33:40 +01:00
|
|
|
props.obdata = props.material = props.texture = props.animation = False
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2011-09-21 15:18:38 +00:00
|
|
|
props = layout.operator("object.make_single_user", text="Object & Data")
|
2009-10-31 19:31:45 +00:00
|
|
|
props.object = props.obdata = True
|
2014-03-23 11:33:40 +01:00
|
|
|
props.material = props.texture = props.animation = False
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2018-04-29 09:07:35 +02:00
|
|
|
props = layout.operator("object.make_single_user", text="Object & Data & Materials")
|
|
|
|
props.object = props.obdata = props.material = True
|
2014-03-23 11:33:40 +01:00
|
|
|
props.animation = False
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2018-04-29 09:07:35 +02:00
|
|
|
props = layout.operator("object.make_single_user", text="Materials")
|
|
|
|
props.material = True
|
2014-03-23 11:33:40 +01:00
|
|
|
props.object = props.obdata = props.animation = False
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2011-09-21 15:18:38 +00:00
|
|
|
props = layout.operator("object.make_single_user", text="Object Animation")
|
2009-10-31 19:31:45 +00:00
|
|
|
props.animation = True
|
2018-04-29 09:07:35 +02:00
|
|
|
props.object = props.obdata = props.material = False
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2009-11-04 10:25:57 +00:00
|
|
|
|
2011-08-12 06:57:00 +00:00
|
|
|
class VIEW3D_MT_make_links(Menu):
|
2011-09-15 13:20:18 +00:00
|
|
|
bl_label = "Make Links"
|
2009-11-04 10:25:57 +00:00
|
|
|
|
|
|
|
def draw(self, context):
|
|
|
|
layout = self.layout
|
2013-01-22 04:54:31 +00:00
|
|
|
operator_context_default = layout.operator_context
|
2017-10-19 15:10:41 +11:00
|
|
|
|
2013-04-04 17:01:51 +00:00
|
|
|
if len(bpy.data.scenes) > 10:
|
2013-01-22 04:54:31 +00:00
|
|
|
layout.operator_context = 'INVOKE_REGION_WIN'
|
2011-09-21 15:18:38 +00:00
|
|
|
layout.operator("object.make_links_scene", text="Objects to Scene...", icon='OUTLINER_OB_EMPTY')
|
2010-12-02 22:58:23 +00:00
|
|
|
else:
|
2013-01-22 04:54:31 +00:00
|
|
|
layout.operator_context = 'EXEC_REGION_WIN'
|
2017-06-09 15:23:44 -04:00
|
|
|
layout.operator_menu_enum("object.make_links_scene", "scene", text="Objects to Scene")
|
2017-10-19 15:10:41 +11:00
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
2013-01-22 04:54:31 +00:00
|
|
|
layout.operator_context = operator_context_default
|
2010-12-02 22:58:23 +00:00
|
|
|
|
2011-02-18 06:07:41 +00:00
|
|
|
layout.operator_enum("object.make_links_data", "type") # inline
|
2009-11-04 10:25:57 +00:00
|
|
|
|
2011-10-06 05:45:06 +00:00
|
|
|
layout.operator("object.join_uvs") # stupid place to add this!
|
2009-11-04 10:25:57 +00:00
|
|
|
|
2011-10-15 05:01:47 +00:00
|
|
|
|
2012-02-16 18:06:38 +00:00
|
|
|
class VIEW3D_MT_brush(Menu):
|
|
|
|
bl_label = "Brush"
|
|
|
|
|
|
|
|
def draw(self, context):
|
|
|
|
layout = self.layout
|
|
|
|
|
|
|
|
settings = UnifiedPaintPanel.paint_settings(context)
|
2017-04-17 23:42:17 -04:00
|
|
|
brush = getattr(settings, "brush", None)
|
2012-02-16 18:06:38 +00:00
|
|
|
|
|
|
|
ups = context.tool_settings.unified_paint_settings
|
|
|
|
layout.prop(ups, "use_unified_size", text="Unified Size")
|
|
|
|
layout.prop(ups, "use_unified_strength", text="Unified Strength")
|
2014-09-20 23:47:10 +02:00
|
|
|
if context.image_paint_object or context.vertex_paint_object:
|
|
|
|
layout.prop(ups, "use_unified_color", text="Unified Color")
|
2012-03-15 09:11:24 +00:00
|
|
|
layout.separator()
|
2012-03-24 07:36:32 +00:00
|
|
|
|
2017-04-17 23:42:17 -04:00
|
|
|
# skip if no active brush
|
|
|
|
if not brush:
|
2017-09-02 15:42:29 +10:00
|
|
|
layout.label(text="No Brushes currently available", icon='INFO')
|
2017-04-17 23:42:17 -04:00
|
|
|
return
|
|
|
|
|
2012-03-15 09:11:24 +00:00
|
|
|
# brush paint modes
|
|
|
|
layout.menu("VIEW3D_MT_brush_paint_modes")
|
|
|
|
|
|
|
|
# brush tool
|
|
|
|
if context.sculpt_object:
|
|
|
|
layout.operator("brush.reset")
|
|
|
|
layout.prop_menu_enum(brush, "sculpt_tool")
|
|
|
|
elif context.image_paint_object:
|
|
|
|
layout.prop_menu_enum(brush, "image_tool")
|
|
|
|
elif context.vertex_paint_object or context.weight_paint_object:
|
|
|
|
layout.prop_menu_enum(brush, "vertex_tool")
|
2012-02-16 18:06:38 +00:00
|
|
|
|
|
|
|
# TODO: still missing a lot of brush options here
|
|
|
|
|
|
|
|
# sculpt options
|
|
|
|
if context.sculpt_object:
|
|
|
|
|
|
|
|
sculpt_tool = brush.sculpt_tool
|
|
|
|
|
|
|
|
layout.separator()
|
2012-07-04 21:41:05 +00:00
|
|
|
layout.operator_menu_enum("brush.curve_preset", "shape", text="Curve Preset")
|
2012-02-16 18:06:38 +00:00
|
|
|
layout.separator()
|
|
|
|
|
|
|
|
if sculpt_tool != 'GRAB':
|
2014-08-26 16:44:32 +02:00
|
|
|
layout.prop_menu_enum(brush, "stroke_method")
|
2012-02-16 18:06:38 +00:00
|
|
|
|
|
|
|
if sculpt_tool in {'DRAW', 'PINCH', 'INFLATE', 'LAYER', 'CLAY'}:
|
|
|
|
layout.prop_menu_enum(brush, "direction")
|
|
|
|
|
|
|
|
if sculpt_tool == 'LAYER':
|
|
|
|
layout.prop(brush, "use_persistent")
|
|
|
|
layout.operator("sculpt.set_persistent_base")
|
2010-05-25 06:24:45 +00:00
|
|
|
|
2012-03-24 07:36:32 +00:00
|
|
|
|
2012-03-15 09:11:24 +00:00
|
|
|
class VIEW3D_MT_brush_paint_modes(Menu):
|
|
|
|
bl_label = "Enabled Modes"
|
|
|
|
|
|
|
|
def draw(self, context):
|
|
|
|
layout = self.layout
|
|
|
|
|
|
|
|
settings = UnifiedPaintPanel.paint_settings(context)
|
|
|
|
brush = settings.brush
|
|
|
|
|
|
|
|
layout.prop(brush, "use_paint_sculpt", text="Sculpt")
|
|
|
|
layout.prop(brush, "use_paint_vertex", text="Vertex Paint")
|
|
|
|
layout.prop(brush, "use_paint_weight", text="Weight Paint")
|
|
|
|
layout.prop(brush, "use_paint_image", text="Texture Paint")
|
|
|
|
|
2017-02-09 16:18:33 -05:00
|
|
|
|
2011-08-12 06:57:00 +00:00
|
|
|
class VIEW3D_MT_paint_vertex(Menu):
|
2011-09-15 13:20:18 +00:00
|
|
|
bl_label = "Paint"
|
2009-10-31 19:31:45 +00:00
|
|
|
|
|
|
|
def draw(self, context):
|
|
|
|
layout = self.layout
|
2009-08-22 02:27:37 +00:00
|
|
|
|
2017-10-19 15:38:34 +11:00
|
|
|
layout.menu("VIEW3D_MT_undo_redo")
|
2010-09-18 16:17:32 +00:00
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.operator("paint.vertex_color_set")
|
2013-04-27 19:00:26 +00:00
|
|
|
layout.operator("paint.vertex_color_smooth")
|
2010-04-21 16:22:37 +00:00
|
|
|
layout.operator("paint.vertex_color_dirt")
|
2017-09-29 17:10:15 +10:00
|
|
|
layout.operator("paint.vertex_color_from_weight")
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2016-06-17 01:45:40 +10:00
|
|
|
layout.separator()
|
|
|
|
|
|
|
|
layout.operator("paint.vertex_color_invert", text="Invert")
|
|
|
|
layout.operator("paint.vertex_color_levels", text="Levels")
|
|
|
|
layout.operator("paint.vertex_color_hsv", text="Hue Saturation Value")
|
|
|
|
layout.operator("paint.vertex_color_brightness_contrast", text="Bright/Contrast")
|
|
|
|
|
2009-11-16 13:59:27 +00:00
|
|
|
|
2011-08-12 06:57:00 +00:00
|
|
|
class VIEW3D_MT_hook(Menu):
|
2011-09-15 13:20:18 +00:00
|
|
|
bl_label = "Hooks"
|
2009-11-16 13:59:27 +00:00
|
|
|
|
|
|
|
def draw(self, context):
|
|
|
|
layout = self.layout
|
|
|
|
layout.operator_context = 'EXEC_AREA'
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.operator("object.hook_add_newob")
|
2012-08-22 15:38:03 +00:00
|
|
|
layout.operator("object.hook_add_selob").use_bone = False
|
2012-08-13 08:54:33 +00:00
|
|
|
layout.operator("object.hook_add_selob", text="Hook to Selected Object Bone").use_bone = True
|
2009-11-28 23:37:56 +00:00
|
|
|
|
2009-11-22 06:20:56 +00:00
|
|
|
if [mod.type == 'HOOK' for mod in context.active_object.modifiers]:
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.separator()
|
2017-10-19 15:10:41 +11:00
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.operator_menu_enum("object.hook_assign", "modifier")
|
|
|
|
layout.operator_menu_enum("object.hook_remove", "modifier")
|
2017-10-19 15:10:41 +11:00
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.separator()
|
2017-10-19 15:10:41 +11:00
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.operator_menu_enum("object.hook_select", "modifier")
|
|
|
|
layout.operator_menu_enum("object.hook_reset", "modifier")
|
|
|
|
layout.operator_menu_enum("object.hook_recenter", "modifier")
|
2009-11-22 06:20:56 +00:00
|
|
|
|
|
|
|
|
2011-08-12 06:57:00 +00:00
|
|
|
class VIEW3D_MT_vertex_group(Menu):
|
2011-09-15 13:20:18 +00:00
|
|
|
bl_label = "Vertex Groups"
|
2009-11-22 06:20:56 +00:00
|
|
|
|
|
|
|
def draw(self, context):
|
|
|
|
layout = self.layout
|
2012-07-29 12:07:06 +00:00
|
|
|
|
2009-11-22 06:20:56 +00:00
|
|
|
layout.operator_context = 'EXEC_AREA'
|
2013-07-01 13:02:53 +00:00
|
|
|
layout.operator("object.vertex_group_assign_new")
|
2009-11-28 23:37:56 +00:00
|
|
|
|
2009-11-22 06:20:56 +00:00
|
|
|
ob = context.active_object
|
2018-04-05 18:20:27 +02:00
|
|
|
if ob.mode == 'EDIT' or (ob.mode == 'WEIGHT_PAINT' and ob.type == 'MESH' and ob.data.use_paint_mask_vertex):
|
2010-08-24 04:02:50 +00:00
|
|
|
if ob.vertex_groups.active:
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.separator()
|
2017-10-19 15:10:41 +11:00
|
|
|
|
2013-07-01 13:02:53 +00:00
|
|
|
layout.operator("object.vertex_group_assign", text="Assign to Active Group")
|
2017-10-19 11:24:01 +11:00
|
|
|
layout.operator(
|
|
|
|
"object.vertex_group_remove_from",
|
|
|
|
text="Remove from Active Group",
|
|
|
|
).use_all_groups = False
|
2013-06-25 22:58:45 +00:00
|
|
|
layout.operator("object.vertex_group_remove_from", text="Remove from All").use_all_groups = True
|
2009-11-28 23:37:56 +00:00
|
|
|
|
2010-08-24 04:02:50 +00:00
|
|
|
if ob.vertex_groups.active:
|
2017-10-19 15:10:41 +11:00
|
|
|
layout.separator()
|
|
|
|
|
2011-09-21 15:18:38 +00:00
|
|
|
layout.operator_menu_enum("object.vertex_group_set_active", "group", text="Set Active Group")
|
2012-01-14 06:30:27 +00:00
|
|
|
layout.operator("object.vertex_group_remove", text="Remove Active Group").all = False
|
2011-09-21 15:18:38 +00:00
|
|
|
layout.operator("object.vertex_group_remove", text="Remove All Groups").all = True
|
2009-11-16 13:59:27 +00:00
|
|
|
|
2017-02-09 16:18:33 -05:00
|
|
|
|
2011-08-12 06:57:00 +00:00
|
|
|
class VIEW3D_MT_paint_weight(Menu):
|
2011-09-15 13:20:18 +00:00
|
|
|
bl_label = "Weights"
|
2010-01-26 11:11:53 +00:00
|
|
|
|
2018-04-24 16:54:38 +02:00
|
|
|
@staticmethod
|
|
|
|
def draw_generic(layout, is_editmode=False):
|
2010-01-26 11:11:53 +00:00
|
|
|
|
2018-04-24 16:54:38 +02:00
|
|
|
if not is_editmode:
|
|
|
|
layout.menu("VIEW3D_MT_undo_redo")
|
2010-09-18 16:17:32 +00:00
|
|
|
|
2018-04-24 16:54:38 +02:00
|
|
|
layout.separator()
|
2010-09-18 16:17:32 +00:00
|
|
|
|
2018-04-24 16:54:38 +02:00
|
|
|
layout.operator("paint.weight_from_bones", text="Assign Automatic From Bones").type = 'AUTOMATIC'
|
|
|
|
layout.operator("paint.weight_from_bones", text="Assign From Bone Envelopes").type = 'ENVELOPES'
|
2010-01-26 11:11:53 +00:00
|
|
|
|
2018-04-24 16:54:38 +02:00
|
|
|
layout.separator()
|
2010-01-26 11:11:53 +00:00
|
|
|
|
2011-09-21 15:18:38 +00:00
|
|
|
layout.operator("object.vertex_group_normalize_all", text="Normalize All")
|
|
|
|
layout.operator("object.vertex_group_normalize", text="Normalize")
|
2017-10-19 15:10:41 +11:00
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
2011-11-01 08:11:55 +00:00
|
|
|
layout.operator("object.vertex_group_mirror", text="Mirror")
|
2011-09-21 15:18:38 +00:00
|
|
|
layout.operator("object.vertex_group_invert", text="Invert")
|
|
|
|
layout.operator("object.vertex_group_clean", text="Clean")
|
2017-10-19 15:10:41 +11:00
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
2013-11-17 14:54:42 +11:00
|
|
|
layout.operator("object.vertex_group_quantize", text="Quantize")
|
2011-09-21 15:18:38 +00:00
|
|
|
layout.operator("object.vertex_group_levels", text="Levels")
|
2015-06-25 16:10:18 +10:00
|
|
|
layout.operator("object.vertex_group_smooth", text="Smooth")
|
2017-10-19 15:10:41 +11:00
|
|
|
|
2018-04-24 16:54:38 +02:00
|
|
|
if not is_editmode:
|
|
|
|
props = layout.operator("object.data_transfer", text="Transfer Weights")
|
|
|
|
props.use_reverse_transfer = True
|
|
|
|
props.data_type = 'VGROUP_WEIGHTS'
|
2017-10-19 15:10:41 +11:00
|
|
|
|
2012-10-09 10:56:35 +00:00
|
|
|
layout.operator("object.vertex_group_limit_total", text="Limit Total")
|
2011-07-29 17:36:49 +00:00
|
|
|
layout.operator("object.vertex_group_fix", text="Fix Deforms")
|
2011-04-04 22:42:43 +00:00
|
|
|
|
|
|
|
|
2018-04-24 16:54:38 +02:00
|
|
|
if not is_editmode:
|
|
|
|
layout.separator()
|
|
|
|
|
|
|
|
layout.operator("paint.weight_set")
|
|
|
|
|
|
|
|
def draw(self, context):
|
|
|
|
self.draw_generic(self.layout, is_editmode=False);
|
2009-11-16 13:59:27 +00:00
|
|
|
|
2017-02-09 16:18:33 -05:00
|
|
|
|
2011-08-12 06:57:00 +00:00
|
|
|
class VIEW3D_MT_sculpt(Menu):
|
2011-09-15 13:20:18 +00:00
|
|
|
bl_label = "Sculpt"
|
2009-10-31 19:31:45 +00:00
|
|
|
|
|
|
|
def draw(self, context):
|
|
|
|
layout = self.layout
|
|
|
|
|
2012-01-17 17:57:20 +00:00
|
|
|
toolsettings = context.tool_settings
|
|
|
|
sculpt = toolsettings.sculpt
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2017-10-19 15:38:34 +11:00
|
|
|
layout.menu("VIEW3D_MT_undo_redo")
|
2010-09-18 16:17:32 +00:00
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
2010-08-19 17:46:00 +00:00
|
|
|
layout.prop(sculpt, "use_symmetry_x")
|
|
|
|
layout.prop(sculpt, "use_symmetry_y")
|
|
|
|
layout.prop(sculpt, "use_symmetry_z")
|
2017-10-19 15:10:41 +11:00
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.separator()
|
2017-10-19 15:10:41 +11:00
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.prop(sculpt, "lock_x")
|
|
|
|
layout.prop(sculpt, "lock_y")
|
|
|
|
layout.prop(sculpt, "lock_z")
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2010-07-26 23:49:23 +00:00
|
|
|
layout.separator()
|
2017-10-19 15:10:41 +11:00
|
|
|
|
2011-09-21 15:18:38 +00:00
|
|
|
layout.prop(sculpt, "use_threaded", text="Threaded Sculpt")
|
2012-02-16 16:38:05 +00:00
|
|
|
layout.prop(sculpt, "show_low_resolution")
|
2010-07-26 23:49:23 +00:00
|
|
|
layout.prop(sculpt, "show_brush")
|
2012-02-16 16:38:05 +00:00
|
|
|
layout.prop(sculpt, "use_deform_only")
|
2012-10-22 17:33:53 +00:00
|
|
|
layout.prop(sculpt, "show_diffuse_color")
|
2018-01-15 11:38:56 +01:00
|
|
|
layout.prop(sculpt, "show_mask")
|
2010-07-26 23:49:23 +00:00
|
|
|
|
|
|
|
|
2012-05-10 20:36:13 +00:00
|
|
|
class VIEW3D_MT_hide_mask(Menu):
|
|
|
|
bl_label = "Hide/Mask"
|
2012-03-14 06:32:43 +00:00
|
|
|
|
|
|
|
def draw(self, context):
|
|
|
|
layout = self.layout
|
|
|
|
|
2013-05-09 13:05:36 +00:00
|
|
|
props = layout.operator("paint.hide_show", text="Show All")
|
|
|
|
props.action = 'SHOW'
|
|
|
|
props.area = 'ALL'
|
2012-03-14 06:32:43 +00:00
|
|
|
|
2013-05-09 13:05:36 +00:00
|
|
|
props = layout.operator("paint.hide_show", text="Hide Bounding Box")
|
|
|
|
props.action = 'HIDE'
|
|
|
|
props.area = 'INSIDE'
|
2012-03-14 06:32:43 +00:00
|
|
|
|
2013-05-09 13:05:36 +00:00
|
|
|
props = layout.operator("paint.hide_show", text="Show Bounding Box")
|
|
|
|
props.action = 'SHOW'
|
|
|
|
props.area = 'INSIDE'
|
2012-05-15 18:50:51 +00:00
|
|
|
|
2013-05-09 13:05:36 +00:00
|
|
|
props = layout.operator("paint.hide_show", text="Hide Masked")
|
|
|
|
props.area = 'MASKED'
|
|
|
|
props.action = 'HIDE'
|
2012-05-10 20:36:13 +00:00
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
2013-05-09 13:05:36 +00:00
|
|
|
props = layout.operator("paint.mask_flood_fill", text="Invert Mask")
|
|
|
|
props.mode = 'INVERT'
|
2012-05-10 20:36:13 +00:00
|
|
|
|
2013-05-09 13:05:36 +00:00
|
|
|
props = layout.operator("paint.mask_flood_fill", text="Fill Mask")
|
|
|
|
props.mode = 'VALUE'
|
|
|
|
props.value = 1
|
2012-05-10 20:36:13 +00:00
|
|
|
|
2013-05-09 13:05:36 +00:00
|
|
|
props = layout.operator("paint.mask_flood_fill", text="Clear Mask")
|
|
|
|
props.mode = 'VALUE'
|
|
|
|
props.value = 0
|
2013-11-20 03:38:18 +11:00
|
|
|
|
2013-10-30 00:54:41 +00:00
|
|
|
props = layout.operator("view3d.select_border", text="Box Mask")
|
|
|
|
props = layout.operator("paint.mask_lasso_gesture", text="Lasso Mask")
|
2012-03-24 07:36:32 +00:00
|
|
|
|
2012-03-14 06:32:43 +00:00
|
|
|
|
2016-12-28 17:30:58 +01:00
|
|
|
class VIEW3D_MT_particle(Menu):
|
|
|
|
bl_label = "Particle"
|
|
|
|
|
|
|
|
def draw(self, context):
|
|
|
|
layout = self.layout
|
|
|
|
|
|
|
|
particle_edit = context.tool_settings.particle_edit
|
|
|
|
|
2017-10-19 15:38:34 +11:00
|
|
|
layout.menu("VIEW3D_MT_undo_redo")
|
2016-12-28 17:30:58 +01:00
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
2017-10-19 15:38:34 +11:00
|
|
|
layout.operator("particle.delete")
|
2016-12-28 17:30:58 +01:00
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
2017-10-19 15:38:34 +11:00
|
|
|
layout.operator("particle.mirror")
|
|
|
|
|
2016-12-28 17:30:58 +01:00
|
|
|
layout.operator("particle.remove_doubles")
|
2017-10-19 15:38:34 +11:00
|
|
|
|
|
|
|
layout.separator()
|
2016-12-28 17:30:58 +01:00
|
|
|
|
|
|
|
if particle_edit.select_mode == 'POINT':
|
|
|
|
layout.operator("particle.subdivide")
|
|
|
|
|
2016-04-26 16:05:52 +02:00
|
|
|
layout.operator("particle.unify_length")
|
2016-12-28 17:30:58 +01:00
|
|
|
layout.operator("particle.rekey")
|
|
|
|
layout.operator("particle.weight_set")
|
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
|
|
|
layout.menu("VIEW3D_MT_particle_showhide")
|
|
|
|
|
|
|
|
|
|
|
|
class VIEW3D_MT_particle_specials(Menu):
|
|
|
|
bl_label = "Specials"
|
|
|
|
|
|
|
|
def draw(self, context):
|
|
|
|
layout = self.layout
|
|
|
|
|
|
|
|
particle_edit = context.tool_settings.particle_edit
|
|
|
|
|
|
|
|
layout.operator("particle.rekey")
|
2017-10-19 15:10:41 +11:00
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
2016-12-28 17:30:58 +01:00
|
|
|
layout.operator("particle.delete")
|
2017-10-19 15:10:41 +11:00
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
2016-12-28 17:30:58 +01:00
|
|
|
layout.operator("particle.remove_doubles")
|
2016-04-26 16:05:52 +02:00
|
|
|
layout.operator("particle.unify_length")
|
2016-12-28 17:30:58 +01:00
|
|
|
|
|
|
|
if particle_edit.select_mode == 'POINT':
|
|
|
|
layout.operator("particle.subdivide")
|
|
|
|
|
|
|
|
layout.operator("particle.weight_set")
|
2017-10-19 15:10:41 +11:00
|
|
|
|
2016-12-28 17:30:58 +01:00
|
|
|
layout.separator()
|
|
|
|
|
|
|
|
layout.operator("particle.mirror")
|
|
|
|
|
|
|
|
if particle_edit.select_mode == 'POINT':
|
|
|
|
layout.separator()
|
|
|
|
layout.operator("particle.select_roots")
|
|
|
|
layout.operator("particle.select_tips")
|
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
|
|
|
layout.operator("particle.select_random")
|
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
|
|
|
layout.operator("particle.select_more")
|
|
|
|
layout.operator("particle.select_less")
|
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
|
|
|
layout.operator("particle.select_all").action = 'TOGGLE'
|
|
|
|
layout.operator("particle.select_linked")
|
|
|
|
layout.operator("particle.select_all", text="Inverse").action = 'INVERT'
|
|
|
|
|
|
|
|
|
|
|
|
class VIEW3D_MT_particle_showhide(ShowHideMenu, Menu):
|
|
|
|
_operator_name = "particle"
|
|
|
|
|
2017-02-09 16:18:33 -05:00
|
|
|
|
2011-08-12 06:57:00 +00:00
|
|
|
class VIEW3D_MT_pose(Menu):
|
2011-09-15 13:20:18 +00:00
|
|
|
bl_label = "Pose"
|
2009-10-31 19:31:45 +00:00
|
|
|
|
|
|
|
def draw(self, context):
|
|
|
|
layout = self.layout
|
|
|
|
|
2017-10-19 15:38:34 +11:00
|
|
|
layout.menu("VIEW3D_MT_undo_redo")
|
2010-09-18 16:17:32 +00:00
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
2012-05-06 06:37:07 +00:00
|
|
|
layout.menu("VIEW3D_MT_transform_armature")
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.menu("VIEW3D_MT_pose_transform")
|
2011-03-27 05:23:14 +00:00
|
|
|
layout.menu("VIEW3D_MT_pose_apply")
|
|
|
|
|
2011-03-24 03:02:34 +00:00
|
|
|
layout.menu("VIEW3D_MT_snap")
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.separator()
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2011-03-24 03:23:30 +00:00
|
|
|
layout.menu("VIEW3D_MT_object_animation")
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.separator()
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2011-03-24 03:02:34 +00:00
|
|
|
layout.menu("VIEW3D_MT_pose_slide")
|
|
|
|
layout.menu("VIEW3D_MT_pose_propagate")
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.separator()
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.operator("pose.copy")
|
2015-01-29 17:34:05 +01:00
|
|
|
layout.operator("pose.paste").flipped = False
|
2011-09-21 15:18:38 +00:00
|
|
|
layout.operator("pose.paste", text="Paste X-Flipped Pose").flipped = True
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.separator()
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2011-03-24 03:02:34 +00:00
|
|
|
layout.menu("VIEW3D_MT_pose_library")
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.menu("VIEW3D_MT_pose_motion")
|
|
|
|
layout.menu("VIEW3D_MT_pose_group")
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.separator()
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2010-08-25 02:56:37 +00:00
|
|
|
layout.menu("VIEW3D_MT_object_parent")
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.menu("VIEW3D_MT_pose_ik")
|
|
|
|
layout.menu("VIEW3D_MT_pose_constraints")
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.separator()
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2009-11-16 13:59:27 +00:00
|
|
|
layout.operator_context = 'EXEC_AREA'
|
2011-09-21 15:18:38 +00:00
|
|
|
layout.operator("pose.autoside_names", text="AutoName Left/Right").axis = 'XAXIS'
|
|
|
|
layout.operator("pose.autoside_names", text="AutoName Front/Back").axis = 'YAXIS'
|
|
|
|
layout.operator("pose.autoside_names", text="AutoName Top/Bottom").axis = 'ZAXIS'
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.operator("pose.flip_names")
|
2010-01-31 14:46:28 +00:00
|
|
|
|
2010-01-25 10:16:36 +00:00
|
|
|
layout.operator("pose.quaternions_flip")
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.separator()
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2009-11-16 13:59:27 +00:00
|
|
|
layout.operator_context = 'INVOKE_AREA'
|
2014-04-25 17:07:30 +02:00
|
|
|
layout.operator("armature.armature_layers", text="Change Armature Layers...")
|
2011-09-21 15:18:38 +00:00
|
|
|
layout.operator("pose.bone_layers", text="Change Bone Layers...")
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.separator()
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.menu("VIEW3D_MT_pose_showhide")
|
2011-09-21 15:18:38 +00:00
|
|
|
layout.menu("VIEW3D_MT_bone_options_toggle", text="Bone Settings")
|
2009-08-23 22:13:56 +00:00
|
|
|
|
2009-10-31 23:35:56 +00:00
|
|
|
|
2011-08-12 06:57:00 +00:00
|
|
|
class VIEW3D_MT_pose_transform(Menu):
|
2011-09-15 13:20:18 +00:00
|
|
|
bl_label = "Clear Transform"
|
2009-10-31 19:31:45 +00:00
|
|
|
|
|
|
|
def draw(self, context):
|
|
|
|
layout = self.layout
|
|
|
|
|
2011-09-21 15:18:38 +00:00
|
|
|
layout.operator("pose.transforms_clear", text="All")
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2011-08-15 13:24:53 +00:00
|
|
|
layout.separator()
|
|
|
|
|
2011-09-21 15:18:38 +00:00
|
|
|
layout.operator("pose.loc_clear", text="Location")
|
|
|
|
layout.operator("pose.rot_clear", text="Rotation")
|
|
|
|
layout.operator("pose.scale_clear", text="Scale")
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2011-08-15 13:24:53 +00:00
|
|
|
layout.separator()
|
|
|
|
|
2017-09-02 15:42:29 +10:00
|
|
|
layout.operator("pose.user_transforms_clear", text="Reset Unkeyed")
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2009-10-31 23:35:56 +00:00
|
|
|
|
2011-08-12 06:57:00 +00:00
|
|
|
class VIEW3D_MT_pose_slide(Menu):
|
2011-09-15 13:20:18 +00:00
|
|
|
bl_label = "In-Betweens"
|
2011-03-24 03:02:34 +00:00
|
|
|
|
|
|
|
def draw(self, context):
|
|
|
|
layout = self.layout
|
|
|
|
|
|
|
|
layout.operator("pose.push")
|
|
|
|
layout.operator("pose.relax")
|
|
|
|
layout.operator("pose.breakdown")
|
|
|
|
|
|
|
|
|
2011-08-12 06:57:00 +00:00
|
|
|
class VIEW3D_MT_pose_propagate(Menu):
|
2011-09-15 13:20:18 +00:00
|
|
|
bl_label = "Propagate"
|
2011-03-24 03:02:34 +00:00
|
|
|
|
|
|
|
def draw(self, context):
|
|
|
|
layout = self.layout
|
|
|
|
|
2012-01-14 06:30:27 +00:00
|
|
|
layout.operator("pose.propagate").mode = 'WHILE_HELD'
|
2011-03-31 01:37:42 +00:00
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
2011-09-21 15:18:38 +00:00
|
|
|
layout.operator("pose.propagate", text="To Next Keyframe").mode = 'NEXT_KEY'
|
|
|
|
layout.operator("pose.propagate", text="To Last Keyframe (Make Cyclic)").mode = 'LAST_KEY'
|
2011-03-24 03:02:34 +00:00
|
|
|
|
2011-03-31 01:37:42 +00:00
|
|
|
layout.separator()
|
|
|
|
|
2015-04-02 23:30:30 +13:00
|
|
|
layout.operator("pose.propagate", text="On Selected Keyframes").mode = 'SELECTED_KEYS'
|
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
2011-09-21 15:18:38 +00:00
|
|
|
layout.operator("pose.propagate", text="On Selected Markers").mode = 'SELECTED_MARKERS'
|
2011-03-31 01:37:42 +00:00
|
|
|
|
2011-03-24 03:02:34 +00:00
|
|
|
|
2011-08-12 06:57:00 +00:00
|
|
|
class VIEW3D_MT_pose_library(Menu):
|
2011-09-15 13:20:18 +00:00
|
|
|
bl_label = "Pose Library"
|
2009-10-31 19:31:45 +00:00
|
|
|
|
|
|
|
def draw(self, context):
|
|
|
|
layout = self.layout
|
|
|
|
|
2011-09-21 15:18:38 +00:00
|
|
|
layout.operator("poselib.browse_interactive", text="Browse Poses...")
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.separator()
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2011-09-21 15:18:38 +00:00
|
|
|
layout.operator("poselib.pose_add", text="Add Pose...")
|
|
|
|
layout.operator("poselib.pose_rename", text="Rename Pose...")
|
|
|
|
layout.operator("poselib.pose_remove", text="Remove Pose...")
|
2009-08-23 22:13:56 +00:00
|
|
|
|
2009-10-31 23:35:56 +00:00
|
|
|
|
2011-08-12 06:57:00 +00:00
|
|
|
class VIEW3D_MT_pose_motion(Menu):
|
2011-09-15 13:20:18 +00:00
|
|
|
bl_label = "Motion Paths"
|
2009-10-31 19:31:45 +00:00
|
|
|
|
|
|
|
def draw(self, context):
|
|
|
|
layout = self.layout
|
|
|
|
|
2011-09-21 15:18:38 +00:00
|
|
|
layout.operator("pose.paths_calculate", text="Calculate")
|
|
|
|
layout.operator("pose.paths_clear", text="Clear")
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2009-10-31 23:35:56 +00:00
|
|
|
|
2011-08-12 06:57:00 +00:00
|
|
|
class VIEW3D_MT_pose_group(Menu):
|
2011-09-15 13:20:18 +00:00
|
|
|
bl_label = "Bone Groups"
|
2009-10-31 19:31:45 +00:00
|
|
|
|
|
|
|
def draw(self, context):
|
|
|
|
layout = self.layout
|
2013-01-15 23:15:32 +00:00
|
|
|
|
2012-10-15 02:01:39 +00:00
|
|
|
pose = context.active_object.pose
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2012-10-15 02:01:39 +00:00
|
|
|
layout.operator_context = 'EXEC_AREA'
|
|
|
|
layout.operator("pose.group_assign", text="Assign to New Group").type = 0
|
2017-10-19 15:10:41 +11:00
|
|
|
|
2012-10-15 02:01:39 +00:00
|
|
|
if pose.bone_groups:
|
|
|
|
active_group = pose.bone_groups.active_index + 1
|
|
|
|
layout.operator("pose.group_assign", text="Assign to Group").type = active_group
|
|
|
|
|
|
|
|
layout.separator()
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2015-09-01 03:51:50 +10:00
|
|
|
# layout.operator_context = 'INVOKE_AREA'
|
2012-10-15 02:01:39 +00:00
|
|
|
layout.operator("pose.group_unassign")
|
|
|
|
layout.operator("pose.group_remove")
|
2009-10-31 19:31:45 +00:00
|
|
|
|
|
|
|
|
2011-08-12 06:57:00 +00:00
|
|
|
class VIEW3D_MT_pose_ik(Menu):
|
2011-09-15 13:20:18 +00:00
|
|
|
bl_label = "Inverse Kinematics"
|
2009-10-31 19:31:45 +00:00
|
|
|
|
|
|
|
def draw(self, context):
|
|
|
|
layout = self.layout
|
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.operator("pose.ik_add")
|
|
|
|
layout.operator("pose.ik_clear")
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2009-10-31 23:35:56 +00:00
|
|
|
|
2011-08-12 06:57:00 +00:00
|
|
|
class VIEW3D_MT_pose_constraints(Menu):
|
2011-09-15 13:20:18 +00:00
|
|
|
bl_label = "Constraints"
|
2009-10-31 19:31:45 +00:00
|
|
|
|
|
|
|
def draw(self, context):
|
|
|
|
layout = self.layout
|
|
|
|
|
2011-09-21 15:18:38 +00:00
|
|
|
layout.operator("pose.constraint_add_with_targets", text="Add (With Targets)...")
|
2010-05-27 11:56:31 +00:00
|
|
|
layout.operator("pose.constraints_copy")
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.operator("pose.constraints_clear")
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2009-10-31 23:35:56 +00:00
|
|
|
|
2011-08-12 06:57:00 +00:00
|
|
|
class VIEW3D_MT_pose_showhide(ShowHideMenu, Menu):
|
2009-10-31 19:31:45 +00:00
|
|
|
_operator_name = "pose"
|
2009-08-23 22:13:56 +00:00
|
|
|
|
2010-02-19 15:34:26 +00:00
|
|
|
|
2011-08-12 06:57:00 +00:00
|
|
|
class VIEW3D_MT_pose_apply(Menu):
|
2011-09-21 15:18:38 +00:00
|
|
|
bl_label = "Apply"
|
2010-02-19 15:34:26 +00:00
|
|
|
|
|
|
|
def draw(self, context):
|
|
|
|
layout = self.layout
|
|
|
|
|
|
|
|
layout.operator("pose.armature_apply")
|
|
|
|
layout.operator("pose.visual_transform_apply")
|
|
|
|
|
|
|
|
|
2012-05-06 12:13:45 +00:00
|
|
|
class VIEW3D_MT_pose_specials(Menu):
|
|
|
|
bl_label = "Specials"
|
|
|
|
|
|
|
|
def draw(self, context):
|
|
|
|
layout = self.layout
|
2013-04-07 01:38:03 +00:00
|
|
|
|
|
|
|
layout.operator("paint.weight_from_bones", text="Assign Automatic from Bones").type = 'AUTOMATIC'
|
|
|
|
layout.operator("paint.weight_from_bones", text="Assign from Bone Envelopes").type = 'ENVELOPES'
|
|
|
|
|
2013-04-06 10:52:52 +00:00
|
|
|
layout.separator()
|
2013-04-07 01:38:03 +00:00
|
|
|
|
2012-05-06 12:13:45 +00:00
|
|
|
layout.operator("pose.select_constraint_target")
|
|
|
|
layout.operator("pose.flip_names")
|
2017-10-19 15:10:41 +11:00
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
2012-05-06 12:13:45 +00:00
|
|
|
layout.operator("pose.paths_calculate")
|
|
|
|
layout.operator("pose.paths_clear")
|
|
|
|
layout.operator("pose.user_transforms_clear")
|
|
|
|
layout.operator("pose.user_transforms_clear", text="Clear User Transforms (All)").only_selected = False
|
|
|
|
layout.operator("pose.relax")
|
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
|
|
|
layout.operator_menu_enum("pose.autoside_names", "axis")
|
|
|
|
|
|
|
|
|
2011-06-27 07:51:52 +00:00
|
|
|
class BoneOptions:
|
|
|
|
def draw(self, context):
|
|
|
|
layout = self.layout
|
|
|
|
|
|
|
|
options = [
|
|
|
|
"show_wire",
|
|
|
|
"use_deform",
|
|
|
|
"use_envelope_multiply",
|
|
|
|
"use_inherit_rotation",
|
|
|
|
"use_inherit_scale",
|
|
|
|
]
|
|
|
|
|
2011-06-27 11:40:15 +00:00
|
|
|
if context.mode == 'EDIT_ARMATURE':
|
|
|
|
bone_props = bpy.types.EditBone.bl_rna.properties
|
2011-06-27 07:51:52 +00:00
|
|
|
data_path_iter = "selected_bones"
|
|
|
|
opt_suffix = ""
|
2011-06-27 11:40:15 +00:00
|
|
|
options.append("lock")
|
2011-10-17 06:58:07 +00:00
|
|
|
else: # pose-mode
|
2011-06-27 11:40:15 +00:00
|
|
|
bone_props = bpy.types.Bone.bl_rna.properties
|
|
|
|
data_path_iter = "selected_pose_bones"
|
|
|
|
opt_suffix = "bone."
|
2011-06-27 07:51:52 +00:00
|
|
|
|
|
|
|
for opt in options:
|
2013-02-24 15:40:28 +00:00
|
|
|
props = layout.operator("wm.context_collection_boolean_set", text=bone_props[opt].name,
|
2013-03-28 15:41:43 +00:00
|
|
|
text_ctxt=i18n_contexts.default)
|
2011-06-27 07:51:52 +00:00
|
|
|
props.data_path_iter = data_path_iter
|
|
|
|
props.data_path_item = opt_suffix + opt
|
|
|
|
props.type = self.type
|
|
|
|
|
|
|
|
|
2011-08-12 06:57:00 +00:00
|
|
|
class VIEW3D_MT_bone_options_toggle(Menu, BoneOptions):
|
2011-06-27 11:40:15 +00:00
|
|
|
bl_label = "Toggle Bone Options"
|
2011-06-27 07:51:52 +00:00
|
|
|
type = 'TOGGLE'
|
|
|
|
|
|
|
|
|
2011-08-12 06:57:00 +00:00
|
|
|
class VIEW3D_MT_bone_options_enable(Menu, BoneOptions):
|
2011-06-27 11:40:15 +00:00
|
|
|
bl_label = "Enable Bone Options"
|
2011-06-27 07:51:52 +00:00
|
|
|
type = 'ENABLE'
|
|
|
|
|
|
|
|
|
2011-08-12 06:57:00 +00:00
|
|
|
class VIEW3D_MT_bone_options_disable(Menu, BoneOptions):
|
2011-06-27 11:40:15 +00:00
|
|
|
bl_label = "Disable Bone Options"
|
2011-06-27 07:51:52 +00:00
|
|
|
type = 'DISABLE'
|
|
|
|
|
2017-02-09 16:18:33 -05:00
|
|
|
|
2009-08-23 22:13:56 +00:00
|
|
|
# ********** Edit Menus, suffix from ob.type **********
|
2009-08-17 10:13:24 +00:00
|
|
|
|
2009-10-31 23:35:56 +00:00
|
|
|
|
2011-08-12 06:57:00 +00:00
|
|
|
class VIEW3D_MT_edit_mesh(Menu):
|
2011-09-15 13:20:18 +00:00
|
|
|
bl_label = "Mesh"
|
2009-10-31 19:31:45 +00:00
|
|
|
|
|
|
|
def draw(self, context):
|
|
|
|
layout = self.layout
|
|
|
|
|
2012-01-17 17:57:20 +00:00
|
|
|
toolsettings = context.tool_settings
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2017-10-19 15:38:34 +11:00
|
|
|
layout.menu("VIEW3D_MT_undo_redo")
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.separator()
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2017-10-19 15:10:41 +11:00
|
|
|
layout.menu("VIEW3D_MT_edit_mesh_delete")
|
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.menu("VIEW3D_MT_transform")
|
|
|
|
layout.menu("VIEW3D_MT_mirror")
|
|
|
|
layout.menu("VIEW3D_MT_snap")
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.separator()
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2011-09-21 15:18:38 +00:00
|
|
|
layout.menu("VIEW3D_MT_uv_map", text="UV Unwrap...")
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.separator()
|
2013-06-20 19:09:18 +00:00
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.operator("mesh.duplicate_move")
|
2013-06-01 05:26:37 +00:00
|
|
|
layout.menu("VIEW3D_MT_edit_mesh_extrude")
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.separator()
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.menu("VIEW3D_MT_edit_mesh_vertices")
|
|
|
|
layout.menu("VIEW3D_MT_edit_mesh_edges")
|
|
|
|
layout.menu("VIEW3D_MT_edit_mesh_faces")
|
2017-10-19 15:10:41 +11:00
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.menu("VIEW3D_MT_edit_mesh_normals")
|
2018-04-24 21:07:05 +02:00
|
|
|
layout.menu("VIEW3D_MT_edit_mesh_shading")
|
2018-04-24 16:54:38 +02:00
|
|
|
layout.menu("VIEW3D_MT_edit_mesh_weights")
|
2013-07-25 18:43:05 +00:00
|
|
|
layout.menu("VIEW3D_MT_edit_mesh_clean")
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.separator()
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2013-06-20 19:09:18 +00:00
|
|
|
layout.operator("mesh.symmetrize")
|
|
|
|
layout.operator("mesh.symmetry_snap")
|
2013-08-23 11:46:08 +00:00
|
|
|
layout.operator("mesh.bisect")
|
2013-06-20 19:09:18 +00:00
|
|
|
layout.operator_menu_enum("mesh.sort_elements", "type", text="Sort Elements...")
|
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
2012-01-17 17:57:20 +00:00
|
|
|
layout.prop(toolsettings, "use_mesh_automerge")
|
2016-09-04 23:40:41 +02:00
|
|
|
layout.menu("VIEW3D_MT_edit_proportional")
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.separator()
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.menu("VIEW3D_MT_edit_mesh_showhide")
|
2009-08-17 10:13:24 +00:00
|
|
|
|
2009-10-31 23:35:56 +00:00
|
|
|
|
2011-08-12 06:57:00 +00:00
|
|
|
class VIEW3D_MT_edit_mesh_specials(Menu):
|
2011-09-15 13:20:18 +00:00
|
|
|
bl_label = "Specials"
|
2009-10-31 19:31:45 +00:00
|
|
|
|
|
|
|
def draw(self, context):
|
|
|
|
layout = self.layout
|
|
|
|
|
|
|
|
layout.operator_context = 'INVOKE_REGION_WIN'
|
|
|
|
|
2012-01-14 06:30:27 +00:00
|
|
|
layout.operator("mesh.subdivide", text="Subdivide").smoothness = 0.0
|
2011-09-21 15:18:38 +00:00
|
|
|
layout.operator("mesh.subdivide", text="Subdivide Smooth").smoothness = 1.0
|
2013-01-21 10:48:18 +00:00
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
2011-09-21 15:18:38 +00:00
|
|
|
layout.operator("mesh.merge", text="Merge...")
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.operator("mesh.remove_doubles")
|
2013-01-21 10:48:18 +00:00
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
2012-04-24 17:50:01 +00:00
|
|
|
layout.operator("mesh.hide", text="Hide").unselected = False
|
2011-09-21 15:18:38 +00:00
|
|
|
layout.operator("mesh.reveal", text="Reveal")
|
2012-03-20 22:00:21 +00:00
|
|
|
layout.operator("mesh.select_all", text="Select Inverse").action = 'INVERT'
|
2013-01-21 10:48:18 +00:00
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.operator("mesh.flip_normals")
|
2011-09-21 15:18:38 +00:00
|
|
|
layout.operator("mesh.vertices_smooth", text="Smooth")
|
2012-10-24 10:39:11 +00:00
|
|
|
layout.operator("mesh.vertices_smooth_laplacian", text="Laplacian Smooth")
|
2013-01-21 10:48:18 +00:00
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
2012-04-24 01:04:37 +00:00
|
|
|
layout.operator("mesh.inset")
|
2011-04-15 01:19:13 +00:00
|
|
|
layout.operator("mesh.bevel", text="Bevel")
|
2012-04-24 01:04:37 +00:00
|
|
|
layout.operator("mesh.bridge_edge_loops")
|
2013-01-21 10:48:18 +00:00
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.operator("mesh.faces_shade_smooth")
|
|
|
|
layout.operator("mesh.faces_shade_flat")
|
2013-01-21 10:48:18 +00:00
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.operator("mesh.blend_from_shape")
|
|
|
|
layout.operator("mesh.shape_propagate_to_all")
|
2013-06-04 01:23:51 +00:00
|
|
|
layout.operator("mesh.shortest_path_select")
|
2012-05-06 17:14:56 +00:00
|
|
|
layout.operator("mesh.sort_elements")
|
2012-10-15 23:50:09 +00:00
|
|
|
layout.operator("mesh.symmetrize")
|
2013-06-20 19:09:18 +00:00
|
|
|
layout.operator("mesh.symmetry_snap")
|
2009-10-12 21:06:03 +00:00
|
|
|
|
2009-10-31 23:35:56 +00:00
|
|
|
|
2011-08-12 06:57:00 +00:00
|
|
|
class VIEW3D_MT_edit_mesh_select_mode(Menu):
|
2011-09-15 13:20:18 +00:00
|
|
|
bl_label = "Mesh Select Mode"
|
2009-12-22 16:11:11 +00:00
|
|
|
|
|
|
|
def draw(self, context):
|
|
|
|
layout = self.layout
|
|
|
|
|
|
|
|
layout.operator_context = 'INVOKE_REGION_WIN'
|
2012-11-13 05:44:49 +00:00
|
|
|
layout.operator("mesh.select_mode", text="Vertex", icon='VERTEXSEL').type = 'VERT'
|
|
|
|
layout.operator("mesh.select_mode", text="Edge", icon='EDGESEL').type = 'EDGE'
|
|
|
|
layout.operator("mesh.select_mode", text="Face", icon='FACESEL').type = 'FACE'
|
2009-12-22 16:11:11 +00:00
|
|
|
|
2010-02-12 22:13:47 +00:00
|
|
|
|
2011-08-12 06:57:00 +00:00
|
|
|
class VIEW3D_MT_edit_mesh_extrude(Menu):
|
2011-09-15 13:20:18 +00:00
|
|
|
bl_label = "Extrude"
|
2010-02-01 18:30:00 +00:00
|
|
|
|
2011-11-08 01:32:34 +00:00
|
|
|
_extrude_funcs = {
|
2013-10-15 18:30:49 +00:00
|
|
|
'VERT': lambda layout:
|
|
|
|
layout.operator("mesh.extrude_vertices_move", text="Vertices Only"),
|
|
|
|
'EDGE': lambda layout:
|
|
|
|
layout.operator("mesh.extrude_edges_move", text="Edges Only"),
|
|
|
|
'FACE': lambda layout:
|
|
|
|
layout.operator("mesh.extrude_faces_move", text="Individual Faces"),
|
|
|
|
'REGION': lambda layout:
|
|
|
|
layout.operator("view3d.edit_mesh_extrude_move_normal", text="Region"),
|
|
|
|
'REGION_VERT_NORMAL': lambda layout:
|
|
|
|
layout.operator("view3d.edit_mesh_extrude_move_shrink_fatten", text="Region (Vertex Normals)"),
|
2010-10-11 02:05:44 +00:00
|
|
|
}
|
|
|
|
|
2010-02-12 22:13:47 +00:00
|
|
|
@staticmethod
|
|
|
|
def extrude_options(context):
|
|
|
|
mesh = context.object.data
|
2010-10-05 15:29:06 +00:00
|
|
|
select_mode = context.tool_settings.mesh_select_mode
|
2010-02-12 22:13:47 +00:00
|
|
|
|
2010-10-11 02:05:44 +00:00
|
|
|
menu = []
|
|
|
|
if mesh.total_face_sel:
|
2013-10-15 18:30:49 +00:00
|
|
|
menu += ['REGION', 'REGION_VERT_NORMAL', 'FACE']
|
2010-10-11 02:05:44 +00:00
|
|
|
if mesh.total_edge_sel and (select_mode[0] or select_mode[1]):
|
2011-11-11 03:28:46 +00:00
|
|
|
menu += ['EDGE']
|
2010-10-11 02:05:44 +00:00
|
|
|
if mesh.total_vert_sel and select_mode[0]:
|
2011-11-11 03:28:46 +00:00
|
|
|
menu += ['VERT']
|
2010-02-22 23:32:58 +00:00
|
|
|
|
2010-02-12 22:13:47 +00:00
|
|
|
# should never get here
|
2010-10-11 02:05:44 +00:00
|
|
|
return menu
|
2010-02-12 22:13:47 +00:00
|
|
|
|
2010-02-01 18:30:00 +00:00
|
|
|
def draw(self, context):
|
|
|
|
layout = self.layout
|
|
|
|
layout.operator_context = 'INVOKE_REGION_WIN'
|
2010-02-22 23:32:58 +00:00
|
|
|
|
2010-10-11 02:05:44 +00:00
|
|
|
for menu_id in self.extrude_options(context):
|
|
|
|
self._extrude_funcs[menu_id](layout)
|
2010-02-12 22:13:47 +00:00
|
|
|
|
2010-02-22 23:32:58 +00:00
|
|
|
|
2011-08-12 06:57:00 +00:00
|
|
|
class VIEW3D_MT_edit_mesh_vertices(Menu):
|
2011-09-15 13:20:18 +00:00
|
|
|
bl_label = "Vertices"
|
2009-10-31 19:31:45 +00:00
|
|
|
|
|
|
|
def draw(self, context):
|
|
|
|
layout = self.layout
|
|
|
|
layout.operator_context = 'INVOKE_REGION_WIN'
|
|
|
|
|
2016-09-05 00:10:13 +02:00
|
|
|
with_bullet = bpy.app.build_options.bullet
|
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.operator("mesh.merge")
|
2017-02-09 16:18:33 -05:00
|
|
|
layout.operator("mesh.remove_doubles")
|
2018-05-11 20:02:12 +02:00
|
|
|
props = layout.operator("mesh.rip_move")
|
|
|
|
props.MESH_OT_rip.use_fill = False
|
|
|
|
props = layout.operator("mesh.rip_move", text="Rip Fill")
|
|
|
|
props.MESH_OT_rip.use_fill = True
|
2014-06-14 01:38:57 +10:00
|
|
|
layout.operator("mesh.rip_edge_move")
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.operator("mesh.split")
|
2012-04-16 13:49:04 +00:00
|
|
|
layout.operator_menu_enum("mesh.separate", "type")
|
2015-02-06 15:46:38 +11:00
|
|
|
layout.operator("mesh.vert_connect_path", text="Connect Vertex Path")
|
|
|
|
layout.operator("mesh.vert_connect", text="Connect Vertices")
|
2013-07-02 04:34:39 +00:00
|
|
|
layout.operator("transform.vert_slide", text="Slide")
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.separator()
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2015-06-13 00:33:21 +10:00
|
|
|
layout.operator("mesh.mark_sharp", text="Mark Sharp Edges").use_verts = True
|
|
|
|
props = layout.operator("mesh.mark_sharp", text="Clear Sharp Edges")
|
|
|
|
props.use_verts = True
|
|
|
|
props.clear = True
|
2015-06-13 00:30:39 +10:00
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
2013-01-21 14:15:57 +00:00
|
|
|
layout.operator("mesh.bevel").vertex_only = True
|
2016-09-05 00:10:13 +02:00
|
|
|
if with_bullet:
|
|
|
|
layout.operator("mesh.convex_hull")
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.operator("mesh.vertices_smooth")
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.operator("mesh.blend_from_shape")
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2015-06-25 16:10:18 +10:00
|
|
|
layout.operator("object.vertex_group_smooth")
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.operator("mesh.shape_propagate_to_all")
|
2009-08-23 22:13:56 +00:00
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.separator()
|
2009-11-16 13:59:27 +00:00
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.menu("VIEW3D_MT_vertex_group")
|
|
|
|
layout.menu("VIEW3D_MT_hook")
|
2009-11-16 13:59:27 +00:00
|
|
|
|
2016-11-12 18:57:40 +01:00
|
|
|
layout.separator()
|
|
|
|
|
|
|
|
layout.operator("object.vertex_parent_set")
|
|
|
|
|
2009-10-31 23:35:56 +00:00
|
|
|
|
2018-04-01 10:16:28 +02:00
|
|
|
class VIEW3D_MT_edit_mesh_edges_data(Menu):
|
|
|
|
bl_label = "Edge Data"
|
2009-10-31 19:31:45 +00:00
|
|
|
|
|
|
|
def draw(self, context):
|
|
|
|
layout = self.layout
|
2013-07-30 09:00:31 +00:00
|
|
|
|
2013-04-13 22:21:21 +00:00
|
|
|
with_freestyle = bpy.app.build_options.freestyle
|
2012-07-29 12:07:06 +00:00
|
|
|
|
2009-10-31 19:31:45 +00:00
|
|
|
layout.operator_context = 'INVOKE_REGION_WIN'
|
|
|
|
|
2012-05-12 23:07:52 +00:00
|
|
|
layout.operator("transform.edge_crease")
|
|
|
|
layout.operator("transform.edge_bevelweight")
|
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
2012-01-14 06:30:27 +00:00
|
|
|
layout.operator("mesh.mark_seam").clear = False
|
2011-09-21 15:18:38 +00:00
|
|
|
layout.operator("mesh.mark_seam", text="Clear Seam").clear = True
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.separator()
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2015-06-13 00:30:39 +10:00
|
|
|
layout.operator("mesh.mark_sharp")
|
|
|
|
layout.operator("mesh.mark_sharp", text="Clear Sharp").clear = True
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.separator()
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2014-07-29 14:36:56 +09:00
|
|
|
if with_freestyle:
|
2012-12-20 07:57:26 +00:00
|
|
|
layout.operator("mesh.mark_freestyle_edge").clear = False
|
|
|
|
layout.operator("mesh.mark_freestyle_edge", text="Clear Freestyle Edge").clear = True
|
2013-07-30 09:00:31 +00:00
|
|
|
layout.separator()
|
2011-10-06 02:04:43 +00:00
|
|
|
|
2018-04-01 10:16:28 +02:00
|
|
|
|
|
|
|
class VIEW3D_MT_edit_mesh_edges(Menu):
|
|
|
|
bl_label = "Edges"
|
|
|
|
|
|
|
|
def draw(self, context):
|
|
|
|
layout = self.layout
|
|
|
|
|
|
|
|
layout.operator_context = 'INVOKE_REGION_WIN'
|
|
|
|
|
|
|
|
layout.operator("mesh.edge_face_add")
|
|
|
|
layout.operator("mesh.subdivide")
|
|
|
|
layout.operator("mesh.subdivide_edgering")
|
|
|
|
layout.operator("mesh.unsubdivide")
|
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
|
|
|
layout.menu("VIEW3D_MT_edit_mesh_edges_data")
|
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
2012-11-20 05:50:19 +00:00
|
|
|
layout.operator("mesh.edge_rotate", text="Rotate Edge CW").use_ccw = False
|
|
|
|
layout.operator("mesh.edge_rotate", text="Rotate Edge CCW").use_ccw = True
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.separator()
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2013-04-23 14:12:12 +00:00
|
|
|
layout.operator("mesh.bevel").vertex_only = False
|
2012-03-23 03:10:44 +00:00
|
|
|
layout.operator("mesh.edge_split")
|
|
|
|
layout.operator("mesh.bridge_edge_loops")
|
2017-01-03 10:34:05 -05:00
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
2012-07-12 16:19:29 +00:00
|
|
|
layout.operator("transform.edge_slide")
|
2017-01-03 10:34:05 -05:00
|
|
|
layout.operator("mesh.loop_multi_select", text="Edge Loops").ring = False
|
|
|
|
layout.operator("mesh.loop_multi_select", text="Edge Rings").ring = True
|
|
|
|
layout.operator("mesh.loop_to_region")
|
|
|
|
layout.operator("mesh.region_to_loop")
|
2009-10-12 21:06:03 +00:00
|
|
|
|
|
|
|
|
2011-08-12 06:57:00 +00:00
|
|
|
class VIEW3D_MT_edit_mesh_faces(Menu):
|
2011-09-15 13:20:18 +00:00
|
|
|
bl_label = "Faces"
|
2009-10-31 19:31:45 +00:00
|
|
|
bl_idname = "VIEW3D_MT_edit_mesh_faces"
|
|
|
|
|
|
|
|
def draw(self, context):
|
|
|
|
layout = self.layout
|
2013-07-30 09:00:31 +00:00
|
|
|
|
2013-04-13 22:21:21 +00:00
|
|
|
with_freestyle = bpy.app.build_options.freestyle
|
2012-07-29 12:07:06 +00:00
|
|
|
|
2009-10-31 19:31:45 +00:00
|
|
|
layout.operator_context = 'INVOKE_REGION_WIN'
|
|
|
|
|
2010-07-10 11:38:40 +00:00
|
|
|
layout.operator("mesh.flip_normals")
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.operator("mesh.edge_face_add")
|
|
|
|
layout.operator("mesh.fill")
|
2013-05-15 20:34:40 +00:00
|
|
|
layout.operator("mesh.fill_grid")
|
2010-01-26 11:14:44 +00:00
|
|
|
layout.operator("mesh.beautify_fill")
|
2012-03-19 05:45:15 +00:00
|
|
|
layout.operator("mesh.inset")
|
2013-04-23 14:12:12 +00:00
|
|
|
layout.operator("mesh.bevel").vertex_only = False
|
2009-12-14 23:35:13 +00:00
|
|
|
layout.operator("mesh.solidify")
|
2014-03-19 15:28:38 +11:00
|
|
|
layout.operator("mesh.intersect")
|
2015-12-11 17:46:19 +11:00
|
|
|
layout.operator("mesh.intersect_boolean")
|
2012-04-29 10:44:00 +00:00
|
|
|
layout.operator("mesh.wireframe")
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.separator()
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2014-07-29 14:36:56 +09:00
|
|
|
if with_freestyle:
|
2012-12-20 07:57:26 +00:00
|
|
|
layout.operator("mesh.mark_freestyle_face").clear = False
|
|
|
|
layout.operator("mesh.mark_freestyle_face", text="Clear Freestyle Face").clear = True
|
2013-07-30 09:00:31 +00:00
|
|
|
layout.separator()
|
2011-10-06 02:04:43 +00:00
|
|
|
|
2013-04-06 02:45:43 +00:00
|
|
|
layout.operator("mesh.poke")
|
2015-01-29 17:34:05 +01:00
|
|
|
props = layout.operator("mesh.quads_convert_to_tris")
|
|
|
|
props.quad_method = props.ngon_method = 'BEAUTY'
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.operator("mesh.tris_convert_to_quads")
|
2014-07-11 10:32:33 +10:00
|
|
|
layout.operator("mesh.face_split_by_edges")
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.separator()
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.operator("mesh.faces_shade_smooth")
|
|
|
|
layout.operator("mesh.faces_shade_flat")
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2015-01-29 17:34:05 +01:00
|
|
|
layout.operator("mesh.normals_make_consistent", text="Recalculate Normals").inside = False
|
2014-10-22 23:25:31 +02:00
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.separator()
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2012-11-20 05:50:19 +00:00
|
|
|
layout.operator("mesh.edge_rotate", text="Rotate Edge CW").use_ccw = False
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.separator()
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2012-11-20 05:50:19 +00:00
|
|
|
layout.operator("mesh.uvs_rotate")
|
2011-12-02 17:17:40 +00:00
|
|
|
layout.operator("mesh.uvs_reverse")
|
2012-11-20 05:50:19 +00:00
|
|
|
layout.operator("mesh.colors_rotate")
|
2011-12-02 17:17:40 +00:00
|
|
|
layout.operator("mesh.colors_reverse")
|
2009-10-12 21:06:03 +00:00
|
|
|
|
2009-08-17 10:13:24 +00:00
|
|
|
|
2011-08-12 06:57:00 +00:00
|
|
|
class VIEW3D_MT_edit_mesh_normals(Menu):
|
2011-09-15 13:20:18 +00:00
|
|
|
bl_label = "Normals"
|
2009-10-31 19:31:45 +00:00
|
|
|
|
|
|
|
def draw(self, context):
|
|
|
|
layout = self.layout
|
2009-08-17 10:13:24 +00:00
|
|
|
|
2012-01-14 06:30:27 +00:00
|
|
|
layout.operator("mesh.normals_make_consistent", text="Recalculate Outside").inside = False
|
2011-09-21 15:18:38 +00:00
|
|
|
layout.operator("mesh.normals_make_consistent", text="Recalculate Inside").inside = True
|
2009-08-17 10:13:24 +00:00
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.separator()
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.operator("mesh.flip_normals")
|
2018-04-24 21:07:05 +02:00
|
|
|
layout.operator("mesh.set_normals_from_faces", text="Set From Faces")
|
|
|
|
|
|
|
|
|
|
|
|
class VIEW3D_MT_edit_mesh_shading(Menu):
|
|
|
|
bl_label = "Shading"
|
|
|
|
|
|
|
|
def draw(self, context):
|
|
|
|
layout = self.layout
|
|
|
|
|
|
|
|
layout.label(text="Faces:")
|
|
|
|
layout.operator("mesh.faces_shade_smooth", text="Smooth")
|
|
|
|
layout.operator("mesh.faces_shade_flat", text="Flat")
|
|
|
|
layout.label(text="Edges:")
|
|
|
|
layout.operator("mesh.mark_sharp", text="Smooth").clear = True
|
|
|
|
layout.operator("mesh.mark_sharp", text="Sharp")
|
|
|
|
layout.label(text="Vertices:")
|
|
|
|
props = layout.operator("mesh.mark_sharp", text="Smooth")
|
|
|
|
props.use_verts = True
|
|
|
|
props.clear = True
|
|
|
|
layout.operator("mesh.mark_sharp", text="Sharp").use_verts = True
|
2009-08-17 10:13:24 +00:00
|
|
|
|
2009-10-31 23:35:56 +00:00
|
|
|
|
2018-04-24 16:54:38 +02:00
|
|
|
class VIEW3D_MT_edit_mesh_weights(Menu):
|
|
|
|
bl_label = "Weights"
|
|
|
|
|
|
|
|
def draw(self, context):
|
|
|
|
VIEW3D_MT_paint_weight.draw_generic(self.layout, is_editmode=True)
|
|
|
|
|
|
|
|
|
2013-07-25 18:43:05 +00:00
|
|
|
class VIEW3D_MT_edit_mesh_clean(Menu):
|
2017-10-30 22:36:51 +11:00
|
|
|
bl_label = "Clean Up"
|
2013-07-25 18:43:05 +00:00
|
|
|
|
|
|
|
def draw(self, context):
|
|
|
|
layout = self.layout
|
|
|
|
|
2014-01-17 12:08:12 +11:00
|
|
|
layout.operator("mesh.delete_loose")
|
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
2016-07-08 23:35:27 +10:00
|
|
|
layout.operator("mesh.decimate")
|
2014-02-17 11:32:35 +11:00
|
|
|
layout.operator("mesh.dissolve_degenerate")
|
|
|
|
layout.operator("mesh.dissolve_limited")
|
2015-06-11 21:46:51 +10:00
|
|
|
layout.operator("mesh.face_make_planar")
|
2017-10-19 15:10:41 +11:00
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
2013-07-28 19:53:46 +00:00
|
|
|
layout.operator("mesh.vert_connect_nonplanar")
|
2015-02-02 09:04:31 +11:00
|
|
|
layout.operator("mesh.vert_connect_concave")
|
2017-02-09 16:25:04 -05:00
|
|
|
layout.operator("mesh.remove_doubles")
|
2014-02-17 11:32:35 +11:00
|
|
|
layout.operator("mesh.fill_holes")
|
2013-07-25 18:43:05 +00:00
|
|
|
|
|
|
|
|
2012-03-23 10:30:42 +00:00
|
|
|
class VIEW3D_MT_edit_mesh_delete(Menu):
|
|
|
|
bl_label = "Delete"
|
|
|
|
|
|
|
|
def draw(self, context):
|
|
|
|
layout = self.layout
|
|
|
|
|
|
|
|
layout.operator_enum("mesh.delete", "type")
|
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
2013-06-15 13:33:28 +00:00
|
|
|
layout.operator("mesh.dissolve_verts")
|
|
|
|
layout.operator("mesh.dissolve_edges")
|
|
|
|
layout.operator("mesh.dissolve_faces")
|
|
|
|
|
|
|
|
layout.separator()
|
2013-05-08 13:48:57 +00:00
|
|
|
|
2013-01-30 05:19:27 +00:00
|
|
|
layout.operator("mesh.dissolve_limited")
|
2012-03-23 10:30:42 +00:00
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
2013-01-30 05:19:27 +00:00
|
|
|
layout.operator("mesh.edge_collapse")
|
2014-05-29 15:28:09 +10:00
|
|
|
layout.operator("mesh.delete_edgeloop", text="Edge Loops")
|
2012-03-23 10:30:42 +00:00
|
|
|
|
|
|
|
|
2011-08-12 06:57:00 +00:00
|
|
|
class VIEW3D_MT_edit_mesh_showhide(ShowHideMenu, Menu):
|
2009-10-31 19:31:45 +00:00
|
|
|
_operator_name = "mesh"
|
2009-08-17 10:13:24 +00:00
|
|
|
|
2015-07-05 14:34:17 +10:00
|
|
|
|
|
|
|
class VIEW3D_MT_edit_gpencil_delete(Menu):
|
|
|
|
bl_label = "Delete"
|
|
|
|
|
|
|
|
def draw(self, context):
|
|
|
|
layout = self.layout
|
|
|
|
|
|
|
|
layout.operator_enum("gpencil.delete", "type")
|
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
|
|
|
layout.operator("gpencil.dissolve")
|
|
|
|
|
2016-05-21 18:33:44 +12:00
|
|
|
layout.separator()
|
|
|
|
|
2016-06-18 12:58:26 +12:00
|
|
|
layout.operator("gpencil.active_frames_delete_all")
|
2016-05-21 18:33:44 +12:00
|
|
|
|
2015-07-05 14:34:17 +10:00
|
|
|
|
2009-09-15 10:23:44 +00:00
|
|
|
# Edit Curve
|
|
|
|
# draw_curve is used by VIEW3D_MT_edit_curve and VIEW3D_MT_edit_surface
|
2009-10-31 23:35:56 +00:00
|
|
|
|
|
|
|
|
2009-09-15 10:23:44 +00:00
|
|
|
def draw_curve(self, context):
|
2009-10-31 19:31:45 +00:00
|
|
|
layout = self.layout
|
|
|
|
|
2017-10-19 15:38:34 +11:00
|
|
|
layout.menu("VIEW3D_MT_undo_redo")
|
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
2017-10-19 15:10:41 +11:00
|
|
|
layout.menu("VIEW3D_MT_edit_curve_delete")
|
|
|
|
|
|
|
|
layout.separator()
|
2009-11-28 23:37:56 +00:00
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.menu("VIEW3D_MT_transform")
|
|
|
|
layout.menu("VIEW3D_MT_mirror")
|
|
|
|
layout.menu("VIEW3D_MT_snap")
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.separator()
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2012-05-12 20:50:46 +00:00
|
|
|
layout.operator("curve.extrude_move")
|
2015-05-17 12:44:18 +02:00
|
|
|
layout.operator("curve.spin")
|
2012-05-12 20:50:46 +00:00
|
|
|
layout.operator("curve.duplicate_move")
|
2017-10-19 15:10:41 +11:00
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
2013-08-29 02:32:51 +00:00
|
|
|
layout.operator("curve.split")
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.operator("curve.separate")
|
|
|
|
layout.operator("curve.make_segment")
|
|
|
|
layout.operator("curve.cyclic_toggle")
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.separator()
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.menu("VIEW3D_MT_edit_curve_ctrlpoints")
|
|
|
|
layout.menu("VIEW3D_MT_edit_curve_segments")
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.separator()
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2017-10-30 22:36:51 +11:00
|
|
|
layout.menu("VIEW3D_MT_edit_curve_clean")
|
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
2016-09-04 23:40:41 +02:00
|
|
|
layout.menu("VIEW3D_MT_edit_proportional")
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.separator()
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.menu("VIEW3D_MT_edit_curve_showhide")
|
2009-08-17 10:13:24 +00:00
|
|
|
|
2009-10-31 23:35:56 +00:00
|
|
|
|
2011-08-12 06:57:00 +00:00
|
|
|
class VIEW3D_MT_edit_curve(Menu):
|
2011-09-15 13:20:18 +00:00
|
|
|
bl_label = "Curve"
|
2009-10-31 19:31:45 +00:00
|
|
|
|
|
|
|
draw = draw_curve
|
2009-08-17 10:13:24 +00:00
|
|
|
|
2009-10-31 23:35:56 +00:00
|
|
|
|
2011-08-12 06:57:00 +00:00
|
|
|
class VIEW3D_MT_edit_curve_ctrlpoints(Menu):
|
2011-09-15 13:20:18 +00:00
|
|
|
bl_label = "Control Points"
|
2009-10-31 19:31:45 +00:00
|
|
|
|
|
|
|
def draw(self, context):
|
|
|
|
layout = self.layout
|
|
|
|
|
|
|
|
edit_object = context.edit_object
|
|
|
|
|
|
|
|
if edit_object.type == 'CURVE':
|
2011-11-26 13:11:55 +00:00
|
|
|
layout.operator("transform.tilt")
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.operator("curve.tilt_clear")
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.separator()
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.operator_menu_enum("curve.handle_type_set", "type")
|
2013-12-14 02:32:48 +11:00
|
|
|
layout.operator("curve.normals_make_consistent")
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.separator()
|
2009-11-16 13:59:27 +00:00
|
|
|
|
2012-05-15 15:28:59 +00:00
|
|
|
layout.menu("VIEW3D_MT_hook")
|
2009-11-16 13:59:27 +00:00
|
|
|
|
2016-11-12 18:57:40 +01:00
|
|
|
layout.separator()
|
|
|
|
|
|
|
|
layout.operator("object.vertex_parent_set")
|
|
|
|
|
2009-10-31 23:35:56 +00:00
|
|
|
|
2011-08-12 06:57:00 +00:00
|
|
|
class VIEW3D_MT_edit_curve_segments(Menu):
|
2011-09-15 13:20:18 +00:00
|
|
|
bl_label = "Segments"
|
2009-08-17 10:13:24 +00:00
|
|
|
|
2009-10-31 19:31:45 +00:00
|
|
|
def draw(self, context):
|
|
|
|
layout = self.layout
|
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.operator("curve.subdivide")
|
|
|
|
layout.operator("curve.switch_direction")
|
2009-12-26 09:36:50 +00:00
|
|
|
|
2017-10-30 22:36:51 +11:00
|
|
|
class VIEW3D_MT_edit_curve_clean(Menu):
|
|
|
|
bl_label = "Clean Up"
|
|
|
|
|
|
|
|
def draw(self, context):
|
|
|
|
layout = self.layout
|
|
|
|
|
|
|
|
layout.operator("curve.decimate")
|
|
|
|
|
2009-12-26 09:36:50 +00:00
|
|
|
|
2011-08-12 06:57:00 +00:00
|
|
|
class VIEW3D_MT_edit_curve_specials(Menu):
|
2011-09-15 13:20:18 +00:00
|
|
|
bl_label = "Specials"
|
2009-08-17 10:13:24 +00:00
|
|
|
|
2009-12-24 10:39:30 +00:00
|
|
|
def draw(self, context):
|
|
|
|
layout = self.layout
|
|
|
|
|
|
|
|
layout.operator("curve.subdivide")
|
|
|
|
layout.operator("curve.switch_direction")
|
|
|
|
layout.operator("curve.spline_weight_set")
|
|
|
|
layout.operator("curve.radius_set")
|
2017-10-19 15:10:41 +11:00
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
2009-12-24 10:39:30 +00:00
|
|
|
layout.operator("curve.smooth")
|
2013-07-24 14:30:45 +00:00
|
|
|
layout.operator("curve.smooth_weight")
|
2009-12-24 10:39:30 +00:00
|
|
|
layout.operator("curve.smooth_radius")
|
2013-07-24 14:30:45 +00:00
|
|
|
layout.operator("curve.smooth_tilt")
|
2009-10-31 23:35:56 +00:00
|
|
|
|
2009-12-26 09:36:50 +00:00
|
|
|
|
2016-05-02 18:11:09 +10:00
|
|
|
class VIEW3D_MT_edit_curve_delete(Menu):
|
|
|
|
bl_label = "Delete"
|
|
|
|
|
|
|
|
def draw(self, context):
|
|
|
|
layout = self.layout
|
|
|
|
|
|
|
|
layout.operator_enum("curve.delete", "type")
|
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
|
|
|
layout.operator("curve.dissolve_verts")
|
|
|
|
|
|
|
|
|
2011-08-12 06:57:00 +00:00
|
|
|
class VIEW3D_MT_edit_curve_showhide(ShowHideMenu, Menu):
|
2009-10-31 19:31:45 +00:00
|
|
|
_operator_name = "curve"
|
2009-08-17 10:13:24 +00:00
|
|
|
|
2009-10-31 23:35:56 +00:00
|
|
|
|
2011-08-12 06:57:00 +00:00
|
|
|
class VIEW3D_MT_edit_surface(Menu):
|
2011-09-15 13:20:18 +00:00
|
|
|
bl_label = "Surface"
|
2009-08-17 10:13:24 +00:00
|
|
|
|
2009-10-31 19:31:45 +00:00
|
|
|
draw = draw_curve
|
2009-08-17 10:13:24 +00:00
|
|
|
|
2009-10-31 23:35:56 +00:00
|
|
|
|
2011-08-12 06:57:00 +00:00
|
|
|
class VIEW3D_MT_edit_font(Menu):
|
2011-09-15 13:20:18 +00:00
|
|
|
bl_label = "Text"
|
2009-10-31 19:31:45 +00:00
|
|
|
|
|
|
|
def draw(self, context):
|
|
|
|
layout = self.layout
|
|
|
|
|
2017-10-19 15:38:34 +11:00
|
|
|
# Break convention of having undo menu here,
|
|
|
|
# instead place in "Edit" menu, matching the text menu.
|
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.menu("VIEW3D_MT_edit_text_chars")
|
2009-08-17 10:13:24 +00:00
|
|
|
|
2010-07-13 23:51:21 +00:00
|
|
|
layout.separator()
|
2010-09-07 15:17:42 +00:00
|
|
|
|
2011-09-21 15:18:38 +00:00
|
|
|
layout.operator("font.style_toggle", text="Toggle Bold").style = 'BOLD'
|
|
|
|
layout.operator("font.style_toggle", text="Toggle Italic").style = 'ITALIC'
|
2017-10-19 15:10:41 +11:00
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
2011-09-21 15:18:38 +00:00
|
|
|
layout.operator("font.style_toggle", text="Toggle Underline").style = 'UNDERLINE'
|
|
|
|
layout.operator("font.style_toggle", text="Toggle Small Caps").style = 'SMALL_CAPS'
|
2010-07-13 23:51:21 +00:00
|
|
|
|
2009-10-31 23:35:56 +00:00
|
|
|
|
2011-08-12 06:57:00 +00:00
|
|
|
class VIEW3D_MT_edit_text_chars(Menu):
|
2011-09-15 13:20:18 +00:00
|
|
|
bl_label = "Special Characters"
|
2009-10-31 19:31:45 +00:00
|
|
|
|
|
|
|
def draw(self, context):
|
|
|
|
layout = self.layout
|
|
|
|
|
2014-05-17 20:00:14 +10:00
|
|
|
layout.operator("font.text_insert", text="Copyright").text = "\u00A9"
|
|
|
|
layout.operator("font.text_insert", text="Registered Trademark").text = "\u00AE"
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.separator()
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2014-05-17 20:00:14 +10:00
|
|
|
layout.operator("font.text_insert", text="Degree Sign").text = "\u00B0"
|
|
|
|
layout.operator("font.text_insert", text="Multiplication Sign").text = "\u00D7"
|
|
|
|
layout.operator("font.text_insert", text="Circle").text = "\u008A"
|
2017-10-19 15:10:41 +11:00
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
2014-05-17 20:00:14 +10:00
|
|
|
layout.operator("font.text_insert", text="Superscript 1").text = "\u00B9"
|
|
|
|
layout.operator("font.text_insert", text="Superscript 2").text = "\u00B2"
|
|
|
|
layout.operator("font.text_insert", text="Superscript 3").text = "\u00B3"
|
2017-10-19 15:10:41 +11:00
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
2014-05-17 20:00:14 +10:00
|
|
|
layout.operator("font.text_insert", text="Double >>").text = "\u00BB"
|
|
|
|
layout.operator("font.text_insert", text="Double <<").text = "\u00AB"
|
|
|
|
layout.operator("font.text_insert", text="Promillage").text = "\u2030"
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.separator()
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2014-05-17 20:00:14 +10:00
|
|
|
layout.operator("font.text_insert", text="Dutch Florin").text = "\u00A4"
|
|
|
|
layout.operator("font.text_insert", text="British Pound").text = "\u00A3"
|
|
|
|
layout.operator("font.text_insert", text="Japanese Yen").text = "\u00A5"
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.separator()
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2014-05-17 20:00:14 +10:00
|
|
|
layout.operator("font.text_insert", text="German S").text = "\u00DF"
|
|
|
|
layout.operator("font.text_insert", text="Spanish Question Mark").text = "\u00BF"
|
|
|
|
layout.operator("font.text_insert", text="Spanish Exclamation Mark").text = "\u00A1"
|
2009-08-17 10:13:24 +00:00
|
|
|
|
2009-10-31 23:35:56 +00:00
|
|
|
|
2011-08-12 06:57:00 +00:00
|
|
|
class VIEW3D_MT_edit_meta(Menu):
|
2011-09-15 13:20:18 +00:00
|
|
|
bl_label = "Metaball"
|
2009-10-31 19:31:45 +00:00
|
|
|
|
|
|
|
def draw(self, context):
|
|
|
|
layout = self.layout
|
|
|
|
|
2017-10-19 15:38:34 +11:00
|
|
|
layout.menu("VIEW3D_MT_undo_redo")
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.separator()
|
2009-11-28 23:37:56 +00:00
|
|
|
|
2017-10-19 15:10:41 +11:00
|
|
|
layout.operator("mball.delete_metaelems", text="Delete...")
|
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.menu("VIEW3D_MT_transform")
|
|
|
|
layout.menu("VIEW3D_MT_mirror")
|
|
|
|
layout.menu("VIEW3D_MT_snap")
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.separator()
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.operator("mball.duplicate_metaelems")
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.separator()
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2016-09-04 23:40:41 +02:00
|
|
|
layout.menu("VIEW3D_MT_edit_proportional")
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.separator()
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.menu("VIEW3D_MT_edit_meta_showhide")
|
2009-08-17 10:13:24 +00:00
|
|
|
|
2009-10-31 23:35:56 +00:00
|
|
|
|
2011-08-12 06:57:00 +00:00
|
|
|
class VIEW3D_MT_edit_meta_showhide(Menu):
|
2011-09-15 13:20:18 +00:00
|
|
|
bl_label = "Show/Hide"
|
2009-10-31 19:31:45 +00:00
|
|
|
|
|
|
|
def draw(self, context):
|
|
|
|
layout = self.layout
|
2009-08-17 10:13:24 +00:00
|
|
|
|
2011-09-21 15:18:38 +00:00
|
|
|
layout.operator("mball.reveal_metaelems", text="Show Hidden")
|
2012-04-24 17:50:01 +00:00
|
|
|
layout.operator("mball.hide_metaelems", text="Hide Selected").unselected = False
|
2011-09-21 15:18:38 +00:00
|
|
|
layout.operator("mball.hide_metaelems", text="Hide Unselected").unselected = True
|
2009-08-17 10:13:24 +00:00
|
|
|
|
2009-10-31 23:35:56 +00:00
|
|
|
|
2011-08-12 06:57:00 +00:00
|
|
|
class VIEW3D_MT_edit_lattice(Menu):
|
2011-09-15 13:20:18 +00:00
|
|
|
bl_label = "Lattice"
|
2009-10-31 19:31:45 +00:00
|
|
|
|
|
|
|
def draw(self, context):
|
|
|
|
layout = self.layout
|
|
|
|
|
2017-10-19 15:38:34 +11:00
|
|
|
layout.menu("VIEW3D_MT_undo_redo")
|
|
|
|
|
|
|
|
layout.separator()
|
2009-11-28 23:37:56 +00:00
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.menu("VIEW3D_MT_transform")
|
|
|
|
layout.menu("VIEW3D_MT_mirror")
|
|
|
|
layout.menu("VIEW3D_MT_snap")
|
2012-10-13 10:42:38 +00:00
|
|
|
layout.operator_menu_enum("lattice.flip", "axis")
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.separator()
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.operator("lattice.make_regular")
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.separator()
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2016-11-12 18:57:40 +01:00
|
|
|
layout.operator("object.vertex_parent_set")
|
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
2016-09-04 23:40:41 +02:00
|
|
|
layout.menu("VIEW3D_MT_edit_proportional")
|
2009-08-17 10:13:24 +00:00
|
|
|
|
2009-10-31 23:35:56 +00:00
|
|
|
|
2011-08-12 06:57:00 +00:00
|
|
|
class VIEW3D_MT_edit_armature(Menu):
|
2011-09-15 13:20:18 +00:00
|
|
|
bl_label = "Armature"
|
2009-10-31 19:31:45 +00:00
|
|
|
|
|
|
|
def draw(self, context):
|
|
|
|
layout = self.layout
|
|
|
|
|
|
|
|
edit_object = context.edit_object
|
|
|
|
arm = edit_object.data
|
2009-11-28 23:37:56 +00:00
|
|
|
|
2017-10-19 15:38:34 +11:00
|
|
|
layout.menu("VIEW3D_MT_undo_redo")
|
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
2017-10-19 15:10:41 +11:00
|
|
|
layout.operator("armature.delete")
|
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
2012-05-06 06:37:07 +00:00
|
|
|
layout.menu("VIEW3D_MT_transform_armature")
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.menu("VIEW3D_MT_mirror")
|
|
|
|
layout.menu("VIEW3D_MT_snap")
|
|
|
|
layout.menu("VIEW3D_MT_edit_armature_roll")
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.separator()
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.operator("armature.extrude_move")
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2010-08-20 06:09:58 +00:00
|
|
|
if arm.use_mirror_x:
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.operator("armature.extrude_forked")
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.operator("armature.duplicate_move")
|
|
|
|
layout.operator("armature.merge")
|
|
|
|
layout.operator("armature.fill")
|
2013-10-29 00:10:03 +00:00
|
|
|
layout.operator("armature.split")
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.operator("armature.separate")
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.separator()
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2011-09-21 15:18:38 +00:00
|
|
|
layout.operator("armature.subdivide", text="Subdivide")
|
|
|
|
layout.operator("armature.switch_direction", text="Switch Direction")
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.separator()
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2009-11-16 13:59:27 +00:00
|
|
|
layout.operator_context = 'EXEC_AREA'
|
2015-03-19 17:57:17 +11:00
|
|
|
layout.operator("armature.symmetrize")
|
2011-09-21 15:18:38 +00:00
|
|
|
layout.operator("armature.autoside_names", text="AutoName Left/Right").type = 'XAXIS'
|
|
|
|
layout.operator("armature.autoside_names", text="AutoName Front/Back").type = 'YAXIS'
|
|
|
|
layout.operator("armature.autoside_names", text="AutoName Top/Bottom").type = 'ZAXIS'
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.operator("armature.flip_names")
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.separator()
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2009-11-16 13:59:27 +00:00
|
|
|
layout.operator_context = 'INVOKE_DEFAULT'
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.operator("armature.armature_layers")
|
|
|
|
layout.operator("armature.bone_layers")
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.separator()
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.menu("VIEW3D_MT_edit_armature_parent")
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.separator()
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2011-09-21 15:18:38 +00:00
|
|
|
layout.menu("VIEW3D_MT_bone_options_toggle", text="Bone Settings")
|
2009-08-17 10:13:24 +00:00
|
|
|
|
2009-11-21 00:05:43 +00:00
|
|
|
|
2011-08-12 06:57:00 +00:00
|
|
|
class VIEW3D_MT_armature_specials(Menu):
|
2011-09-15 13:20:18 +00:00
|
|
|
bl_label = "Specials"
|
2009-11-20 11:49:47 +00:00
|
|
|
|
|
|
|
def draw(self, context):
|
|
|
|
layout = self.layout
|
2009-11-21 00:05:43 +00:00
|
|
|
|
2009-11-20 11:49:47 +00:00
|
|
|
layout.operator_context = 'INVOKE_REGION_WIN'
|
2009-11-21 00:05:43 +00:00
|
|
|
|
2011-09-21 15:18:38 +00:00
|
|
|
layout.operator("armature.subdivide", text="Subdivide")
|
|
|
|
layout.operator("armature.switch_direction", text="Switch Direction")
|
2009-11-21 00:05:43 +00:00
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.separator()
|
2009-11-21 00:05:43 +00:00
|
|
|
|
2009-11-20 11:49:47 +00:00
|
|
|
layout.operator_context = 'EXEC_REGION_WIN'
|
2011-09-21 15:18:38 +00:00
|
|
|
layout.operator("armature.autoside_names", text="AutoName Left/Right").type = 'XAXIS'
|
|
|
|
layout.operator("armature.autoside_names", text="AutoName Front/Back").type = 'YAXIS'
|
|
|
|
layout.operator("armature.autoside_names", text="AutoName Top/Bottom").type = 'ZAXIS'
|
|
|
|
layout.operator("armature.flip_names", text="Flip Names")
|
2015-03-19 17:57:17 +11:00
|
|
|
layout.operator("armature.symmetrize")
|
2009-10-31 23:35:56 +00:00
|
|
|
|
2009-11-21 00:05:43 +00:00
|
|
|
|
2011-08-12 06:57:00 +00:00
|
|
|
class VIEW3D_MT_edit_armature_parent(Menu):
|
2011-09-15 13:20:18 +00:00
|
|
|
bl_label = "Parent"
|
2009-10-31 19:31:45 +00:00
|
|
|
|
|
|
|
def draw(self, context):
|
|
|
|
layout = self.layout
|
2009-08-17 10:13:24 +00:00
|
|
|
|
2011-09-21 15:18:38 +00:00
|
|
|
layout.operator("armature.parent_set", text="Make")
|
|
|
|
layout.operator("armature.parent_clear", text="Clear")
|
2009-08-17 10:13:24 +00:00
|
|
|
|
2009-10-31 23:35:56 +00:00
|
|
|
|
2011-08-12 06:57:00 +00:00
|
|
|
class VIEW3D_MT_edit_armature_roll(Menu):
|
2011-09-15 13:20:18 +00:00
|
|
|
bl_label = "Bone Roll"
|
2009-10-31 19:31:45 +00:00
|
|
|
|
|
|
|
def draw(self, context):
|
|
|
|
layout = self.layout
|
|
|
|
|
2011-02-16 02:25:03 +00:00
|
|
|
layout.operator_menu_enum("armature.calculate_roll", "type")
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2009-11-23 00:27:30 +00:00
|
|
|
layout.separator()
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2011-09-21 15:18:38 +00:00
|
|
|
layout.operator("transform.transform", text="Set Roll").mode = 'BONE_ROLL'
|
2016-03-03 11:45:43 +11:00
|
|
|
layout.operator("armature.roll_clear")
|
2009-08-17 10:13:24 +00:00
|
|
|
|
2015-06-13 03:20:07 +10:00
|
|
|
|
|
|
|
class VIEW3D_MT_edit_armature_delete(Menu):
|
|
|
|
bl_label = "Delete"
|
|
|
|
|
|
|
|
def draw(self, context):
|
|
|
|
layout = self.layout
|
|
|
|
|
|
|
|
layout.operator("armature.delete", text="Delete Bones")
|
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
|
|
|
layout.operator("armature.dissolve", text="Dissolve")
|
|
|
|
|
|
|
|
|
2015-12-13 21:03:13 +13:00
|
|
|
# ********** GPencil Stroke Edit menu **********
|
|
|
|
|
|
|
|
|
|
|
|
class VIEW3D_MT_edit_gpencil(Menu):
|
|
|
|
bl_label = "GPencil"
|
2016-02-01 00:47:10 +11:00
|
|
|
|
2015-12-13 21:03:13 +13:00
|
|
|
def draw(self, context):
|
|
|
|
toolsettings = context.tool_settings
|
|
|
|
|
|
|
|
layout = self.layout
|
|
|
|
|
2017-10-19 15:38:34 +11:00
|
|
|
layout.menu("VIEW3D_MT_undo_redo")
|
2015-12-13 21:03:13 +13:00
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
2017-10-19 15:10:41 +11:00
|
|
|
layout.menu("VIEW3D_MT_edit_gpencil_delete")
|
2015-12-13 21:03:13 +13:00
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
|
|
|
layout.menu("VIEW3D_MT_edit_gpencil_transform")
|
|
|
|
layout.operator("transform.mirror", text="Mirror")
|
|
|
|
layout.menu("GPENCIL_MT_snap")
|
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
2017-10-19 15:10:41 +11:00
|
|
|
layout.operator("gpencil.brush_paint", text="Sculpt Strokes").wait_for_input = True
|
|
|
|
layout.prop_menu_enum(toolsettings.gpencil_sculpt, "tool", text="Sculpt Brush")
|
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
2015-12-13 21:03:13 +13:00
|
|
|
layout.menu("VIEW3D_MT_object_animation") # NOTE: provides keyingset access...
|
2016-12-02 02:19:59 +13:00
|
|
|
layout.menu("VIEW3D_MT_edit_gpencil_interpolate")
|
2015-12-13 21:03:13 +13:00
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
|
|
|
layout.operator("gpencil.duplicate_move", text="Duplicate")
|
2016-12-02 02:19:59 +13:00
|
|
|
layout.operator("gpencil.stroke_subdivide", text="Subdivide")
|
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
|
|
|
layout.operator_menu_enum("gpencil.stroke_join", "type", text="Join...")
|
|
|
|
layout.operator("gpencil.stroke_flip", text="Flip Direction")
|
2015-12-13 21:03:13 +13:00
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
|
|
|
layout.operator("gpencil.copy", text="Copy")
|
|
|
|
layout.operator("gpencil.paste", text="Paste")
|
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
2016-09-04 23:40:41 +02:00
|
|
|
layout.menu("VIEW3D_MT_edit_proportional")
|
2015-12-13 21:03:13 +13:00
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
|
|
|
layout.operator("gpencil.reveal")
|
|
|
|
layout.operator("gpencil.hide", text="Show Active Layer Only").unselected = True
|
|
|
|
layout.operator("gpencil.hide", text="Hide Active Layer").unselected = False
|
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
|
|
|
layout.operator_menu_enum("gpencil.move_to_layer", "layer", text="Move to Layer")
|
2016-12-02 02:19:59 +13:00
|
|
|
layout.operator("gpencil.stroke_change_color", text="Move to Color")
|
|
|
|
layout.operator_menu_enum("gpencil.stroke_arrange", "direction", text="Arrange Strokes...")
|
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
2015-12-13 21:03:13 +13:00
|
|
|
layout.operator_menu_enum("gpencil.convert", "type", text="Convert to Geometry...")
|
|
|
|
|
|
|
|
|
|
|
|
class VIEW3D_MT_edit_gpencil_transform(Menu):
|
|
|
|
bl_label = "Transform"
|
|
|
|
|
|
|
|
def draw(self, context):
|
|
|
|
layout = self.layout
|
|
|
|
|
|
|
|
layout.operator("transform.translate")
|
|
|
|
layout.operator("transform.rotate")
|
|
|
|
layout.operator("transform.resize", text="Scale")
|
|
|
|
|
|
|
|
layout.separator()
|
|
|
|
|
|
|
|
layout.operator("transform.bend", text="Bend")
|
|
|
|
layout.operator("transform.shear", text="Shear")
|
|
|
|
layout.operator("transform.tosphere", text="To Sphere")
|
|
|
|
layout.operator("transform.transform", text="Shrink Fatten").mode = 'GPENCIL_SHRINKFATTEN'
|
|
|
|
|
2016-12-02 02:19:59 +13:00
|
|
|
layout.separator()
|
|
|
|
|
|
|
|
layout.operator("gpencil.reproject")
|
|
|
|
|
|
|
|
|
|
|
|
class VIEW3D_MT_edit_gpencil_interpolate(Menu):
|
|
|
|
bl_label = "Interpolate"
|
|
|
|
|
|
|
|
def draw(self, context):
|
|
|
|
layout = self.layout
|
|
|
|
|
|
|
|
layout.operator("gpencil.interpolate", text="Interpolate")
|
|
|
|
layout.operator("gpencil.interpolate_sequence", text="Sequence")
|
|
|
|
|
2015-12-13 21:03:13 +13:00
|
|
|
|
2009-08-15 20:21:49 +00:00
|
|
|
# ********** Panel **********
|
2009-07-11 13:32:20 +00:00
|
|
|
|
2015-01-29 15:35:06 +11:00
|
|
|
|
Grease Pencil - Storyboarding Features (merge from GPencil_EditStrokes branch)
This merge-commit brings in a number of new features and workflow/UI improvements for
working with Grease Pencil. While these were originally targetted at improving
the workflow for creating 3D storyboards in Blender using the Grease Pencil,
many of these changes should also prove useful in other workflows too.
The main highlights here are:
1) It is now possible to edit Grease Pencil strokes
- Use D Tab, or toggle the "Enable Editing" toggles in the Toolbar/Properties regions
to enter "Stroke Edit Mode". In this mode, many common editing tools will
operate on Grease Pencil stroke points instead.
- Tools implemented include Select, Select All/Border/Circle/Linked/More/Less,
Grab, Rotate, Scale, Bend, Shear, To Sphere, Mirror, Duplicate, Delete.
- Proportional Editing works when using the transform tools
2) Grease Pencil stroke settings can now be animated
NOTE: Currently drivers don't work, but if time allows, this may still be
added before the release.
3) Strokes can be drawn with "filled" interiors, using a separate set of
colour/opacity settings to the ones used for the lines themselves.
This makes use of OpenGL filled polys, which has the limitation of only
being able to fill convex shapes. Some artifacts may be visible on concave
shapes (e.g. pacman's mouth will be overdrawn)
4) "Volumetric Strokes" - An alternative drawing technique for stroke drawing
has been added which draws strokes as a series of screen-aligned discs.
While this was originally a partial experimental technique at getting better
quality 3D lines, the effects possible using this technique were interesting
enough to warrant making this a dedicated feature. Best results when partial
opacity and large stroke widths are used.
5) Improved Onion Skinning Support
- Different colours can be selected for the before/after ghosts. To do so,
enable the "colour wheel" toggle beside the Onion Skinning toggle, and set
the colours accordingly.
- Different numbers of ghosts can be shown before/after the current frame
6) Grease Pencil datablocks are now attached to the scene by default instead of
the active object.
- For a long time, the object-attachment has proved to be quite problematic
for users to keep track of. Now that this is done at scene level, it is
easier for most users to use.
- An exception for old files (and for any addons which may benefit from object
attachment instead), is that if the active object has a Grease Pencil datablock,
that will be used instead.
- It is not currently possible to choose object-attachment from the UI, but
it is simple to do this from the console instead, by doing:
context.active_object.grease_pencil = bpy.data.grease_pencil["blah"]
7) Various UI Cleanups
- The layers UI has been cleaned up to use a list instead of the nested-panels
design. Apart from saving space, this is also much nicer to look at now.
- The UI code is now all defined in Python. To support this, it has been necessary
to add some new context properties to make it easier to access these settings.
e.g. "gpencil_data" for the datablock
"active_gpencil_layer" and "active_gpencil_frame" for active data,
"editable_gpencil_strokes" for the strokes that can be edited
- The "stroke placement/alignment" settings (previously "Drawing Settings" at the
bottom of the Grease Pencil panel in the Properties Region) is now located in
the toolbar. These were more toolsettings than properties for how GPencil got drawn.
- "Use Sketching Sessions" has been renamed "Continuous Drawing", as per a
suggestion for an earlier discussion on developer.blender.org
- By default, the painting operator will wait for a mouse button to be pressed
before it starts creating the stroke. This is to make it easier to include
this operator in various toolbars/menus/etc. To get it immediately starting
(as when you hold down DKEy to draw), set "wait_for_input" to False.
- GPencil Layers can be rearranged in the "Grease Pencil" mode of the Action Editor
- Toolbar panels have been added to all the other editors which support these.
8) Pie menus for quick-access to tools
A set of experimental pie menus has been included for quick access to many
tools and settings. It is not necessary to use these to get things done,
but they have been designed to help make certain common tasks easier.
- Ctrl-D = The main pie menu. Reveals tools in a context sensitive and
spatially stable manner.
- D Q = "Quick Settings" pie. This allows quick access to the active
layer's settings. Notably, colours, thickness, and turning
onion skinning on/off.
2014-12-01 01:52:06 +13:00
|
|
|
class VIEW3D_PT_grease_pencil(GreasePencilDataPanel, Panel):
|
|
|
|
bl_space_type = 'VIEW_3D'
|
|
|
|
bl_region_type = 'UI'
|
2016-08-03 23:31:48 +02:00
|
|
|
|
|
|
|
# NOTE: this is just a wrapper around the generic GP Panel
|
|
|
|
|
|
|
|
|
|
|
|
class VIEW3D_PT_grease_pencil_palettecolor(GreasePencilPaletteColorPanel, Panel):
|
|
|
|
bl_space_type = 'VIEW_3D'
|
|
|
|
bl_region_type = 'UI'
|
Grease Pencil - Storyboarding Features (merge from GPencil_EditStrokes branch)
This merge-commit brings in a number of new features and workflow/UI improvements for
working with Grease Pencil. While these were originally targetted at improving
the workflow for creating 3D storyboards in Blender using the Grease Pencil,
many of these changes should also prove useful in other workflows too.
The main highlights here are:
1) It is now possible to edit Grease Pencil strokes
- Use D Tab, or toggle the "Enable Editing" toggles in the Toolbar/Properties regions
to enter "Stroke Edit Mode". In this mode, many common editing tools will
operate on Grease Pencil stroke points instead.
- Tools implemented include Select, Select All/Border/Circle/Linked/More/Less,
Grab, Rotate, Scale, Bend, Shear, To Sphere, Mirror, Duplicate, Delete.
- Proportional Editing works when using the transform tools
2) Grease Pencil stroke settings can now be animated
NOTE: Currently drivers don't work, but if time allows, this may still be
added before the release.
3) Strokes can be drawn with "filled" interiors, using a separate set of
colour/opacity settings to the ones used for the lines themselves.
This makes use of OpenGL filled polys, which has the limitation of only
being able to fill convex shapes. Some artifacts may be visible on concave
shapes (e.g. pacman's mouth will be overdrawn)
4) "Volumetric Strokes" - An alternative drawing technique for stroke drawing
has been added which draws strokes as a series of screen-aligned discs.
While this was originally a partial experimental technique at getting better
quality 3D lines, the effects possible using this technique were interesting
enough to warrant making this a dedicated feature. Best results when partial
opacity and large stroke widths are used.
5) Improved Onion Skinning Support
- Different colours can be selected for the before/after ghosts. To do so,
enable the "colour wheel" toggle beside the Onion Skinning toggle, and set
the colours accordingly.
- Different numbers of ghosts can be shown before/after the current frame
6) Grease Pencil datablocks are now attached to the scene by default instead of
the active object.
- For a long time, the object-attachment has proved to be quite problematic
for users to keep track of. Now that this is done at scene level, it is
easier for most users to use.
- An exception for old files (and for any addons which may benefit from object
attachment instead), is that if the active object has a Grease Pencil datablock,
that will be used instead.
- It is not currently possible to choose object-attachment from the UI, but
it is simple to do this from the console instead, by doing:
context.active_object.grease_pencil = bpy.data.grease_pencil["blah"]
7) Various UI Cleanups
- The layers UI has been cleaned up to use a list instead of the nested-panels
design. Apart from saving space, this is also much nicer to look at now.
- The UI code is now all defined in Python. To support this, it has been necessary
to add some new context properties to make it easier to access these settings.
e.g. "gpencil_data" for the datablock
"active_gpencil_layer" and "active_gpencil_frame" for active data,
"editable_gpencil_strokes" for the strokes that can be edited
- The "stroke placement/alignment" settings (previously "Drawing Settings" at the
bottom of the Grease Pencil panel in the Properties Region) is now located in
the toolbar. These were more toolsettings than properties for how GPencil got drawn.
- "Use Sketching Sessions" has been renamed "Continuous Drawing", as per a
suggestion for an earlier discussion on developer.blender.org
- By default, the painting operator will wait for a mouse button to be pressed
before it starts creating the stroke. This is to make it easier to include
this operator in various toolbars/menus/etc. To get it immediately starting
(as when you hold down DKEy to draw), set "wait_for_input" to False.
- GPencil Layers can be rearranged in the "Grease Pencil" mode of the Action Editor
- Toolbar panels have been added to all the other editors which support these.
8) Pie menus for quick-access to tools
A set of experimental pie menus has been included for quick access to many
tools and settings. It is not necessary to use these to get things done,
but they have been designed to help make certain common tasks easier.
- Ctrl-D = The main pie menu. Reveals tools in a context sensitive and
spatially stable manner.
- D Q = "Quick Settings" pie. This allows quick access to the active
layer's settings. Notably, colours, thickness, and turning
onion skinning on/off.
2014-12-01 01:52:06 +13:00
|
|
|
|
|
|
|
# NOTE: this is just a wrapper around the generic GP Panel
|
|
|
|
|
2009-10-31 23:35:56 +00:00
|
|
|
|
2011-08-12 06:57:00 +00:00
|
|
|
class VIEW3D_PT_view3d_properties(Panel):
|
2009-10-31 19:31:45 +00:00
|
|
|
bl_space_type = 'VIEW_3D'
|
|
|
|
bl_region_type = 'UI'
|
2011-09-15 13:20:18 +00:00
|
|
|
bl_label = "View"
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2010-08-09 01:37:09 +00:00
|
|
|
@classmethod
|
|
|
|
def poll(cls, context):
|
2009-10-31 19:31:45 +00:00
|
|
|
view = context.space_data
|
|
|
|
return (view)
|
|
|
|
|
|
|
|
def draw(self, context):
|
|
|
|
layout = self.layout
|
|
|
|
|
|
|
|
view = context.space_data
|
|
|
|
|
|
|
|
col = layout.column()
|
2014-03-11 15:07:53 +01:00
|
|
|
col.active = bool(view.region_3d.view_perspective != 'CAMERA' or view.region_quadviews)
|
2009-11-23 00:27:30 +00:00
|
|
|
col.prop(view, "lens")
|
2011-09-21 15:18:38 +00:00
|
|
|
col.label(text="Lock to Object:")
|
2009-11-28 13:39:35 +00:00
|
|
|
col.prop(view, "lock_object", text="")
|
2011-08-23 19:58:15 +00:00
|
|
|
lock_object = view.lock_object
|
|
|
|
if lock_object:
|
|
|
|
if lock_object.type == 'ARMATURE':
|
2012-04-13 15:21:26 +00:00
|
|
|
col.prop_search(view, "lock_bone", lock_object.data,
|
2018-04-05 18:20:27 +02:00
|
|
|
"edit_bones" if lock_object.mode == 'EDIT'
|
2012-10-08 08:28:05 +00:00
|
|
|
else "bones",
|
2012-04-13 15:21:26 +00:00
|
|
|
text="")
|
2011-08-23 19:58:15 +00:00
|
|
|
else:
|
2011-09-21 15:18:38 +00:00
|
|
|
col.prop(view, "lock_cursor", text="Lock to Cursor")
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2011-05-14 17:50:33 +00:00
|
|
|
col = layout.column()
|
|
|
|
col.prop(view, "lock_camera")
|
|
|
|
|
2009-10-31 19:31:45 +00:00
|
|
|
col = layout.column(align=True)
|
2011-09-21 15:18:38 +00:00
|
|
|
col.label(text="Clip:")
|
|
|
|
col.prop(view, "clip_start", text="Start")
|
|
|
|
col.prop(view, "clip_end", text="End")
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2013-08-23 20:41:21 +00:00
|
|
|
subcol = col.column(align=True)
|
2010-04-27 06:47:12 +00:00
|
|
|
subcol.enabled = not view.lock_camera_and_layers
|
2011-09-21 15:18:38 +00:00
|
|
|
subcol.label(text="Local Camera:")
|
2010-04-27 06:47:12 +00:00
|
|
|
subcol.prop(view, "camera", text="")
|
|
|
|
|
2012-10-16 11:57:46 +00:00
|
|
|
col = layout.column(align=True)
|
|
|
|
col.prop(view, "use_render_border")
|
2013-04-22 14:26:57 +00:00
|
|
|
col.active = view.region_3d.view_perspective != 'CAMERA'
|
2012-10-16 11:57:46 +00:00
|
|
|
|
2011-11-06 06:19:00 +00:00
|
|
|
|
|
|
|
class VIEW3D_PT_view3d_cursor(Panel):
|
|
|
|
bl_space_type = 'VIEW_3D'
|
|
|
|
bl_region_type = 'UI'
|
|
|
|
bl_label = "3D Cursor"
|
|
|
|
|
|
|
|
@classmethod
|
|
|
|
def poll(cls, context):
|
|
|
|
view = context.space_data
|
2012-05-15 18:45:20 +00:00
|
|
|
return (view is not None)
|
2011-11-06 06:19:00 +00:00
|
|
|
|
|
|
|
def draw(self, context):
|
|
|
|
layout = self.layout
|
|
|
|
|
|
|
|
view = context.space_data
|
2015-12-17 14:54:06 +11:00
|
|
|
layout.column().prop(view, "cursor_location", text="Location")
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2009-11-14 13:35:44 +00:00
|
|
|
|
2011-08-12 06:57:00 +00:00
|
|
|
class VIEW3D_PT_view3d_name(Panel):
|
2009-11-05 17:22:11 +00:00
|
|
|
bl_space_type = 'VIEW_3D'
|
|
|
|
bl_region_type = 'UI'
|
2011-09-15 13:20:18 +00:00
|
|
|
bl_label = "Item"
|
2009-11-21 00:05:43 +00:00
|
|
|
|
2010-08-09 01:37:09 +00:00
|
|
|
@classmethod
|
|
|
|
def poll(cls, context):
|
2009-11-19 18:48:31 +00:00
|
|
|
return (context.space_data and context.active_object)
|
2009-11-07 22:07:46 +00:00
|
|
|
|
2009-11-05 17:22:11 +00:00
|
|
|
def draw(self, context):
|
|
|
|
layout = self.layout
|
2009-11-07 22:07:46 +00:00
|
|
|
|
2009-11-11 10:07:52 +00:00
|
|
|
ob = context.active_object
|
2009-11-05 17:22:11 +00:00
|
|
|
row = layout.row()
|
2009-12-10 10:23:53 +00:00
|
|
|
row.label(text="", icon='OBJECT_DATA')
|
2009-11-23 00:27:30 +00:00
|
|
|
row.prop(ob, "name", text="")
|
2009-11-07 22:07:46 +00:00
|
|
|
|
2018-04-05 18:20:27 +02:00
|
|
|
if ob.type == 'ARMATURE' and ob.mode in {'EDIT', 'POSE'}:
|
2009-11-05 17:22:11 +00:00
|
|
|
bone = context.active_bone
|
2009-11-11 10:07:52 +00:00
|
|
|
if bone:
|
|
|
|
row = layout.row()
|
2009-12-10 10:23:53 +00:00
|
|
|
row.label(text="", icon='BONE_DATA')
|
2009-11-23 00:27:30 +00:00
|
|
|
row.prop(bone, "name", text="")
|
2009-10-31 23:35:56 +00:00
|
|
|
|
2009-11-14 13:35:44 +00:00
|
|
|
|
2018-04-29 08:47:14 +02:00
|
|
|
class VIEW3D_PT_shading(Panel):
|
2009-10-31 19:31:45 +00:00
|
|
|
bl_space_type = 'VIEW_3D'
|
2018-05-02 12:05:40 +02:00
|
|
|
bl_region_type = 'HEADER'
|
2018-04-29 08:47:14 +02:00
|
|
|
bl_label = "Shading"
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2010-08-09 01:37:09 +00:00
|
|
|
@classmethod
|
|
|
|
def poll(cls, context):
|
2018-05-02 12:05:40 +02:00
|
|
|
return True
|
2018-04-29 08:47:14 +02:00
|
|
|
|
|
|
|
def draw(self, context):
|
|
|
|
layout = self.layout
|
|
|
|
|
2009-10-31 19:31:45 +00:00
|
|
|
view = context.space_data
|
2018-04-29 09:44:57 +02:00
|
|
|
shading = view.shading
|
2018-04-29 08:47:14 +02:00
|
|
|
|
|
|
|
col = layout.column()
|
2018-04-29 09:44:57 +02:00
|
|
|
col.prop(shading, "type", expand=True)
|
2018-04-29 08:47:14 +02:00
|
|
|
|
2018-04-29 09:44:57 +02:00
|
|
|
if shading.type == 'SOLID':
|
2018-05-03 15:31:03 +02:00
|
|
|
col.separator()
|
2018-05-05 10:45:15 +02:00
|
|
|
col.row().prop(shading, "color_type", expand=True)
|
2018-05-03 15:31:03 +02:00
|
|
|
|
2018-05-05 10:45:15 +02:00
|
|
|
if shading.color_type == 'SINGLE':
|
2018-05-04 17:25:49 +02:00
|
|
|
col.separator()
|
|
|
|
col.row().prop(shading, "single_color", text="")
|
|
|
|
|
2018-05-07 14:59:27 +02:00
|
|
|
if shading.type in ('SOLID', 'TEXTURED'):
|
2018-04-29 08:47:14 +02:00
|
|
|
col.separator()
|
2018-04-29 09:44:57 +02:00
|
|
|
col.row().prop(shading, "light", expand=True)
|
2018-05-03 15:31:03 +02:00
|
|
|
if shading.light == 'STUDIO':
|
2018-05-03 15:09:09 +02:00
|
|
|
col.row().template_icon_view(shading, "studio_light")
|
2018-05-04 14:07:00 +02:00
|
|
|
|
2018-05-05 15:09:21 +02:00
|
|
|
col.separator()
|
|
|
|
|
|
|
|
row = col.row()
|
|
|
|
row.prop(shading, "show_shadows")
|
|
|
|
sub = row.row()
|
|
|
|
sub.active = shading.show_shadows
|
|
|
|
sub.prop(shading, "shadow_intensity", text="")
|
2018-04-29 08:47:14 +02:00
|
|
|
|
2018-05-01 10:43:27 +02:00
|
|
|
col.prop(shading, "show_object_overlap")
|
|
|
|
|
2018-04-29 08:47:14 +02:00
|
|
|
|
|
|
|
class VIEW3D_PT_overlay(Panel):
|
|
|
|
bl_space_type = 'VIEW_3D'
|
2018-05-02 12:05:40 +02:00
|
|
|
bl_region_type = 'HEADER'
|
2018-04-29 08:47:14 +02:00
|
|
|
bl_label = "Overlay"
|
|
|
|
|
|
|
|
@classmethod
|
|
|
|
def poll(cls, context):
|
2018-05-02 12:05:40 +02:00
|
|
|
return True
|
2009-10-31 19:31:45 +00:00
|
|
|
|
|
|
|
def draw(self, context):
|
|
|
|
layout = self.layout
|
|
|
|
|
|
|
|
view = context.space_data
|
2018-04-29 09:44:57 +02:00
|
|
|
overlay = view.overlay
|
2010-11-23 14:14:06 +00:00
|
|
|
scene = context.scene
|
2018-05-06 12:17:53 +02:00
|
|
|
toolsettings = context.tool_settings
|
2018-05-03 10:55:28 +02:00
|
|
|
display_all = overlay.show_overlays
|
2009-11-28 23:37:56 +00:00
|
|
|
|
2009-10-31 19:31:45 +00:00
|
|
|
col = layout.column()
|
2018-04-29 09:44:57 +02:00
|
|
|
col.prop(overlay, "show_overlays")
|
2018-04-29 08:47:14 +02:00
|
|
|
col.separator()
|
2014-11-24 14:29:09 +01:00
|
|
|
col.prop(view, "show_world")
|
2010-03-16 17:49:31 +00:00
|
|
|
|
2018-05-03 10:55:28 +02:00
|
|
|
col = layout.column()
|
|
|
|
col.active = display_all
|
2018-05-03 17:56:06 +02:00
|
|
|
col.prop(overlay, "show_cursor")
|
2018-05-03 10:55:28 +02:00
|
|
|
|
2018-05-12 14:54:57 +02:00
|
|
|
col.prop(view, "show_manipulator")
|
|
|
|
|
2010-03-16 17:49:31 +00:00
|
|
|
col = layout.column()
|
|
|
|
col.active = display_all
|
2018-05-05 10:45:15 +02:00
|
|
|
col.prop(overlay, "show_outline_selected")
|
|
|
|
col.prop(overlay, "show_all_objects_origin")
|
|
|
|
col.prop(overlay, "show_relationship_lines")
|
|
|
|
col.prop(overlay, "show_face_orientation")
|
2018-05-03 15:09:09 +02:00
|
|
|
col.prop(overlay, "show_backface_culling")
|
2009-11-28 23:37:56 +00:00
|
|
|
|
2009-11-28 13:39:35 +00:00
|
|
|
col = layout.column()
|
2010-03-16 17:49:31 +00:00
|
|
|
col.active = display_all
|
|
|
|
split = col.split(percentage=0.55)
|
2018-05-05 10:45:15 +02:00
|
|
|
split.prop(overlay, "show_floor", text="Grid Floor")
|
2010-04-04 14:52:15 +00:00
|
|
|
|
2010-03-16 17:49:31 +00:00
|
|
|
row = split.row(align=True)
|
2018-05-05 10:45:15 +02:00
|
|
|
row.prop(overlay, "show_axis_x", text="X", toggle=True)
|
|
|
|
row.prop(overlay, "show_axis_y", text="Y", toggle=True)
|
|
|
|
row.prop(overlay, "show_axis_z", text="Z", toggle=True)
|
2010-04-04 14:52:15 +00:00
|
|
|
|
2009-11-28 13:39:35 +00:00
|
|
|
sub = col.column(align=True)
|
2018-05-05 10:45:15 +02:00
|
|
|
sub.active = bool(overlay.show_floor or view.region_quadviews or not view.region_3d.is_perspective)
|
2016-10-21 16:06:53 +02:00
|
|
|
subsub = sub.column(align=True)
|
2018-05-05 10:45:15 +02:00
|
|
|
subsub.active = overlay.show_floor
|
|
|
|
subsub.prop(overlay, "grid_lines", text="Lines")
|
|
|
|
sub.prop(overlay, "grid_scale", text="Scale")
|
2010-11-23 14:14:06 +00:00
|
|
|
subsub = sub.column(align=True)
|
|
|
|
subsub.active = scene.unit_settings.system == 'NONE'
|
2018-05-05 10:45:15 +02:00
|
|
|
subsub.prop(overlay, "grid_subdivisions", text="Subdivisions")
|
2009-11-28 23:37:56 +00:00
|
|
|
|
2018-05-07 15:10:11 +02:00
|
|
|
|
|
|
|
|
2018-05-03 15:09:09 +02:00
|
|
|
if context.mode == 'EDIT_MESH':
|
|
|
|
col.separator()
|
|
|
|
col.label(text="Edit Mode:")
|
|
|
|
|
|
|
|
col.prop(overlay, "show_occlude_wire")
|
|
|
|
|
2018-05-06 12:17:53 +02:00
|
|
|
col.prop(overlay, "show_weight")
|
|
|
|
col.label("Show Zero Weights:")
|
|
|
|
col.row().prop(toolsettings, "vertex_group_user", expand=True)
|
|
|
|
|
2018-05-03 15:09:09 +02:00
|
|
|
col.label(text="Normals:")
|
|
|
|
row = col.row(align=True)
|
|
|
|
|
|
|
|
row.prop(overlay, "show_vertex_normals", text="", icon='VERTEXSEL')
|
|
|
|
row.prop(overlay, "show_split_normals", text="", icon='LOOPSEL')
|
|
|
|
row.prop(overlay, "show_face_normals", text="", icon='FACESEL')
|
|
|
|
|
|
|
|
sub = row.row(align=True)
|
|
|
|
sub.active = overlay.show_vertex_normals or overlay.show_face_normals or overlay.show_split_normals
|
|
|
|
sub.prop(overlay, "normals_length", text="Size")
|
|
|
|
|
2018-05-07 15:10:11 +02:00
|
|
|
elif context.mode == 'POSE':
|
|
|
|
col.separator()
|
|
|
|
col.label(text="Pose Mode:")
|
|
|
|
|
|
|
|
col = layout.column()
|
|
|
|
col.active = display_all
|
|
|
|
col.prop(overlay, "transparent_bones")
|
2018-05-11 08:16:41 +02:00
|
|
|
col.prop(overlay, "show_bone_selection")
|
2018-05-07 15:10:11 +02:00
|
|
|
|
|
|
|
elif context.mode == 'EDIT_ARMATURE':
|
|
|
|
col.separator()
|
|
|
|
col.label(text="Edit Armature:")
|
|
|
|
|
|
|
|
col = layout.column()
|
|
|
|
col.active = display_all
|
|
|
|
col.prop(overlay, "transparent_bones")
|
2018-05-06 12:17:53 +02:00
|
|
|
|
2018-05-03 15:09:09 +02:00
|
|
|
elif context.mode in {'PAINT_WEIGHT', 'PAINT_VERTEX', 'PAINT_TEXTURE'}:
|
|
|
|
col.separator()
|
|
|
|
col.label(text="Paint Mode:")
|
|
|
|
|
|
|
|
if context.mode in {'PAINT_WEIGHT', 'PAINT_VERTEX'}:
|
|
|
|
col.prop(overlay, "show_paint_wire")
|
|
|
|
|
|
|
|
col.prop(view, "show_mode_shade_override")
|
|
|
|
|
2010-01-30 03:22:22 +00:00
|
|
|
|
2018-04-29 08:47:14 +02:00
|
|
|
class VIEW3D_PT_quad_view(Panel):
|
|
|
|
bl_space_type = 'VIEW_3D'
|
|
|
|
bl_region_type = 'UI'
|
|
|
|
bl_label = "Quad View"
|
|
|
|
bl_options = {'DEFAULT_CLOSED'}
|
2009-08-22 11:51:26 +00:00
|
|
|
|
2018-04-29 08:47:14 +02:00
|
|
|
@classmethod
|
|
|
|
def poll(cls, context):
|
|
|
|
view = context.space_data
|
|
|
|
return view.region_quadviews
|
|
|
|
|
|
|
|
def draw(self, context):
|
|
|
|
layout = self.layout
|
|
|
|
|
|
|
|
view = context.space_data
|
|
|
|
|
|
|
|
region = view.region_quadviews[2]
|
|
|
|
col = layout.column()
|
|
|
|
col.prop(region, "lock_rotation")
|
|
|
|
row = col.row()
|
|
|
|
row.enabled = region.lock_rotation
|
|
|
|
row.prop(region, "show_sync_view")
|
|
|
|
row = col.row()
|
|
|
|
row.enabled = region.lock_rotation and region.show_sync_view
|
|
|
|
row.prop(region, "use_box_clip")
|
2009-10-31 23:35:56 +00:00
|
|
|
|
2010-01-31 14:46:28 +00:00
|
|
|
|
2015-04-06 10:40:12 -03:00
|
|
|
class VIEW3D_PT_view3d_stereo(Panel):
|
2013-09-12 13:01:36 +00:00
|
|
|
bl_space_type = 'VIEW_3D'
|
|
|
|
bl_region_type = 'UI'
|
2015-04-06 10:40:12 -03:00
|
|
|
bl_label = "Stereoscopy"
|
2013-09-12 13:01:36 +00:00
|
|
|
bl_options = {'DEFAULT_CLOSED'}
|
2013-09-12 19:51:31 +00:00
|
|
|
|
2013-09-12 13:01:36 +00:00
|
|
|
@classmethod
|
|
|
|
def poll(cls, context):
|
2015-04-06 10:40:12 -03:00
|
|
|
scene = context.scene
|
|
|
|
|
|
|
|
multiview = scene.render.use_multiview
|
|
|
|
return context.space_data and multiview
|
|
|
|
|
|
|
|
def draw(self, context):
|
|
|
|
layout = self.layout
|
2013-09-12 13:01:36 +00:00
|
|
|
view = context.space_data
|
2015-04-06 10:40:12 -03:00
|
|
|
|
|
|
|
basic_stereo = context.scene.render.views_format == 'STEREO_3D'
|
|
|
|
|
|
|
|
col = layout.column()
|
|
|
|
col.row().prop(view, "stereo_3d_camera", expand=True)
|
|
|
|
|
|
|
|
col.label(text="Display:")
|
|
|
|
row = col.row()
|
|
|
|
row.active = basic_stereo
|
|
|
|
row.prop(view, "show_stereo_3d_cameras")
|
|
|
|
row = col.row()
|
|
|
|
row.active = basic_stereo
|
|
|
|
split = row.split()
|
|
|
|
split.prop(view, "show_stereo_3d_convergence_plane")
|
|
|
|
split = row.split()
|
|
|
|
split.prop(view, "stereo_3d_convergence_plane_alpha", text="Alpha")
|
|
|
|
split.active = view.show_stereo_3d_convergence_plane
|
|
|
|
row = col.row()
|
|
|
|
split = row.split()
|
|
|
|
split.prop(view, "show_stereo_3d_volume")
|
|
|
|
split = row.split()
|
|
|
|
split.prop(view, "stereo_3d_volume_alpha", text="Alpha")
|
|
|
|
|
|
|
|
|
2011-11-14 06:41:42 +00:00
|
|
|
class VIEW3D_PT_view3d_motion_tracking(Panel):
|
|
|
|
bl_space_type = 'VIEW_3D'
|
|
|
|
bl_region_type = 'UI'
|
|
|
|
bl_label = "Motion Tracking"
|
|
|
|
bl_options = {'DEFAULT_CLOSED'}
|
|
|
|
|
|
|
|
@classmethod
|
|
|
|
def poll(cls, context):
|
|
|
|
view = context.space_data
|
|
|
|
return (view)
|
|
|
|
|
|
|
|
def draw_header(self, context):
|
|
|
|
view = context.space_data
|
|
|
|
|
2011-11-20 00:32:39 +00:00
|
|
|
self.layout.prop(view, "show_reconstruction", text="")
|
2011-11-14 06:41:42 +00:00
|
|
|
|
|
|
|
def draw(self, context):
|
|
|
|
layout = self.layout
|
|
|
|
|
|
|
|
view = context.space_data
|
|
|
|
|
|
|
|
col = layout.column()
|
|
|
|
col.active = view.show_reconstruction
|
2014-02-20 22:01:10 +06:00
|
|
|
col.prop(view, "show_camera_path", text="Camera Path")
|
|
|
|
col.prop(view, "show_bundle_names", text="3D Marker Names")
|
|
|
|
col.label(text="Track Type and Size:")
|
|
|
|
row = col.row(align=True)
|
|
|
|
row.prop(view, "tracks_draw_type", text="")
|
|
|
|
row.prop(view, "tracks_draw_size", text="")
|
2011-11-14 06:41:42 +00:00
|
|
|
|
|
|
|
|
2011-08-12 06:57:00 +00:00
|
|
|
class VIEW3D_PT_view3d_meshdisplay(Panel):
|
2009-10-31 19:31:45 +00:00
|
|
|
bl_space_type = 'VIEW_3D'
|
|
|
|
bl_region_type = 'UI'
|
2011-09-15 13:20:18 +00:00
|
|
|
bl_label = "Mesh Display"
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2010-08-09 01:37:09 +00:00
|
|
|
@classmethod
|
|
|
|
def poll(cls, context):
|
2011-10-17 06:58:07 +00:00
|
|
|
# The active object check is needed because of local-mode
|
2009-11-04 16:26:08 +00:00
|
|
|
return (context.active_object and (context.mode == 'EDIT_MESH'))
|
2009-10-31 19:31:45 +00:00
|
|
|
|
|
|
|
def draw(self, context):
|
|
|
|
layout = self.layout
|
2013-04-13 22:21:21 +00:00
|
|
|
with_freestyle = bpy.app.build_options.freestyle
|
2009-10-31 19:31:45 +00:00
|
|
|
|
|
|
|
mesh = context.active_object.data
|
2013-07-30 09:00:31 +00:00
|
|
|
scene = context.scene
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2013-03-01 18:45:41 +00:00
|
|
|
split = layout.split()
|
2013-03-11 02:19:58 +00:00
|
|
|
|
2013-03-01 18:45:41 +00:00
|
|
|
col = split.column()
|
2011-09-21 15:18:38 +00:00
|
|
|
col.label(text="Overlays:")
|
|
|
|
col.prop(mesh, "show_faces", text="Faces")
|
2013-03-01 18:45:41 +00:00
|
|
|
col.prop(mesh, "show_edges", text="Edges")
|
2011-09-21 15:18:38 +00:00
|
|
|
col.prop(mesh, "show_edge_crease", text="Creases")
|
2013-03-26 00:32:19 +00:00
|
|
|
if with_freestyle:
|
|
|
|
col.prop(mesh, "show_edge_seams", text="Seams")
|
2013-03-11 02:19:58 +00:00
|
|
|
|
2013-03-01 18:45:41 +00:00
|
|
|
col = split.column()
|
|
|
|
col.label()
|
2013-03-26 00:32:19 +00:00
|
|
|
if not with_freestyle:
|
|
|
|
col.prop(mesh, "show_edge_seams", text="Seams")
|
2013-03-28 15:41:43 +00:00
|
|
|
col.prop(mesh, "show_edge_sharp", text="Sharp", text_ctxt=i18n_contexts.plural)
|
2013-04-13 20:20:21 +00:00
|
|
|
col.prop(mesh, "show_edge_bevel_weight", text="Bevel")
|
2014-07-29 14:36:56 +09:00
|
|
|
if with_freestyle:
|
2013-03-26 00:32:19 +00:00
|
|
|
col.prop(mesh, "show_freestyle_edge_marks", text="Edge Marks")
|
|
|
|
col.prop(mesh, "show_freestyle_face_marks", text="Face Marks")
|
2013-04-06 07:53:57 +00:00
|
|
|
|
2013-03-01 18:45:41 +00:00
|
|
|
col = layout.column()
|
2009-11-23 00:27:30 +00:00
|
|
|
|
|
|
|
col.separator()
|
2013-04-13 22:29:58 +00:00
|
|
|
split = layout.split()
|
|
|
|
col = split.column()
|
|
|
|
col.label(text="Edge Info:")
|
|
|
|
col.prop(mesh, "show_extra_edge_length", text="Length")
|
|
|
|
col.prop(mesh, "show_extra_edge_angle", text="Angle")
|
|
|
|
col = split.column()
|
|
|
|
col.label(text="Face Info:")
|
|
|
|
col.prop(mesh, "show_extra_face_area", text="Area")
|
|
|
|
col.prop(mesh, "show_extra_face_angle", text="Angle")
|
2011-12-22 05:39:23 +00:00
|
|
|
if bpy.app.debug:
|
2013-04-13 22:29:58 +00:00
|
|
|
layout.prop(mesh, "show_extra_indices")
|
2009-09-08 07:35:07 +00:00
|
|
|
|
2009-10-31 23:35:56 +00:00
|
|
|
|
2013-04-17 09:27:23 +00:00
|
|
|
class VIEW3D_PT_view3d_meshstatvis(Panel):
|
|
|
|
bl_space_type = 'VIEW_3D'
|
|
|
|
bl_region_type = 'UI'
|
2013-04-19 15:50:17 +00:00
|
|
|
bl_label = "Mesh Analysis"
|
2013-04-17 09:27:23 +00:00
|
|
|
|
|
|
|
@classmethod
|
|
|
|
def poll(cls, context):
|
|
|
|
# The active object check is needed because of local-mode
|
|
|
|
return (context.active_object and (context.mode == 'EDIT_MESH'))
|
|
|
|
|
|
|
|
def draw_header(self, context):
|
|
|
|
mesh = context.active_object.data
|
|
|
|
|
|
|
|
self.layout.prop(mesh, "show_statvis", text="")
|
|
|
|
|
|
|
|
def draw(self, context):
|
|
|
|
layout = self.layout
|
|
|
|
|
|
|
|
mesh = context.active_object.data
|
|
|
|
statvis = context.tool_settings.statvis
|
|
|
|
layout.active = mesh.show_statvis
|
|
|
|
|
|
|
|
layout.prop(statvis, "type")
|
|
|
|
statvis_type = statvis.type
|
|
|
|
if statvis_type == 'OVERHANG':
|
|
|
|
row = layout.row(align=True)
|
|
|
|
row.prop(statvis, "overhang_min", text="")
|
|
|
|
row.prop(statvis, "overhang_max", text="")
|
2017-06-01 16:38:32 +03:00
|
|
|
layout.row().prop(statvis, "overhang_axis", expand=True)
|
2013-04-17 09:27:23 +00:00
|
|
|
elif statvis_type == 'THICKNESS':
|
|
|
|
row = layout.row(align=True)
|
|
|
|
row.prop(statvis, "thickness_min", text="")
|
|
|
|
row.prop(statvis, "thickness_max", text="")
|
|
|
|
layout.prop(statvis, "thickness_samples")
|
|
|
|
elif statvis_type == 'INTERSECT':
|
|
|
|
pass
|
2013-04-18 04:24:18 +00:00
|
|
|
elif statvis_type == 'DISTORT':
|
|
|
|
row = layout.row(align=True)
|
|
|
|
row.prop(statvis, "distort_min", text="")
|
|
|
|
row.prop(statvis, "distort_max", text="")
|
2013-04-18 17:09:56 +00:00
|
|
|
elif statvis_type == 'SHARP':
|
|
|
|
row = layout.row(align=True)
|
|
|
|
row.prop(statvis, "sharp_min", text="")
|
|
|
|
row.prop(statvis, "sharp_max", text="")
|
2013-04-17 09:27:23 +00:00
|
|
|
|
|
|
|
|
2011-08-12 06:57:00 +00:00
|
|
|
class VIEW3D_PT_view3d_curvedisplay(Panel):
|
2009-10-31 19:31:45 +00:00
|
|
|
bl_space_type = 'VIEW_3D'
|
|
|
|
bl_region_type = 'UI'
|
2011-09-15 13:20:18 +00:00
|
|
|
bl_label = "Curve Display"
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2010-08-09 01:37:09 +00:00
|
|
|
@classmethod
|
|
|
|
def poll(cls, context):
|
2009-10-31 19:31:45 +00:00
|
|
|
editmesh = context.mode == 'EDIT_CURVE'
|
|
|
|
return (editmesh)
|
2009-09-08 07:35:07 +00:00
|
|
|
|
2009-10-31 19:31:45 +00:00
|
|
|
def draw(self, context):
|
|
|
|
layout = self.layout
|
2009-09-08 07:35:07 +00:00
|
|
|
|
2009-10-31 19:31:45 +00:00
|
|
|
curve = context.active_object.data
|
2009-09-08 07:35:07 +00:00
|
|
|
|
2009-10-31 19:31:45 +00:00
|
|
|
col = layout.column()
|
2013-09-09 14:26:39 +00:00
|
|
|
row = col.row()
|
|
|
|
row.prop(curve, "show_handles", text="Handles")
|
|
|
|
row.prop(curve, "show_normal_face", text="Normals")
|
2009-10-13 17:49:05 +00:00
|
|
|
|
2009-10-31 23:35:56 +00:00
|
|
|
|
2011-08-12 06:57:00 +00:00
|
|
|
class VIEW3D_PT_transform_orientations(Panel):
|
2009-10-31 19:31:45 +00:00
|
|
|
bl_space_type = 'VIEW_3D'
|
|
|
|
bl_region_type = 'UI'
|
2011-09-15 13:20:18 +00:00
|
|
|
bl_label = "Transform Orientations"
|
2010-08-26 01:05:37 +00:00
|
|
|
bl_options = {'DEFAULT_CLOSED'}
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2010-08-09 01:37:09 +00:00
|
|
|
@classmethod
|
|
|
|
def poll(cls, context):
|
2009-10-31 19:31:45 +00:00
|
|
|
view = context.space_data
|
|
|
|
return (view)
|
|
|
|
|
|
|
|
def draw(self, context):
|
|
|
|
layout = self.layout
|
|
|
|
|
2018-04-18 09:12:44 +02:00
|
|
|
scene = context.scene
|
|
|
|
orientation = scene.current_orientation
|
2009-10-31 19:31:45 +00:00
|
|
|
|
2012-01-06 01:14:57 +00:00
|
|
|
row = layout.row(align=True)
|
2018-04-18 09:12:44 +02:00
|
|
|
row.prop(scene, "transform_orientation", text="")
|
2012-01-06 01:14:57 +00:00
|
|
|
row.operator("transform.create_orientation", text="", icon='ZOOMIN')
|
2009-10-31 19:31:45 +00:00
|
|
|
|
|
|
|
if orientation:
|
2012-01-06 01:14:57 +00:00
|
|
|
row = layout.row(align=True)
|
|
|
|
row.prop(orientation, "name", text="")
|
2014-03-20 01:32:44 +11:00
|
|
|
row.operator("transform.delete_orientation", text="", icon='X')
|
2009-10-08 07:54:20 +00:00
|
|
|
|
2009-10-31 23:35:56 +00:00
|
|
|
|
2011-08-12 06:57:00 +00:00
|
|
|
class VIEW3D_PT_context_properties(Panel):
|
2009-11-18 20:01:35 +00:00
|
|
|
bl_space_type = 'VIEW_3D'
|
|
|
|
bl_region_type = 'UI'
|
2011-09-15 13:20:18 +00:00
|
|
|
bl_label = "Properties"
|
2010-08-26 01:05:37 +00:00
|
|
|
bl_options = {'DEFAULT_CLOSED'}
|
2009-11-18 20:01:35 +00:00
|
|
|
|
2010-08-05 21:58:57 +00:00
|
|
|
def _active_context_member(context):
|
2009-11-18 20:01:35 +00:00
|
|
|
obj = context.object
|
|
|
|
if obj:
|
2018-04-05 18:20:27 +02:00
|
|
|
mode = obj.mode
|
2009-11-18 20:01:35 +00:00
|
|
|
if mode == 'POSE':
|
2009-11-24 17:12:32 +00:00
|
|
|
return "active_pose_bone"
|
2009-11-18 20:01:35 +00:00
|
|
|
elif mode == 'EDIT' and obj.type == 'ARMATURE':
|
2009-11-23 13:06:26 +00:00
|
|
|
return "active_bone"
|
2009-11-18 20:01:35 +00:00
|
|
|
else:
|
2009-11-23 13:06:26 +00:00
|
|
|
return "object"
|
|
|
|
|
|
|
|
return ""
|
2009-11-28 23:37:56 +00:00
|
|
|
|
2010-08-09 01:37:09 +00:00
|
|
|
@classmethod
|
|
|
|
def poll(cls, context):
|
2014-06-06 14:38:07 +02:00
|
|
|
import rna_prop_ui
|
2010-08-09 01:37:09 +00:00
|
|
|
member = cls._active_context_member(context)
|
2014-06-06 14:38:07 +02:00
|
|
|
|
2009-11-23 13:06:26 +00:00
|
|
|
if member:
|
2014-06-06 14:38:07 +02:00
|
|
|
context_member, member = rna_prop_ui.rna_idprop_context_value(context, member, object)
|
|
|
|
return context_member and rna_prop_ui.rna_idprop_has_properties(context_member)
|
2009-11-23 13:06:26 +00:00
|
|
|
|
|
|
|
return False
|
|
|
|
|
|
|
|
def draw(self, context):
|
|
|
|
import rna_prop_ui
|
2011-07-11 05:50:49 +00:00
|
|
|
member = VIEW3D_PT_context_properties._active_context_member(context)
|
2009-11-18 20:01:35 +00:00
|
|
|
|
2009-11-23 13:06:26 +00:00
|
|
|
if member:
|
2009-11-18 20:01:35 +00:00
|
|
|
# Draw with no edit button
|
2010-12-19 13:04:14 +00:00
|
|
|
rna_prop_ui.draw(self.layout, context, member, object, False)
|
2011-03-24 03:02:34 +00:00
|
|
|
|
2017-10-19 11:24:01 +11:00
|
|
|
|
2017-03-18 20:03:24 +11:00
|
|
|
classes = (
|
|
|
|
VIEW3D_HT_header,
|
2017-03-20 02:34:32 +11:00
|
|
|
VIEW3D_MT_editor_menus,
|
|
|
|
VIEW3D_MT_transform,
|
|
|
|
VIEW3D_MT_transform_base,
|
|
|
|
VIEW3D_MT_transform_object,
|
|
|
|
VIEW3D_MT_transform_armature,
|
|
|
|
VIEW3D_MT_mirror,
|
|
|
|
VIEW3D_MT_snap,
|
|
|
|
VIEW3D_MT_uv_map,
|
|
|
|
VIEW3D_MT_edit_proportional,
|
|
|
|
VIEW3D_MT_view,
|
2017-10-19 12:35:58 +11:00
|
|
|
VIEW3D_MT_view_cameras,
|
2017-03-20 02:34:32 +11:00
|
|
|
VIEW3D_MT_view_navigation,
|
|
|
|
VIEW3D_MT_view_align,
|
|
|
|
VIEW3D_MT_view_align_selected,
|
2017-10-19 12:35:58 +11:00
|
|
|
VIEW3D_MT_view_viewpoint,
|
|
|
|
VIEW3D_MT_view_borders,
|
2017-03-20 02:34:32 +11:00
|
|
|
VIEW3D_MT_select_object,
|
|
|
|
VIEW3D_MT_select_object_more_less,
|
|
|
|
VIEW3D_MT_select_pose,
|
|
|
|
VIEW3D_MT_select_pose_more_less,
|
|
|
|
VIEW3D_MT_select_particle,
|
2017-03-18 20:03:24 +11:00
|
|
|
VIEW3D_MT_edit_mesh,
|
2017-03-20 02:34:32 +11:00
|
|
|
VIEW3D_MT_edit_mesh_select_similar,
|
2017-03-18 20:03:24 +11:00
|
|
|
VIEW3D_MT_edit_mesh_select_by_trait,
|
|
|
|
VIEW3D_MT_edit_mesh_select_more_less,
|
2017-03-20 02:34:32 +11:00
|
|
|
VIEW3D_MT_select_edit_mesh,
|
|
|
|
VIEW3D_MT_select_edit_curve,
|
|
|
|
VIEW3D_MT_select_edit_surface,
|
|
|
|
VIEW3D_MT_select_edit_text,
|
|
|
|
VIEW3D_MT_select_edit_metaball,
|
|
|
|
VIEW3D_MT_select_edit_lattice,
|
|
|
|
VIEW3D_MT_select_edit_armature,
|
|
|
|
VIEW3D_MT_select_gpencil,
|
|
|
|
VIEW3D_MT_select_paint_mask,
|
|
|
|
VIEW3D_MT_select_paint_mask_vertex,
|
|
|
|
VIEW3D_MT_angle_control,
|
|
|
|
INFO_MT_mesh_add,
|
|
|
|
INFO_MT_curve_add,
|
|
|
|
INFO_MT_surface_add,
|
|
|
|
INFO_MT_metaball_add,
|
|
|
|
INFO_MT_edit_curve_add,
|
|
|
|
INFO_MT_edit_armature_add,
|
|
|
|
INFO_MT_armature_add,
|
|
|
|
INFO_MT_lamp_add,
|
2017-06-12 20:59:54 +10:00
|
|
|
INFO_MT_lightprobe_add,
|
2017-03-26 11:20:46 +11:00
|
|
|
INFO_MT_camera_add,
|
2017-03-20 02:34:32 +11:00
|
|
|
INFO_MT_add,
|
2017-10-19 15:38:34 +11:00
|
|
|
VIEW3D_MT_undo_redo,
|
2017-10-19 16:09:21 +11:00
|
|
|
VIEW3D_MT_object_relations,
|
2017-03-18 20:03:24 +11:00
|
|
|
VIEW3D_MT_object,
|
|
|
|
VIEW3D_MT_object_animation,
|
2018-04-24 20:46:18 +02:00
|
|
|
VIEW3D_MT_object_rigid_body,
|
2017-03-18 20:03:24 +11:00
|
|
|
VIEW3D_MT_object_clear,
|
2017-03-20 02:34:32 +11:00
|
|
|
VIEW3D_MT_object_specials,
|
2018-04-25 07:25:08 +02:00
|
|
|
VIEW3D_MT_object_shading,
|
2017-03-20 02:34:32 +11:00
|
|
|
VIEW3D_MT_object_apply,
|
2017-03-18 20:03:24 +11:00
|
|
|
VIEW3D_MT_object_parent,
|
2017-03-20 02:34:32 +11:00
|
|
|
VIEW3D_MT_object_track,
|
|
|
|
VIEW3D_MT_object_group,
|
|
|
|
VIEW3D_MT_object_constraints,
|
2017-03-18 20:03:24 +11:00
|
|
|
VIEW3D_MT_object_quick_effects,
|
2017-03-20 02:34:32 +11:00
|
|
|
VIEW3D_MT_make_single_user,
|
|
|
|
VIEW3D_MT_make_links,
|
|
|
|
VIEW3D_MT_brush,
|
|
|
|
VIEW3D_MT_brush_paint_modes,
|
2017-03-18 20:03:24 +11:00
|
|
|
VIEW3D_MT_paint_vertex,
|
2017-03-20 02:34:32 +11:00
|
|
|
VIEW3D_MT_hook,
|
|
|
|
VIEW3D_MT_vertex_group,
|
2017-03-18 20:03:24 +11:00
|
|
|
VIEW3D_MT_paint_weight,
|
2017-03-20 02:34:32 +11:00
|
|
|
VIEW3D_MT_sculpt,
|
|
|
|
VIEW3D_MT_hide_mask,
|
2017-03-18 20:03:24 +11:00
|
|
|
VIEW3D_MT_particle,
|
|
|
|
VIEW3D_MT_particle_specials,
|
2017-03-20 02:34:32 +11:00
|
|
|
VIEW3D_MT_particle_showhide,
|
2017-03-18 20:03:24 +11:00
|
|
|
VIEW3D_MT_pose,
|
2017-03-20 02:34:32 +11:00
|
|
|
VIEW3D_MT_pose_transform,
|
|
|
|
VIEW3D_MT_pose_slide,
|
|
|
|
VIEW3D_MT_pose_propagate,
|
2017-03-18 20:03:24 +11:00
|
|
|
VIEW3D_MT_pose_library,
|
|
|
|
VIEW3D_MT_pose_motion,
|
2017-03-20 02:34:32 +11:00
|
|
|
VIEW3D_MT_pose_group,
|
|
|
|
VIEW3D_MT_pose_ik,
|
|
|
|
VIEW3D_MT_pose_constraints,
|
2017-03-18 20:03:24 +11:00
|
|
|
VIEW3D_MT_pose_showhide,
|
2017-03-20 02:34:32 +11:00
|
|
|
VIEW3D_MT_pose_apply,
|
2017-03-18 20:03:24 +11:00
|
|
|
VIEW3D_MT_pose_specials,
|
2017-03-20 02:34:32 +11:00
|
|
|
VIEW3D_MT_bone_options_toggle,
|
|
|
|
VIEW3D_MT_bone_options_enable,
|
|
|
|
VIEW3D_MT_bone_options_disable,
|
|
|
|
VIEW3D_MT_edit_mesh_specials,
|
|
|
|
VIEW3D_MT_edit_mesh_select_mode,
|
2017-10-19 14:45:56 +11:00
|
|
|
VIEW3D_MT_edit_mesh_select_linked,
|
|
|
|
VIEW3D_MT_edit_mesh_select_loops,
|
2017-03-20 02:34:32 +11:00
|
|
|
VIEW3D_MT_edit_mesh_extrude,
|
|
|
|
VIEW3D_MT_edit_mesh_vertices,
|
|
|
|
VIEW3D_MT_edit_mesh_edges,
|
2018-04-01 10:16:28 +02:00
|
|
|
VIEW3D_MT_edit_mesh_edges_data,
|
2017-03-20 02:34:32 +11:00
|
|
|
VIEW3D_MT_edit_mesh_faces,
|
|
|
|
VIEW3D_MT_edit_mesh_normals,
|
2018-04-24 21:07:05 +02:00
|
|
|
VIEW3D_MT_edit_mesh_shading,
|
2018-04-24 16:54:38 +02:00
|
|
|
VIEW3D_MT_edit_mesh_weights,
|
2017-03-20 02:34:32 +11:00
|
|
|
VIEW3D_MT_edit_mesh_clean,
|
|
|
|
VIEW3D_MT_edit_mesh_delete,
|
|
|
|
VIEW3D_MT_edit_mesh_showhide,
|
|
|
|
VIEW3D_MT_edit_gpencil,
|
|
|
|
VIEW3D_MT_edit_gpencil_delete,
|
|
|
|
VIEW3D_MT_edit_curve,
|
|
|
|
VIEW3D_MT_edit_curve_ctrlpoints,
|
|
|
|
VIEW3D_MT_edit_curve_segments,
|
2017-10-30 22:36:51 +11:00
|
|
|
VIEW3D_MT_edit_curve_clean,
|
2017-03-20 02:34:32 +11:00
|
|
|
VIEW3D_MT_edit_curve_specials,
|
|
|
|
VIEW3D_MT_edit_curve_delete,
|
|
|
|
VIEW3D_MT_edit_curve_showhide,
|
|
|
|
VIEW3D_MT_edit_surface,
|
|
|
|
VIEW3D_MT_edit_font,
|
|
|
|
VIEW3D_MT_edit_text_chars,
|
|
|
|
VIEW3D_MT_edit_meta,
|
|
|
|
VIEW3D_MT_edit_meta_showhide,
|
|
|
|
VIEW3D_MT_edit_lattice,
|
|
|
|
VIEW3D_MT_edit_armature,
|
|
|
|
VIEW3D_MT_armature_specials,
|
|
|
|
VIEW3D_MT_edit_armature_parent,
|
|
|
|
VIEW3D_MT_edit_armature_roll,
|
|
|
|
VIEW3D_MT_edit_armature_delete,
|
|
|
|
VIEW3D_MT_edit_gpencil_transform,
|
|
|
|
VIEW3D_MT_edit_gpencil_interpolate,
|
2017-03-18 20:03:24 +11:00
|
|
|
VIEW3D_PT_grease_pencil,
|
|
|
|
VIEW3D_PT_grease_pencil_palettecolor,
|
2017-03-20 02:34:32 +11:00
|
|
|
VIEW3D_PT_view3d_properties,
|
2017-03-18 20:03:24 +11:00
|
|
|
VIEW3D_PT_view3d_cursor,
|
2017-03-20 02:34:32 +11:00
|
|
|
VIEW3D_PT_view3d_name,
|
2018-04-29 08:47:14 +02:00
|
|
|
VIEW3D_PT_quad_view,
|
2017-03-20 02:34:32 +11:00
|
|
|
VIEW3D_PT_view3d_stereo,
|
|
|
|
VIEW3D_PT_view3d_motion_tracking,
|
2017-03-18 20:03:24 +11:00
|
|
|
VIEW3D_PT_view3d_meshdisplay,
|
|
|
|
VIEW3D_PT_view3d_meshstatvis,
|
2017-03-20 02:34:32 +11:00
|
|
|
VIEW3D_PT_view3d_curvedisplay,
|
2018-04-29 08:47:14 +02:00
|
|
|
VIEW3D_PT_shading,
|
2018-04-29 09:44:57 +02:00
|
|
|
VIEW3D_PT_overlay,
|
2017-03-20 02:34:32 +11:00
|
|
|
VIEW3D_PT_transform_orientations,
|
|
|
|
VIEW3D_PT_context_properties,
|
2017-03-18 20:03:24 +11:00
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
if __name__ == "__main__": # only for live edit.
|
|
|
|
from bpy.utils import register_class
|
|
|
|
for cls in classes:
|
|
|
|
register_class(cls)
|