(質問) 選択物の リストを取る方法

  • このフォーラムに新しいトピックを立てることはできません
  • このフォーラムではゲスト投稿が禁止されています

投稿ツリー



前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2015/1/8 15:19
もヂャ  新米   投稿数: 16
失礼致します。
スクリプト関係の質問をさせて頂きます。


「今 選択している オブジェクト」のリストは、
bpy.context.selected_objects で 取る事ができます。

同じように、
「選択している頂点」や、「選択しているUV」 を取る方法を、どなたか ご存知ないでしょうか。


一応、「頂点のリスト」
len(bpy.context.active_object.data.vertices) と
「それぞれが選択されているかどうか」
bpy.context.active_object.data.vertices[0].select を 取る事はできたのですが、
( ↑ これは なぜか編集モード内だと更新されないようです )

毎回 全ての頂点を総当たりで選択しているかどうか調べる というのも違う気がして・・・

「選択している頂点数」
bpy.context.object.data.total_vert_sel というのもあるので、
どこかに「選択している頂点のリスト」なんていうのも あるのかと思い、
いろいろ調べてはいるのですが、まだ見つけられていません。

頂点のマージをする時、
bpy.ops.mesh.merge(type='FIRST') #最初に選択した頂点
bpy.ops.mesh.merge(type='LAST') #最後に選択した頂点
というのがあるので、選択した順番の情報なんかも どこかにありそうな気がするのですが。


このような情報の取り方を ご存知の方がおられましたら、教えて頂けると有難いです。


投票数:0 平均点:0.00
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2015/1/9 11:19
完全無欠猫  長老 居住地: 兵庫  投稿数: 750
このサイト等を参考にされてはどうでしょうか?
Blender Python
Blender PythonのTipsがいろいろとあります。

Vertexに関する質問に関して私の知る限りでは、ないと思いますが・・・・。

又、既にご存知かとは思いますが実装されているAddon等のPythonで記述された機能は
該当するボタンなりPanelなりでマウス右クリックで表示されるメニューのEdit Sourceを選択すれば
概ね該当する箇所のPython SourceがText Editor画面に表示されます。
マウス右クリックで表示されるメニューのOnline Python Referenceを選択すれば
リリース版のBlender Python APIのマニュアルが表示されます。
但し、デイリービルド版では時折APIの統廃合や追加、削除がされることがありますので
常に最新とは限りません。

Editモード中の選択されているVertexの状態を正しく取得するためには
bpy.context.edit_object.update_from_editmode()を呼び出して状態を更新してやれば
vertexのselect状態がEditモードの中でも確認できます。

AddOnスクリプトのmesh_looptools.pyが参考になるかもしれません。
例えば、選択されているvertexを抽出するのであれば
vv = [v.index for v in D.meshes[C.edit_object.name].vertices if v.select and not v.hide]
vvにはindexが詰まっています。
これはPython consoleでの例なので・・・
Cはbpy.context
Dはbpy.dataに置き換えてください。
投票数:0 平均点:0.00
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 .2 | 投稿日時 2015/1/9 16:34
もヂャ  新米   投稿数: 16
>完全無欠猫さま

なるほど。
bpy.context.edit_object.update_from_editmode()
なんていうのがあったんですね。
これで、Vertexの選択状態を取る事ができます。
ありがとうございます。

まずは動けばいいので、
要領がいい方法は 教えて頂いたサイトなどを見ながら少しづつ調べようと思います。

早速、これも参考に。
vv = [v.index for v in D.meshes[C.edit_object.name].vertices if v.select and not v.hide]

えっと・・・ こうかな。
v.index
for v in bpy.data.meshes[bpy.context.edit_object.name].vertices
  if v.select and not v.hide

ん〜? 最初の v.index って何してるんだろ。
とりあえず、総当りで調べて
「選択」されていて、更に「見えて」いるものを選んでるんですね。
やっぱり そういうやり方になるんですねぇ。
参考になります。


Edit Sourceで表示される Python Sourceなんですが、
ボタンなどから表示されるソースって、パネルのレイアウトっぽかったので
レイアウトの参考としてしか使ってなかったのですが、
operator に書かれているIDネームを手がかりにして、
その先の処理内容を調べる事は可能でしょうか?

投票数:1 平均点:0.00
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2015/1/10 11:57
完全無欠猫  長老 居住地: 兵庫  投稿数: 750
引用:
えっと・・・ こうかな。
v.index
for v in bpy.data.meshes[bpy.context.edit_object.name].vertices
  if v.select and not v.hide

ん〜? 最初の v.index って何してるんだろ。
[v.index for v in D.meshes[C.edit_object.name].vertices if v.select and not v.hide]
これはリストの定義書式のひとつで分解するものではありません。

