0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

both_constrain

Last updated at Posted at 2024-06-05

both_constrain
一つのオブジェクトに両手を追随させて、両手持ちっぽく見せるツール

.py実行ファイルのダウンロードリンクは以下


# -*- coding: utf-8 -*-
from maya import OpenMayaUI
from PySide2 import QtWidgets, QtCore
import shiboken2 as shiboken
import maya.cmds as cmds

ptr = OpenMayaUI.MQtUtil.mainWindow()
parent = shiboken.wrapInstance(int(ptr), QtWidgets.QMainWindow)

# UIの書式設定
class LocatorGUI(QtWidgets.QMainWindow):
    def __init__(self, parent=None):
        super(LocatorGUI, self).__init__(parent)

        self.setWindowTitle("both constrain")
        self.resize(300, 200)

        self.central_widget = QtWidgets.QWidget()
        self.setCentralWidget(self.central_widget)

        self.main_layout = QtWidgets.QVBoxLayout(self.central_widget)

        # Step1 GroupBoxの書式設定
        self.step1_group = QtWidgets.QGroupBox("Step1")
        self.step1_layout = QtWidgets.QVBoxLayout(self.step1_group)
        self.select_object_button = QtWidgets.QPushButton("オブシェクトを指定")
        self.select_object_button.clicked.connect(self.select_object)
        self.confirm_button = QtWidgets.QPushButton("確定")
        self.confirm_button.setEnabled(False)
        self.confirm_button.clicked.connect(self.confirm_object)

        self.step1_layout.addWidget(QtWidgets.QLabel("一つのオブシェクトを指定し、確定を押下して下さい"))
        self.step1_layout.addWidget(self.select_object_button)
        self.step1_layout.addWidget(self.confirm_button)

        self.step1_group.setLayout(self.step1_layout)

        # Step2 GroupBoxの書式設定
        self.step2_group = QtWidgets.QGroupBox("Step2")
        self.step2_layout = QtWidgets.QVBoxLayout(self.step2_group)
        self.strong_button = QtWidgets.QPushButton("Strong")
        self.strong_button.setEnabled(False)
        self.strong_button.clicked.connect(self.strong_object)
        self.weak_button = QtWidgets.QPushButton("Weak")
        self.weak_button.setEnabled(False)
        self.weak_button.clicked.connect(self.weak_object)

        self.step2_layout.addWidget(QtWidgets.QLabel("Strong=利き手を指定してください"))
        self.step2_layout.addWidget(self.strong_button)
        self.step2_layout.addWidget(QtWidgets.QLabel("Weak=添える手を指定してください"))

        self.step2_layout.addWidget(self.weak_button)

        self.step2_group.setLayout(self.step2_layout)

        self.main_layout.addWidget(self.step1_group)
        self.main_layout.addWidget(self.step2_group)
        # グループボックスの余白、色指定
        self.setStyleSheet(
            '''
            QGroupBox {
                border: 2px solid #256d7b;
                border-radius: 6px;
                margin-top: 2em;
                font-size: 12px;
            }

            QGroupBox::title {
                color: #fff;
                background-color: #256d7b;
                subcontrol-origin: margin;
                padding: 0.5em 0.7em;
                border-top-left-radius: 6px;
                border-top-right-radius: 6px;
            }
            '''
        )

    def select_object(self):
        selected_objects = cmds.ls(selection=True, dag=True)
        if not selected_objects:
            cmds.warning("Please select an object.")
            return
        self.selected_object = selected_objects[0]
        self.confirm_button.setEnabled(True) #ボタンのグレイアウトを解除

    def confirm_object(self):
        try:
            selected_object = self.selected_object
        except AttributeError:
            cmds.warning("Please select an object.")
            return

        group = cmds.group(selected_object, name=selected_object + "_group")
        bbox = cmds.exactWorldBoundingBox(selected_object)
        bbox_center = [(bbox[0] + bbox[3]) / 2, (bbox[1] + bbox[4]) / 2, (bbox[2] + bbox[5]) / 2]

        self.strong_locator = cmds.spaceLocator(name=selected_object + "_strong")[0]
        cmds.parent(self.strong_locator, selected_object)
        cmds.move(bbox_center[0], bbox_center[1], bbox_center[2], self.strong_locator)

        self.weak_locator = cmds.spaceLocator(name=selected_object + "_weak")[0]
        cmds.parent(self.weak_locator, self.strong_locator)
        cmds.xform(self.weak_locator, translation=bbox_center, worldSpace=True)

        self.strong_button.setEnabled(True) #ボタンのグレイアウトを解除


    def strong_object(self):
        selected_objects = cmds.ls(selection=True, type="transform")
        if not selected_objects:
            cmds.warning("Please select an object to constrain to the strong locator.")
            return
        selected_strong_object = selected_objects[0]

        try:
            strong_locator = self.strong_locator
        except AttributeError:
            cmds.warning("Strong locator not found. Please confirm the initial object.")
            return

        cmds.parentConstraint(strong_locator, selected_strong_object, mo=False)
        self.weak_button.setEnabled(True) #ボタンのグレイアウトを解除

    def weak_object(self):
        selected_objects = cmds.ls(selection=True, type="transform")
        if not selected_objects:
            cmds.warning("Please select an object to constrain to the weak locator.")
            return
        selected_weak_object = selected_objects[0]

        try:
            weak_locator = self.weak_locator
        except AttributeError:
            cmds.warning("Weak locator not found. Please confirm the initial object.")
            return

        cmds.parentConstraint(weak_locator, selected_weak_object, mo=False)

        self.confirm_button.setEnabled(False) #ボタンを再度グレイアウト
        self.strong_button.setEnabled(False)
        self.weak_button.setEnabled(False)

        self.selected_object = None # 選択したオブジェクトのリスト・インスタンス変数をリセット

def main():
    locator_gui = LocatorGUI(parent)
    locator_gui.show()

main()


0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?