使用Grease Pencil绘制图形。
bpy.ops.gpencil.draw
通过以下方式调用:
bpy.ops.gpencil.draw(
mode='DRAW',
blendmode='NORMAL',
stroke=None,
wait_for_input=True
)
mode
(枚举): 绘图模式。默认值为DRAW
。值 | 描述 |
---|---|
DRAW |
绘制新的画笔轨迹。 |
DRAW_POLY |
绘制多边形。 |
DRAW_POLY_LINE |
绘制折线轮廓。 |
ERASER |
使用橡皮擦工具清除画布。 |
LINE |
绘制直线(两个点之间的线段)。 |
BOX |
绘制一个矩形。 |
CIRCLE |
绘制一个圆。 |
STRIP |
绘制纹理映射带。 |
DOT |
绘制一个象征性的点。 |
BOX_SELECT |
捕获重叠的笔画并选择它们。 |
LASSO_SELECT |
捕获笔画并选择它们。 |
SMART_FILL |
在选定的区域内创建填充。 |
FILL |
在一个封闭区域内创建填充。 |
blendmode
(枚举): 笔画混合模式。默认值为NORMAL
。值 | 描述 |
---|---|
NORMAL |
用新的画笔颜色覆盖旧的画笔颜色。 |
MIX |
基于画笔的不透明度混合新的和旧的画笔颜色。 |
ADD |
将新的画笔颜色与旧的画笔颜色相加。 |
SUBTRACT |
从旧画笔颜色中减去新画笔颜色。 |
stroke
(bpy_prop_collection,可选): Grease Pencil笔画对象的集合。默认值为None
。
wait_for_input
(布尔值,可选): 是否等待用户输入。默认值为True
。
{'FINISHED'}
。使用标准模板制作一种绘画应用程序:
import bpy
from bpy.props import IntProperty
class SimpleOperator(bpy.types.Operator):
"""Simple Operator"""
bl_idname = "gpencil.simple_operator"
bl_label = "Simple Operator"
bl_options = {'REGISTER', 'UNDO'}
draw_mode: bpy.props.EnumProperty(
items=[
('DRAW', "Draw", "Draw mode"),
('DRAW_POLY', "Draw Poly", "Draw Poly"),
('DRAW_POLY_LINE', "Draw Poly Line", "Draw Poly Line"),
('ERASER', "Eraser", "Eraser"),
('LINE', "Line", "Line"),
('BOX', "Box", "Box"),
('CIRCLE', "Circle", "Circle"),
('STRIP', "Strip", "Strip"),
('DOT', "Dot", "Dot"),
('BOX_SELECT', "Box Select", "Box Select"),
('LASSO_SELECT', "Lasso Select", "Lasso Select"),
('SMART_FILL', "Smart Fill", "Smart Fill"),
('FILL', "Fill", "Fill"),
],
name="Draw Mode",
description="Draw mode",
default='DRAW'
)
blend_mode: bpy.props.EnumProperty(
items=[
('NORMAL', "Normal", "Use new brush color to overwrite old brush color "),
('MIX', "Mix", "Mix new and old brush color based on opacity of brush"),
('ADD', "Add", "Add new brush color with old brush color"),
('SUBTRACT', "Subtract", "Subtract new brush color from old brush color"),
],
name="Blend Mode",
description="Blend mode",
default='NORMAL'
)
wait_for_input: bpy.props.BoolProperty(name="Wait For Input", default=True)
def execute(self, context):
view3d_area = None
# 获取视窗搜索迭代列表
for area in context.screen.areas:
if area.type == 'VIEW_3D':
view3d_area = area
break
# 切换到视窗
override = bpy.context.copy()
override['area'] = view3d_area
bpy.ops.screen.screen_full_area(override)
# 添加同步计时器
timer = context.window_manager.event_timer_add(0.02, window=context.window)
# 获取笔铅对象
gpencil_data = bpy.data.grease_pencils.new("New Grease Pencil")
gpencil_layer = gpencil_data.layers.new("Layer 1", set_active=True)
# 获取笔铅画笔对象
gpencil_stroke = gpencil_layer.active_frame.strokes.new()
gpencil_stroke.display_mode = '3DSPACE'
gpencil_stroke.material_index = 0
def draw_callback():
# 获取鼠标事件
event = context.events[-1]
if event.type == 'LEFTMOUSE' and event.value == 'PRESS':
gpencil_stroke.pen_flip()
gpencil_stroke.points.add(1)
gpencil_stroke.points[-1].co = event.mouse_region_x, event.mouse_region_y, 0
elif event.type == 'MOUSEMOVE' and event.mouse.is_dragging:
gpencil_stroke.points.add(1)
gpencil_stroke.points[-1].co = event.mouse_region_x, event.mouse_region_y, 0
elif event.type in {'ESC'}:
bpy.ops.gpencil.draw('INVOKE_DEFAULT', mode='ERASER', blendmode='NORMAL')
# 绑定笔画绘制回调函数
bpy.types.SpaceView3D.draw_handler_add(draw_callback, (), 'WINDOW', 'POST_PIXEL')
try:
# 启动绘制模式
bpy.ops.gpencil.draw('INVOKE_DEFAULT', mode=self.draw_mode, blendmode=self.blend_mode, stroke=gpencil_stroke, wait_for_input=self.wait_for_input)
# 等待输入结束
if self.wait_for_input:
while bpy.ops.gpencil.draw.poll():
timer.timeout = 0.02
finally:
# 关闭笔画绘制回调函数
bpy.types.SpaceView3D.draw_handler_remove(draw_callback, 'WINDOW')
# 停止同步计时器
context.window_manager.event_timer_remove(timer)
# 删除笔铅画笔对象
if gpencil_stroke in gpencil_layer.active_frame.strokes:
gpencil_layer.active_frame.strokes.remove(gpencil_stroke)
return {'FINISHED'}
class SimplePanel(bpy.types.Panel):
"""Simple Panel"""
bl_idname = "GPENCIL_PT_SimplePanel"
bl_label = "Simple Panel"
bl_category = "Draw"
bl_space_type = "VIEW_3D"
bl_region_type = "UI"
bl_context = "objectmode"
bl_options = {'DEFAULT_CLOSED'}
def draw(self, context):
layout = self.layout
layout.operator("gpencil.simple_operator")
def register():
bpy.utils.register_class(SimpleOperator)
bpy.utils.register_class(SimplePanel)
def unregister():
bpy.utils.unregister_class(SimpleOperator)
bpy.utils.unregister_class(SimplePanel)
if __name__ == "__main__":
register()
RuntimeError
- 如果当前没有Grease Pencil笔划对象,则引发运行时错误。