end0tknr's kipple - web写経開発

太宰府天満宮の狛犬って、妙にカワイイ

blender python で、meshにmirror modifier適用

import bpy
import copy
import math
import bmesh
import sys
from mathutils import Vector

def main():
    #全object削除
    remove_all_obj()
    #球追加
    new_obj = add_sphere()
    # mirror適用
    set_mirror_modifier( new_obj.name )

def set_mirror_modifier( obj_name ):

    # 一旦、全てを選択解除
    for ob in bpy.context.scene.objects:
        ob.select_set(False)

    ob = bpy.data.objects.get( obj_name )
    if not ob:
        return

    ob.select_set(True)
    bpy.context.view_layer.objects.active = ob
    bpy.ops.object.mode_set(mode='EDIT', toggle=False)

    meshdata = bmesh.from_edit_mesh(ob.data)
    meshdata.select_mode = {'VERT'} # 頂点選択mode化
    
    for vert in meshdata.verts:
        if vert.co.x < -0.001:
            vert.select_set(True)
        else:
            vert.select_set(False)

    bpy.ops.mesh.delete(type='VERT') # 選択頂点を削除

    
    
    bpy.ops.object.mode_set(mode='OBJECT', toggle=False)
  
    # ミラー モディファイアを適用
    bpy.ops.object.modifier_add(type='MIRROR')
    # 作成したモディファイアを取得
    modifier = ob.modifiers['Mirror']
  
    modifier.use_axis[0] = True        # X軸でmirror
    modifier.use_axis[1] = False
    modifier.use_axis[2] = False
  
    # option設定
    modifier.use_mirror_merge = True
    modifier.use_clip = True
    modifier.use_mirror_vertex_groups = True
  
    # 結合距離
    modifier.merge_threshold = 0.001


def add_sphere():
    bpy.ops.mesh.primitive_uv_sphere_add(
        segments=32,
        ring_count=16,
        radius=1.0,
        location=(0.0, 0.0, 0.0),
        rotation=(0.0, 0.0, 0.0) )

    # 作成したobject参照を取得
    obj = bpy.context.view_layer.objects.active
    obj.name  = 'NewSphere'
    return obj
    

def remove_all_obj():
    for col in bpy.data.collections:
        for item in col.objects:
            col.objects.unlink(item)
            bpy.data.objects.remove(item)

    for item in bpy.context.scene.collection.objects:
        bpy.context.scene.collection.objects.unlink(item)
        bpy.data.objects.remove(item)

    for item in bpy.data.meshes:
        bpy.data.meshes.remove(item)

    for item in bpy.data.materials:
        bpy.data.materials.remove(item)


if __name__ == '__main__':
    main()