2017-10-21 16:19:48 +11: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.
|
|
|
|
#
|
|
|
|
# This program is distributed in the hope that it will be useful,
|
|
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
# GNU General Public License for more details.
|
|
|
|
#
|
|
|
|
# You should have received a copy of the GNU General Public License
|
|
|
|
# along with this program; if not, write to the Free Software Foundation,
|
|
|
|
# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
|
|
#
|
|
|
|
# ##### END GPL LICENSE BLOCK #####
|
|
|
|
|
|
|
|
# <pep8 compliant>
|
|
|
|
|
|
|
|
# For now group all tools together
|
|
|
|
# we may want to move these into per space-type files.
|
|
|
|
#
|
|
|
|
# For now keep this in a single file since it's an area that may change,
|
|
|
|
# so avoid making changes all over the place.
|
|
|
|
|
2018-07-31 10:22:19 +02:00
|
|
|
import bpy
|
2017-10-21 16:19:48 +11:00
|
|
|
from bpy.types import Panel
|
|
|
|
|
|
|
|
from .space_toolsystem_common import (
|
|
|
|
ToolSelectPanelHelper,
|
2018-04-27 13:23:29 +02:00
|
|
|
ToolDef,
|
2017-10-21 16:19:48 +11:00
|
|
|
)
|
2018-09-27 20:50:05 +02:00
|
|
|
from .properties_material_gpencil import (
|
|
|
|
GPENCIL_UL_matslots,
|
|
|
|
)
|
2018-10-15 18:54:09 +02:00
|
|
|
from .properties_grease_pencil_common import (
|
|
|
|
AnnotationDataPanel,
|
|
|
|
)
|
2018-05-07 21:38:43 +02:00
|
|
|
|
2018-11-02 09:10:23 +11:00
|
|
|
|
|
|
|
def generate_from_brushes_tool_slots_ex(
|
|
|
|
context, paint, *,
|
2018-04-30 15:21:04 +02:00
|
|
|
icon_prefix,
|
|
|
|
brush_category_attr,
|
|
|
|
brush_category_layout,
|
2018-11-02 09:10:23 +11:00
|
|
|
# Optional
|
|
|
|
tooldef_keywords={},
|
2018-04-30 15:21:04 +02:00
|
|
|
):
|
|
|
|
# Categories
|
|
|
|
brush_categories = {}
|
2018-11-02 09:10:23 +11:00
|
|
|
for paint_slot in paint.tool_slots:
|
|
|
|
brush = paint_slot.brush
|
|
|
|
if brush is None:
|
|
|
|
continue
|
|
|
|
category = getattr(brush, brush_category_attr)
|
|
|
|
name = brush.name
|
|
|
|
brush_categories.setdefault(category, []).append(
|
|
|
|
ToolDef.from_dict(
|
|
|
|
dict(
|
|
|
|
text=name,
|
2018-11-03 20:33:59 +11:00
|
|
|
icon=icon_prefix + category.lower(),
|
2018-11-02 09:10:23 +11:00
|
|
|
data_block=name,
|
|
|
|
**tooldef_keywords,
|
|
|
|
)
|
|
|
|
)
|
|
|
|
)
|
2018-04-30 15:21:04 +02:00
|
|
|
|
|
|
|
def tools_from_brush_group(groups):
|
|
|
|
assert(type(groups) is tuple)
|
|
|
|
if len(groups) == 1:
|
|
|
|
tool_defs = tuple(brush_categories.pop(groups[0], ()))
|
|
|
|
else:
|
|
|
|
tool_defs = tuple(item for g in groups for item in brush_categories.pop(g, ()))
|
2018-07-31 10:22:19 +02:00
|
|
|
|
2018-04-30 15:21:04 +02:00
|
|
|
if len(tool_defs) > 1:
|
|
|
|
return (tool_defs,)
|
|
|
|
else:
|
|
|
|
return tool_defs
|
|
|
|
|
|
|
|
# Each item below is a single toolbar entry:
|
|
|
|
# Grouped for multiple or none if no brushes are found.
|
|
|
|
tool_defs = tuple(
|
|
|
|
tool_def
|
|
|
|
for category in brush_category_layout
|
|
|
|
for tool_def in tools_from_brush_group(category)
|
|
|
|
)
|
|
|
|
# Ensure we use all types.
|
2018-04-30 21:57:51 +02:00
|
|
|
if brush_categories:
|
|
|
|
print(brush_categories)
|
2018-04-30 15:21:04 +02:00
|
|
|
assert(len(brush_categories) == 0)
|
|
|
|
return tool_defs
|
|
|
|
|
|
|
|
|
2018-08-02 17:41:11 +10:00
|
|
|
def generate_from_enum_ex(
|
|
|
|
context, *,
|
|
|
|
icon_prefix,
|
2018-11-05 13:54:43 +11:00
|
|
|
type,
|
2018-08-02 17:41:11 +10:00
|
|
|
attr,
|
|
|
|
):
|
|
|
|
tool_defs = []
|
2018-11-05 13:54:43 +11:00
|
|
|
for enum in type.bl_rna.properties[attr].enum_items_static:
|
2018-08-02 17:41:11 +10:00
|
|
|
name = enum.name
|
|
|
|
identifier = enum.identifier
|
|
|
|
tool_defs.append(
|
|
|
|
ToolDef.from_dict(
|
|
|
|
dict(
|
|
|
|
text=name,
|
|
|
|
icon=icon_prefix + identifier.lower(),
|
|
|
|
data_block=identifier,
|
|
|
|
)
|
|
|
|
)
|
|
|
|
)
|
|
|
|
return tuple(tool_defs)
|
|
|
|
|
|
|
|
|
2018-04-27 13:23:29 +02:00
|
|
|
class _defs_view3d_generic:
|
2018-04-30 12:14:46 +02:00
|
|
|
@ToolDef.from_fn
|
|
|
|
def cursor():
|
2018-06-22 15:07:11 +02:00
|
|
|
def draw_settings(context, layout, tool):
|
|
|
|
props = tool.operator_properties("view3d.cursor3d")
|
|
|
|
layout.prop(props, "use_depth")
|
|
|
|
layout.prop(props, "orientation")
|
2018-04-30 12:14:46 +02:00
|
|
|
return dict(
|
2018-05-07 21:38:43 +02:00
|
|
|
text="Cursor",
|
2018-08-31 14:37:10 +10:00
|
|
|
description=(
|
2018-10-04 12:04:36 +10:00
|
|
|
"Set the cursor location, drag to transform"
|
2018-08-31 14:37:10 +10:00
|
|
|
),
|
2018-05-07 21:38:43 +02:00
|
|
|
icon="ops.generic.cursor",
|
|
|
|
keymap=(
|
2018-05-25 12:45:18 +02:00
|
|
|
("view3d.cursor3d", dict(), dict(type='ACTIONMOUSE', value='PRESS')),
|
2018-05-25 19:43:23 +02:00
|
|
|
("transform.translate",
|
|
|
|
dict(release_confirm=True, cursor_transform=True),
|
|
|
|
dict(type='EVT_TWEAK_A', value='ANY'),
|
2018-06-05 16:35:20 +02:00
|
|
|
),
|
2018-05-07 21:38:43 +02:00
|
|
|
),
|
2018-06-22 15:07:11 +02:00
|
|
|
draw_settings=draw_settings,
|
2018-05-07 21:38:43 +02:00
|
|
|
)
|
2018-04-30 12:14:46 +02:00
|
|
|
|
2018-05-28 18:05:21 +02:00
|
|
|
@ToolDef.from_fn
|
|
|
|
def cursor_click():
|
|
|
|
return dict(
|
2018-06-15 12:28:19 +02:00
|
|
|
text="None",
|
2018-05-28 18:05:21 +02:00
|
|
|
icon="ops.generic.cursor",
|
|
|
|
keymap=(
|
2018-06-15 12:28:19 +02:00
|
|
|
# This is a dummy keymap entry, until particle system is properly working with toolsystem.
|
|
|
|
("view3d.cursor3d", dict(), dict(type='ACTIONMOUSE', value='CLICK', ctrl=True, alt=True, shift=True)),
|
2018-05-28 18:05:21 +02:00
|
|
|
),
|
|
|
|
)
|
|
|
|
|
2018-04-30 12:14:46 +02:00
|
|
|
@ToolDef.from_fn
|
|
|
|
def ruler():
|
|
|
|
return dict(
|
2018-08-23 16:50:43 +10:00
|
|
|
text="Measure",
|
2018-09-07 11:48:03 +10:00
|
|
|
description=(
|
|
|
|
"Measure distance and angles.\n"
|
|
|
|
"\u2022 Drag anywhere for new measurement.\n"
|
|
|
|
"\u2022 Drag ruler segment to measure an angle.\n"
|
|
|
|
"\u2022 Drag ruler outside the view to remove.\n"
|
|
|
|
"\u2022 Ctrl to snap.\n"
|
|
|
|
"\u2022 Shift to measure surface thickness"
|
|
|
|
),
|
2018-05-07 21:38:43 +02:00
|
|
|
icon="ops.view3d.ruler",
|
2018-07-15 14:24:10 +02:00
|
|
|
widget="VIEW3D_GGT_ruler",
|
2018-05-07 21:38:43 +02:00
|
|
|
keymap=(
|
|
|
|
("view3d.ruler_add", dict(), dict(type='EVT_TWEAK_A', value='ANY')),
|
|
|
|
),
|
|
|
|
)
|
|
|
|
|
2018-08-28 21:00:25 +10:00
|
|
|
|
2018-08-23 20:25:25 +10:00
|
|
|
def _defs_annotate_factory():
|
2018-04-27 13:23:29 +02:00
|
|
|
|
2018-08-23 20:25:25 +10:00
|
|
|
class _defs_annotate:
|
2018-11-05 06:57:01 +11:00
|
|
|
|
2018-08-23 20:25:25 +10:00
|
|
|
def draw_settings_common(context, layout, tool):
|
2018-10-10 11:10:13 +11:00
|
|
|
if type(context.gpencil_data_owner) is bpy.types.Object:
|
|
|
|
gpd = context.scene.grease_pencil
|
|
|
|
else:
|
|
|
|
gpd = context.gpencil_data
|
2018-10-15 18:54:09 +02:00
|
|
|
|
2018-10-10 11:10:13 +11:00
|
|
|
if gpd is not None:
|
2018-10-15 18:54:09 +02:00
|
|
|
if gpd.layers.active_note is not None:
|
|
|
|
text = gpd.layers.active_note
|
|
|
|
maxw = 25
|
|
|
|
if len(text) > maxw:
|
|
|
|
text = text[:maxw - 5] + '..' + text[-3:]
|
|
|
|
else:
|
|
|
|
text = ""
|
|
|
|
|
|
|
|
layout.label(text="Annotation:")
|
|
|
|
gpl = context.active_gpencil_layer
|
2018-10-16 09:13:26 +11:00
|
|
|
if gpl is not None:
|
|
|
|
sub = layout.row(align=True)
|
|
|
|
sub.ui_units_x = 8
|
|
|
|
|
|
|
|
sub.prop(gpl, "color", text="")
|
|
|
|
sub.popover(
|
|
|
|
panel="TOPBAR_PT_annotation_layers",
|
|
|
|
text=text,
|
|
|
|
)
|
2018-07-31 10:22:19 +02:00
|
|
|
|
2018-10-10 11:12:41 +11:00
|
|
|
tool_settings = context.tool_settings
|
2018-08-23 20:25:25 +10:00
|
|
|
space_type = tool.space_type
|
|
|
|
if space_type == 'VIEW_3D':
|
|
|
|
layout.separator()
|
2018-07-31 10:22:19 +02:00
|
|
|
|
2018-08-23 20:25:25 +10:00
|
|
|
row = layout.row(align=True)
|
2018-10-10 11:12:41 +11:00
|
|
|
row.prop(tool_settings, "annotation_stroke_placement_view3d", text="Placement")
|
|
|
|
if tool_settings.gpencil_stroke_placement_view3d == 'CURSOR':
|
|
|
|
row.prop(tool_settings.gpencil_sculpt, "lockaxis")
|
|
|
|
elif tool_settings.gpencil_stroke_placement_view3d in {'SURFACE', 'STROKE'}:
|
|
|
|
row.prop(tool_settings, "use_gpencil_stroke_endpoints")
|
2018-08-23 20:25:25 +10:00
|
|
|
|
2018-11-05 11:57:37 +11:00
|
|
|
@ToolDef.from_fn.with_args(draw_settings=draw_settings_common)
|
|
|
|
def scribble(*, draw_settings):
|
2018-08-23 20:25:25 +10:00
|
|
|
return dict(
|
|
|
|
text="Annotate",
|
|
|
|
icon="ops.gpencil.draw",
|
|
|
|
cursor='PAINT_BRUSH',
|
|
|
|
keymap=(
|
|
|
|
("gpencil.annotate",
|
|
|
|
dict(mode='DRAW', wait_for_input=False),
|
2018-09-07 21:16:03 +10:00
|
|
|
dict(type='ACTIONMOUSE', value='PRESS')),
|
2018-08-23 20:25:25 +10:00
|
|
|
),
|
2018-11-05 11:57:37 +11:00
|
|
|
draw_settings=draw_settings,
|
2018-08-23 20:25:25 +10:00
|
|
|
)
|
2018-07-31 10:22:19 +02:00
|
|
|
|
2018-11-05 11:57:37 +11:00
|
|
|
@ToolDef.from_fn.with_args(draw_settings=draw_settings_common)
|
|
|
|
def line(*, draw_settings):
|
2018-08-23 20:25:25 +10:00
|
|
|
return dict(
|
2018-08-28 20:43:34 +10:00
|
|
|
text="Annotate Line",
|
2018-08-23 20:25:25 +10:00
|
|
|
icon="ops.gpencil.draw.line",
|
|
|
|
cursor='CROSSHAIR',
|
|
|
|
keymap=(
|
|
|
|
("gpencil.annotate",
|
|
|
|
dict(mode='DRAW_STRAIGHT', wait_for_input=False),
|
|
|
|
dict(type='EVT_TWEAK_A', value='ANY')),
|
|
|
|
),
|
2018-11-05 11:57:37 +11:00
|
|
|
draw_settings=draw_settings,
|
2018-08-23 20:25:25 +10:00
|
|
|
)
|
2018-07-31 10:22:19 +02:00
|
|
|
|
2018-11-05 11:57:37 +11:00
|
|
|
@ToolDef.from_fn.with_args(draw_settings=draw_settings_common)
|
|
|
|
def poly(*, draw_settings):
|
2018-08-23 20:25:25 +10:00
|
|
|
return dict(
|
2018-08-28 20:43:34 +10:00
|
|
|
text="Annotate Polygon",
|
2018-08-23 20:25:25 +10:00
|
|
|
icon="ops.gpencil.draw.poly",
|
|
|
|
cursor='CROSSHAIR',
|
|
|
|
keymap=(
|
|
|
|
("gpencil.annotate",
|
|
|
|
dict(mode='DRAW_POLY', wait_for_input=False),
|
|
|
|
dict(type='ACTIONMOUSE', value='PRESS')),
|
|
|
|
),
|
2018-11-05 11:57:37 +11:00
|
|
|
draw_settings=draw_settings,
|
2018-08-23 20:25:25 +10:00
|
|
|
)
|
2018-07-31 10:22:19 +02:00
|
|
|
|
2018-08-23 20:25:25 +10:00
|
|
|
@ToolDef.from_fn
|
|
|
|
def eraser():
|
|
|
|
def draw_settings(context, layout, tool):
|
2018-10-10 11:12:41 +11:00
|
|
|
# TODO: Move this setting to tool_settings
|
2018-08-23 20:25:25 +10:00
|
|
|
user_prefs = context.user_preferences
|
|
|
|
layout.prop(user_prefs.edit, "grease_pencil_eraser_radius", text="Radius")
|
|
|
|
return dict(
|
2018-08-28 20:43:34 +10:00
|
|
|
text="Annotate Eraser",
|
2018-08-23 20:25:25 +10:00
|
|
|
icon="ops.gpencil.draw.eraser",
|
|
|
|
cursor='CROSSHAIR', # XXX: Always show brush circle when enabled
|
|
|
|
keymap=(
|
|
|
|
("gpencil.annotate",
|
|
|
|
dict(mode='ERASER', wait_for_input=False),
|
|
|
|
dict(type='ACTIONMOUSE', value='PRESS')),
|
|
|
|
),
|
|
|
|
draw_settings=draw_settings,
|
|
|
|
)
|
2018-11-05 06:57:01 +11:00
|
|
|
|
2018-08-23 20:25:25 +10:00
|
|
|
return _defs_annotate
|
2018-07-31 10:22:19 +02:00
|
|
|
|
2018-08-28 21:00:25 +10:00
|
|
|
|
2018-08-23 20:25:25 +10:00
|
|
|
# Needed so annotation gets a keymap per space type.
|
|
|
|
_defs_annotate_image = _defs_annotate_factory()
|
|
|
|
_defs_annotate_view3d = _defs_annotate_factory()
|
2018-07-31 10:22:19 +02:00
|
|
|
|
|
|
|
|
2018-04-27 13:23:29 +02:00
|
|
|
class _defs_transform:
|
|
|
|
|
2018-04-30 12:14:46 +02:00
|
|
|
@ToolDef.from_fn
|
|
|
|
def translate():
|
|
|
|
return dict(
|
2018-09-06 12:13:01 +02:00
|
|
|
text="Move",
|
2018-06-28 10:34:41 +02:00
|
|
|
# cursor='SCROLL_XY',
|
2018-05-07 21:38:43 +02:00
|
|
|
icon="ops.transform.translate",
|
2018-07-15 14:24:10 +02:00
|
|
|
widget="TRANSFORM_GGT_gizmo",
|
2018-07-03 18:33:52 +02:00
|
|
|
operator="transform.translate",
|
2018-10-18 12:30:23 +11:00
|
|
|
keymap=(
|
|
|
|
("transform.translate", dict(release_confirm=True), dict(type='EVT_TWEAK_A', value='ANY')),
|
|
|
|
),
|
2018-05-07 21:38:43 +02:00
|
|
|
)
|
2018-04-30 12:14:46 +02:00
|
|
|
|
|
|
|
@ToolDef.from_fn
|
|
|
|
def rotate():
|
|
|
|
return dict(
|
|
|
|
text="Rotate",
|
2018-06-28 10:34:41 +02:00
|
|
|
# cursor='SCROLL_XY',
|
2018-04-30 12:14:46 +02:00
|
|
|
icon="ops.transform.rotate",
|
2018-07-15 14:24:10 +02:00
|
|
|
widget="TRANSFORM_GGT_gizmo",
|
2018-07-03 18:33:52 +02:00
|
|
|
operator="transform.rotate",
|
2018-10-18 12:30:23 +11:00
|
|
|
keymap=(
|
|
|
|
("transform.rotate", dict(release_confirm=True), dict(type='EVT_TWEAK_A', value='ANY')),
|
|
|
|
),
|
2018-04-30 12:14:46 +02:00
|
|
|
)
|
|
|
|
|
|
|
|
@ToolDef.from_fn
|
|
|
|
def scale():
|
|
|
|
return dict(
|
|
|
|
text="Scale",
|
2018-06-28 10:34:41 +02:00
|
|
|
# cursor='SCROLL_XY',
|
2018-04-30 12:14:46 +02:00
|
|
|
icon="ops.transform.resize",
|
2018-07-15 14:24:10 +02:00
|
|
|
widget="TRANSFORM_GGT_gizmo",
|
2018-07-03 18:33:52 +02:00
|
|
|
operator="transform.resize",
|
2018-10-18 12:30:23 +11:00
|
|
|
keymap=(
|
|
|
|
("transform.resize", dict(release_confirm=True), dict(type='EVT_TWEAK_A', value='ANY')),
|
|
|
|
),
|
2018-04-30 12:14:46 +02:00
|
|
|
)
|
|
|
|
|
|
|
|
@ToolDef.from_fn
|
|
|
|
def scale_cage():
|
|
|
|
return dict(
|
|
|
|
text="Scale Cage",
|
|
|
|
icon="ops.transform.resize.cage",
|
2018-07-15 14:24:10 +02:00
|
|
|
widget="VIEW3D_GGT_xform_cage",
|
2018-07-03 18:33:52 +02:00
|
|
|
operator="transform.resize",
|
2018-04-30 12:14:46 +02:00
|
|
|
)
|
|
|
|
|
|
|
|
@ToolDef.from_fn
|
|
|
|
def transform():
|
2018-06-22 19:22:49 +02:00
|
|
|
def draw_settings(context, layout, tool):
|
2018-10-19 11:54:26 +11:00
|
|
|
layout.label(text="Gizmos:")
|
2018-06-22 19:22:49 +02:00
|
|
|
tool_settings = context.tool_settings
|
2018-07-29 11:54:12 +10:00
|
|
|
layout.prop(tool_settings, "use_gizmo_mode")
|
2018-10-19 11:54:26 +11:00
|
|
|
|
|
|
|
props = tool.gizmo_group_properties("TRANSFORM_GGT_gizmo")
|
|
|
|
layout.prop(props, "drag_action")
|
|
|
|
|
2018-04-30 12:14:46 +02:00
|
|
|
return dict(
|
|
|
|
text="Transform",
|
2018-08-31 14:37:10 +10:00
|
|
|
description=(
|
|
|
|
"Supports any combination of grab, rotate & scale at once"
|
|
|
|
),
|
2018-04-30 12:14:46 +02:00
|
|
|
icon="ops.transform.transform",
|
2018-07-15 14:24:10 +02:00
|
|
|
widget="TRANSFORM_GGT_gizmo",
|
2018-10-19 11:54:26 +11:00
|
|
|
keymap=(
|
|
|
|
("transform.from_gizmo", dict(), dict(type='EVT_TWEAK_A', value='ANY')),
|
|
|
|
),
|
2018-06-22 19:22:49 +02:00
|
|
|
draw_settings=draw_settings,
|
2018-05-07 21:38:43 +02:00
|
|
|
)
|
|
|
|
|
2018-04-27 13:23:29 +02:00
|
|
|
|
|
|
|
class _defs_view3d_select:
|
|
|
|
|
2018-04-30 12:14:46 +02:00
|
|
|
@ToolDef.from_fn
|
|
|
|
def border():
|
2018-08-14 10:28:41 +10:00
|
|
|
def draw_settings(context, layout, tool):
|
2018-10-05 10:27:04 +10:00
|
|
|
props = tool.operator_properties("view3d.select_box")
|
2018-08-14 10:28:41 +10:00
|
|
|
layout.prop(props, "mode", expand=True)
|
2018-04-30 12:14:46 +02:00
|
|
|
return dict(
|
2018-10-05 10:27:04 +10:00
|
|
|
text="Select Box",
|
|
|
|
icon="ops.generic.select_box",
|
2018-04-30 12:14:46 +02:00
|
|
|
widget=None,
|
|
|
|
keymap=(
|
2018-10-05 10:27:04 +10:00
|
|
|
("view3d.select_box",
|
2018-08-14 10:28:41 +10:00
|
|
|
dict(mode='ADD'),
|
2018-04-30 12:14:46 +02:00
|
|
|
dict(type='EVT_TWEAK_A', value='ANY')),
|
2018-10-05 10:27:04 +10:00
|
|
|
("view3d.select_box",
|
2018-08-14 10:28:41 +10:00
|
|
|
dict(mode='SUB'),
|
2018-09-27 21:18:02 +10:00
|
|
|
dict(type='EVT_TWEAK_A', value='ANY', ctrl=True)),
|
2018-04-30 12:14:46 +02:00
|
|
|
),
|
2018-08-14 10:28:41 +10:00
|
|
|
draw_settings=draw_settings,
|
2018-04-30 12:14:46 +02:00
|
|
|
)
|
|
|
|
|
|
|
|
@ToolDef.from_fn
|
|
|
|
def circle():
|
2018-08-29 15:03:50 +10:00
|
|
|
def draw_settings(context, layout, tool):
|
|
|
|
props = tool.operator_properties("view3d.select_circle")
|
|
|
|
layout.prop(props, "radius")
|
2018-10-25 21:05:29 +11:00
|
|
|
|
|
|
|
def draw_cursor(context, tool, xy):
|
|
|
|
from gpu_extras.presets import draw_circle_2d
|
|
|
|
props = tool.operator_properties("view3d.select_circle")
|
|
|
|
radius = props.radius
|
|
|
|
draw_circle_2d(xy, (1.0,) * 4, radius, 32)
|
|
|
|
|
2018-04-30 12:14:46 +02:00
|
|
|
return dict(
|
|
|
|
text="Select Circle",
|
|
|
|
icon="ops.generic.select_circle",
|
|
|
|
widget=None,
|
|
|
|
keymap=(
|
|
|
|
("view3d.select_circle",
|
|
|
|
dict(deselect=False),
|
|
|
|
dict(type='ACTIONMOUSE', value='PRESS')),
|
|
|
|
("view3d.select_circle",
|
|
|
|
dict(deselect=True),
|
2018-09-27 21:18:02 +10:00
|
|
|
dict(type='ACTIONMOUSE', value='PRESS', ctrl=True)),
|
2018-04-30 12:14:46 +02:00
|
|
|
),
|
2018-08-29 15:03:50 +10:00
|
|
|
draw_settings=draw_settings,
|
2018-10-25 21:05:29 +11:00
|
|
|
draw_cursor=draw_cursor,
|
2018-04-30 12:14:46 +02:00
|
|
|
)
|
|
|
|
|
|
|
|
@ToolDef.from_fn
|
|
|
|
def lasso():
|
2018-08-14 10:28:41 +10:00
|
|
|
def draw_settings(context, layout, tool):
|
|
|
|
props = tool.operator_properties("view3d.select_lasso")
|
|
|
|
layout.prop(props, "mode", expand=True)
|
2018-04-30 12:14:46 +02:00
|
|
|
return dict(
|
|
|
|
text="Select Lasso",
|
|
|
|
icon="ops.generic.select_lasso",
|
|
|
|
widget=None,
|
|
|
|
keymap=(
|
|
|
|
("view3d.select_lasso",
|
2018-08-14 10:28:41 +10:00
|
|
|
dict(mode='ADD'),
|
2018-04-30 12:14:46 +02:00
|
|
|
dict(type='EVT_TWEAK_A', value='ANY')),
|
|
|
|
("view3d.select_lasso",
|
2018-08-14 10:28:41 +10:00
|
|
|
dict(mode='SUB'),
|
2018-09-27 21:18:02 +10:00
|
|
|
dict(type='EVT_TWEAK_A', value='ANY', ctrl=True)),
|
2018-04-30 12:14:46 +02:00
|
|
|
),
|
2018-08-14 10:28:41 +10:00
|
|
|
draw_settings=draw_settings,
|
2018-04-27 13:23:29 +02:00
|
|
|
)
|
|
|
|
# -----------------------------------------------------------------------------
|
|
|
|
# Object Modes (named based on context.mode)
|
|
|
|
|
2018-05-07 21:38:43 +02:00
|
|
|
|
2018-04-27 13:23:29 +02:00
|
|
|
class _defs_edit_armature:
|
|
|
|
|
2018-04-30 12:14:46 +02:00
|
|
|
@ToolDef.from_fn
|
|
|
|
def roll():
|
|
|
|
return dict(
|
|
|
|
text="Roll",
|
|
|
|
icon="ops.armature.bone.roll",
|
|
|
|
widget=None,
|
|
|
|
keymap=(
|
|
|
|
("transform.transform",
|
|
|
|
dict(release_confirm=True, mode='BONE_ROLL'),
|
|
|
|
dict(type='EVT_TWEAK_A', value='ANY'),),
|
|
|
|
),
|
|
|
|
)
|
|
|
|
|
2018-05-15 10:24:26 +02:00
|
|
|
@ToolDef.from_fn
|
|
|
|
def bone_envelope():
|
|
|
|
return dict(
|
|
|
|
text="Bone Envelope",
|
2018-05-15 13:49:44 +02:00
|
|
|
icon="ops.transform.bone_envelope",
|
2018-05-15 10:24:26 +02:00
|
|
|
widget=None,
|
|
|
|
keymap=(
|
|
|
|
("transform.transform",
|
|
|
|
dict(release_confirm=True, mode='BONE_ENVELOPE'),
|
|
|
|
dict(type='ACTIONMOUSE', value='PRESS')),
|
|
|
|
),
|
|
|
|
)
|
|
|
|
|
|
|
|
@ToolDef.from_fn
|
|
|
|
def bone_size():
|
|
|
|
return dict(
|
|
|
|
text="Bone Size",
|
2018-05-15 13:49:44 +02:00
|
|
|
icon="ops.transform.bone_size",
|
2018-05-15 10:24:26 +02:00
|
|
|
widget=None,
|
|
|
|
keymap=(
|
|
|
|
("transform.transform",
|
|
|
|
dict(release_confirm=True, mode='BONE_SIZE'),
|
|
|
|
dict(type='ACTIONMOUSE', value='PRESS')),
|
|
|
|
),
|
|
|
|
)
|
|
|
|
|
2018-04-30 12:14:46 +02:00
|
|
|
@ToolDef.from_fn
|
|
|
|
def extrude():
|
|
|
|
return dict(
|
|
|
|
text="Extrude",
|
|
|
|
icon="ops.armature.extrude_move",
|
|
|
|
widget=None,
|
|
|
|
keymap=(
|
2018-08-29 11:11:11 +10:00
|
|
|
("armature.extrude_move",
|
|
|
|
dict(TRANSFORM_OT_translate=dict(release_confirm=True)),
|
|
|
|
dict(type='EVT_TWEAK_A', value='ANY')),
|
2018-04-30 12:14:46 +02:00
|
|
|
),
|
|
|
|
)
|
|
|
|
|
|
|
|
@ToolDef.from_fn
|
|
|
|
def extrude_cursor():
|
|
|
|
return dict(
|
|
|
|
text="Extrude to Cursor",
|
|
|
|
icon="ops.armature.extrude_cursor",
|
|
|
|
widget=None,
|
|
|
|
keymap=(
|
|
|
|
("armature.click_extrude", dict(), dict(type='ACTIONMOUSE', value='PRESS')),
|
|
|
|
),
|
2018-04-27 13:23:29 +02:00
|
|
|
)
|
2018-05-07 21:38:43 +02:00
|
|
|
|
|
|
|
|
2018-04-27 13:23:29 +02:00
|
|
|
class _defs_edit_mesh:
|
|
|
|
|
2018-05-10 20:16:22 +02:00
|
|
|
@ToolDef.from_fn
|
|
|
|
def cube_add():
|
|
|
|
return dict(
|
|
|
|
text="Add Cube",
|
2018-08-29 18:40:32 +10:00
|
|
|
icon="ops.mesh.primitive_cube_add_gizmo",
|
2018-05-10 20:16:22 +02:00
|
|
|
widget=None,
|
|
|
|
keymap=(
|
|
|
|
("view3d.cursor3d", dict(), dict(type='ACTIONMOUSE', value='CLICK')),
|
2018-07-14 23:58:07 +02:00
|
|
|
("mesh.primitive_cube_add_gizmo", dict(), dict(type='EVT_TWEAK_A', value='ANY')),
|
2018-05-10 20:16:22 +02:00
|
|
|
),
|
|
|
|
)
|
|
|
|
|
2018-04-30 12:14:46 +02:00
|
|
|
@ToolDef.from_fn
|
|
|
|
def rip_region():
|
2018-05-22 14:00:44 +02:00
|
|
|
def draw_settings(context, layout, tool):
|
|
|
|
props = tool.operator_properties("mesh.rip_move")
|
2018-05-11 20:22:04 +02:00
|
|
|
props_macro = props.MESH_OT_rip
|
|
|
|
layout.prop(props_macro, "use_fill")
|
|
|
|
|
2018-04-30 12:14:46 +02:00
|
|
|
return dict(
|
|
|
|
text="Rip Region",
|
|
|
|
icon="ops.mesh.rip",
|
|
|
|
widget=None,
|
|
|
|
keymap=(
|
2018-05-11 20:22:04 +02:00
|
|
|
("mesh.rip_move",
|
|
|
|
dict(TRANSFORM_OT_translate=dict(release_confirm=True)),
|
2018-04-30 12:14:46 +02:00
|
|
|
dict(type='ACTIONMOUSE', value='PRESS')),
|
|
|
|
),
|
2018-05-11 20:22:04 +02:00
|
|
|
draw_settings=draw_settings,
|
2018-04-30 12:14:46 +02:00
|
|
|
)
|
|
|
|
|
|
|
|
@ToolDef.from_fn
|
|
|
|
def rip_edge():
|
|
|
|
return dict(
|
|
|
|
text="Rip Edge",
|
|
|
|
icon="ops.mesh.rip_edge",
|
|
|
|
widget=None,
|
|
|
|
keymap=(
|
2018-09-05 08:45:46 +10:00
|
|
|
("mesh.rip_edge_move",
|
|
|
|
dict(TRANSFORM_OT_translate=dict(release_confirm=True)),
|
2018-04-30 12:14:46 +02:00
|
|
|
dict(type='ACTIONMOUSE', value='PRESS')),
|
|
|
|
),
|
|
|
|
)
|
|
|
|
|
|
|
|
@ToolDef.from_fn
|
|
|
|
def poly_build():
|
|
|
|
return dict(
|
|
|
|
text="Poly Build",
|
|
|
|
icon="ops.mesh.polybuild_hover",
|
2018-09-09 16:11:02 +10:00
|
|
|
widget="VIEW3D_GGT_mesh_preselect_elem",
|
2018-04-30 12:14:46 +02:00
|
|
|
keymap=(
|
|
|
|
("mesh.polybuild_face_at_cursor_move",
|
|
|
|
dict(TRANSFORM_OT_translate=dict(release_confirm=True)),
|
|
|
|
dict(type='ACTIONMOUSE', value='PRESS')),
|
|
|
|
("mesh.polybuild_split_at_cursor_move",
|
|
|
|
dict(TRANSFORM_OT_translate=dict(release_confirm=True)),
|
|
|
|
dict(type='ACTIONMOUSE', value='PRESS', ctrl=True)),
|
|
|
|
("mesh.polybuild_dissolve_at_cursor", dict(), dict(type='ACTIONMOUSE', value='CLICK', alt=True)),
|
|
|
|
),
|
|
|
|
)
|
|
|
|
|
|
|
|
@ToolDef.from_fn
|
|
|
|
def edge_slide():
|
2018-08-22 17:53:03 +10:00
|
|
|
def draw_settings(context, layout, tool):
|
|
|
|
props = tool.operator_properties("transform.edge_slide")
|
|
|
|
layout.prop(props, "correct_uv")
|
|
|
|
|
2018-04-30 12:14:46 +02:00
|
|
|
return dict(
|
|
|
|
text="Edge Slide",
|
|
|
|
icon="ops.transform.edge_slide",
|
|
|
|
widget=None,
|
|
|
|
keymap=(
|
|
|
|
("transform.edge_slide", dict(release_confirm=True),
|
|
|
|
dict(type='ACTIONMOUSE', value='PRESS')
|
2018-05-07 21:38:43 +02:00
|
|
|
),
|
2018-04-30 12:14:46 +02:00
|
|
|
),
|
2018-08-22 17:53:03 +10:00
|
|
|
draw_settings=draw_settings,
|
2018-04-30 12:14:46 +02:00
|
|
|
)
|
|
|
|
|
|
|
|
@ToolDef.from_fn
|
|
|
|
def vert_slide():
|
2018-08-22 17:53:03 +10:00
|
|
|
def draw_settings(context, layout, tool):
|
|
|
|
props = tool.operator_properties("transform.vert_slide")
|
|
|
|
layout.prop(props, "correct_uv")
|
|
|
|
|
2018-04-30 12:14:46 +02:00
|
|
|
return dict(
|
|
|
|
text="Vertex Slide",
|
|
|
|
icon="ops.transform.vert_slide",
|
|
|
|
widget=None,
|
|
|
|
keymap=(
|
|
|
|
("transform.vert_slide", dict(release_confirm=True),
|
|
|
|
dict(type='ACTIONMOUSE', value='PRESS')),
|
|
|
|
),
|
2018-08-22 17:53:03 +10:00
|
|
|
draw_settings=draw_settings,
|
2018-04-30 12:14:46 +02:00
|
|
|
)
|
|
|
|
|
|
|
|
@ToolDef.from_fn
|
|
|
|
def spin():
|
2018-09-17 14:52:54 +10:00
|
|
|
def draw_settings(context, layout, tool):
|
|
|
|
props = tool.operator_properties("mesh.spin")
|
|
|
|
layout.prop(props, "steps")
|
2018-10-02 17:05:13 +10:00
|
|
|
props = tool.gizmo_group_properties("MESH_GGT_spin")
|
|
|
|
layout.prop(props, "axis")
|
2018-09-17 14:52:54 +10:00
|
|
|
|
2018-04-30 12:14:46 +02:00
|
|
|
return dict(
|
|
|
|
text="Spin",
|
|
|
|
icon="ops.mesh.spin",
|
2018-09-18 13:24:35 +10:00
|
|
|
widget="MESH_GGT_spin",
|
2018-04-30 12:14:46 +02:00
|
|
|
keymap=(
|
|
|
|
("mesh.spin", dict(),
|
2018-09-17 14:34:51 +10:00
|
|
|
dict(type='EVT_TWEAK_A', value='ANY')),
|
2018-04-30 12:14:46 +02:00
|
|
|
),
|
2018-09-17 14:52:54 +10:00
|
|
|
draw_settings=draw_settings,
|
2018-04-30 12:14:46 +02:00
|
|
|
)
|
|
|
|
|
|
|
|
@ToolDef.from_fn
|
|
|
|
def spin_duplicate():
|
2018-09-17 14:52:54 +10:00
|
|
|
def draw_settings(context, layout, tool):
|
|
|
|
props = tool.operator_properties("mesh.spin")
|
|
|
|
layout.prop(props, "steps")
|
2018-10-02 17:05:13 +10:00
|
|
|
props = tool.gizmo_group_properties("MESH_GGT_spin")
|
|
|
|
layout.prop(props, "axis")
|
2018-09-17 14:52:54 +10:00
|
|
|
|
2018-04-30 12:14:46 +02:00
|
|
|
return dict(
|
|
|
|
text="Spin (Duplicate)",
|
|
|
|
icon="ops.mesh.spin.duplicate",
|
2018-09-18 13:24:35 +10:00
|
|
|
widget="MESH_GGT_spin",
|
2018-04-30 12:14:46 +02:00
|
|
|
keymap=(
|
|
|
|
("mesh.spin", dict(dupli=True),
|
2018-09-17 14:52:54 +10:00
|
|
|
dict(type='EVT_TWEAK_A', value='ANY')),
|
2018-04-30 12:14:46 +02:00
|
|
|
),
|
2018-09-17 14:52:54 +10:00
|
|
|
draw_settings=draw_settings,
|
2018-04-30 12:14:46 +02:00
|
|
|
)
|
|
|
|
|
|
|
|
@ToolDef.from_fn
|
|
|
|
def inset():
|
2018-05-22 14:00:44 +02:00
|
|
|
def draw_settings(context, layout, tool):
|
|
|
|
props = tool.operator_properties("mesh.inset")
|
2018-05-11 20:23:29 +02:00
|
|
|
layout.prop(props, "use_outset")
|
|
|
|
layout.prop(props, "use_individual")
|
|
|
|
layout.prop(props, "use_even_offset")
|
|
|
|
layout.prop(props, "use_relative_offset")
|
|
|
|
|
2018-04-30 12:14:46 +02:00
|
|
|
return dict(
|
|
|
|
text="Inset Faces",
|
|
|
|
icon="ops.mesh.inset",
|
|
|
|
widget=None,
|
|
|
|
keymap=(
|
|
|
|
("mesh.inset", dict(release_confirm=True),
|
|
|
|
dict(type='ACTIONMOUSE', value='PRESS')),
|
|
|
|
),
|
2018-05-11 20:23:29 +02:00
|
|
|
draw_settings=draw_settings,
|
2018-04-30 12:14:46 +02:00
|
|
|
)
|
|
|
|
|
|
|
|
@ToolDef.from_fn
|
|
|
|
def bevel():
|
2018-08-22 17:37:07 +10:00
|
|
|
def draw_settings(context, layout, tool):
|
|
|
|
props = tool.operator_properties("mesh.bevel")
|
|
|
|
layout.prop(props, "offset_type")
|
|
|
|
layout.prop(props, "segments")
|
|
|
|
layout.prop(props, "profile", slider=True)
|
|
|
|
layout.prop(props, "vertex_only")
|
|
|
|
|
2018-04-30 12:14:46 +02:00
|
|
|
return dict(
|
|
|
|
text="Bevel",
|
|
|
|
icon="ops.mesh.bevel",
|
|
|
|
widget=None,
|
|
|
|
keymap=(
|
2018-08-22 17:43:49 +10:00
|
|
|
("mesh.bevel", dict(release_confirm=True),
|
2018-04-30 12:14:46 +02:00
|
|
|
dict(type='ACTIONMOUSE', value='PRESS')),
|
|
|
|
),
|
2018-08-22 17:37:07 +10:00
|
|
|
draw_settings=draw_settings,
|
2018-04-30 12:14:46 +02:00
|
|
|
)
|
|
|
|
|
|
|
|
@ToolDef.from_fn
|
|
|
|
def extrude():
|
2018-10-02 18:16:00 +10:00
|
|
|
def draw_settings(context, layout, tool):
|
|
|
|
props = tool.gizmo_group_properties("MESH_GGT_extrude")
|
|
|
|
layout.prop(props, "axis_type", expand=True)
|
2018-04-30 12:14:46 +02:00
|
|
|
return dict(
|
|
|
|
text="Extrude Region",
|
2018-10-02 18:48:28 +10:00
|
|
|
# The operator description isn't useful in this case, give our own.
|
|
|
|
description=(
|
|
|
|
"Extrude freely or along an axis"
|
|
|
|
),
|
2018-04-30 12:14:46 +02:00
|
|
|
icon="ops.mesh.extrude_region_move",
|
2018-07-15 14:24:10 +02:00
|
|
|
widget="MESH_GGT_extrude",
|
2018-10-02 18:48:28 +10:00
|
|
|
# Important to use same operator as 'E' key.
|
|
|
|
operator="view3d.edit_mesh_extrude_move_normal",
|
2018-04-30 12:14:46 +02:00
|
|
|
keymap=(
|
2018-08-29 11:11:11 +10:00
|
|
|
("mesh.extrude_context_move",
|
|
|
|
dict(TRANSFORM_OT_translate=dict(release_confirm=True)),
|
2018-05-13 21:19:22 +02:00
|
|
|
dict(type='EVT_TWEAK_A', value='ANY')),
|
2018-04-30 12:14:46 +02:00
|
|
|
),
|
2018-10-02 18:16:00 +10:00
|
|
|
draw_settings=draw_settings,
|
2018-04-30 12:14:46 +02:00
|
|
|
)
|
|
|
|
|
2018-08-29 22:59:49 +10:00
|
|
|
@ToolDef.from_fn
|
|
|
|
def extrude_normals():
|
|
|
|
def draw_settings(context, layout, tool):
|
|
|
|
props = tool.operator_properties("mesh.extrude_region_shrink_fatten")
|
|
|
|
props_macro = props.TRANSFORM_OT_shrink_fatten
|
|
|
|
layout.prop(props_macro, "use_even_offset")
|
|
|
|
return dict(
|
|
|
|
text="Extrude Along Normals",
|
|
|
|
icon="ops.mesh.extrude_region_shrink_fatten",
|
|
|
|
widget=None,
|
2018-10-02 15:17:00 +10:00
|
|
|
operator="mesh.extrude_region_shrink_fatten",
|
2018-08-29 22:59:49 +10:00
|
|
|
keymap=(
|
|
|
|
("mesh.extrude_region_shrink_fatten",
|
|
|
|
dict(TRANSFORM_OT_shrink_fatten=dict(release_confirm=True)),
|
|
|
|
dict(type='EVT_TWEAK_A', value='ANY')),
|
|
|
|
),
|
|
|
|
draw_settings=draw_settings,
|
|
|
|
)
|
|
|
|
|
2018-04-30 12:14:46 +02:00
|
|
|
@ToolDef.from_fn
|
|
|
|
def extrude_individual():
|
|
|
|
return dict(
|
|
|
|
text="Extrude Individual",
|
|
|
|
icon="ops.mesh.extrude_faces_move",
|
|
|
|
widget=None,
|
|
|
|
keymap=(
|
|
|
|
("mesh.extrude_faces_move", dict(TRANSFORM_OT_shrink_fatten=dict(release_confirm=True)),
|
2018-05-13 21:19:22 +02:00
|
|
|
dict(type='EVT_TWEAK_A', value='ANY')),
|
2018-04-30 12:14:46 +02:00
|
|
|
),
|
|
|
|
)
|
|
|
|
|
|
|
|
@ToolDef.from_fn
|
|
|
|
def extrude_cursor():
|
2018-09-27 12:23:01 +10:00
|
|
|
def draw_settings(context, layout, tool):
|
|
|
|
props = tool.operator_properties("mesh.dupli_extrude_cursor")
|
|
|
|
layout.prop(props, "rotate_source")
|
|
|
|
|
2018-04-30 12:14:46 +02:00
|
|
|
return dict(
|
|
|
|
text="Extrude to Cursor",
|
|
|
|
icon="ops.mesh.dupli_extrude_cursor",
|
|
|
|
widget=None,
|
|
|
|
keymap=(
|
|
|
|
("mesh.dupli_extrude_cursor", dict(), dict(type='ACTIONMOUSE', value='PRESS')),
|
|
|
|
),
|
2018-09-27 12:23:01 +10:00
|
|
|
draw_settings=draw_settings,
|
2018-04-30 12:14:46 +02:00
|
|
|
)
|
|
|
|
|
|
|
|
@ToolDef.from_fn
|
|
|
|
def loopcut_slide():
|
2018-08-22 14:04:37 +10:00
|
|
|
|
|
|
|
def draw_settings(context, layout, tool):
|
|
|
|
props = tool.operator_properties("mesh.loopcut_slide")
|
|
|
|
props_macro = props.MESH_OT_loopcut
|
|
|
|
layout.prop(props_macro, "number_cuts")
|
|
|
|
props_macro = props.TRANSFORM_OT_edge_slide
|
|
|
|
layout.prop(props_macro, "correct_uv")
|
|
|
|
|
2018-04-30 12:14:46 +02:00
|
|
|
return dict(
|
|
|
|
text="Loop Cut",
|
|
|
|
icon="ops.mesh.loopcut_slide",
|
2018-08-21 19:02:28 +10:00
|
|
|
widget="VIEW3D_GGT_mesh_preselect_edgering",
|
2018-04-30 12:14:46 +02:00
|
|
|
keymap=(
|
2018-08-22 17:53:03 +10:00
|
|
|
("mesh.loopcut_slide",
|
|
|
|
dict(TRANSFORM_OT_edge_slide=dict(release_confirm=True)),
|
|
|
|
dict(type='ACTIONMOUSE', value='PRESS')),
|
2018-04-30 12:14:46 +02:00
|
|
|
),
|
2018-08-22 14:04:37 +10:00
|
|
|
draw_settings=draw_settings,
|
2018-04-30 12:14:46 +02:00
|
|
|
)
|
|
|
|
|
|
|
|
@ToolDef.from_fn
|
|
|
|
def offset_edge_loops_slide():
|
|
|
|
return dict(
|
|
|
|
text="Offset Edge Loop Cut",
|
|
|
|
icon="ops.mesh.offset_edge_loops_slide",
|
|
|
|
widget=None,
|
|
|
|
keymap=(
|
|
|
|
("mesh.offset_edge_loops_slide", dict(), dict(type='ACTIONMOUSE', value='PRESS')),
|
|
|
|
),
|
|
|
|
)
|
|
|
|
|
|
|
|
@ToolDef.from_fn
|
|
|
|
def vertex_smooth():
|
2018-09-13 09:23:24 +10:00
|
|
|
def draw_settings(context, layout, tool):
|
|
|
|
props = tool.operator_properties("mesh.vertices_smooth")
|
|
|
|
layout.prop(props, "repeat")
|
2018-04-30 12:14:46 +02:00
|
|
|
return dict(
|
|
|
|
text="Smooth",
|
|
|
|
icon="ops.mesh.vertices_smooth",
|
2018-09-13 09:19:30 +10:00
|
|
|
widget="WM_GGT_value_operator_redo",
|
2018-04-30 12:14:46 +02:00
|
|
|
keymap=(
|
2018-09-13 09:19:30 +10:00
|
|
|
# Use 0.0, so dragging increases from nothing.
|
|
|
|
("mesh.vertices_smooth", dict(factor=0.0),
|
2018-04-30 12:14:46 +02:00
|
|
|
dict(type='ACTIONMOUSE', value='PRESS')),
|
|
|
|
),
|
2018-09-13 09:23:24 +10:00
|
|
|
draw_settings=draw_settings,
|
2018-04-30 12:14:46 +02:00
|
|
|
)
|
|
|
|
|
|
|
|
@ToolDef.from_fn
|
|
|
|
def vertex_randomize():
|
2018-09-13 09:23:24 +10:00
|
|
|
def draw_settings(context, layout, tool):
|
|
|
|
props = tool.operator_properties("transform.vertex_random")
|
|
|
|
layout.prop(props, "uniform")
|
|
|
|
layout.prop(props, "normal")
|
|
|
|
layout.prop(props, "seed")
|
2018-04-30 12:14:46 +02:00
|
|
|
return dict(
|
|
|
|
text="Randomize",
|
|
|
|
icon="ops.transform.vertex_random",
|
2018-09-13 09:19:30 +10:00
|
|
|
widget="WM_GGT_value_operator_redo",
|
2018-04-30 12:14:46 +02:00
|
|
|
keymap=(
|
2018-09-13 09:19:30 +10:00
|
|
|
# Use 0.0, so dragging increases from nothing.
|
|
|
|
("transform.vertex_random", dict(offset=0.0),
|
2018-04-30 12:14:46 +02:00
|
|
|
dict(type='ACTIONMOUSE', value='PRESS')),
|
|
|
|
),
|
2018-09-13 09:23:24 +10:00
|
|
|
draw_settings=draw_settings,
|
2018-04-30 12:14:46 +02:00
|
|
|
)
|
|
|
|
|
2018-08-28 20:41:48 +10:00
|
|
|
@ToolDef.from_fn
|
|
|
|
def shear():
|
2018-10-18 13:55:01 +11:00
|
|
|
def draw_settings(context, layout, tool):
|
|
|
|
props = tool.operator_properties("transform.shear")
|
|
|
|
layout.label(text="View Axis:")
|
|
|
|
layout.prop(props, "shear_axis", expand=True)
|
2018-08-28 20:41:48 +10:00
|
|
|
return dict(
|
|
|
|
text="Shear",
|
|
|
|
icon="ops.transform.shear",
|
2018-10-16 21:55:39 +11:00
|
|
|
widget="VIEW3D_GGT_xform_shear",
|
2018-08-28 20:41:48 +10:00
|
|
|
keymap=(
|
|
|
|
("transform.shear", dict(release_confirm=True),
|
2018-10-18 13:06:23 +11:00
|
|
|
dict(type='EVT_TWEAK_A', value='ANY')),
|
2018-08-28 20:41:48 +10:00
|
|
|
),
|
2018-10-18 13:55:01 +11:00
|
|
|
draw_settings=draw_settings,
|
2018-08-28 20:41:48 +10:00
|
|
|
)
|
|
|
|
|
|
|
|
@ToolDef.from_fn
|
|
|
|
def tosphere():
|
|
|
|
return dict(
|
|
|
|
text="To Sphere",
|
|
|
|
icon="ops.transform.tosphere",
|
|
|
|
widget=None,
|
|
|
|
keymap=(
|
|
|
|
("transform.tosphere", dict(release_confirm=True),
|
|
|
|
dict(type='ACTIONMOUSE', value='PRESS')),
|
|
|
|
),
|
|
|
|
)
|
|
|
|
|
2018-04-30 12:14:46 +02:00
|
|
|
@ToolDef.from_fn
|
|
|
|
def shrink_fatten():
|
2018-05-22 14:00:44 +02:00
|
|
|
def draw_settings(context, layout, tool):
|
|
|
|
props = tool.operator_properties("transform.shrink_fatten")
|
2018-05-11 20:23:29 +02:00
|
|
|
layout.prop(props, "use_even_offset")
|
|
|
|
|
2018-04-30 12:14:46 +02:00
|
|
|
return dict(
|
|
|
|
text="Shrink/Fatten",
|
|
|
|
icon="ops.transform.shrink_fatten",
|
|
|
|
widget=None,
|
|
|
|
keymap=(
|
|
|
|
("transform.shrink_fatten", dict(release_confirm=True),
|
|
|
|
dict(type='ACTIONMOUSE', value='PRESS')),
|
|
|
|
),
|
2018-05-11 20:23:29 +02:00
|
|
|
draw_settings=draw_settings,
|
2018-04-30 12:14:46 +02:00
|
|
|
)
|
|
|
|
|
|
|
|
@ToolDef.from_fn
|
|
|
|
def push_pull():
|
|
|
|
return dict(
|
|
|
|
text="Push/Pull",
|
|
|
|
icon="ops.transform.push_pull",
|
|
|
|
widget=None,
|
|
|
|
keymap=(
|
|
|
|
("transform.push_pull", dict(release_confirm=True),
|
|
|
|
dict(type='ACTIONMOUSE', value='PRESS')),
|
|
|
|
),
|
|
|
|
)
|
|
|
|
|
|
|
|
@ToolDef.from_fn
|
|
|
|
def knife():
|
2018-05-22 14:00:44 +02:00
|
|
|
def draw_settings(context, layout, tool):
|
|
|
|
props = tool.operator_properties("mesh.knife_tool")
|
2018-04-27 14:13:16 +02:00
|
|
|
layout.prop(props, "use_occlude_geometry")
|
|
|
|
layout.prop(props, "only_selected")
|
|
|
|
|
2018-04-30 12:14:46 +02:00
|
|
|
return dict(
|
|
|
|
text="Knife",
|
|
|
|
icon="ops.mesh.knife_tool",
|
|
|
|
widget=None,
|
|
|
|
keymap=(
|
|
|
|
("mesh.knife_tool",
|
|
|
|
dict(wait_for_input=False),
|
|
|
|
dict(type='ACTIONMOUSE', value='PRESS')),
|
|
|
|
),
|
|
|
|
draw_settings=draw_settings,
|
|
|
|
)
|
|
|
|
|
|
|
|
@ToolDef.from_fn
|
|
|
|
def bisect():
|
2018-09-12 06:24:15 +10:00
|
|
|
def draw_settings(context, layout, tool):
|
|
|
|
props = tool.operator_properties("mesh.bisect")
|
|
|
|
layout.prop(props, "use_fill")
|
|
|
|
layout.prop(props, "clear_inner")
|
|
|
|
layout.prop(props, "clear_outer")
|
|
|
|
layout.prop(props, "threshold")
|
2018-04-30 12:14:46 +02:00
|
|
|
return dict(
|
|
|
|
text="Bisect",
|
|
|
|
icon="ops.mesh.bisect",
|
|
|
|
widget=None,
|
|
|
|
keymap=(
|
|
|
|
("mesh.bisect",
|
|
|
|
dict(),
|
|
|
|
dict(type='EVT_TWEAK_A', value='ANY')),
|
|
|
|
),
|
2018-09-12 06:24:15 +10:00
|
|
|
draw_settings=draw_settings,
|
2018-04-27 13:23:29 +02:00
|
|
|
)
|
|
|
|
|
2018-05-07 21:38:43 +02:00
|
|
|
|
2018-04-27 13:23:29 +02:00
|
|
|
class _defs_edit_curve:
|
|
|
|
|
2018-04-30 12:14:46 +02:00
|
|
|
@ToolDef.from_fn
|
|
|
|
def draw():
|
2018-05-22 14:00:44 +02:00
|
|
|
def draw_settings(context, layout, tool):
|
2018-05-11 20:25:01 +02:00
|
|
|
# Tool settings initialize operator options.
|
|
|
|
tool_settings = context.tool_settings
|
|
|
|
cps = tool_settings.curve_paint_settings
|
|
|
|
|
|
|
|
col = layout.row()
|
|
|
|
|
|
|
|
col.prop(cps, "curve_type")
|
|
|
|
|
|
|
|
if cps.curve_type == 'BEZIER':
|
|
|
|
col.prop(cps, "error_threshold")
|
|
|
|
col.prop(cps, "fit_method")
|
|
|
|
col.prop(cps, "use_corners_detect")
|
|
|
|
|
|
|
|
col = layout.row()
|
|
|
|
col.active = cps.use_corners_detect
|
|
|
|
col.prop(cps, "corner_angle")
|
|
|
|
|
2018-04-30 12:14:46 +02:00
|
|
|
return dict(
|
|
|
|
text="Draw",
|
2018-05-18 11:57:40 +02:00
|
|
|
cursor='PAINT_BRUSH',
|
2018-10-21 16:04:58 +11:00
|
|
|
icon="ops.curve.draw",
|
2018-04-30 12:14:46 +02:00
|
|
|
widget=None,
|
|
|
|
keymap=(
|
|
|
|
("curve.draw", dict(wait_for_input=False), dict(type='ACTIONMOUSE', value='PRESS')),
|
|
|
|
),
|
2018-05-11 20:25:01 +02:00
|
|
|
draw_settings=draw_settings,
|
2018-04-27 13:23:29 +02:00
|
|
|
)
|
|
|
|
|
2018-08-29 15:14:41 +10:00
|
|
|
@ToolDef.from_fn
|
|
|
|
def extrude():
|
|
|
|
return dict(
|
|
|
|
text="Extrude",
|
2018-10-21 16:04:58 +11:00
|
|
|
icon="ops.curve.extrude_move",
|
2018-08-29 15:14:41 +10:00
|
|
|
widget=None,
|
|
|
|
keymap=(
|
|
|
|
("curve.extrude_move",
|
|
|
|
dict(TRANSFORM_OT_translate=dict(release_confirm=True)),
|
|
|
|
dict(type='EVT_TWEAK_A', value='ANY')),
|
|
|
|
),
|
|
|
|
)
|
|
|
|
|
2018-04-30 12:14:46 +02:00
|
|
|
@ToolDef.from_fn
|
|
|
|
def extrude_cursor():
|
|
|
|
return dict(
|
|
|
|
text="Extrude Cursor",
|
2018-10-21 16:04:58 +11:00
|
|
|
icon="ops.curve.extrude_cursor",
|
2018-04-30 12:14:46 +02:00
|
|
|
widget=None,
|
|
|
|
keymap=(
|
|
|
|
("curve.vertex_add", dict(), dict(type='ACTIONMOUSE', value='PRESS')),
|
|
|
|
),
|
2018-04-27 13:23:29 +02:00
|
|
|
)
|
|
|
|
|
2018-05-07 21:38:43 +02:00
|
|
|
|
2018-05-15 12:40:50 +02:00
|
|
|
class _defs_pose:
|
|
|
|
|
|
|
|
@ToolDef.from_fn
|
|
|
|
def breakdown():
|
|
|
|
return dict(
|
|
|
|
text="Breakdowner",
|
2018-05-15 13:49:44 +02:00
|
|
|
icon="ops.pose.breakdowner",
|
2018-05-15 12:40:50 +02:00
|
|
|
widget=None,
|
|
|
|
keymap=(
|
|
|
|
("pose.breakdown", dict(), dict(type='ACTIONMOUSE', value='PRESS')),
|
|
|
|
),
|
|
|
|
)
|
|
|
|
|
|
|
|
@ToolDef.from_fn
|
|
|
|
def push():
|
|
|
|
return dict(
|
|
|
|
text="Push",
|
2018-05-15 13:49:44 +02:00
|
|
|
icon="ops.pose.push",
|
2018-05-15 12:40:50 +02:00
|
|
|
widget=None,
|
|
|
|
keymap=(
|
|
|
|
("pose.push", dict(), dict(type='ACTIONMOUSE', value='PRESS')),
|
|
|
|
),
|
|
|
|
)
|
|
|
|
|
|
|
|
@ToolDef.from_fn
|
|
|
|
def relax():
|
|
|
|
return dict(
|
|
|
|
text="Relax",
|
2018-05-15 13:49:44 +02:00
|
|
|
icon="ops.pose.relax",
|
2018-05-15 12:40:50 +02:00
|
|
|
widget=None,
|
|
|
|
keymap=(
|
|
|
|
("pose.relax", dict(), dict(type='ACTIONMOUSE', value='PRESS')),
|
|
|
|
),
|
|
|
|
)
|
|
|
|
|
|
|
|
|
2018-08-02 17:41:11 +10:00
|
|
|
class _defs_particle:
|
|
|
|
|
|
|
|
@staticmethod
|
|
|
|
def generate_from_brushes(context):
|
|
|
|
return generate_from_enum_ex(
|
|
|
|
context,
|
|
|
|
icon_prefix="brush.particle.",
|
2018-11-05 13:54:43 +11:00
|
|
|
type=bpy.types.ParticleEdit,
|
2018-08-02 17:41:11 +10:00
|
|
|
attr="tool",
|
|
|
|
)
|
|
|
|
|
|
|
|
|
2018-04-29 14:31:00 +02:00
|
|
|
class _defs_sculpt:
|
|
|
|
|
|
|
|
@staticmethod
|
|
|
|
def generate_from_brushes(context):
|
2018-11-02 09:10:23 +11:00
|
|
|
return generate_from_brushes_tool_slots_ex(
|
|
|
|
context, context.tool_settings.sculpt,
|
2018-04-30 15:21:04 +02:00
|
|
|
icon_prefix="brush.sculpt.",
|
|
|
|
brush_category_attr="sculpt_tool",
|
|
|
|
brush_category_layout=(
|
|
|
|
('DRAW',),
|
|
|
|
('GRAB', 'THUMB'),
|
|
|
|
('SNAKE_HOOK',),
|
|
|
|
('BLOB', 'INFLATE'),
|
2018-11-03 20:00:30 +11:00
|
|
|
('SMOOTH',),
|
2018-11-04 10:32:58 +11:00
|
|
|
('SCRAPE',),
|
|
|
|
('FLATTEN',),
|
2018-04-30 15:21:04 +02:00
|
|
|
('CREASE', 'PINCH'),
|
|
|
|
('CLAY', 'CLAY_STRIPS'),
|
|
|
|
('LAYER',),
|
|
|
|
('NUDGE', 'ROTATE'),
|
|
|
|
('FILL',),
|
|
|
|
('SIMPLIFY',),
|
|
|
|
('MASK',),
|
2018-11-02 09:10:23 +11:00
|
|
|
),
|
2018-04-30 15:21:04 +02:00
|
|
|
)
|
2018-04-29 16:36:31 +02:00
|
|
|
|
2018-08-23 12:56:02 +10:00
|
|
|
@ToolDef.from_fn
|
|
|
|
def hide_border():
|
|
|
|
return dict(
|
2018-10-05 10:27:04 +10:00
|
|
|
text="Box Hide",
|
2018-08-23 22:46:04 +10:00
|
|
|
icon="ops.sculpt.border_hide",
|
2018-08-23 12:56:02 +10:00
|
|
|
widget=None,
|
|
|
|
keymap=(
|
|
|
|
("paint.hide_show", dict(action='HIDE'), dict(type='EVT_TWEAK_A', value='ANY')),
|
|
|
|
("paint.hide_show", dict(action='SHOW'), dict(type='EVT_TWEAK_A', value='ANY', ctrl=True)),
|
|
|
|
("paint.hide_show", dict(action='SHOW', area='ALL'), dict(type='SELECTMOUSE', value='PRESS')),
|
|
|
|
),
|
|
|
|
)
|
|
|
|
|
|
|
|
@ToolDef.from_fn
|
|
|
|
def mask_border():
|
|
|
|
return dict(
|
2018-10-05 10:27:04 +10:00
|
|
|
text="Box Mask",
|
2018-08-23 22:46:04 +10:00
|
|
|
icon="ops.sculpt.border_mask",
|
2018-08-23 12:56:02 +10:00
|
|
|
widget=None,
|
|
|
|
keymap=(
|
2018-10-05 10:27:04 +10:00
|
|
|
("view3d.select_box", dict(mode='ADD'), dict(type='EVT_TWEAK_A', value='ANY')),
|
|
|
|
("view3d.select_box", dict(mode='SUB'), dict(type='EVT_TWEAK_A', value='ANY', ctrl=True)),
|
2018-08-23 12:56:02 +10:00
|
|
|
),
|
|
|
|
)
|
2018-04-30 16:06:51 +02:00
|
|
|
|
2018-08-28 21:00:25 +10:00
|
|
|
|
2018-04-30 16:06:51 +02:00
|
|
|
class _defs_vertex_paint:
|
2018-04-30 15:21:04 +02:00
|
|
|
|
2018-08-29 16:21:48 +10:00
|
|
|
@staticmethod
|
|
|
|
def poll_select_mask(context):
|
2018-09-21 19:24:29 +02:00
|
|
|
ob = context.active_object
|
|
|
|
return ob.type == 'MESH' and ob.data.use_paint_mask
|
2018-08-29 16:21:48 +10:00
|
|
|
|
2018-04-30 15:21:04 +02:00
|
|
|
@staticmethod
|
|
|
|
def generate_from_brushes(context):
|
2018-11-02 09:10:23 +11:00
|
|
|
return generate_from_brushes_tool_slots_ex(
|
|
|
|
context, context.tool_settings.vertex_paint,
|
2018-04-30 16:06:51 +02:00
|
|
|
icon_prefix="brush.paint_vertex.",
|
2018-04-30 15:21:04 +02:00
|
|
|
brush_category_attr="vertex_tool",
|
|
|
|
brush_category_layout=(
|
|
|
|
('MIX',),
|
|
|
|
('BLUR', 'AVERAGE'),
|
|
|
|
('SMEAR',),
|
|
|
|
(
|
|
|
|
'ADD', 'SUB', 'MUL', 'LIGHTEN', 'DARKEN',
|
|
|
|
'COLORDODGE', 'DIFFERENCE', 'SCREEN', 'HARDLIGHT',
|
|
|
|
'OVERLAY', 'SOFTLIGHT', 'EXCLUSION', 'LUMINOCITY',
|
2018-04-30 21:57:51 +02:00
|
|
|
'SATURATION', 'HUE', 'ERASE_ALPHA', 'ADD_ALPHA',
|
2018-04-30 15:21:04 +02:00
|
|
|
),
|
2018-11-02 09:10:23 +11:00
|
|
|
),
|
2018-04-30 15:21:04 +02:00
|
|
|
)
|
2018-04-29 14:31:00 +02:00
|
|
|
|
|
|
|
|
2018-04-30 16:43:13 +02:00
|
|
|
class _defs_texture_paint:
|
|
|
|
|
|
|
|
@staticmethod
|
|
|
|
def generate_from_brushes(context):
|
2018-11-02 09:10:23 +11:00
|
|
|
return generate_from_brushes_tool_slots_ex(
|
|
|
|
context, context.tool_settings.image_paint,
|
2018-04-30 16:43:13 +02:00
|
|
|
icon_prefix="brush.paint_texture.",
|
|
|
|
brush_category_attr="image_tool",
|
|
|
|
brush_category_layout=(
|
|
|
|
('DRAW',),
|
|
|
|
('SOFTEN',),
|
|
|
|
('SMEAR',),
|
|
|
|
('CLONE',),
|
|
|
|
('FILL',),
|
|
|
|
('MASK',),
|
2018-11-02 09:10:23 +11:00
|
|
|
),
|
2018-04-30 16:43:13 +02:00
|
|
|
)
|
|
|
|
|
|
|
|
|
2018-04-30 16:06:51 +02:00
|
|
|
class _defs_weight_paint:
|
|
|
|
|
2018-08-29 16:21:48 +10:00
|
|
|
@staticmethod
|
|
|
|
def poll_select_mask(context):
|
2018-09-21 19:24:29 +02:00
|
|
|
ob = context.active_object
|
|
|
|
return (ob.type == 'MESH' and
|
|
|
|
(ob.data.use_paint_mask or
|
|
|
|
ob.data.use_paint_mask_vertex))
|
2018-08-29 16:21:48 +10:00
|
|
|
|
2018-04-30 16:06:51 +02:00
|
|
|
@staticmethod
|
|
|
|
def generate_from_brushes(context):
|
2018-11-02 09:10:23 +11:00
|
|
|
return generate_from_brushes_tool_slots_ex(
|
|
|
|
context, context.tool_settings.weight_paint,
|
2018-04-30 16:06:51 +02:00
|
|
|
icon_prefix="brush.paint_weight.",
|
|
|
|
brush_category_attr="vertex_tool",
|
|
|
|
brush_category_layout=(
|
|
|
|
('MIX',),
|
|
|
|
('BLUR', 'AVERAGE'),
|
|
|
|
('SMEAR',),
|
|
|
|
(
|
|
|
|
'ADD', 'SUB', 'MUL', 'LIGHTEN', 'DARKEN',
|
|
|
|
'COLORDODGE', 'DIFFERENCE', 'SCREEN', 'HARDLIGHT',
|
|
|
|
'OVERLAY', 'SOFTLIGHT', 'EXCLUSION', 'LUMINOCITY',
|
|
|
|
'SATURATION', 'HUE',
|
|
|
|
),
|
2018-11-02 09:10:23 +11:00
|
|
|
),
|
2018-04-30 16:06:51 +02:00
|
|
|
)
|
|
|
|
|
2018-05-01 12:20:53 +02:00
|
|
|
@ToolDef.from_fn
|
|
|
|
def sample_weight():
|
|
|
|
return dict(
|
|
|
|
text="Sample Weight",
|
|
|
|
icon="ops.paint.weight_sample",
|
|
|
|
widget=None,
|
|
|
|
keymap=(
|
|
|
|
("paint.weight_sample", dict(), dict(type='ACTIONMOUSE', value='PRESS')),
|
|
|
|
),
|
|
|
|
)
|
|
|
|
|
|
|
|
@ToolDef.from_fn
|
|
|
|
def sample_weight_group():
|
|
|
|
return dict(
|
|
|
|
text="Sample Vertex Group",
|
|
|
|
icon="ops.paint.weight_sample_group",
|
|
|
|
widget=None,
|
|
|
|
keymap=(
|
|
|
|
("paint.weight_sample_group", dict(), dict(type='ACTIONMOUSE', value='PRESS')),
|
|
|
|
),
|
|
|
|
)
|
|
|
|
|
2018-04-30 16:06:51 +02:00
|
|
|
@ToolDef.from_fn
|
2018-05-01 12:46:25 +02:00
|
|
|
def gradient():
|
2018-05-22 14:00:44 +02:00
|
|
|
def draw_settings(context, layout, tool):
|
2018-09-05 16:01:53 +10:00
|
|
|
brush = context.tool_settings.weight_paint.brush
|
|
|
|
if brush is not None:
|
|
|
|
from .properties_paint_common import UnifiedPaintPanel
|
|
|
|
UnifiedPaintPanel.prop_unified_weight(layout, context, brush, "weight", slider=True, text="Weight")
|
2018-09-05 16:05:00 +10:00
|
|
|
props = tool.operator_properties("paint.weight_gradient")
|
|
|
|
layout.prop(props, "type")
|
2018-04-30 16:06:51 +02:00
|
|
|
|
|
|
|
return dict(
|
2018-05-01 12:46:25 +02:00
|
|
|
text="Gradient",
|
|
|
|
icon="ops.paint.weight_gradient",
|
2018-04-30 16:06:51 +02:00
|
|
|
widget=None,
|
|
|
|
keymap=(
|
2018-05-01 12:46:25 +02:00
|
|
|
("paint.weight_gradient", dict(), dict(type='EVT_TWEAK_A', value='ANY')),
|
2018-04-30 16:06:51 +02:00
|
|
|
),
|
2018-05-01 12:46:25 +02:00
|
|
|
draw_settings=draw_settings,
|
2018-04-30 16:06:51 +02:00
|
|
|
)
|
|
|
|
|
|
|
|
|
2018-10-04 12:04:36 +10:00
|
|
|
class _defs_image_generic:
|
|
|
|
|
2018-10-05 13:07:01 +10:00
|
|
|
@staticmethod
|
|
|
|
def poll_uvedit(context):
|
|
|
|
ob = context.edit_object
|
|
|
|
if ob is not None:
|
|
|
|
data = ob.data
|
|
|
|
if data is not None:
|
|
|
|
return bool(getattr(data, "uv_layers", False))
|
|
|
|
return False
|
|
|
|
|
2018-10-04 12:04:36 +10:00
|
|
|
@ToolDef.from_fn
|
|
|
|
def cursor():
|
|
|
|
return dict(
|
|
|
|
text="Cursor",
|
|
|
|
description=(
|
|
|
|
"Set the cursor location, drag to transform"
|
|
|
|
),
|
|
|
|
icon="ops.generic.cursor",
|
|
|
|
keymap=(
|
|
|
|
("uv.cursor_set", dict(), dict(type='ACTIONMOUSE', value='PRESS')),
|
|
|
|
("transform.translate",
|
|
|
|
dict(release_confirm=True, cursor_transform=True),
|
|
|
|
dict(type='EVT_TWEAK_A', value='ANY'),
|
|
|
|
),
|
|
|
|
),
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
class _defs_image_uv_transform:
|
|
|
|
|
|
|
|
@ToolDef.from_fn
|
|
|
|
def transform():
|
|
|
|
return dict(
|
|
|
|
text="Transform",
|
|
|
|
description=(
|
|
|
|
"Supports any combination of grab, rotate & scale at once"
|
|
|
|
),
|
|
|
|
icon="ops.transform.transform",
|
|
|
|
widget="IMAGE_GGT_gizmo2d",
|
|
|
|
# No keymap default action, only for gizmo!
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
class _defs_image_uv_select:
|
2018-05-16 18:41:11 +02:00
|
|
|
|
|
|
|
@ToolDef.from_fn
|
|
|
|
def border():
|
2018-10-04 15:12:28 +10:00
|
|
|
def draw_settings(context, layout, tool):
|
2018-10-05 10:27:04 +10:00
|
|
|
props = tool.operator_properties("uv.select_box")
|
2018-10-04 15:12:28 +10:00
|
|
|
layout.prop(props, "deselect")
|
2018-05-16 18:41:11 +02:00
|
|
|
return dict(
|
2018-10-05 10:27:04 +10:00
|
|
|
text="Select Box",
|
|
|
|
icon="ops.generic.select_box",
|
2018-05-16 18:41:11 +02:00
|
|
|
widget=None,
|
|
|
|
keymap=(
|
2018-10-05 10:27:04 +10:00
|
|
|
("uv.select_box",
|
2018-10-04 15:12:28 +10:00
|
|
|
dict(),
|
2018-05-16 18:41:11 +02:00
|
|
|
dict(type='EVT_TWEAK_A', value='ANY')),
|
2018-10-05 10:27:04 +10:00
|
|
|
("uv.select_box",
|
2018-10-04 15:12:28 +10:00
|
|
|
dict(deselect=True),
|
|
|
|
dict(type='EVT_TWEAK_A', value='ANY', ctrl=True)),
|
2018-05-16 18:41:11 +02:00
|
|
|
),
|
2018-10-04 15:12:28 +10:00
|
|
|
draw_settings=draw_settings,
|
2018-05-16 18:41:11 +02:00
|
|
|
)
|
|
|
|
|
|
|
|
@ToolDef.from_fn
|
|
|
|
def circle():
|
2018-10-04 15:12:28 +10:00
|
|
|
def draw_settings(context, layout, tool):
|
|
|
|
props = tool.operator_properties("uv.select_circle")
|
|
|
|
layout.prop(props, "radius")
|
2018-05-16 18:41:11 +02:00
|
|
|
return dict(
|
|
|
|
text="Select Circle",
|
|
|
|
icon="ops.generic.select_circle",
|
|
|
|
widget=None,
|
|
|
|
keymap=(
|
|
|
|
("uv.select_circle",
|
2018-10-04 13:21:25 +10:00
|
|
|
dict(deselect=False),
|
2018-05-16 18:41:11 +02:00
|
|
|
dict(type='ACTIONMOUSE', value='PRESS')),
|
2018-10-04 13:21:25 +10:00
|
|
|
("uv.select_circle",
|
|
|
|
dict(deselect=True),
|
|
|
|
dict(type='ACTIONMOUSE', value='PRESS', ctrl=True)),
|
2018-05-16 18:41:11 +02:00
|
|
|
),
|
2018-10-04 15:12:28 +10:00
|
|
|
draw_settings=draw_settings,
|
2018-05-16 18:41:11 +02:00
|
|
|
)
|
|
|
|
|
|
|
|
@ToolDef.from_fn
|
|
|
|
def lasso():
|
|
|
|
return dict(
|
|
|
|
text="Select Lasso",
|
|
|
|
icon="ops.generic.select_lasso",
|
|
|
|
widget=None,
|
|
|
|
keymap=(
|
|
|
|
("uv.select_lasso",
|
|
|
|
dict(deselect=False),
|
|
|
|
dict(type='EVT_TWEAK_A', value='ANY')),
|
|
|
|
# ("uv.select_lasso",
|
|
|
|
# dict(deselect=True),
|
2018-09-27 21:18:02 +10:00
|
|
|
# dict(type='EVT_TWEAK_A', value='ANY', ctrl=True)),
|
2018-05-16 18:41:11 +02:00
|
|
|
),
|
|
|
|
)
|
|
|
|
|
2018-07-31 21:06:08 +10:00
|
|
|
|
2018-10-05 13:07:01 +10:00
|
|
|
class _defs_image_uv_sculpt:
|
|
|
|
|
|
|
|
@staticmethod
|
|
|
|
def generate_from_brushes(context):
|
|
|
|
return generate_from_enum_ex(
|
|
|
|
context,
|
|
|
|
icon_prefix="brush.uv_sculpt.",
|
|
|
|
data=context.tool_settings,
|
|
|
|
attr="uv_sculpt_tool",
|
|
|
|
)
|
|
|
|
|
|
|
|
|
2018-07-31 10:22:19 +02:00
|
|
|
class _defs_gpencil_paint:
|
2018-08-24 23:59:56 +02:00
|
|
|
|
2018-07-31 10:22:19 +02:00
|
|
|
@staticmethod
|
|
|
|
def generate_from_brushes(context):
|
2018-11-02 09:10:23 +11:00
|
|
|
|
|
|
|
return generate_from_brushes_tool_slots_ex(
|
|
|
|
context, context.tool_settings.gpencil_paint,
|
2018-11-03 20:33:59 +11:00
|
|
|
icon_prefix="brush.gpencil_draw.",
|
2018-11-02 09:10:23 +11:00
|
|
|
brush_category_attr="gpencil_tool",
|
2018-07-31 10:22:19 +02:00
|
|
|
brush_category_layout=(
|
2018-11-02 09:10:23 +11:00
|
|
|
('DRAW',),
|
2018-07-31 10:22:19 +02:00
|
|
|
('FILL',),
|
2018-11-02 09:10:23 +11:00
|
|
|
('ERASE',),
|
|
|
|
),
|
|
|
|
tooldef_keywords=dict(
|
|
|
|
operator="gpencil.draw",
|
|
|
|
),
|
2018-07-31 10:22:19 +02:00
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
class _defs_gpencil_edit:
|
|
|
|
@ToolDef.from_fn
|
|
|
|
def bend():
|
|
|
|
return dict(
|
|
|
|
text="Bend",
|
|
|
|
icon="ops.gpencil.edit_bend",
|
|
|
|
widget=None,
|
|
|
|
keymap=(
|
|
|
|
("transform.bend",
|
2018-08-28 20:43:34 +10:00
|
|
|
dict(release_confirm=True),
|
2018-07-31 10:22:19 +02:00
|
|
|
dict(type='EVT_TWEAK_A', value='ANY')),
|
|
|
|
),
|
|
|
|
)
|
|
|
|
|
2018-09-21 10:28:51 +02:00
|
|
|
@ToolDef.from_fn
|
2018-10-05 10:27:04 +10:00
|
|
|
def box_select():
|
2018-09-21 10:28:51 +02:00
|
|
|
return dict(
|
2018-10-05 10:27:04 +10:00
|
|
|
text="Select Box",
|
|
|
|
icon="ops.generic.select_box",
|
2018-09-21 10:28:51 +02:00
|
|
|
widget=None,
|
|
|
|
keymap=(
|
2018-10-05 10:27:04 +10:00
|
|
|
("gpencil.select_box",
|
2018-09-21 10:28:51 +02:00
|
|
|
dict(),
|
|
|
|
dict(type='EVT_TWEAK_A', value='ANY')),
|
|
|
|
),
|
|
|
|
)
|
|
|
|
|
|
|
|
@ToolDef.from_fn
|
|
|
|
def circle_select():
|
|
|
|
return dict(
|
|
|
|
text="Select Circle",
|
|
|
|
icon="ops.generic.select_circle",
|
|
|
|
widget=None,
|
|
|
|
keymap=(
|
|
|
|
("gpencil.select_circle",
|
|
|
|
dict(),
|
|
|
|
dict(type='EVT_TWEAK_A', value='ANY')),
|
|
|
|
),
|
|
|
|
)
|
|
|
|
|
|
|
|
@ToolDef.from_fn
|
|
|
|
def lasso_select():
|
|
|
|
return dict(
|
|
|
|
text="Select Lasso",
|
|
|
|
icon="ops.generic.select_lasso",
|
|
|
|
widget=None,
|
|
|
|
keymap=(
|
|
|
|
("gpencil.select_lasso",
|
|
|
|
dict(),
|
|
|
|
dict(type='EVT_TWEAK_A', value='ANY')),
|
|
|
|
),
|
|
|
|
)
|
|
|
|
|
2018-07-31 10:22:19 +02:00
|
|
|
@ToolDef.from_fn
|
|
|
|
def shear():
|
|
|
|
return dict(
|
|
|
|
text="Shear",
|
|
|
|
icon="ops.gpencil.edit_shear",
|
|
|
|
widget=None,
|
|
|
|
keymap=(
|
|
|
|
("transform.shear",
|
2018-08-28 20:43:34 +10:00
|
|
|
dict(release_confirm=True),
|
2018-07-31 10:22:19 +02:00
|
|
|
dict(type='EVT_TWEAK_A', value='ANY')),
|
|
|
|
),
|
|
|
|
)
|
|
|
|
|
|
|
|
@ToolDef.from_fn
|
|
|
|
def tosphere():
|
|
|
|
return dict(
|
|
|
|
text="To Sphere",
|
2018-10-21 16:04:58 +11:00
|
|
|
icon="ops.transform.tosphere",
|
2018-07-31 10:22:19 +02:00
|
|
|
widget=None,
|
|
|
|
keymap=(
|
|
|
|
("transform.tosphere",
|
2018-08-28 20:43:34 +10:00
|
|
|
dict(release_confirm=True),
|
2018-07-31 10:22:19 +02:00
|
|
|
dict(type='EVT_TWEAK_A', value='ANY')),
|
|
|
|
),
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
class _defs_gpencil_sculpt:
|
2018-11-05 06:57:01 +11:00
|
|
|
|
2018-08-23 20:16:50 +10:00
|
|
|
def draw_settings_common(context, layout, tool):
|
2018-07-31 10:22:19 +02:00
|
|
|
ob = context.active_object
|
|
|
|
if ob and ob.mode == 'GPENCIL_SCULPT':
|
2018-10-10 11:12:41 +11:00
|
|
|
tool_settings = context.tool_settings
|
|
|
|
settings = tool_settings.gpencil_sculpt
|
2018-09-21 22:50:02 +02:00
|
|
|
tool = settings.tool
|
2018-07-31 10:22:19 +02:00
|
|
|
brush = settings.brush
|
|
|
|
|
|
|
|
layout.prop(brush, "size", slider=True)
|
|
|
|
|
|
|
|
row = layout.row(align=True)
|
|
|
|
row.prop(brush, "strength", slider=True)
|
|
|
|
row.prop(brush, "use_pressure_strength", text="")
|
2018-09-21 22:50:02 +02:00
|
|
|
|
2018-09-21 23:11:30 +02:00
|
|
|
if tool in {'THICKNESS', 'STRENGTH', 'PINCH', 'TWIST'}:
|
2018-09-21 22:50:02 +02:00
|
|
|
row.separator()
|
|
|
|
row.prop(brush, "direction", expand=True, text="")
|
|
|
|
|
2018-11-05 11:57:37 +11:00
|
|
|
@ToolDef.from_fn.with_args(draw_settings=draw_settings_common)
|
|
|
|
def smooth(*, draw_settings):
|
2018-07-31 10:22:19 +02:00
|
|
|
return dict(
|
|
|
|
text="Smooth",
|
|
|
|
icon="ops.gpencil.sculpt_smooth",
|
|
|
|
widget=None,
|
|
|
|
keymap=(
|
|
|
|
("gpencil.brush_paint",
|
|
|
|
dict(mode='SMOOTH', wait_for_input=False),
|
|
|
|
dict(type='EVT_TWEAK_A', value='ANY')),
|
|
|
|
),
|
2018-11-05 11:57:37 +11:00
|
|
|
draw_settings=draw_settings,
|
2018-07-31 10:22:19 +02:00
|
|
|
)
|
|
|
|
|
2018-11-05 11:57:37 +11:00
|
|
|
@ToolDef.from_fn.with_args(draw_settings=draw_settings_common)
|
|
|
|
def thickness(*, draw_settings):
|
2018-07-31 10:22:19 +02:00
|
|
|
return dict(
|
|
|
|
text="Thickness",
|
|
|
|
icon="ops.gpencil.sculpt_thickness",
|
|
|
|
widget=None,
|
|
|
|
keymap=(
|
|
|
|
("gpencil.brush_paint",
|
|
|
|
dict(mode='THICKNESS', wait_for_input=False),
|
|
|
|
dict(type='EVT_TWEAK_A', value='ANY')),
|
|
|
|
),
|
2018-11-05 11:57:37 +11:00
|
|
|
draw_settings=draw_settings,
|
2018-07-31 10:22:19 +02:00
|
|
|
)
|
|
|
|
|
2018-11-05 11:57:37 +11:00
|
|
|
@ToolDef.from_fn.with_args(draw_settings=draw_settings_common)
|
|
|
|
def strength(*, draw_settings):
|
2018-07-31 10:22:19 +02:00
|
|
|
return dict(
|
|
|
|
text="Strength",
|
|
|
|
icon="ops.gpencil.sculpt_strength",
|
|
|
|
widget=None,
|
|
|
|
keymap=(
|
|
|
|
("gpencil.brush_paint",
|
|
|
|
dict(mode='STRENGTH', wait_for_input=False),
|
|
|
|
dict(type='EVT_TWEAK_A', value='ANY')),
|
|
|
|
),
|
2018-11-05 11:57:37 +11:00
|
|
|
draw_settings=draw_settings,
|
2018-07-31 10:22:19 +02:00
|
|
|
)
|
|
|
|
|
2018-11-05 11:57:37 +11:00
|
|
|
@ToolDef.from_fn.with_args(draw_settings=draw_settings_common)
|
|
|
|
def grab(*, draw_settings):
|
2018-07-31 10:22:19 +02:00
|
|
|
return dict(
|
|
|
|
text="Grab",
|
|
|
|
icon="ops.gpencil.sculpt_grab",
|
|
|
|
widget=None,
|
|
|
|
keymap=(
|
|
|
|
("gpencil.brush_paint",
|
|
|
|
dict(mode='GRAB', wait_for_input=False),
|
|
|
|
dict(type='EVT_TWEAK_A', value='ANY')),
|
|
|
|
),
|
2018-11-05 11:57:37 +11:00
|
|
|
draw_settings=draw_settings,
|
2018-07-31 10:22:19 +02:00
|
|
|
)
|
|
|
|
|
2018-11-05 11:57:37 +11:00
|
|
|
@ToolDef.from_fn.with_args(draw_settings=draw_settings_common)
|
|
|
|
def push(*, draw_settings):
|
2018-07-31 10:22:19 +02:00
|
|
|
return dict(
|
|
|
|
text="Push",
|
|
|
|
icon="ops.gpencil.sculpt_push",
|
|
|
|
widget=None,
|
|
|
|
keymap=(
|
|
|
|
("gpencil.brush_paint",
|
|
|
|
dict(mode='PUSH', wait_for_input=False),
|
|
|
|
dict(type='EVT_TWEAK_A', value='ANY')),
|
|
|
|
),
|
2018-11-05 11:57:37 +11:00
|
|
|
draw_settings=draw_settings,
|
2018-07-31 10:22:19 +02:00
|
|
|
)
|
|
|
|
|
2018-11-05 11:57:37 +11:00
|
|
|
@ToolDef.from_fn.with_args(draw_settings=draw_settings_common)
|
|
|
|
def twist(*, draw_settings):
|
2018-07-31 10:22:19 +02:00
|
|
|
return dict(
|
|
|
|
text="Twist",
|
|
|
|
icon="ops.gpencil.sculpt_twist",
|
|
|
|
widget=None,
|
|
|
|
keymap=(
|
|
|
|
("gpencil.brush_paint",
|
|
|
|
dict(mode='TWIST', wait_for_input=False),
|
|
|
|
dict(type='EVT_TWEAK_A', value='ANY')),
|
|
|
|
),
|
2018-11-05 11:57:37 +11:00
|
|
|
draw_settings=draw_settings,
|
2018-07-31 10:22:19 +02:00
|
|
|
)
|
|
|
|
|
2018-11-05 11:57:37 +11:00
|
|
|
@ToolDef.from_fn.with_args(draw_settings=draw_settings_common)
|
|
|
|
def pinch(*, draw_settings):
|
2018-07-31 10:22:19 +02:00
|
|
|
return dict(
|
|
|
|
text="Pinch",
|
|
|
|
icon="ops.gpencil.sculpt_pinch",
|
|
|
|
widget=None,
|
|
|
|
keymap=(
|
|
|
|
("gpencil.brush_paint",
|
|
|
|
dict(mode='PINCH', wait_for_input=False),
|
|
|
|
dict(type='EVT_TWEAK_A', value='ANY')),
|
|
|
|
),
|
2018-11-05 11:57:37 +11:00
|
|
|
draw_settings=draw_settings,
|
2018-07-31 10:22:19 +02:00
|
|
|
)
|
|
|
|
|
2018-11-05 11:57:37 +11:00
|
|
|
@ToolDef.from_fn.with_args(draw_settings=draw_settings_common)
|
|
|
|
def randomize(*, draw_settings):
|
2018-07-31 10:22:19 +02:00
|
|
|
return dict(
|
|
|
|
text="Randomize",
|
|
|
|
icon="ops.gpencil.sculpt_randomize",
|
|
|
|
widget=None,
|
|
|
|
keymap=(
|
|
|
|
("gpencil.brush_paint",
|
|
|
|
dict(mode='RANDOMIZE', wait_for_input=False),
|
|
|
|
dict(type='EVT_TWEAK_A', value='ANY')),
|
|
|
|
),
|
2018-11-05 11:57:37 +11:00
|
|
|
draw_settings=draw_settings,
|
2018-07-31 10:22:19 +02:00
|
|
|
)
|
|
|
|
|
2018-11-05 11:57:37 +11:00
|
|
|
@ToolDef.from_fn.with_args(draw_settings=draw_settings_common)
|
|
|
|
def clone(*, draw_settings):
|
2018-07-31 10:22:19 +02:00
|
|
|
return dict(
|
|
|
|
text="Clone",
|
|
|
|
icon="ops.gpencil.sculpt_clone",
|
|
|
|
widget=None,
|
|
|
|
keymap=(
|
|
|
|
("gpencil.brush_paint",
|
|
|
|
dict(mode='CLONE', wait_for_input=False),
|
|
|
|
dict(type='EVT_TWEAK_A', value='ANY')),
|
|
|
|
),
|
2018-11-05 11:57:37 +11:00
|
|
|
draw_settings=draw_settings,
|
2018-07-31 10:22:19 +02:00
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
class _defs_gpencil_weight:
|
2018-11-05 06:57:01 +11:00
|
|
|
|
2018-08-23 20:16:50 +10:00
|
|
|
def draw_settings_common(context, layout, tool):
|
2018-07-31 10:22:19 +02:00
|
|
|
ob = context.active_object
|
|
|
|
if ob and ob.mode == 'GPENCIL_WEIGHT':
|
|
|
|
settings = context.tool_settings.gpencil_sculpt
|
|
|
|
brush = settings.brush
|
|
|
|
|
|
|
|
layout.prop(brush, "size", slider=True)
|
|
|
|
|
|
|
|
row = layout.row(align=True)
|
|
|
|
row.prop(brush, "strength", slider=True)
|
|
|
|
row.prop(brush, "use_pressure_strength", text="")
|
|
|
|
|
2018-11-05 11:57:37 +11:00
|
|
|
@ToolDef.from_fn.with_args(draw_settings=draw_settings_common)
|
|
|
|
def paint(*, draw_settings):
|
2018-07-31 10:22:19 +02:00
|
|
|
return dict(
|
|
|
|
text="Draw",
|
|
|
|
icon="ops.gpencil.sculpt_weight",
|
|
|
|
widget=None,
|
|
|
|
keymap=(
|
|
|
|
("gpencil.brush_paint",
|
|
|
|
dict(mode='WEIGHT', wait_for_input=False),
|
|
|
|
dict(type='EVT_TWEAK_A', value='ANY')),
|
|
|
|
),
|
2018-11-05 11:57:37 +11:00
|
|
|
draw_settings=draw_settings,
|
2018-07-31 10:22:19 +02:00
|
|
|
)
|
|
|
|
|
2018-05-16 18:41:11 +02:00
|
|
|
|
2018-09-27 20:50:05 +02:00
|
|
|
class TOPBAR_PT_gpencil_materials(Panel):
|
|
|
|
bl_space_type = 'VIEW_3D'
|
|
|
|
bl_region_type = 'HEADER'
|
|
|
|
bl_label = "Materials"
|
|
|
|
bl_ui_units_x = 14
|
|
|
|
|
|
|
|
@classmethod
|
|
|
|
def poll(cls, context):
|
|
|
|
ob = context.object
|
|
|
|
return ob and ob.type == 'GPENCIL'
|
|
|
|
|
|
|
|
@staticmethod
|
|
|
|
def draw(self, context):
|
|
|
|
layout = self.layout
|
|
|
|
ob = context.object
|
|
|
|
|
|
|
|
if ob:
|
|
|
|
is_sortable = len(ob.material_slots) > 1
|
|
|
|
rows = 1
|
|
|
|
if (is_sortable):
|
2018-09-27 21:11:13 +02:00
|
|
|
rows = 10
|
2018-09-27 20:50:05 +02:00
|
|
|
|
|
|
|
row = layout.row()
|
|
|
|
|
|
|
|
row.template_list("GPENCIL_UL_matslots", "", ob, "material_slots", ob, "active_material_index", rows=rows)
|
|
|
|
|
|
|
|
col = row.column(align=True)
|
|
|
|
col.menu("GPENCIL_MT_color_specials", icon='DOWNARROW_HLT', text="")
|
|
|
|
|
|
|
|
if is_sortable:
|
|
|
|
col.separator()
|
|
|
|
|
|
|
|
col.operator("object.material_slot_move", icon='TRIA_UP', text="").direction = 'UP'
|
|
|
|
col.operator("object.material_slot_move", icon='TRIA_DOWN', text="").direction = 'DOWN'
|
|
|
|
|
|
|
|
col.separator()
|
|
|
|
|
|
|
|
sub = col.column(align=True)
|
|
|
|
sub.operator("gpencil.color_isolate", icon='LOCKED', text="").affect_visibility = False
|
|
|
|
sub.operator("gpencil.color_isolate", icon='HIDE_OFF', text="").affect_visibility = True
|
|
|
|
|
|
|
|
|
2018-05-16 18:41:11 +02:00
|
|
|
class IMAGE_PT_tools_active(ToolSelectPanelHelper, Panel):
|
|
|
|
bl_space_type = 'IMAGE_EDITOR'
|
|
|
|
bl_region_type = 'TOOLS'
|
|
|
|
bl_label = "Tools" # not visible
|
|
|
|
bl_options = {'HIDE_HEADER'}
|
|
|
|
|
|
|
|
# Satisfy the 'ToolSelectPanelHelper' API.
|
2018-07-14 09:02:36 +02:00
|
|
|
keymap_prefix = "Image Editor Tool:"
|
2018-05-16 18:41:11 +02:00
|
|
|
|
|
|
|
@classmethod
|
|
|
|
def tools_from_context(cls, context, mode=None):
|
|
|
|
if mode is None:
|
2018-08-17 12:59:24 +02:00
|
|
|
if context.space_data is None:
|
|
|
|
mode = 'VIEW'
|
2018-08-17 13:09:59 +02:00
|
|
|
else:
|
|
|
|
mode = context.space_data.mode
|
2018-05-16 18:41:11 +02:00
|
|
|
for tools in (cls._tools[None], cls._tools.get(mode, ())):
|
|
|
|
for item in tools:
|
|
|
|
if not (type(item) is ToolDef) and callable(item):
|
|
|
|
yield from item(context)
|
|
|
|
else:
|
|
|
|
yield item
|
|
|
|
|
|
|
|
@classmethod
|
|
|
|
def tools_all(cls):
|
|
|
|
yield from cls._tools.items()
|
|
|
|
|
|
|
|
# for reuse
|
2018-10-04 12:04:36 +10:00
|
|
|
_tools_transform = (
|
|
|
|
_defs_image_uv_transform.transform,
|
|
|
|
)
|
|
|
|
|
2018-05-16 18:41:11 +02:00
|
|
|
_tools_select = (
|
|
|
|
(
|
2018-10-04 12:04:36 +10:00
|
|
|
_defs_image_uv_select.border,
|
|
|
|
_defs_image_uv_select.circle,
|
|
|
|
_defs_image_uv_select.lasso,
|
2018-05-16 18:41:11 +02:00
|
|
|
),
|
|
|
|
)
|
|
|
|
|
2018-08-21 01:17:15 +12:00
|
|
|
_tools_annotate = (
|
|
|
|
(
|
2018-08-23 20:25:25 +10:00
|
|
|
_defs_annotate_image.scribble,
|
|
|
|
_defs_annotate_image.line,
|
|
|
|
_defs_annotate_image.poly,
|
|
|
|
_defs_annotate_image.eraser,
|
2018-08-21 01:17:15 +12:00
|
|
|
),
|
|
|
|
)
|
|
|
|
|
2018-05-16 18:41:11 +02:00
|
|
|
_tools = {
|
|
|
|
None: [
|
|
|
|
# for all modes
|
|
|
|
],
|
|
|
|
'VIEW': [
|
2018-10-19 20:10:14 +11:00
|
|
|
],
|
|
|
|
'UV': [
|
2018-10-04 12:04:36 +10:00
|
|
|
_defs_image_generic.cursor,
|
2018-05-16 18:41:11 +02:00
|
|
|
*_tools_select,
|
2018-10-04 12:04:36 +10:00
|
|
|
None,
|
|
|
|
*_tools_transform,
|
|
|
|
None,
|
2018-08-21 01:17:15 +12:00
|
|
|
*_tools_annotate,
|
2018-10-05 13:07:01 +10:00
|
|
|
None,
|
|
|
|
lambda context: (
|
|
|
|
_defs_image_uv_sculpt.generate_from_brushes(context)
|
|
|
|
if _defs_image_generic.poll_uvedit(context)
|
|
|
|
else ()
|
|
|
|
),
|
2018-05-16 18:41:11 +02:00
|
|
|
],
|
|
|
|
'MASK': [
|
|
|
|
None,
|
|
|
|
],
|
|
|
|
'PAINT': [
|
|
|
|
_defs_texture_paint.generate_from_brushes,
|
|
|
|
],
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2017-10-21 16:19:48 +11:00
|
|
|
class VIEW3D_PT_tools_active(ToolSelectPanelHelper, Panel):
|
|
|
|
bl_space_type = 'VIEW_3D'
|
|
|
|
bl_region_type = 'TOOLS'
|
2018-04-24 16:04:07 +02:00
|
|
|
bl_label = "Tools" # not visible
|
|
|
|
bl_options = {'HIDE_HEADER'}
|
2017-10-21 16:19:48 +11:00
|
|
|
|
|
|
|
# Satisfy the 'ToolSelectPanelHelper' API.
|
2018-07-14 09:02:36 +02:00
|
|
|
keymap_prefix = "3D View Tool:"
|
2017-10-21 16:19:48 +11:00
|
|
|
|
|
|
|
@classmethod
|
2018-05-16 18:41:11 +02:00
|
|
|
def tools_from_context(cls, context, mode=None):
|
|
|
|
if mode is None:
|
|
|
|
mode = context.mode
|
|
|
|
for tools in (cls._tools[None], cls._tools.get(mode, ())):
|
2018-04-29 12:26:00 +02:00
|
|
|
for item in tools:
|
2018-04-30 13:46:01 +02:00
|
|
|
if not (type(item) is ToolDef) and callable(item):
|
2018-04-29 12:26:00 +02:00
|
|
|
yield from item(context)
|
|
|
|
else:
|
|
|
|
yield item
|
|
|
|
|
2017-10-21 16:19:48 +11:00
|
|
|
@classmethod
|
|
|
|
def tools_all(cls):
|
2018-04-26 14:43:32 +02:00
|
|
|
yield from cls._tools.items()
|
2017-10-21 16:19:48 +11:00
|
|
|
|
|
|
|
# for reuse
|
|
|
|
_tools_transform = (
|
2018-07-03 13:51:11 +02:00
|
|
|
_defs_transform.transform,
|
|
|
|
_defs_transform.translate,
|
2018-04-27 13:23:29 +02:00
|
|
|
_defs_transform.rotate,
|
2018-04-24 09:19:28 +02:00
|
|
|
(
|
2018-04-27 13:23:29 +02:00
|
|
|
_defs_transform.scale,
|
|
|
|
_defs_transform.scale_cage,
|
2018-04-24 09:19:28 +02:00
|
|
|
),
|
2017-10-21 16:19:48 +11:00
|
|
|
)
|
|
|
|
|
2018-04-29 16:36:31 +02:00
|
|
|
_tools_select = (
|
|
|
|
(
|
|
|
|
_defs_view3d_select.border,
|
|
|
|
_defs_view3d_select.circle,
|
|
|
|
_defs_view3d_select.lasso,
|
|
|
|
),
|
|
|
|
)
|
|
|
|
|
2018-07-31 10:22:19 +02:00
|
|
|
_tools_annotate = (
|
|
|
|
(
|
2018-08-23 20:25:25 +10:00
|
|
|
_defs_annotate_view3d.scribble,
|
|
|
|
_defs_annotate_view3d.line,
|
|
|
|
_defs_annotate_view3d.poly,
|
|
|
|
_defs_annotate_view3d.eraser,
|
2018-07-31 10:22:19 +02:00
|
|
|
),
|
|
|
|
_defs_view3d_generic.ruler,
|
|
|
|
)
|
|
|
|
|
2018-09-25 13:17:48 +02:00
|
|
|
_tools_gpencil_select = (
|
|
|
|
(
|
2018-10-05 10:27:04 +10:00
|
|
|
_defs_gpencil_edit.box_select,
|
2018-09-25 13:17:48 +02:00
|
|
|
_defs_gpencil_edit.circle_select,
|
|
|
|
_defs_gpencil_edit.lasso_select,
|
|
|
|
),
|
|
|
|
)
|
|
|
|
|
2017-10-21 16:19:48 +11:00
|
|
|
_tools = {
|
|
|
|
None: [
|
2018-08-23 12:12:11 +10:00
|
|
|
# Don't use this! because of paint modes.
|
|
|
|
# _defs_view3d_generic.cursor,
|
2017-11-02 23:05:13 +11:00
|
|
|
# End group.
|
2017-10-21 16:19:48 +11:00
|
|
|
],
|
|
|
|
'OBJECT': [
|
2018-08-23 12:12:11 +10:00
|
|
|
_defs_view3d_generic.cursor,
|
2018-04-29 16:36:31 +02:00
|
|
|
*_tools_select,
|
|
|
|
None,
|
2017-10-21 16:19:48 +11:00
|
|
|
*_tools_transform,
|
2018-07-31 10:22:19 +02:00
|
|
|
None,
|
|
|
|
*_tools_annotate,
|
2017-10-21 16:19:48 +11:00
|
|
|
],
|
|
|
|
'POSE': [
|
2018-08-23 12:12:11 +10:00
|
|
|
_defs_view3d_generic.cursor,
|
2018-04-29 16:36:31 +02:00
|
|
|
*_tools_select,
|
2018-08-23 12:12:11 +10:00
|
|
|
None,
|
2017-10-21 16:19:48 +11:00
|
|
|
*_tools_transform,
|
2018-05-15 12:40:50 +02:00
|
|
|
None,
|
2018-07-31 10:22:19 +02:00
|
|
|
*_tools_annotate,
|
|
|
|
None,
|
2018-05-15 12:40:50 +02:00
|
|
|
(
|
|
|
|
_defs_pose.breakdown,
|
|
|
|
_defs_pose.push,
|
|
|
|
_defs_pose.relax,
|
2018-07-31 10:22:19 +02:00
|
|
|
),
|
2017-10-21 16:19:48 +11:00
|
|
|
],
|
|
|
|
'EDIT_ARMATURE': [
|
2018-08-23 12:12:11 +10:00
|
|
|
_defs_view3d_generic.cursor,
|
2018-04-29 16:36:31 +02:00
|
|
|
*_tools_select,
|
|
|
|
None,
|
2017-10-21 16:19:48 +11:00
|
|
|
*_tools_transform,
|
2018-07-31 10:22:19 +02:00
|
|
|
None,
|
|
|
|
*_tools_annotate,
|
2018-04-27 13:23:29 +02:00
|
|
|
_defs_edit_armature.roll,
|
2018-05-15 10:24:26 +02:00
|
|
|
(
|
|
|
|
_defs_edit_armature.bone_size,
|
|
|
|
_defs_edit_armature.bone_envelope,
|
|
|
|
),
|
2017-10-21 16:19:48 +11:00
|
|
|
None,
|
2018-04-27 19:16:00 +02:00
|
|
|
(
|
|
|
|
_defs_edit_armature.extrude,
|
|
|
|
_defs_edit_armature.extrude_cursor,
|
2018-07-31 10:22:19 +02:00
|
|
|
),
|
2017-10-21 16:19:48 +11:00
|
|
|
],
|
|
|
|
'EDIT_MESH': [
|
2018-08-23 12:12:11 +10:00
|
|
|
_defs_view3d_generic.cursor,
|
2018-04-29 16:36:31 +02:00
|
|
|
*_tools_select,
|
|
|
|
None,
|
2017-10-21 16:19:48 +11:00
|
|
|
*_tools_transform,
|
|
|
|
None,
|
2018-07-31 10:22:19 +02:00
|
|
|
*_tools_annotate,
|
|
|
|
None,
|
2018-05-10 20:16:22 +02:00
|
|
|
_defs_edit_mesh.cube_add,
|
|
|
|
None,
|
2018-04-24 15:32:11 +02:00
|
|
|
(
|
2018-04-30 20:40:36 +02:00
|
|
|
_defs_edit_mesh.extrude,
|
2018-08-29 22:59:49 +10:00
|
|
|
_defs_edit_mesh.extrude_normals,
|
2018-04-30 20:40:36 +02:00
|
|
|
_defs_edit_mesh.extrude_individual,
|
|
|
|
_defs_edit_mesh.extrude_cursor,
|
2018-04-24 15:32:11 +02:00
|
|
|
),
|
2018-04-27 13:23:29 +02:00
|
|
|
_defs_edit_mesh.inset,
|
2018-04-27 22:48:23 +02:00
|
|
|
_defs_edit_mesh.bevel,
|
2018-04-27 22:59:51 +02:00
|
|
|
(
|
|
|
|
_defs_edit_mesh.loopcut_slide,
|
|
|
|
_defs_edit_mesh.offset_edge_loops_slide,
|
|
|
|
),
|
2018-04-24 15:32:11 +02:00
|
|
|
(
|
2018-04-30 20:40:36 +02:00
|
|
|
_defs_edit_mesh.knife,
|
|
|
|
_defs_edit_mesh.bisect,
|
|
|
|
),
|
|
|
|
_defs_edit_mesh.poly_build,
|
|
|
|
(
|
|
|
|
_defs_edit_mesh.spin,
|
|
|
|
_defs_edit_mesh.spin_duplicate,
|
2018-04-24 15:32:11 +02:00
|
|
|
),
|
|
|
|
(
|
2018-04-27 13:23:29 +02:00
|
|
|
_defs_edit_mesh.vertex_smooth,
|
|
|
|
_defs_edit_mesh.vertex_randomize,
|
2018-04-24 15:32:11 +02:00
|
|
|
),
|
2018-04-30 20:40:36 +02:00
|
|
|
(
|
|
|
|
_defs_edit_mesh.edge_slide,
|
|
|
|
_defs_edit_mesh.vert_slide,
|
|
|
|
),
|
2018-04-24 15:32:11 +02:00
|
|
|
(
|
2018-04-27 13:23:29 +02:00
|
|
|
_defs_edit_mesh.shrink_fatten,
|
|
|
|
_defs_edit_mesh.push_pull,
|
2018-04-24 15:32:11 +02:00
|
|
|
),
|
2018-08-28 20:41:48 +10:00
|
|
|
(
|
|
|
|
_defs_edit_mesh.shear,
|
|
|
|
_defs_edit_mesh.tosphere,
|
|
|
|
),
|
2017-11-02 23:05:13 +11:00
|
|
|
(
|
2018-04-30 20:40:36 +02:00
|
|
|
_defs_edit_mesh.rip_region,
|
|
|
|
_defs_edit_mesh.rip_edge,
|
2018-04-26 07:31:39 +02:00
|
|
|
),
|
2017-10-21 16:19:48 +11:00
|
|
|
],
|
|
|
|
'EDIT_CURVE': [
|
2018-08-23 12:12:11 +10:00
|
|
|
_defs_view3d_generic.cursor,
|
2018-04-29 16:36:31 +02:00
|
|
|
*_tools_select,
|
|
|
|
None,
|
2017-10-21 16:19:48 +11:00
|
|
|
*_tools_transform,
|
|
|
|
None,
|
2018-07-31 10:22:19 +02:00
|
|
|
*_tools_annotate,
|
|
|
|
None,
|
2018-04-27 13:23:29 +02:00
|
|
|
_defs_edit_curve.draw,
|
2018-08-29 15:14:41 +10:00
|
|
|
(
|
|
|
|
_defs_edit_curve.extrude,
|
|
|
|
_defs_edit_curve.extrude_cursor,
|
|
|
|
)
|
2017-10-21 16:19:48 +11:00
|
|
|
],
|
2018-05-28 18:05:21 +02:00
|
|
|
'PARTICLE': [
|
2018-08-23 12:12:11 +10:00
|
|
|
_defs_view3d_generic.cursor,
|
2018-08-02 17:41:11 +10:00
|
|
|
_defs_particle.generate_from_brushes,
|
2018-05-28 18:05:21 +02:00
|
|
|
],
|
2018-04-29 14:31:00 +02:00
|
|
|
'SCULPT': [
|
|
|
|
_defs_sculpt.generate_from_brushes,
|
2018-08-23 12:56:02 +10:00
|
|
|
None,
|
|
|
|
_defs_sculpt.hide_border,
|
|
|
|
_defs_sculpt.mask_border,
|
2018-04-29 14:31:00 +02:00
|
|
|
],
|
2018-04-30 16:43:13 +02:00
|
|
|
'PAINT_TEXTURE': [
|
|
|
|
_defs_texture_paint.generate_from_brushes,
|
|
|
|
],
|
2018-04-30 15:21:04 +02:00
|
|
|
'PAINT_VERTEX': [
|
2018-04-30 16:06:51 +02:00
|
|
|
_defs_vertex_paint.generate_from_brushes,
|
2018-08-29 16:21:48 +10:00
|
|
|
None,
|
|
|
|
lambda context: (
|
|
|
|
VIEW3D_PT_tools_active._tools_select
|
|
|
|
if _defs_vertex_paint.poll_select_mask(context)
|
|
|
|
else ()
|
|
|
|
),
|
2018-04-30 16:06:51 +02:00
|
|
|
],
|
|
|
|
'PAINT_WEIGHT': [
|
2018-08-23 12:12:11 +10:00
|
|
|
# TODO, check for mixed pose mode
|
|
|
|
_defs_view3d_generic.cursor,
|
2018-04-30 16:59:16 +02:00
|
|
|
_defs_weight_paint.generate_from_brushes,
|
2018-05-01 12:20:53 +02:00
|
|
|
None,
|
|
|
|
_defs_weight_paint.sample_weight,
|
|
|
|
_defs_weight_paint.sample_weight_group,
|
|
|
|
None,
|
2018-08-29 16:21:48 +10:00
|
|
|
lambda context: (
|
|
|
|
VIEW3D_PT_tools_active._tools_select
|
|
|
|
if _defs_weight_paint.poll_select_mask(context)
|
|
|
|
else ()
|
|
|
|
),
|
2018-05-01 12:20:53 +02:00
|
|
|
None,
|
2018-05-01 12:46:25 +02:00
|
|
|
_defs_weight_paint.gradient,
|
2018-04-30 15:21:04 +02:00
|
|
|
],
|
2018-07-31 10:22:19 +02:00
|
|
|
'GPENCIL_PAINT': [
|
|
|
|
_defs_gpencil_paint.generate_from_brushes,
|
|
|
|
],
|
|
|
|
'GPENCIL_EDIT': [
|
2018-08-23 12:12:11 +10:00
|
|
|
_defs_view3d_generic.cursor,
|
2018-10-05 10:27:04 +10:00
|
|
|
_defs_gpencil_edit.box_select,
|
2018-09-21 10:28:51 +02:00
|
|
|
_defs_gpencil_edit.circle_select,
|
|
|
|
_defs_gpencil_edit.lasso_select,
|
2018-07-31 10:22:19 +02:00
|
|
|
None,
|
2018-10-23 13:03:25 +02:00
|
|
|
*_tools_transform,
|
|
|
|
None,
|
2018-07-31 10:22:19 +02:00
|
|
|
_defs_gpencil_edit.bend,
|
|
|
|
_defs_gpencil_edit.shear,
|
|
|
|
_defs_gpencil_edit.tosphere,
|
|
|
|
],
|
|
|
|
'GPENCIL_SCULPT': [
|
|
|
|
_defs_gpencil_sculpt.smooth,
|
|
|
|
_defs_gpencil_sculpt.thickness,
|
|
|
|
_defs_gpencil_sculpt.strength,
|
|
|
|
_defs_gpencil_sculpt.grab,
|
|
|
|
_defs_gpencil_sculpt.push,
|
|
|
|
_defs_gpencil_sculpt.twist,
|
|
|
|
_defs_gpencil_sculpt.pinch,
|
|
|
|
_defs_gpencil_sculpt.randomize,
|
|
|
|
_defs_gpencil_sculpt.clone,
|
2018-09-25 13:17:48 +02:00
|
|
|
None,
|
|
|
|
*_tools_gpencil_select,
|
2018-07-31 10:22:19 +02:00
|
|
|
],
|
|
|
|
'GPENCIL_WEIGHT': [
|
|
|
|
_defs_gpencil_weight.paint,
|
|
|
|
],
|
2017-10-21 16:19:48 +11:00
|
|
|
}
|
|
|
|
|
2018-11-04 10:25:27 +11:00
|
|
|
|
2018-10-15 18:54:09 +02:00
|
|
|
class TOPBAR_PT_annotation_layers(Panel, AnnotationDataPanel):
|
|
|
|
bl_space_type = 'VIEW_3D'
|
|
|
|
bl_region_type = 'HEADER'
|
|
|
|
bl_label = "Layers"
|
|
|
|
bl_ui_units_x = 14
|
|
|
|
|
2017-10-21 16:19:48 +11:00
|
|
|
|
|
|
|
classes = (
|
2018-05-16 18:41:11 +02:00
|
|
|
IMAGE_PT_tools_active,
|
2017-10-21 16:19:48 +11:00
|
|
|
VIEW3D_PT_tools_active,
|
2018-09-27 20:50:05 +02:00
|
|
|
TOPBAR_PT_gpencil_materials,
|
2018-10-15 18:54:09 +02:00
|
|
|
TOPBAR_PT_annotation_layers,
|
2017-10-21 16:19:48 +11:00
|
|
|
)
|
|
|
|
|
|
|
|
if __name__ == "__main__": # only for live edit.
|
|
|
|
from bpy.utils import register_class
|
|
|
|
for cls in classes:
|
|
|
|
register_class(cls)
|