今回はこれをpymel化のいけにえにしてみました。
# -*- coding: utf-8 -*- #------------------------------------------------------------------------------ # 頂点の整列ツール #------------------------------------------------------------------------------ import pymel.core as pm import sys sys.dont_write_bytecode = True #------------------------------------------------------------------------------ # 整列処理 #------------------------------------------------------------------------------ def AlignVertex(axis, mode, sp): # ~ 引数 ~ # axis 0:X 1:Y 2:Z # mode 0:最小 1:センター 2:平均 3:最大 # sp 0:オブジェクトモード 1:ワールドモード space = ['object', 'world'][sp] # セレクションをバーテックスに変換 if not pm.selected(): return pm.runtime.ConvertSelectionToVertices(pm.selected(flatten=True)) vtxList = pm.filterExpand(selectionMask=31) # 全頂点の座標を取得し、最大、最小、平均、中心を求める pos = [pm.PyNode(p).getPosition(space=space)[axis] for p in vtxList] posMax = max(pos) posMin = min(pos) posAve = sum(pos) / len(vtxList) posCen = (posMax + posMin) / 2 # 押されたボタンから移動する場所を決める if mode == 0: value = posMin if mode == 1: value = posCen if mode == 2: value = posAve if mode == 3: value = posMax # オブジェクトモードならこっち if space == 'object': if axis == 0: pm.move(value, vtxList, moveX=True, objectSpace=True) if axis == 1: pm.move(value, vtxList, moveY=True, objectSpace=True) if axis == 2: pm.move(value, vtxList, moveZ=True, objectSpace=True) # ワールドモードならこっち else: if axis == 0: pm.move(value, vtxList, moveX=True) if axis == 1: pm.move(value, vtxList, moveY=True) if axis == 2: pm.move(value, vtxList, moveZ=True) # ビュー上でアンドゥが効かなくなるのでフォーカスを元に戻しておこう pm.setFocus(pm.getPanel(withFocus=True) ) #------------------------------------------------------------------------------ # GUI #------------------------------------------------------------------------------ class GUI: windowName = "Align_Vertex_Tool" _checkBox = None # 初期化 def __init__(self): if pm.window(self.windowName, exists=True): pm.deleteUI(self.windowName) # ボタンを押した時のアクション def callBack(self, axis, mode, *args): AlignVertex(axis, mode, self.checkBox.getValue() ) def show(self): window = pm.window(self.windowName, title=self.windowName) window.setWidth(180) window.setHeight(240) labelText = ["X", "Y", "Z"] BGColor = [[1.0, 0.5, 0.5], [0.5, 1.0, 0.5], [0.5, 0.5, 1.0]] buttonLabel = ["- <-", "cen", "ave", "-> +"] with window: with pm.frameLayout(borderStyle="in", label=u"頂点の整列ツール"): for i in range(0, 3): with pm.frameLayout(borderStyle="in", label=labelText[i] + u"軸", marginHeight=4, marginWidth=4, backgroundColor=BGColor[i]): with pm.rowLayout(numberOfColumns=4): for j in range(0, 4): pm.button(label=buttonLabel[j], width=40, height=32, command=pm.Callback(self.callBack, i, j) ) self.checkBox = pm.checkBox(label=u"ワールド軸(off / ローカル)", value=True) def main(): w = GUI() w.show() main()スクリプトエディタにコピペして実行するとこんなのが出来ます。
MELだと結構な行数取ってる最大、最小、平均、中心の計算が
それぞれ1行で出来ちゃうのがpythonのすごいとこですねー。
(↑pymel関係無いじゃん。。)
わりと使い勝手が良いので使ってやってください。
こっちが元になったMEL
// -------------------------------------------------------------------------- // 頂点の整列ツール // -------------------------------------------------------------------------- // -------------------------------------------------------------------------- // 頂点計算部分 // -------------------------------------------------------------------------- global proc AVT_AlignVertex(int $command) { string $selectComp[] = `ls -sl -fl`; if(size($selectComp) ) return; PolySelectConvert 3; string $vtxList[] = `filterExpand -sm 31`; float $maxX = $maxY = $maxZ = $minX = $minY = $minZ = 0.0; float $cenX = $cenY = $cenZ = $aveX = $aveY = $aveZ = 0.0; for($i = 0; $i < size($vtxList); $i++) { float $tmp[] = `pointPosition -w $vtxList[$i]`; if($i == 0) { $maxX = $minX = $tmp[0]; $maxY = $minY = $tmp[1]; $maxZ = $minZ = $tmp[2]; } else { $maxX = `max $tmp[0] $maxX`; $minX = `min $tmp[0] $minX`; $maxY = `max $tmp[1] $maxY`; $minY = `min $tmp[1] $minY`; $maxZ = `max $tmp[2] $maxZ`; $minZ = `min $tmp[2] $minZ`; } $aveX += $tmp[0]; $aveY += $tmp[1]; $aveZ += $tmp[2]; } $cenX = ($maxX + $minX) / 2; $cenY = ($maxY + $minY) / 2; $cenZ = ($maxZ + $minZ) / 2; $aveX /= $i; $aveY /= $i; $aveZ /= $i; switch($command) { case 1 : move -a -x $minX; break; case 2 : move -a -x $cenX; break; case 3 : move -a -x $aveX; break; case 4 : move -a -x $maxX; break; case 11 : move -a -y $maxY; break; case 12 : move -a -y $cenY; break; case 13 : move -a -y $aveY; break; case 14 : move -a -y $minY; break; case 21 : move -a -z $maxZ; break; case 22 : move -a -z $cenZ; break; case 23 : move -a -z $aveZ; break; case 24 : move -a -z $minZ; break; default : break; } string $panel = `getPanel -withFocus`; setFocus $panel; } // -------------------------------------------------------------------------- // // GUI関係 // // -------------------------------------------------------------------------- // -------------------------------------------------------------------------- // X軸レイアウト // -------------------------------------------------------------------------- global proc string AVT_CreateXAxisPanel(string $GetPanel) { string $PanelName = `frameLayout -l " X軸" -bgc 1.0 0.5 0.5`; string $XButtonGrp = `formLayout -bgc 1.0 0.5 0.5`; button -l "-方向" -c "AVT_AlignVertex(1)" XButton1; button -l "中央" -c "AVT_AlignVertex(2)" XButton2; button -l "平均" -c "AVT_AlignVertex(3)" XButton3; button -l "+方向" -c "AVT_AlignVertex(4)" XButton4; formLayout -e -af XButton1 top 5 -af XButton1 left 5 -af XButton2 top 5 -ac XButton2 left 5 XButton1 -af XButton3 top 5 -ac XButton3 left 5 XButton2 -af XButton4 top 5 -ac XButton4 left 5 XButton3 -af XButton4 bottom 5 $XButtonGrp; setParent ..; setParent $GetPanel; return $PanelName; } // -------------------------------------------------------------------------- // Y軸レイアウト // -------------------------------------------------------------------------- global proc string AVT_CreateYAxisPanel(string $GetPanel) { string $PanelName = `frameLayout -l " Y軸" -bgc 0.5 1.0 0.5`; string $YButtonGrp = `formLayout -bgc 0.5 1.0 0.5`; button -l "+方向" -c "AVT_AlignVertex(11)" YButton1; button -l "中央" -c "AVT_AlignVertex(12)" YButton2; button -l "平均" -c "AVT_AlignVertex(13)" YButton3; button -l "-方向" -c "AVT_AlignVertex(14)" YButton4; formLayout -e -af YButton1 top 5 -af YButton1 left 5 -af YButton2 top 5 -ac YButton2 left 5 YButton1 -af YButton3 top 5 -ac YButton3 left 5 YButton2 -af YButton4 top 5 -ac YButton4 left 5 YButton3 -af YButton4 bottom 5 $YButtonGrp; setParent ..; setParent $GetPanel; return $PanelName; } // -------------------------------------------------------------------------- // Z軸レイアウト // -------------------------------------------------------------------------- global proc string AVT_CreateZAxisPanel(string $GetPanel) { string $PanelName = `frameLayout -l " Z軸" -bgc 0.5 0.5 1.0`; string $ZButtonGrp = `formLayout -bgc 0.5 0.5 1.0`; button -l "-方向" -c "AVT_AlignVertex(21)" ZButton1; button -l "中央" -c "AVT_AlignVertex(22)" ZButton2; button -l "平均" -c "AVT_AlignVertex(23)" ZButton3; button -l "+方向" -c "AVT_AlignVertex(24)" ZButton4; formLayout -e -af ZButton1 top 5 -af ZButton1 left 5 -af ZButton2 top 5 -ac ZButton2 left 5 ZButton1 -af ZButton3 top 5 -ac ZButton3 left 5 ZButton2 -af ZButton4 top 5 -ac ZButton4 left 5 ZButton3 -af ZButton4 bottom 5 $ZButtonGrp; setParent ..; setParent $GetPanel; return $PanelName; } // -------------------------------------------------------------------------- // メイン // -------------------------------------------------------------------------- global proc alignVertexTool() { if(`window -ex AVT_window`) deleteUI AVT_window; window -t "Align Vertex Tool" -s false AVT_window; int $uiWidth = 145; int $uiHeight = 230; string $AllForm = `formLayout`; text -l "頂点の整列ツール" -w $uiWidth -font "boldLabelFont" TitleTxt; string $XPanel = `AVT_CreateXAxisPanel($AllForm)`; string $YPanel = `AVT_CreateYAxisPanel($AllForm)`; string $ZPanel = `AVT_CreateZAxisPanel($AllForm)`; formLayout -e -af TitleTxt top 5 -af TitleTxt left 5 -ac $XPanel top 5 TitleTxt -af $XPanel left 2 -af $XPanel right 2 -ac $YPanel top 5 $XPanel -af $YPanel left 2 -af $YPanel right 2 -ac $ZPanel top 5 $YPanel -af $ZPanel left 2 -af $ZPanel right 2 $AllForm; setParent ..; showWindow AVT_window; window -e -wh $uiWidth $uiHeight AVT_window; } alignVertexTool();
【Maya】大倶利伽羅の髪の毛を作る。4 | Create3D-3dCG制作作業日記
返信削除こちらのページでスクリプトとその使い方を書かせていただきました。
本当に、作ってくださってありがとうございます。ありがとうございます!