リストの定義書式は以下の通りです。
(Python公式サイトのドキュメント The Python Language Reference 6.2.4 6.2.5 辺りを参考にすればいいと思います)
list_display ::= "[" [expression_list | list_comprehension] "]"
list_comprehension ::= expression list_for
list_for ::= "for" target_list "in" old_expression_list _iter]
old_expression_list ::= old_expression [("," old_expression)+ [","]]
old_expression ::= or_test | old_lambda_form
list_iter ::= list_for | list_if
list_if ::= "if" old_expression _iter]

例えば
[ x for x in range(3)] のように書けば
[0, 1, 2]というリストが生成されます。
また [[x, y] for x in range(2) for y in range(2)]のように書けば
[[0, 0], [0, 1], [1, 0], [1, 1]] というリストが生成されます。

list_if節はマッチ条件です。

ですので、[v.index for v in D.meshes[C.edit_object.name].vertices if v.select and not v.hide]は
Edit中のmeshのVertexの中から条件に一致するVertexのindex番号でリストを生成するという式です。

投票数:0 平均点:0.00
前の投稿 - 次の投稿 | 親投稿 - 子投稿なし | 投稿日時 2015/1/10 12:38
もヂャ  新米   投稿数: 16
なるほど。
代入でそう書けるって事ではなく、全部まとめて そういう書式だったんですね。
勘違いしてました。

すみません。
投票数:1 平均点:0.00
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2015/1/10 14:11
完全無欠猫  長老 居住地: 兵庫  投稿数: 750
引用:
operator に書かれているIDネームを手がかりにして、
その先の処理内容を調べる事は可能でしょうか?
質問の意味が今一わかりませんが・・・。
AddOnであれば該当するPanelでEdit Sourceを選択すると該当するAddOnのPython Sourceが
表示されます。
それを開いてFile Folderを開くとそのファイルを取得したフォルダがデフォルトで開かれると思います。
その中にそのAddOnのoperatorのSourceがあるかも知れません(Operatorがあればですが・・・)
Blenderの提供しているoperatorであれば
Online Python Referenceの中にあります。
Application Modulesの章の中のOperators (bpy.ops)です。
投票数:0 平均点:0.00
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 .2 | 投稿日時 2015/1/10 20:11
もヂャ  新米   投稿数: 16
すみません。なんかうまく説明できなくて。
そもそも 何か思い違いをしてるかもなのですが、

えっとですね。
例えば、

Merge>At_Last が、どう動いているのか、中の処理を覗けたら
最後に選択した頂点の調べ方が解るかもしれないと思って、
「Merge」の機能を調べようと、ボタンから「EditSouce」でソースを見ますと、

col.operator_menu_enum("mesh.merge", "type")
こういうのが見つかります。
これで ボタンが作られているらしいのは解るんですが、

どうやら 実際の処理は ここでやってないみたいだし、
じゃぁ、"mesh.merge" ってどこにあるのかな? と思いまして。

AddOnを作る時、
bl_idname = "mesh.merge"
みたいに書くので、
これもどこかに 実際の処理をしている merge.py とかがあるのかな?
と考えた訳です。

よく考えれば、AddOnだって そんな名前のファイルじゃないですよね。
すみません。あまり理解できてないもので、妙な質問してしまって。
投票数:1 平均点:0.00
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2015/1/10 22:15
uimac  常連   投稿数: 49
出来ました

import bmesh
bm = bmesh.new()
bm.from_mesh( bpy.context.object.data )
for s in bm.select_history:
    print(s)



投票数:0 平均点:0.00
前の投稿 - 次の投稿 | 親投稿 - 子投稿なし | 投稿日時 2015/1/10 23:07
もヂャ  新米   投稿数: 16
お〜!

import bmesh ですか〜。
何度か見かけてたんですが、ぱっと見て よく解んなかったのでスルーしてました。

bm.select_history で、選択順が取れるって事は、
他にも いろいろな情報が取れるかもしれないですね。
ちょっと調べてみます。

ありがとうございます〜。
投票数:0 平均点:0.00
前の投稿 - 次の投稿 | 親投稿 - 子投稿なし | 投稿日時 2015/1/13 11:05
完全無欠猫  長老 居住地: 兵庫  投稿数: 750
意味がわかりましたが・・・Blenderの機能の全てがPythonで記述されているわけではありません。
基本的にはC++で記述され、コンパイルされたバイナリコードです。

全てのコードが見たいのであればGitでソースコードを取得して見るしかないです。
しかし、それらも外部のライブラリを呼び出していたりして全てのコードを見ることは出来ません。
それらを使用するのに何を必要として何が処理されるのかを理解して使用するだけです。

投票数:0 平均点:0.00

  条件検索へ


ログイン

ユーザ名:

パスワード:



パスワード紛失

クイックリンク

2021/07/01版
●Blender.org
BlenderFoundation
- Blenderのダウンロード
- 公式チュート等
- 公式マニュアル(和訳)

●ニュース(英文)
BlenderNation

●Blenderコミュニティ
blenderartists.org

●Blender Q&A
- Blender Stack Exchange

●テストビルド
Buildbot(自動生成)


●開発関連
公式開発サイト
Blender開発blog
Blender Wiki