Blender初心者が最初に覚えるべき内容をまとめたページは、このリンクにあります。
このページは、Blender(Portable_4.1.1)のPythonスクリプトでこのページで示す手法で実行できるソースです。
参考:https://docs.blender.org/api/current/
D:\work\test.pyでソースを作り、下記のコードを貼り付けて実行します。(使用している Python のバージョンは、'3.11.7' です。)
import sys from importlib import reload sys.path.append('D:\\work') import test #reload( test )
import bpy obj = bpy.data.objects['Cube'] # 指定オブジェクトを変数で管理 #bpy.ops.object.editmode_toggle() # オブジェクトモードとエディットモードの切り替え bpy.ops.object.mode_set(mode='EDIT')# 下記の面選択にするため編集モードにする bpy.ops.mesh.select_mode(use_extend=False, use_expand=False, type='FACE')# 面選択モード bpy.ops.mesh.select_all(action='DESELECT') # 全て非選択へ (action='SELECT'で選択) bpy.ops.object.mode_set(mode='OBJECT')# オブジェクトモードに切り替え obj.data.polygons[0].select = True # 面のインデックスを指定して選択(オブジェクトモードで可能) bpy.ops.object.mode_set(mode='EDIT')# 上記添え字で選択したが編集モードにしないと、確認できないのでエディットモードの切り替え bpy.ops.transform.translate(value=(1, 0, 1), orient_type='GLOBAL')# 選択面の平行移動(エディットモードで行わないとオブジェクト全体の移動になる)上記のobj.data.polygons[添え字].selectで、添え字に対応する面は、次のダイダイ色の番号通りでした。(実験結果)
import bpy import os for obj in bpy.data.objects:# 'Camera' と 'Light' 以外を全て削除する if obj.name=='Camera' or obj.name=='Light': continue bpy.data.objects.remove( obj ) bpy.ops.mesh.primitive_cube_add()#cubeを追加 obj= bpy.context.active_object # 上記生成直後のオブジェクトを取得 obj.name='立方体' # オブジェクトの名前変更 import bmesh bpy.ops.object.mode_set(mode='EDIT')# 下記の編集オブジェクト取得のため編集モードにする # 上記で、bpy.context.active_object.modeが'EDIT'になります。) obj = bpy.context.edit_object # bpy.context.active_objectで取得してもよい。 bm = bmesh.from_edit_mesh(obj.data) # BMeshのコピーを取得(エディットモードで行わないとエラー) for vert in bm.verts:vert.select_set(False)# すべての頂点の選択状態を解除します for edge in bm.edges:edge.select_set(False)# すべての辺の選択状態を解除します for face in bm.faces:face.select_set(False)# すべての面の選択状態を解除します # bpy.ops.mesh.select_all(action='DESELECT') で全て非選択することも可能 bm.faces.ensure_lookup_table() # これを使わないと、下記でエラー bm.faces[5].select = True# トップ面のインデックスを指定して選択 bpy.ops.transform.translate(value=(1, 0, 1), orient_type='GLOBAL')# 選択オブジェクトの平行移動(エディットモードで行わないと、辺の移動) bmesh.update_edit_mesh(obj.data) # bmeshで、obj.dataを更新bm.faces[5]がトップ面になっています。(前述のオブジェクトモードでのobj.data.polygons[0]がトップ面で、添え字の面が全く異なります)
import bpy import os for obj in bpy.data.objects:# 'Camera' と 'Light' 以外を全て削除する if obj.name=='Camera' or obj.name=='Light': continue bpy.data.objects.remove( obj ) bpy.ops.mesh.primitive_cylinder_add(vertices=32,radius=0.05,depth=0.05)#円柱を追加 obj= bpy.context.object # 上記生成直後のオブジェクトを取得「obj = bpy.context.active_object で取得することもできます。」 obj= bpy.data.objects['円柱'] # この例において、上記の行はこの行と同じオブジェクトがobjに設定される。 bpy.ops.object.mode_set(mode='OBJECT')# オブジェクトモードに切り替え obj.select_set(False) # オブジェクトの選択を外しても、個々の面の選択は外れない結果が得られた。 bpy.ops.object.mode_set(mode='EDIT')# エディットモードの切り替え bpy.ops.mesh.select_mode(use_extend=False, use_expand=False, type='FACE')# 面選択モード bpy.ops.mesh.select_all(action='DESELECT') # 全て非選択へ (action='SELECT'で選択) bpy.ops.object.mode_set(mode='OBJECT')# オブジェクトモードに切り替え nn=len(obj.data.polygons) print(f"number of faces:{nn}")#「number of faces:34」の表示 for i, ob in enumerate(obj.data.polygons): if i % 2 == 0: continue print(f"[{i}] :{ob.select}") #奇数添え字面だけの選択 obj.data.polygons[i].select = True obj.data.polygons[0].select = True# 側面の右回りで最も奥の面 # obj.data.polygons[30].select = True# トップ面 obj.data.polygons[33].select = False# 最後の面の選択(底面) bpy.ops.object.mode_set(mode='EDIT')# エディットモードの切り替え上記のobj.data.polygons[添え字].selectで、添え字に対応する面は、次のダイダイ色の番号通りでした。
import bpy import os for obj in bpy.data.objects:# 'Camera' と 'Light' 以外を全て削除する if obj.name=='Camera' or obj.name=='Light': continue bpy.data.objects.remove( obj ) bpy.ops.mesh.primitive_cylinder_add(vertices=32,radius=0.05,depth=0.05)#円柱を追加 obj= bpy.context.active_object # 上記生成直後のオブジェクトを取得 obj.name='Cube2' # オブジェクトの名前変更 import bmesh bpy.ops.object.mode_set(mode='EDIT')# 下記の編集オブジェクト取得のため編集モードにする bpy.ops.mesh.select_all(action='DESELECT') # 全て非選択へ (action='SELECT'で選択) obj = bpy.context.active_object bm = bmesh.from_edit_mesh(obj.data) # BMeshのコピーを取得 nn=len(bm.faces) print(f"number of faces:{nn}")#「number of faces:34」の表示 bm.faces.ensure_lookup_table() # これを使わないと、下記でエラー for i, ob in enumerate(bm.faces): if i % 2 == 0: continue print(f"[{i}] :{ob.select}") #奇数添え字面だけの選択 bm.faces[i].select = True bm.faces[0].select = True# 側面の右回りで最も奥の面 #bm.faces[30].select = True# (トップ面) bm.faces[33].select = False# 最後の面の選択(底面) bmesh.update_edit_mesh(obj.data) # bmeshで、obj.dataを更新