A simple script for Blender 4.0.0 version with Bright Pencil material, see the output image:
This is the source code:
import bpy
import random
# fix an active object before changing mode
if bpy.context.view_layer.objects.active is None:
# If there is no active object, set the first object in the scene as active
if len(bpy.context.scene.objects) > 0:
bpy.context.view_layer.objects.active = bpy.context.scene.objects[0]
else:
print("There are no objects in the scene to set as active.")
# set the mode
bpy.ops.object.mode_set(mode='OBJECT')
# set camera from the scene
cam_ob = bpy.context.scene.camera
# if is a camera in the scene and set it as active object
if cam_ob is None:
print("There is no camera in the scene.")
elif cam_ob.type == 'CAMERA':
# Set the camera as active object
bpy.context.view_layer.objects.active = cam_ob
print("The camera has been set as active object.")
else:
print(f"The object {cam_ob.type} is set as a camera, but it is not of type 'CAMERA'.")
# set data for the ink brush
gpencil = bpy.data.grease_pencils.new("Bright Pencil")
# make material for the ink brush
if "Bright Material" in bpy.data.materials.keys():
gp_mat = bpy.data.materials["Bright Material"]
else:
gp_mat = bpy.data.materials.new("Bright Material")
if not gp_mat.is_grease_pencil:
bpy.data.materials.create_gpencil_data(gp_mat)
bpy.context.object.active_material.grease_pencil.color = (0, 0, 1, 1)
# set the object for the ink brush
if "Bright Pencil" not in bpy.data.objects:
gp_data = bpy.data.objects.new("Bright Pencil", gpencil)
bpy.context.scene.collection.objects.link(gp_data)
# if it does not already exist in the scene
else:
gp_data = bpy.data.objects["Bright Pencil"]
# assign material for drawing
if gp_mat.name not in gp_data.data.materials:
gp_data.data.materials.append(gp_mat)
# define a function to create random lines
def create_random_strokes(num_strokes, max_width):
# Set the active object and mode
bpy.context.view_layer.objects.active = gp_data
bpy.ops.object.mode_set(mode='PAINT_GPENCIL')
# get or create layer and set it as active
if gpencil.layers and gpencil.layers.active:
layer = gpencil.layers.active
else:
layer = gpencil.layers.new('my_test_layer', set_active=True)
# set layer as active
gpencil.layers.active = layer
# get or create frame and set it as active using change_frame() method
if layer.frames and layer.active_frame:
frame = layer.active_frame
else:
frame = layer.frames.new(1)
for _ in range(num_strokes):
stroke = frame.strokes.new()
stroke.line_width = int(random.uniform(1.0, max_width))
stroke.points.add(count=3)
for point in stroke.points:
point.co = (random.uniform(-1.0, 1.0), random.uniform(-1.0, 1.0), 0.0)
# this function with desired parameters
create_random_strokes(num_strokes=10, max_width=16.0)
# return to original mode
bpy.ops.object.mode_set(mode='OBJECT')