Maya Script Python ポリゴンエラーの検出

image935l

# -*- coding: utf-8 -*-
import maya.cmds as cmds
import maya.mel

def gkn_list_select_es( flag,oVtx ):
	if flag == 1:
		oSel = cmds.textScrollList( "PolyList" , q = 1 , sii = 1 )
	else:
		oSel = cmds.textScrollList( "VtxList" , q = 1 , sii = 1 )
	oHi = []
	[ oHi.extend([oVtx[j-1]]) for j in oSel]
	cmds.select( oHi , r= 1 )

def gkn_error_search():
	polys = cmds.ls( sl= 1, o= 1 )
	if polys != [] :
		tVtx = []
		lPoly = []
		tVtxElog = []
		lPolyElog = []
		lVtx = []
		fPoly = []
		lVtxElog = []
		fPolyElog = []
		selPoly = []
		polyElog = []
		selVtx = []
		vtxElog = []
		oCount = len(polys)
		gMainProgressBar = maya.mel.eval( '$tmp = $gMainProgressBar' )
		cmds.progressBar( gMainProgressBar, edit=True,beginProgress=True, status='Now Search...', maxValue=oCount )
		for p in polys :
			tVtx.extend( cmds.ls(cmds.polyInfo( p, nmv= 1), fl= 1 ) )
			tVtxElog.extend( [u"非多様体" for x in tVtx] )
			lPoly.extend( cmds.ls(cmds.polyInfo( p, lf= 1), fl= 1 ) )
			lPolyElog.extend( [u"ラミナフェース" for x in lPoly] )
			faces = cmds.ls(p + ".f[*]",fl=1)
			oVtx = cmds.ls(p + ".vtx[*]",fl=1)
			lVtx.extend([oVtx[i] for i,x in enumerate([cmds.polyNormalPerVertex( v, q=1 , al = 1 ) for v in oVtx]) if x == [True]])
			lVtxElog.extend( [u"法線ロック" for x in lVtx] )
			fPoly.extend([p+".f["+"".join(x).split()[1].split(":")[0]+"]" for x in [cmds.polyInfo(f, fv= 1) for f in cmds.ls(p+".f[*]",fl=1)] if len("".join(x).split()[2:]) > 4])
			fPolyElog.extend( [u"多角形" for x in fPoly] )
			cmds.progressBar( gMainProgressBar, edit=True, step=1 )
		cmds.select(cl=1)
		cmds.progressBar( gMainProgressBar, edit=True, endProgress=True )
		selPoly.extend(lPoly)
		selPoly.extend(fPoly)
		polyElog.extend(lPolyElog)
		polyElog.extend(fPolyElog)
		selVtx.extend(tVtx)
		selVtx.extend(lVtx)
		vtxElog.extend(tVtxElog)
		vtxElog.extend(lVtxElog)
		if selPoly == [] :
			selPoly.append(u"エラーは見つかりませんでした")
			polyElog.append("")
		if selVtx == [] :
			selVtx.append(u"エラーは見つかりませんでした")
			vtxElog.append("")
		if cmds.window("errorpolyUI", q=1, ex=1) :
			cmds.deleteUI("errorpolyUI")
		oErrorp = cmds.window("errorpolyUI", title="ErrorPolys", w=400, h= len(selPoly)*20 )
		cmds.columnLayout(adjustableColumn=True)
		oScrollLayout = cmds.scrollLayout( h= 400 )
		cmds.rowLayout( nc= 2, adj= 2, cw2= ( 300, 100 ) )
		cmds.textScrollList( "PolyList" , w = 280 , h= len(selPoly)*15+10, ams = 1 )
		cmds.textScrollList( "PolyList" , e = 1 , ra= 1 )
		cmds.textScrollList( "PolyeList" , w = 100 , h= len(selPoly)*15+10, ams = 1,en= 0 )
		cmds.textScrollList( "PolyeList" , e = 1 , ra= 1 )
		for i,r in enumerate(selPoly) :
			cmds.textScrollList( "PolyList" , e= 1, a= u"{0}".format( r ) )
			cmds.textScrollList( "PolyeList" , e= 1, a= u"{0}".format( polyElog[i] ) )
		if selPoly[0] != u"エラーは見つかりませんでした":
			cmds.textScrollList( "PolyList" , e = 1 , sc= "gkn_list_select_es( 1," + str(selPoly) +" )" )
		else :
			cmds.textScrollList( "PolyList" , e = 1 , en= 0 )
		cmds.showWindow(oErrorp)
		if cmds.window("errorvtxUI", q=1, ex=1) :
			cmds.deleteUI("errorvtxUI")
		oErrorv = cmds.window("errorvtxUI", title="ErrorVtxs", w=400, h= len(selVtx)*20 )
		cmds.columnLayout(adjustableColumn=True)
		oScrollLayout = cmds.scrollLayout( h= 400 )
		cmds.rowLayout( nc= 2, adj= 2, cw2= ( 300, 100 ) )
		cmds.textScrollList( "VtxList" , w = 280 , h= len(selVtx)*15+10, ams = 1 )
		cmds.textScrollList( "VtxList" , e = 1 , ra= 1 )
		cmds.textScrollList( "VtxeList" , w = 100 , h= len(selVtx)*15+10, ams = 1, en= 0 )
		cmds.textScrollList( "VtxeList" , e = 1 , ra= 1 )
		for i,r in enumerate(selVtx) :
			cmds.textScrollList( "VtxList" , e= 1, a= u"{0}".format( r ) )
			cmds.textScrollList( "VtxeList" , e= 1, a= u"{0}".format( vtxElog[i] ) )
		if selVtx[0] != u"エラーは見つかりませんでした":
			cmds.textScrollList( "VtxList" , e = 1 , sc= "gkn_list_select_es( 2," + str(selVtx) +" )" )
		else :
			cmds.textScrollList( "VtxList" , e = 1 , en= 0 )
		cmds.showWindow(oErrorv)
gkn_error_search()

すみません、適当なコードです。

 

単一、もしくは複数のオブジェクトを選択し実行して使います。
コードをスクリプトエディタにペーストすると直ぐに実行されます。
選択されているオブジェクトの非多様体頂点、頂点の法線ロック、多角形ポリゴン、ラミナフェースを検出します。
検出されれば、それらがリストとしてウィンドウに表示されます。
ウィンドウに表示されているリストを選択すると、エラーとして検出された頂点、もしくはポリゴンを選択します。

 

どれだけ早く動くのだろうか、と、forループでひとつひとつの頂点やポリゴンを見ていたのですが、
リスト内包表記に変えてみました。
大分早くはなったようです。ただ、可読性が著しく低い、、
エラーが多すぎると、ウィンドウに表示するのに時間がかかります。

 

modoもクリーンナップを自動でしてくれますが、自動ではなく選択してくれるとありがたいのですが、、
でも多角形ポリゴンは直ぐに見つけられるのが良いです。
Maya2012でも2013でも動きます。

※追記2012/5/15
リスト表示もリスト内包表記にしました

コメントする

post date*

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

トラックバックする

トラックバック用URL:

アニメーションが親切に解説されております

レンダリング、ライティングの基本が分かります

図版が見やすい美術解剖書です