MRが楽しい

MRやVRについて学習したことを書き残す

Blender2.8で利用可能なpythonスクリプトを作る その60(Operatorを利用しないオブジェクトの複製)

本日は Blender の技術調査枠です。
Blender2.8で利用可能なpythonスクリプトを作ります。

Operatorを利用しないオブジェクトの複製

指定オブジェクトの複製を行います。
スクリプトは Operator を利用せず、複製を行います。
これにより、複製オブジェクトの参照を戻り値で取得できます。
・copy_object_target.py

# 各種ライブラリインポート
import bpy

# 指定オブジェクトを複製する
def copy_object_target(arg_object:bpy.types.Object) -> bpy.types.Object:
    """指定オブジェクトを複製する

    Args:
        arg_object (bpy.types.Object): 指定オブジェクト

    Returns:
        bpy.types.Object: 複製オブジェクトの参照
    """

    # オブジェクトを複製する
    duplicatob = arg_object.copy()

    # 複製先のコレクションの参照
    target_collection = None

    # 全てのコレクションを操作する
    for collection in bpy.data.collections:
        # コレクション内に複製元オブジェクトが含まれるか確認する
        if arg_object.name in collection.objects:
            # 複製元オブジェクトのコレクションを複製先とする
            target_collection = collection

    # 複製先のコレクションが存在するか確認する
    if target_collection != None:
        # 複製したオブジェクトをシーンの複製先コレクションにリンクする
        target_collection.objects.link(duplicatob)
    else:
        # 複製先のコレクションが見つからない場合はコンテキストにリンクする
        bpy.context.scene.collection.objects.link(duplicatob)

    return duplicatob

# 関数の実行例
target_obj = bpy.data.objects.get("Cube")
copy_obj = copy_object_target(arg_object=target_obj)
copy_obj.name = "Cube_copy"

f:id:bluebirdofoz:20200821183748j:plain

Operatorを利用しないオブジェクトの複製(メッシュのシングルユーザ化)

指定オブジェクトの複製を行います。
スクリプトは Operator を利用せず、複製を行います。
これにより、複製オブジェクトの参照を戻り値で取得できます。
本関数では更にメッシュもシングルユーザ化します。
・singlecopy_object_target.py

# 各種ライブラリインポート
import bpy

# 指定オブジェクトを複製してシングルユーザ化する
def singlecopy_object_target(arg_object:bpy.types.Object) -> bpy.types.Object:
    """指定オブジェクトをしてシングルユーザ化する

    Args:
        arg_object (bpy.types.Object): 指定オブジェクト

    Returns:
        bpy.types.Object: 複製オブジェクトの参照
    """

    # オブジェクトを複製する
    duplicatob = arg_object.copy()
    
    # オブジェクトのメッシュデータを取得する
    # IDアクセスのマニュアル
    # (https://docs.blender.org/api/current/bpy.types.ID.html)
    mesh = duplicatob.data
    
    # メッシュの参照ユーザ数を取得する
    user_count = mesh.users

    # 複数のユーザが参照しているか確認する
    if user_count > 1:
        # シングルユーザ化するため、メッシュのコピーを作成して参照する
        duplicatob.data = mesh.copy()

    # 複製先のコレクションの参照
    target_collection = None

    # 全てのコレクションを操作する
    for collection in bpy.data.collections:
        # コレクション内に複製元オブジェクトが含まれるか確認する
        if arg_object.name in collection.objects:
            # 複製元オブジェクトのコレクションを複製先とする
            target_collection = collection

    # 複製先のコレクションが存在するか確認する
    if target_collection != None:
        # 複製したオブジェクトをシーンの複製先コレクションにリンクする
        target_collection.objects.link(duplicatob)
    else:
        # 複製先のコレクションが見つからない場合はコンテキストにリンクする
        bpy.context.scene.collection.objects.link(duplicatob)

    return duplicatob

# 関数の実行例
target_obj = bpy.data.objects.get("Cube")
copy_obj = singlecopy_object_target(arg_object=target_obj)
copy_obj.name = "Cube_copy"

f:id:bluebirdofoz:20200905112800j:plain