質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Blender

Blenderとは、オープンソースの3DCGソフトウェアです。フリーでありながら、3Dモデル作成、レンダリング、アニメーション、コンポジットなどのハイエンドに匹敵する高い機能を持ち、さらにゲームエンジンも搭載しています。

Q&A

解決済

1回答

985閲覧

変動するコレクションに対するループ処理

narwth1138

総合スコア18

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Blender

Blenderとは、オープンソースの3DCGソフトウェアです。フリーでありながら、3Dモデル作成、レンダリング、アニメーション、コンポジットなどのハイエンドに匹敵する高い機能を持ち、さらにゲームエンジンも搭載しています。

0グッド

0クリップ

投稿2019/05/14 19:29

Pythonで以下のようなプログラムを作っています。
・グラフのを通る点のうち、その点における接線の傾きが0でない点を削除

グラフを通る点が
AjDuplFcrv[m].keyframe_points

AjDuplFcrv[m].keyframe_points[0],
AjDuplFcrv[m].keyframe_points[1],
....

と格納されているのですが、ループ処理内で点を削除してしまうとそれ以降の点のインデックスが繰り上げられてしまい、次のループに入った際に一つ点をスキップしてしまいます。
全ての点に対し処理をするにはどのように処理をすればよいでしょうか。
よろしくお願いします。

python

1import bpy 2import numpy as np 3 4 5class GraphMod(bpy.types.Operator): 6 bl_idname = "graph.modification" 7 bl_label = "Graph Modification" 8 bl_description = "Transform Graph" 9 bl_options = {'REGISTER', 'UNDO'} 10 11 def execute(self,context): 12 aj = bpy.context.scene.objects.active 13 shape_key = aj.data.shape_keys 14 kbloks = shape_key.key_blocks.keys()#basis,mouth,... 15 bpy.ops.object.duplicate()#複製 16 ajDup = bpy.context.scene.objects.active#複製を選択 17 18 animParamList = [getattr(aj.data, 'shape_keys', None)] 19 print(animParamList) 20 print(len(animParamList)) 21 print(animParamList[0]) 22 print(type(animParamList[0])) 23 24 action = animParamList[0].animation_data.action 25 26 m=0 27 for fc in action.fcurves: 28 AnimShps = [] 29 animfcrvDP = fc.data_path 30 animfcrvChName=animfcrvDP.split('"')[1]#名前を取り出す 31 AnimShps.append(animfcrvChName)#空のリストに名前を入れる 32 AnimShpIndL = [i for i, j in enumerate(kbloks) if j == animfcrvChName]#シェイプキーのインデックスを探す 33 AnimShpInd = AnimShpIndL[0]#インデックスを代入 34 bpy.context.object.active_shape_key_index = AnimShpInd#該当のシェイプキーを選択 35 36 ajDup.data.shape_keys.key_blocks[AnimShpInd].keyframe_insert("value") 37 AjDuplFcrv = ajDup.data.shape_keys.animation_data.action.fcurves 38 39#削除処理 40 for k, key in enumerate(AjDuplFcrv[m].keyframe_points):#グラフを通る点でループ 41 if(key.handle_left[1]!=key.handle_right[1]):#接線の傾きを判定 42 AjDuplFcrv[m].keyframe_points.remove(AjDuplFcrv[m].keyframe_points[k])#点を削除 43 44 45 m=m+1 46 47 return {'FINISHED'} 48 49 50def menu_func(self, context): 51 self.layout.operator("graph.modification") 52 53 54def register(): 55 bpy.utils.register_module(__name__) 56 bpy.types.GRAPH_MT_channel.append(menu_func) 57 bpy.types.DOPESHEET_MT_channel.append(menu_func) 58 print("installed add-on") 59 60 61def unregister(): 62 bpy.types.GRAPH_MT_channel.remove(menu_func) 63 bpy.types.DOPESHEET_MT_channel.remove(menu_func) 64 bpy.utils.unregister_module(__name__) 65 print("uninstalled add-on") 66 67 68if __name__ == "__main__": 69 register() 70

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

提示のような処理の一般的な手法として、以下のように末尾から削除すればよいです。

Python

1lst = list(range(10)) 2print(lst) # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 3 4# 削除対象の位置を抽出 5del_lst = [i for i in lst if i%2] 6print(del_lst) # [1, 3, 5, 7, 9] 7 8# 末尾から削除 9for pos in reversed(del_lst): 10 del lst[pos] 11 12print(lst) # [0, 2, 4, 6, 8]

投稿2019/05/14 23:23

can110

総合スコア38262

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

narwth1138

2019/05/18 15:59

解決できました。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問