Skip to content

Instantly share code, notes, and snippets.

@ShikouYamaue
Last active April 20, 2019 11:15
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ShikouYamaue/e0d014eb06c630c1aa1ede832f8ee504 to your computer and use it in GitHub Desktop.
Save ShikouYamaue/e0d014eb06c630c1aa1ede832f8ee504 to your computer and use it in GitHub Desktop.
Sample Editor 1 Cmds + QTableWidget
# -*- coding: utf-8 -*-
from maya import cmds
from maya.app.general.mayaMixin import MayaQWidgetBaseMixin
import time
import imp
try:
imp.find_module('PySide2')
from PySide2.QtWidgets import *
from PySide2.QtGui import *
from PySide2.QtCore import *
except ImportError:
from PySide.QtGui import *
from PySide.QtCore import *
#時間計測用関数
def timer(func):
def wrapper(*args, **kwargs):
global WINDOW
start = time.time()#開始時間
func(*args, **kwargs)#関数実行
end = time.time()#終了時間
msg = func.__name__ + ' : ' + str(end - start)
print '-'*50
print msg
print '-'*50
WINDOW.time_label.setText(msg)
return wrapper
#ウィンドウ呼び出し
def main():
global WINDOW
WINDOW = SampleEditor()
WINDOW.resize(600, 400)
WINDOW.show()
#サンプルエディタークラス
class SampleEditor(MayaQWidgetBaseMixin, QMainWindow):
#コンストラクタ
def __init__(self, parent=None):
super(self.__class__, self).__init__(parent)
self.setWindowTitle('Sample Editor Cmds')
#ラッパーウイジェットとレイアウトを設定
central_widget = QWidget()
self.setCentralWidget(central_widget)
self.main_layout = QVBoxLayout()
central_widget.setLayout(self.main_layout)
#ウェイト取得するボタン
self.get_button = QPushButton('Get Weights')
self.main_layout.addWidget(self.get_button)
self.get_button.clicked.connect(self.get_weights)
#ウェイトテーブルの変更を実際のウェイト値に反映するボタン
self.set_button = QPushButton('Set Weights')
self.main_layout.addWidget(self.set_button)
self.set_button.clicked.connect(self.set_weights)
#ウェイトテーブル
self.table_widget = QTableWidget()
self.table_widget.cellChanged.connect(self.update_weights)
self.main_layout.addWidget(self.table_widget)
#時間計測結果のお知らせ
self.time_label = QLabel('Execution time :')
self.main_layout.addWidget(self.time_label)
#選択コンポーネントのウェイトデータを取得してテーブルに反映
def get_weights(self):
self.get_skin_data()#まずはウェイトデータの取得
self.table_setup()#テーブルにデータセット
#QTableWidgetにデータ設定
@timer
def table_setup(self):
self.table_widget.clear()
self.table_widget.setColumnCount(len(self.influences))
self.table_widget.setHorizontalHeaderLabels(self.influences)
self.table_widget.setRowCount(len(self.vertices))
self.table_widget.setVerticalHeaderLabels(self.vertices)
for column in range(len(self.influences)):
self.table_widget.setColumnWidth(column, 60)
for row, weights in enumerate(self.weights_list):
for column, w in enumerate(weights):
item = QTableWidgetItem(str(w), w)
self.table_widget.setItem(row, column, item)
#選択頂点、ウェイト、インフルエンス、スキンクラスタを取得して返す関数
@timer
def get_skin_data(self):
if cmds.selectMode(q=True, co=True):
selection = cmds.ls(sl=True, l=True)
node = cmds.ls(hl=True, l=True)[0]
else:
selection = cmds.ls(sl=True, l=True)
node = selection
selected_vertices = self.convert_to_vertex(selection)
node_vertices = self.convert_to_vertex(node)
self.vertices = list(set(selected_vertices) & set(node_vertices))
self.skin_cluster = cmds.ls(cmds.listHistory(node), type='skinCluster')[0]
self.influences = cmds.skinCluster(self.skin_cluster , q=True, inf=True)
self.weights_list = list()
for vtx in self.vertices:
weights = cmds.skinPercent(self.skin_cluster, vtx, q=True, v=True)
self.weights_list.append(weights)
#ウェイトテーブルが更新されたらクラスのメンバ変数で保有しているウェイト値も更新する
def update_weights(self, row, column):
new_value = float(self.table_widget.item(row, column).data(0))
self.weights_list[row][column] = new_value
#ウェイト値をスキンメッシュに反映
@timer
def set_weights(self):
for vtx, weights in zip(self.vertices, self.weights_list):
new_weights = []
for inf, w in zip(self.influences, weights):
new_weights.append((inf, w))
cmds.skinPercent(self.skin_cluster, vtx, tv=new_weights)
#コンポーネントやメッシュリストをバーテックスリストに変換する
def convert_to_vertex(self, obj):
vertices = cmds.polyListComponentConversion(obj, tv=True)
vertices = cmds.filterExpand(vertices, sm=31)
return vertices
#実行
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment