Last active
April 20, 2019 11:15
-
-
Save ShikouYamaue/e0d014eb06c630c1aa1ede832f8ee504 to your computer and use it in GitHub Desktop.
Sample Editor 1 Cmds + QTableWidget
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# -*- 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