TwitterでJunkiさんが下記のようなこと(『Mayaでオブジェクトのローカル座標の例えば Xが3以上の位置におさまるポリゴンを全て選択せよ、というような機能とか、ないでしょうかね?』と)仰っていたので、勉強がてら作ってみました。
2017/05/28 更新
・選択する処理の高速化
(選択する処理のUI上で設定した範囲をfor文で回している中で毎回無駄に取得してたのをfor文まわす前に事前に取得しておいたものを使用する & 頂点の位置をpointPositionで取得していたのをOpenMaya2のgetPointsで取得するように変更)
※これにより600002頂点で実行したときに約14秒かかっていたのが約2秒くらいまで縮まりました。
処理が長くてフリーズしたように見えないように前回プログレスバーを追加していましたが、
それほど待たなくても良くなったのとプログレスバーの表示を消すとさらに約1秒くらい縮まったので、
今回のバージョンでは消しました。
・AutoSelectのチェックボックスを2つに分けていたのを再度1つにまとめました
※前回floatSliderGrpでfloatFieldとfloatSlider部分をまとめて設定していて、
dragCommandとchangeCommandでの変更によるAutoSelectを分けるためにチェックボックスも2つにしていたのですが、
試しているとfloatSliderGrpでドラッグするとdragCommandだけでなく無駄にchangeCommandが一緒に実行されているようだったので、
再度textとfloatFieldとfloatFieldのパーツに分けて設定しました。
そのためチェックボックスを分ける必要がなくなったのでチェックボックスを1つにまとめました。
Mayaでオブジェクトのローカル座標の例えば Xが3以上の位置におさまるポリゴンを全て選択せよ、というような機能とか、ないでしょうかね? もしくはそんなことができる誰かが書いた Maya のツールとかスクリプトとかご存じないでしょうか。 pic.twitter.com/8EBi3jI4l8
— 潤樹 (@JunkiTheJunkie) 2017年5月8日
2017/05/17 更新
・スライダを動かしている間も自動選択できるようにチェックボックス追加
(Range Changedは入力やドラッグを離した時だけに実行されますが、
このWhile Changing by DragがONになっているとドラッグ中もインタラクティブに選択されます)
※頂点数が多い場合(1万以上など)は少し固まってしまうと思うのでOFF推奨です
・オブジェクトが小さく、頂点の座標値の絶対値が1以下の極めて小さい数字の場合に
Mayaが微妙な座標(コンポーネントエディタで見えるのとは違う値)を返してくるので
その場合は1000倍して四捨五入(round)して、1000で割るという処理を入れています。
・プログレスバーも追加してみました(ただなぜかESCでのキャンセルが効かない…)
・値変更時の履歴(特にスライダのDrag)を無駄に残していたので
実行時にUndoInfoのstateWithoutFlushをOffにして最後戻すという処理を追加
2017/05/15 更新
・スライダでも範囲を設定できるように変更
・Auto Select If Range Changedのチェックボックスを追加
(ONだと範囲を変更したときにSelectボタンを押した時と同じ挙動を自動で行います)
作る前はオブジェクトのローカル座標での頂点などの位置はどうやって取得するのが効率的なのかなと考えていましたが、
調べてみたらなんてこたぁなくpointPositionコマンドを使えば簡単に取得させてくれるのがわかったので、
あとはもう選択の条件を指定するGUIだけ用意するだけ!
特に変わった処理もしていないので詳しい処理内容の説明は省きますw
(ほとんど下記の選択の条件でのif分岐ばかりなので)
一応、選択の条件は
・選択するスペース(ローカルかワールドか)
・選択するコンポーネントの種類(頂点かエッジかポリゴンか)
・範囲を指定する軸と範囲
にしてみました。
また複数オブジェクトにも対応しています。
使い方はスクリプトのファイルをこちらからDLしてもらうか
下のほうにあるスクリプトをテキストファイルにコピペしてもらい、
それをMayaが認識できる適当なフォルダに入れて、Maya内のスクリプトエディタのPythonタブに
import kkSelectComponentInsideRange
reload(kkSelectComponentInsideRange)
と書いて実行してもらえば下記の画像のようなウィンドウが開くので、
オブジェクトを選択し、条件を設定してからSelectボタンを押して下さい。
これを使ったところでデータに対して何かが起こることはないと思いますが、
責任は負いませんので一応自己責任でご使用下さい。
# -*- coding: utf-8 -*-
import maya.cmds as mc
import maya.api.OpenMaya as om2
# グローバル変数
radioBtnSpace = ""
radioBtnCompKind = ""
autoSelectChkBox = ""
xChkBox = ""
xTxtMin = ""
xTxtMax = ""
xFieldMin = ""
xFieldMax = ""
xSliderMin = ""
xSliderMax = ""
yChkBox = ""
yTxtMin = ""
yTxtMax = ""
yFieldMin = ""
yFieldMax = ""
ySliderMin = ""
ySliderMax = ""
zChkBox = ""
zTxtMin = ""
zTxtMax = ""
zFieldMin = ""
zFieldMax = ""
zSliderMin = ""
zSliderMax = ""
class kkSelectComponentInsideRange():
def __init__(self):
self.createUI()
# X CheckBox OnOff ChangeCommand ====================================================
def xChkBoxOn(self, *args):
global xTxtMin, xTxtMax, xFieldMin, xFieldMax, xSliderMin, xSliderMax
mc.text(xTxtMin, e=True, enable=True)
mc.text(xTxtMax, e=True, enable=True)
mc.floatField(xFieldMin, e=True, enable=True)
mc.floatField(xFieldMax, e=True, enable=True)
mc.floatSlider(xSliderMin, e=True, enable=True)
mc.floatSlider(xSliderMax, e=True, enable=True)
def xChkBoxOff(self, *args):
global xTxtMin, xTxtMax, xFieldMin, xFieldMax, xSliderMin, xSliderMax
mc.text(xTxtMin, e=True, enable=False)
mc.text(xTxtMax, e=True, enable=False)
mc.floatField(xFieldMin, e=True, enable=False)
mc.floatField(xFieldMax, e=True, enable=False)
mc.floatSlider(xSliderMin, e=True, enable=False)
mc.floatSlider(xSliderMax, e=True, enable=False)
# Y CheckBox OnOff ChangeCommand ====================================================
def yChkBoxOn(self, *args):
global yTxtMin, yTxtMax, yFieldMin, yFieldMax, ySliderMin, ySliderMax
mc.text(yTxtMin, e=True, enable=True)
mc.text(yTxtMax, e=True, enable=True)
mc.floatField(yFieldMin, e=True, enable=True)
mc.floatField(yFieldMax, e=True, enable=True)
mc.floatSlider(ySliderMin, e=True, enable=True)
mc.floatSlider(ySliderMax, e=True, enable=True)
def yChkBoxOff(self, *args):
global yTxtMin, yTxtMax, yFieldMin, yFieldMax, ySliderMin, ySliderMax
mc.text(yTxtMin, e=True, enable=False)
mc.text(yTxtMax, e=True, enable=False)
mc.floatField(yFieldMin, e=True, enable=False)
mc.floatField(yFieldMax, e=True, enable=False)
mc.floatSlider(ySliderMin, e=True, enable=False)
mc.floatSlider(ySliderMax, e=True, enable=False)
# Z CheckBox OnOff ChangeCommand ====================================================
def zChkBoxOn(self, *args):
global zTxtMin, zTxtMax, zFieldMin, zFieldMax, zSliderMin, zSliderMax
mc.text(zTxtMin, e=True, enable=True)
mc.text(zTxtMax, e=True, enable=True)
mc.floatField(zFieldMin, e=True, enable=True)
mc.floatField(zFieldMax, e=True, enable=True)
mc.floatSlider(zSliderMin, e=True, enable=True)
mc.floatSlider(zSliderMax, e=True, enable=True)
def zChkBoxOff(self, *args):
global zTxtMin, zTxtMax, zFieldMin, zFieldMax, zSliderMin, zSliderMax
mc.text(zTxtMin, e=True, enable=False)
mc.text(zTxtMax, e=True, enable=False)
mc.floatField(zFieldMin, e=True, enable=False)
mc.floatField(zFieldMax, e=True, enable=False)
mc.floatSlider(zSliderMin, e=True, enable=False)
mc.floatSlider(zSliderMax, e=True, enable=False)
# X Field ChangeCommand =============================================================
def changeXFieldMin(self, *args):
global xFieldMin, xFieldMax, xSliderMin, xSliderMax
xFldMin = mc.floatField(xFieldMin, q=True, value=True)
xFldMax = mc.floatField(xFieldMax, q=True, value=True)
if xFldMin <= mc.floatSlider(xSliderMin, q=True, minValue=True) * 0.9:
mc.floatSlider(xSliderMin, e=True, minValue=xFldMin * 1.2)
mc.floatSlider(xSliderMax, e=True, minValue=xFldMin * 1.2)
if xFldMin >= mc.floatSlider(xSliderMin, q=True, maxValue=True) * 0.9:
mc.floatSlider(xSliderMin, e=True, maxValue=xFldMin * 1.2)
mc.floatSlider(xSliderMax, e=True, maxValue=xFldMin * 1.2)
if xFldMin > xFldMax:
mc.floatSlider(xSliderMin, e=True, value=xFldMax - 1)
mc.floatField(xFieldMin, e=True, value=xFldMax - 1)
else:
mc.floatSlider(xSliderMin, e=True, value=xFldMin)
if mc.checkBox(autoSelectChkBox, q=True, value=True) == True:
self.selectClicked()
def changeXFieldMax(self, *args):
global xFieldMin, xFieldMax, xSliderMin, xSliderMax
xFldMin = mc.floatField(xFieldMin, q=True, value=True)
xFldMax = mc.floatField(xFieldMax, q=True, value=True)
if xFldMax <= mc.floatSlider(xSliderMax, q=True, minValue=True) * 0.9:
mc.floatSlider(xSliderMin, e=True, minValue=xFldMax * 1.2)
mc.floatSlider(xSliderMax, e=True, minValue=xFldMax * 1.2)
if xFldMax >= mc.floatSlider(xSliderMax, q=True, maxValue=True) * 0.9:
mc.floatSlider(xSliderMin, e=True, maxValue=xFldMax * 1.2)
mc.floatSlider(xSliderMax, e=True, maxValue=xFldMax * 1.2)
if xFldMin > xFldMax:
mc.floatSlider(xSliderMax, e=True, value=xFldMin + 1)
mc.floatField(xFieldMax, e=True, value=xFldMin + 1)
else:
mc.floatSlider(xSliderMax, e=True, value=xFldMax)
if mc.checkBox(autoSelectChkBox, q=True, value=True) == True:
self.selectClicked()
# X Slider Drag ChangeCommand =======================================================
def changeXSliderMinDrag(self, *args):
global xFieldMin, xSliderMin, xSliderMax
mc.undoInfo(stateWithoutFlush=False)
xSldMin = mc.floatSlider(xSliderMin, q=True, value=True)
xSldMax = mc.floatSlider(xSliderMax, q=True, value=True)
if xSldMin <= mc.floatSlider(xSliderMin, q=True, minValue=True) * 0.9:
mc.floatSlider(xSliderMin, e=True, minValue=xSldMin * 1.2)
mc.floatSlider(xSliderMax, e=True, minValue=xSldMin * 1.2)
if xSldMin >= mc.floatSlider(xSliderMin, q=True, maxValue=True) * 0.9:
mc.floatSlider(xSliderMin, e=True, maxValue=xSldMin * 1.2)
mc.floatSlider(xSliderMax, e=True, maxValue=xSldMin * 1.2)
if xSldMin > xSldMax:
mc.floatSlider(xSliderMin, e=True, value=xSldMax - 1)
mc.floatField(xFieldMin, e=True, value=xSldMax - 1)
else:
mc.floatField(xFieldMin, e=True, value=xSldMin)
if mc.checkBox(autoSelectChkBox, q=True, value=True) == True:
self.selectClicked()
mc.undoInfo(stateWithoutFlush=True)
def changeXSliderMaxDrag(self, *args):
global xFieldMax, xSliderMin, xSliderMax
mc.undoInfo(stateWithoutFlush=False)
xSldMin = mc.floatSlider(xSliderMin, q=True, value=True)
xSldMax = mc.floatSlider(xSliderMax, q=True, value=True)
if xSldMax <= mc.floatSlider(xSliderMax, q=True, minValue=True) * 0.9:
mc.floatSlider(xSliderMin, e=True, minValue=xSldMax * 1.2)
mc.floatSlider(xSliderMax, e=True, minValue=xSldMax * 1.2)
if xSldMax >= mc.floatSlider(xSliderMax, q=True, maxValue=True) * 0.9:
mc.floatSlider(xSliderMin, e=True, maxValue=xSldMax * 1.2)
mc.floatSlider(xSliderMax, e=True, maxValue=xSldMax * 1.2)
if xSldMin > xSldMax:
mc.floatSlider(xSliderMax, e=True, value=xSldMin + 1)
mc.floatField(xFieldMax, e=True, value=xSldMin + 1)
else:
mc.floatField(xFieldMax, e=True, value=xSldMax)
if mc.checkBox(autoSelectChkBox, q=True, value=True) == True:
self.selectClicked()
mc.undoInfo(stateWithoutFlush=True)
# Y Field ChangeCommand =============================================================
def changeYFieldMin(self, *args):
global yFieldMin, yFieldMax, ySliderMin, ySliderMax
yFldMin = mc.floatField(yFieldMin, q=True, value=True)
yFldMax = mc.floatField(yFieldMax, q=True, value=True)
if yFldMin <= mc.floatSlider(ySliderMin, q=True, minValue=True) * 0.9:
mc.floatSlider(ySliderMin, e=True, minValue=yFldMin * 1.2)
mc.floatSlider(ySliderMax, e=True, minValue=yFldMin * 1.2)
if yFldMin >= mc.floatSlider(ySliderMin, q=True, maxValue=True) * 0.9:
mc.floatSlider(ySliderMin, e=True, maxValue=yFldMin * 1.2)
mc.floatSlider(ySliderMax, e=True, maxValue=yFldMin * 1.2)
if yFldMin > yFldMax:
mc.floatSlider(ySliderMin, e=True, value=yFldMax - 1)
mc.floatField(yFieldMin, e=True, value=yFldMax - 1)
else:
mc.floatSlider(ySliderMin, e=True, value=yFldMin)
if mc.checkBox(autoSelectChkBox, q=True, value=True) == True:
self.selectClicked()
def changeYFieldMax(self, *args):
global yFieldMin, yFieldMax, ySliderMin, ySliderMax
yFldMin = mc.floatField(yFieldMin, q=True, value=True)
yFldMax = mc.floatField(yFieldMax, q=True, value=True)
if yFldMax <= mc.floatSlider(ySliderMax, q=True, minValue=True) * 0.9:
mc.floatSlider(ySliderMin, e=True, minValue=yFldMax * 1.2)
mc.floatSlider(ySliderMax, e=True, minValue=yFldMax * 1.2)
if yFldMax >= mc.floatSlider(ySliderMax, q=True, maxValue=True) * 0.9:
mc.floatSlider(ySliderMin, e=True, maxValue=yFldMax * 1.2)
mc.floatSlider(ySliderMax, e=True, maxValue=yFldMax * 1.2)
if yFldMin > yFldMax:
mc.floatSlider(ySliderMax, e=True, value=yFldMin + 1)
mc.floatField(yFieldMax, e=True, value=yFldMin + 1)
else:
mc.floatSlider(ySliderMax, e=True, value=yFldMax)
if mc.checkBox(autoSelectChkBox, q=True, value=True) == True:
self.selectClicked()
# Y Slider Drag ChangeCommand =======================================================
def changeYSliderMinDrag(self, *args):
global yFieldMin, ySliderMin, ySliderMax
mc.undoInfo(stateWithoutFlush=False)
ySldMin = mc.floatSlider(ySliderMin, q=True, value=True)
ySldMax = mc.floatSlider(ySliderMax, q=True, value=True)
if ySldMin <= mc.floatSlider(ySliderMin, q=True, minValue=True) * 0.9:
mc.floatSlider(ySliderMin, e=True, minValue=ySldMin * 1.2)
mc.floatSlider(ySliderMax, e=True, minValue=ySldMin * 1.2)
if ySldMin >= mc.floatSlider(ySliderMin, q=True, maxValue=True) * 0.9:
mc.floatSlider(ySliderMin, e=True, maxValue=ySldMin * 1.2)
mc.floatSlider(ySliderMax, e=True, maxValue=ySldMin * 1.2)
if ySldMin > ySldMax:
mc.floatSlider(ySliderMin, e=True, value=ySldMax - 1)
mc.floatField(yFieldMin, e=True, value=ySldMax - 1)
else:
mc.floatField(yFieldMin, e=True, value=ySldMin)
if mc.checkBox(autoSelectChkBox, q=True, value=True) == True:
self.selectClicked()
mc.undoInfo(stateWithoutFlush=True)
def changeYSliderMaxDrag(self, *args):
global yFieldMax, ySliderMin, ySliderMax
mc.undoInfo(stateWithoutFlush=False)
ySldMin = mc.floatSlider(ySliderMin, q=True, value=True)
ySldMax = mc.floatSlider(ySliderMax, q=True, value=True)
if ySldMax <= mc.floatSlider(ySliderMax, q=True, minValue=True) * 0.9:
mc.floatSlider(ySliderMin, e=True, minValue=ySldMax * 1.2)
mc.floatSlider(ySliderMax, e=True, minValue=ySldMax * 1.2)
if ySldMax >= mc.floatSlider(ySliderMax, q=True, maxValue=True) * 0.9:
mc.floatSlider(ySliderMin, e=True, maxValue=ySldMax * 1.2)
mc.floatSlider(ySliderMax, e=True, maxValue=ySldMax * 1.2)
if ySldMin > ySldMax:
mc.floatSlider(ySliderMax, e=True, value=ySldMin + 1)
mc.floatField(yFieldMax, e=True, value=ySldMin + 1)
else:
mc.floatField(yFieldMax, e=True, value=ySldMax)
if mc.checkBox(autoSelectChkBox, q=True, value=True) == True:
self.selectClicked()
mc.undoInfo(stateWithoutFlush=True)
# Z Field ChangeCommand =============================================================
def changeZFieldMin(self, *args):
global zFieldMin, zFieldMax, zSliderMin, zSliderMax
zFldMin = mc.floatField(zFieldMin, q=True, value=True)
zFldMax = mc.floatField(zFieldMax, q=True, value=True)
if zFldMin <= mc.floatSlider(zSliderMin, q=True, minValue=True) * 0.9:
mc.floatSlider(zSliderMin, e=True, minValue=zFldMin * 1.2)
mc.floatSlider(zSliderMax, e=True, minValue=zFldMin * 1.2)
if zFldMin >= mc.floatSlider(zSliderMin, q=True, maxValue=True) * 0.9:
mc.floatSlider(zSliderMin, e=True, maxValue=zFldMin * 1.2)
mc.floatSlider(zSliderMax, e=True, maxValue=zFldMin * 1.2)
if zFldMin > zFldMax:
mc.floatSlider(zSliderMin, e=True, value=zFldMax - 1)
mc.floatField(zFieldMin, e=True, value=zFldMax - 1)
else:
mc.floatSlider(zSliderMin, e=True, value=zFldMin)
if mc.checkBox(autoSelectChkBox, q=True, value=True) == True:
self.selectClicked()
def changeZFieldMax(self, *args):
global zFieldMin, zFieldMax, zSliderMin, zSliderMax
zFldMin = mc.floatField(zFieldMin, q=True, value=True)
zFldMax = mc.floatField(zFieldMax, q=True, value=True)
if zFldMax <= mc.floatSlider(zSliderMax, q=True, minValue=True) * 0.9:
mc.floatSlider(zSliderMin, e=True, minValue=zFldMax * 1.2)
mc.floatSlider(zSliderMax, e=True, minValue=zFldMax * 1.2)
if zFldMax >= mc.floatSlider(zSliderMax, q=True, maxValue=True) * 0.9:
mc.floatSlider(zSliderMin, e=True, maxValue=zFldMax * 1.2)
mc.floatSlider(zSliderMax, e=True, maxValue=zFldMax * 1.2)
if zFldMin > zFldMax:
mc.floatSlider(zSliderMax, e=True, value=zFldMin + 1)
mc.floatField(zFieldMax, e=True, value=zFldMin + 1)
else:
mc.floatSlider(zSliderMax, e=True, value=zFldMax)
if mc.checkBox(autoSelectChkBox, q=True, value=True) == True:
self.selectClicked()
# Z Slider Drag ChangeCommand =======================================================
def changeZSliderMinDrag(self, *args):
global zFieldMin, zSliderMin, zSliderMax
mc.undoInfo(stateWithoutFlush=False)
zSldMin = mc.floatSlider(zSliderMin, q=True, value=True)
zSldMax = mc.floatSlider(zSliderMax, q=True, value=True)
if zSldMin > zSldMax:
mc.floatSlider(zSliderMin, e=True, value=zSldMax - 1)
mc.floatField(zFieldMin, e=True, value=zSldMax - 1)
else:
mc.floatField(zFieldMin, e=True, value=zSldMin)
if zSldMin <= mc.floatSlider(zSliderMin, q=True, minValue=True) * 0.9:
mc.floatSlider(zSliderMin, e=True, minValue=zSldMin * 1.2)
mc.floatSlider(zSliderMax, e=True, minValue=zSldMin * 1.2)
if zSldMin >= mc.floatSlider(zSliderMin, q=True, maxValue=True) * 0.9:
mc.floatSlider(zSliderMin, e=True, maxValue=zSldMin * 1.2)
mc.floatSlider(zSliderMax, e=True, maxValue=zSldMin * 1.2)
if mc.checkBox(autoSelectChkBox, q=True, value=True) == True:
self.selectClicked()
mc.undoInfo(stateWithoutFlush=True)
def changeZSliderMaxDrag(self, *args):
global zFieldMax, zSliderMin, zSliderMax
mc.undoInfo(stateWithoutFlush=False)
zSldMin = mc.floatSlider(zSliderMin, q=True, value=True)
zSldMax = mc.floatSlider(zSliderMax, q=True, value=True)
if zSldMax <= mc.floatSlider(zSliderMax, q=True, minValue=True) * 0.9:
mc.floatSlider(zSliderMin, e=True, minValue=zSldMax * 1.2)
mc.floatSlider(zSliderMax, e=True, minValue=zSldMax * 1.2)
if zSldMax >= mc.floatSlider(zSliderMax, q=True, maxValue=True) * 0.9:
mc.floatSlider(zSliderMin, e=True, maxValue=zSldMax * 1.2)
mc.floatSlider(zSliderMax, e=True, maxValue=zSldMax * 1.2)
if zSldMin > zSldMax:
mc.floatSlider(zSliderMax, e=True, value=zSldMin + 1)
mc.floatField(zFieldMax, e=True, value=zSldMin + 1)
else:
mc.floatField(zFieldMax, e=True, value=zSldMax)
if mc.checkBox(autoSelectChkBox, q=True, value=True) == True:
self.selectClicked()
mc.undoInfo(stateWithoutFlush=True)
# Select Component ==================================================================
def selectClicked(self, *args):
global xChkBox, yChkBox, zChkBox
xChk = mc.checkBox(xChkBox, q=True, value=True)
yChk = mc.checkBox(yChkBox, q=True, value=True)
zChk = mc.checkBox(zChkBox, q=True, value=True)
if xChk == False and yChk == False and zChk == False:
mc.warning(u"X,Y,Zのチェックボックスが全てOFFになっています"),
return
mc.undoInfo(stateWithoutFlush=False)
# コンポーネントモードでの選択になっている可能性があるのでオブジェクト選択に変更
mc.select(mc.ls(sl=True, objectsOnly=True))
selList = om2.MGlobal.getActiveSelectionList()
vertexList = []
pos = [0, 0, 0]
global xSliderMin, xSliderMax, ySliderMin, ySliderMax, zSliderMin, zSliderMax
xMinRange = mc.floatSlider(xSliderMin, q=True, value=True)
xMaxRange = mc.floatSlider(xSliderMax, q=True, value=True)
yMinRange = mc.floatSlider(ySliderMin, q=True, value=True)
yMaxRange = mc.floatSlider(ySliderMax, q=True, value=True)
zMinRange = mc.floatSlider(zSliderMin, q=True, value=True)
zMaxRange = mc.floatSlider(zSliderMax, q=True, value=True)
global radioBtnSpace
radioSpace = mc.radioButtonGrp(radioBtnSpace, q=True, select=True)
selListCount = selList.length()
if selListCount == 0:
mc.warning(u"何も選択されていません"),
return
for x in xrange(selListCount):
mDag, __ = selList.getComponent(x)
if mDag.hasFn(om2.MFn.kMesh):
mfnMesh = om2.MFnMesh(mDag)
if radioSpace == 1:
vertexArray = mfnMesh.getPoints(om2.MSpace.kObject)
else:
vertexArray = mfnMesh.getPoints(om2.MSpace.kWorld)
for i in xrange(len(vertexArray)):
# X.Y.Z全部選択されている場合
if xChk == True and yChk == True and zChk == True:
pos[0] = roundFloat(vertexArray[i].x)
pos[1] = roundFloat(vertexArray[i].y)
pos[2] = roundFloat(vertexArray[i].z)
if xMinRange < pos[0] < xMaxRange\
and yMinRange < pos[1] < yMaxRange\
and zMinRange < pos[2] < zMaxRange:
vtxs = "%s.vtx[%i]" %(mDag.fullPathName(), i)
vertexList.append(vtxs)
# X.Yだけ選択されている場合
if xChk == True and yChk == True and zChk == False:
pos[0] = roundFloat(vertexArray[i].x)
pos[1] = roundFloat(vertexArray[i].y)
if xMinRange < pos[0] < xMaxRange\
and yMinRange < pos[1] < yMaxRange:
vtxs = "%s.vtx[%i]" %(mDag.fullPathName(), i)
vertexList.append(vtxs)
# X.Zだけ選択されている場合
if xChk == True and yChk == False and zChk == True:
pos[0] = roundFloat(vertexArray[i].x)
pos[2] = roundFloat(vertexArray[i].z)
if xMinRange < pos[0] < xMaxRange\
and zMinRange < pos[2] < zMaxRange:
vtxs = "%s.vtx[%i]" %(mDag.fullPathName(), i)
vertexList.append(vtxs)
# Y.Zだけ選択されている場合
if xChk == False and yChk == True and zChk == True:
pos[1] = roundFloat(vertexArray[i].y)
pos[2] = roundFloat(vertexArray[i].z)
if yMinRange < pos[1] < yMaxRange\
and zMinRange < pos[2] < zMaxRange:
vtxs = "%s.vtx[%i]" %(mDag.fullPathName(), i)
vertexList.append(vtxs)
# Xだけ選択されている場合
if xChk == True and yChk == False and zChk == False:
pos[0] = roundFloat(vertexArray[i].x)
if xMinRange < pos[0] < xMaxRange:
vtxs = "%s.vtx[%i]" %(mDag.fullPathName(), i)
vertexList.append(vtxs)
# Yだけ選択されている場合
if xChk == False and yChk == True and zChk == False:
pos[1] = roundFloat(vertexArray[i].y)
if yMinRange < pos[1] < yMaxRange:
vtxs = "%s.vtx[%i]" %(mDag.fullPathName(), i)
vertexList.append(vtxs)
# Zだけ選択されている場合
if xChk == False and yChk == False and zChk == True:
pos[2] = roundFloat(vertexArray[i].z)
if zMinRange < pos[2] < zMaxRange:
vtxs = "%s.vtx[%i]" %(mDag.fullPathName(), i)
vertexList.append(vtxs)
if len(vertexList) == 0:
mc.warning(u"その設定範囲には何も含まれていませんでした")
mc.select(mc.ls(sl=True, o=True))
return
# 設定範囲内にあった頂点を選択された種類のコンポーネントに変換する
selCompKind = mc.radioButtonGrp(radioBtnCompKind, q=True, select=True)
if selCompKind == 1:
mc.select(vertexList)
elif selCompKind == 2:
edges = mc.polyListComponentConversion(vertexList, fromVertex=True, toEdge=True)
mc.select(edges)
elif selCompKind == 3:
faces = mc.polyListComponentConversion(vertexList, fromVertex=True, toFace=True)
mc.select(faces)
mc.undoInfo(stateWithoutFlush=True)
# UIの生成 =============================================================================
def createUI(self):
# もしすでにこのウィンドウが開いてたら閉じる
if mc.window("selCompRangeWindow", ex = True): mc.deleteUI("selCompRangeWindow")
mc.window(
"selCompRangeWindow",
title = "Select Component Inside Range",
sizeable = False,
widthHeight = (330 , 420))
mc.columnLayout(columnOffset=("both", 10 ), rowSpacing=8 )
# Select Space ==================================================================
mc.rowLayout( numberOfColumns=2 )
mc.text(label = "Select Space ")
mc.separator( width=226 )
mc.setParent('..')
global radioBtnSpace
radioBtnSpace = mc.radioButtonGrp(
numberOfRadioButtons = 2,
select = 1,
labelArray2 = ["Local Space", "World Space"],
columnAttach2 = ["both", "both"],
columnOffset2 = [30, 30],
columnWidth2 = (150, 150))
# Select Component Kind =========================================================
mc.rowLayout( numberOfColumns=2 )
mc.text(label = "Select Component ")
mc.separator( width=192 )
mc.setParent('..')
global radioBtnCompKind
radioBtnCompKind = mc.radioButtonGrp(
numberOfRadioButtons = 3,
select = 1,
labelArray3 = ["Vertex", "Edge", "Face" ],
columnAttach3 = ["left", "left", "left"],
columnOffset3 = [30, 35, 35],
columnWidth3 = (90, 90, 90))
# Select Range ==================================================================
mc.rowLayout( numberOfColumns=2 )
mc.text(label = "Select Axis and Range ")
mc.separator( width=172 )
mc.setParent('..')
mc.rowLayout( columnAttach1="left", columnOffset1=20 )
global autoSelectChkBox
autoSelectChkBox = mc.checkBox(
label = "Auto Select If Range Changed",
value = 1)
mc.setParent('..')
global xChkBox, xTxtMin, xFieldMin, xSliderMin, xTxtMax, xFieldMax, xSliderMax
# X Range ===================================================
mc.rowLayout( numberOfColumns=3 )
xChkBox = mc.checkBox(
label = "X",
value = 1,
backgroundColor = [0.75, 0.25, 0.25],
onCommand = self.xChkBoxOn,
offCommand = self.xChkBoxOff)
mc.columnLayout()
mc.rowLayout( numberOfColumns=3 )
xTxtMin = mc.text(label="Min", enable=True, width=26)
xFieldMin = mc.floatField(
enable = True,
width = 70,
value = -1,
precision = 3,
changeCommand = self.changeXFieldMin)
xSliderMin = mc.floatSlider(
enable = True,
value = -1,
step = 1.0,
maxValue = 10,
minValue = -10,
width = 172,
dragCommand = self.changeXSliderMinDrag)
mc.setParent('..')
mc.rowLayout( numberOfColumns=3 )
xTxtMax = mc.text(label="Max", enable=True, width=26)
xFieldMax = mc.floatField(
enable = True,
width = 70,
value = 1,
precision = 3,
changeCommand = self.changeXFieldMax)
xSliderMax = mc.floatSlider(
enable = True,
value = 1,
step = 1.0,
maxValue = 10,
minValue = -10,
width = 172,
dragCommand = self.changeXSliderMaxDrag)
mc.setParent('..')
mc.setParent('..')
mc.setParent('..')
global yChkBox, yTxtMin, yFieldMin, ySliderMin, yTxtMax, yFieldMax, ySliderMax
# Y Range ===================================================
mc.rowLayout( numberOfColumns=3 )
yChkBox = mc.checkBox(
label = "Y",
value = 1,
backgroundColor = [0.25, 0.75, 0.25],
onCommand = self.yChkBoxOn,
offCommand = self.yChkBoxOff)
mc.columnLayout()
mc.rowLayout( numberOfColumns=3 )
yTxtMin = mc.text(label="Min", enable=True, width=26)
yFieldMin = mc.floatField(
enable = True,
width = 70,
value = -1,
precision = 3,
changeCommand = self.changeYFieldMin)
ySliderMin = mc.floatSlider(
enable = True,
value = -1,
step = 1.0,
maxValue = 10,
minValue = -10,
width = 172,
dragCommand = self.changeYSliderMinDrag)
mc.setParent('..')
mc.rowLayout( numberOfColumns=3 )
yTxtMax = mc.text(label="Max", enable=True, width=26)
yFieldMax = mc.floatField(
enable = True,
width = 70,
value = 1,
precision = 3,
changeCommand = self.changeYFieldMax)
ySliderMax = mc.floatSlider(
enable = True,
value = 1,
step = 1.0,
maxValue = 10,
minValue = -10,
width = 172,
dragCommand = self.changeYSliderMaxDrag)
mc.setParent('..')
mc.setParent('..')
mc.setParent('..')
global zChkBox, zTxtMin, zFieldMin, zSliderMin, zTxtMax, zFieldMax, zSliderMax
# Z Range ===================================================
mc.rowLayout( numberOfColumns=3 )
zChkBox = mc.checkBox(
label = "Z",
value = 1,
backgroundColor = [0.25, 0.25, 0.75],
onCommand = self.zChkBoxOn,
offCommand = self.zChkBoxOff)
mc.columnLayout()
mc.rowLayout( numberOfColumns=3 )
zTxtMin = mc.text(label="Min", enable=True, width=26)
zFieldMin = mc.floatField(
enable = True,
width = 70,
value = -1,
precision = 3,
changeCommand = self.changeZFieldMin)
zSliderMin = mc.floatSlider(
enable = True,
value = -1,
step = 1.0,
maxValue = 10,
minValue = -10,
width = 172,
dragCommand = self.changeZSliderMinDrag)
mc.setParent('..')
mc.rowLayout( numberOfColumns=3 )
zTxtMax = mc.text(label="Max", enable=True, width=26)
zFieldMax = mc.floatField(
enable = True,
width = 70,
value = 1,
precision = 3,
changeCommand = self.changeZFieldMax)
zSliderMax = mc.floatSlider(
enable = True,
value = 1,
step = 1.0,
maxValue = 10,
minValue = -10,
width = 172,
dragCommand = self.changeZSliderMaxDrag)
mc.setParent('..')
mc.setParent('..')
mc.setParent('..')
mc.separator( width=308 )
# Select Button =================================================================
mc.button(label="Select ", height=40, width=308, command=self.selectClicked )
mc.showWindow()
def roundFloat( num ):
if abs(num) < 1:
return round(num * 1000) / 1000
else:
return num
kkSelectComponentInsideRange()
- Xのメッセージを読み込み中

コメントをお書きください