FC2ブログ
*admin*entry*file*plugin| 文字サイズ  

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。



また、久しぶりの更新ですが
今回アップしたアドオンについての説明です。
何をするものかというと・・・

これを簡略化できないかなぁ・・・

こういう選択を簡単に行うためのものです。
「何に使うねん」っていうと「ポリゴン削減」が
主な目的ですかね・・・

すでにあるかもしれませんが見つけられ
なかったので作ってみました。
最初に選択されている頂点が基準になります
これにより縦向きか、横向きかを決めます。
アドオンの作り方の勉強にもなるし良いかなぁって
実行すると・・・

これが
これを簡略化できないかなぁ・・・

こうなります
これを簡略化できないかなぁ・・・
ボタンを押すほど選択範囲が広がります。

物自体はココに置いてあるのでお好きにどうぞ
ここをクリック

ソースコードはこんな感じです


#アドオンの情報
bl_info = {
"name": "Skip Select(Loop)",
"author": "Mithril",
"version": (0, 0, 1),
"blender": (2, 7, 9),
"location": "3DView > Tools > Skip Select > Edit Mode ",
"description": "Loop selection for one skip",
"tracker_url": "http://mithrilproject.blog66.fc2.com/",
"warning": "",
"category": "Tools"}

#必要なインポート
import bpy
import bmesh

#メインの処理
def SkipSelect():
#エディットモードじゃなければ終了
if bpy.context.object.mode != "EDIT":return {'FINISHED'}

obj = bpy.context.active_object
#エディットモードに変更(別に要らないけど)
bpy.ops.object.mode_set(mode='EDIT')
#頂点モードに変更
bpy.context.tool_settings.mesh_select_mode = (True, False, False)
mesh = bmesh.from_edit_mesh(obj.data)

#選択頂点取得
verts = []
i = 0
for vert in mesh.verts:
if vert.select == True:
verts.append(vert.index)
i = i+1

#選択範囲拡張
bpy.ops.mesh.select_more()
#インバース選択
bpy.ops.mesh.select_all(action='INVERT')

#選択頂点を再選択
k = 0
for v in mesh.verts:
if k == i : break
if v.index == verts[k]:
v.select = True
k = k+1
if k == i : break

#インバース選択
bpy.ops.mesh.select_all(action='INVERT')

class UI(bpy.types.Panel):
#UI情報
bl_label = "Skip Select"
bl_space_type = "VIEW_3D"
bl_region_type = "TOOLS"
bl_category = 'Tools'

#オブジェクトが「メッシュ」以外だと非表示
@classmethod
def poll(self, context):
obj = context.active_object
if obj and obj.type == 'MESH':
return{'FINISHED'}

#ボタン配置
#エディットモード以外だとグレーアウト
def draw(self, context):
row = self.layout.row(align=True)
row.operator('skip.select', icon='LATTICE_DATA')
row.enabled = len([o for o in context.selected_objects if o.mode == 'EDIT'])

#ボタン押したら実行するやつ、たぶん
class Skip_Select(bpy.types.Operator):
bl_idname = "skip.select"
bl_label = "Select (More)"

### EXECUTE #######
def execute(self, context):
SkipSelect()
return {'FINISHED'}

#インストールとアンインストールの処理
def register():
bpy.utils.register_module(__name__)

def unregister():
bpy.utils.unregister_module(__name__)

if __name__ == '__main__':
register()


まず最初のところはアドオンの情報ですね
インストール時にこのあたりに表示されたり。

アドオンの情報

その次は必要なインポートで「bpy」「bmesh」の
2つ入れてます、「bpy」はほぼ確実に必要なものですね。

で、次の「SkipSelect()」が今回作ったメインの部分
手動でやるところをコードに起こしただけですが、

①選択された頂点を取得
②選択範囲拡張
③インバース選択
④①を再選択
⑤インバース選択

これをやってるだけ

本当は
①選択された頂点を取得
②選択範囲拡張
③①を非選択

これでもいけるはずなんだけど、何故かうまくいかなくて
ちょっと回りくどいやり方になってます。
その他の具体的なコードの説明は冒頭のソースコードの
コメントにしてるのでそれを参照していただければ。

「Run Script」で行うだけなら「SkipSelect()」の
中身だけで事足りますが、アドオンにするときはインストール
やらボタンやらレジストリやらなんやかんやついてきて
まぁ、面倒ですね。

「SkipSelect()」の部分を外に出しているのはそのほうが都合が
良さそうだからで、「Class」の中でやるとどうも「print」が
使えないんですよね、これ使えないとデバックできないじゃん
ってことで外に出しました。

Blenderはマウスオーバーのときにソースコピーきますし、
「Python Console」使えば「Ctrl」+「スペース」でリスト出ますし
アドオン作る上では色々便利になってますね。

また何かあれば記事にするかも


この記事へコメントする















Mithril

Author:Mithril


趣味は主に雑学です。
どうでもいいこと書いてます。

Blenderやプログラムに
ついても書いたりするかも。
私のPC環境はこちら

メールはこちらから↓
mithrilp★yahoo.co.jp
(★を@に変えて下さい)

09 | 2018/10 | 11
- 1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31 - - -

QRコード
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。