経緯
「Mayaのプロジェクトフォルダをいちいちエクスプローラーから選択してセットするのめんどくせぇぇ~~~~」
「そうだ、D&Dでフォルダを投げてできるようにすれば良いんだ!」
ツール動作
コード
下記をコピーして、Mayaのコマンドラインに貼り付けてください!
Maya2019でしか確認してません!
import os import maya.cmds as cmds import maya.mel as mel from maya import OpenMayaUI as omui from PySide2 import QtWidgets, QtGui, QtCore from shiboken2 import wrapInstance def maya_main_window(): """ Mayaのメインウィンドウを取得する。 """ main_window_ptr = omui.MQtUtil.mainWindow() return wrapInstance(int(main_window_ptr), QtWidgets.QWidget) class DragAndDropWidget(QtWidgets.QWidget): def __init__(self, parent=None): super(DragAndDropWidget, self).__init__(parent) self.setAcceptDrops(True) self.init_ui() def init_ui(self): """ ウィジェットのUIを初期化。 """ layout = QtWidgets.QVBoxLayout(self) label = QtWidgets.QLabel(u"ここにプロジェクトフォルダをD&Dしてください", self) label.setAlignment(QtCore.Qt.AlignCenter) layout.addWidget(label) def dragEnterEvent(self, event): """ D&Dのエンターイベントを処理。 """ if event.mimeData().hasUrls(): event.acceptProposedAction() def dropEvent(self, event): """ D&Dのドロップイベントを処理。 """ urls = event.mimeData().urls() if urls: file_path = urls[0].toLocalFile() if os.path.isdir(file_path): self.set_project(file_path) def set_project(self, folder_path): """ プロジェクトフォルダを設定し、シーンを開くダイアログを表示。 """ workspace_file = os.path.join(folder_path, "workspace.mel") if os.path.exists(workspace_file): mel.eval('setProject "{0}"'.format(folder_path)) cmds.inViewMessage(amg='プロジェクトフォルダが設定されました: {0}'.format(folder_path), pos='midCenter', fade=True) self.open_scene_dialog(folder_path) self.activate_maya_window() # Mayaウィンドウをアクティブにする else: cmds.warning("workspace.melが見つかりませんでした。") def open_scene_dialog(self, folder_path): """ scenesフォルダ内のシーンファイルを開くためのダイアログを表示。 """ scenes_folder = os.path.join(folder_path, "scenes") if not os.path.exists(scenes_folder): cmds.warning("scenesフォルダが見つかりません: {0}".format(scenes_folder)) return scene_file = cmds.fileDialog2(fileFilter="Maya Files (*.ma *.mb)", dialogStyle=2, startingDirectory=scenes_folder, fileMode=1) if scene_file: cmds.file(scene_file[0], o=True, force=True) def activate_maya_window(self): """ Mayaウィンドウをアクティブにする。 """ main_window = maya_main_window() main_window.activateWindow() main_window.raise_() class DragAndDropDockableWidget(QtWidgets.QWidget): def __init__(self, parent=None): super(DragAndDropDockableWidget, self).__init__(parent) self.setWindowTitle(u"D&D プロジェクト設定") self.setMinimumWidth(400) self.setMinimumHeight(200) self.init_ui() def init_ui(self): """ メインウィンドウのUIを初期化。 """ layout = QtWidgets.QVBoxLayout(self) self.drag_and_drop_widget = DragAndDropWidget(self) layout.addWidget(self.drag_and_drop_widget) def show_drag_and_drop_panel(): """ D&DパネルをMayaのパネルにアタッチして表示する関数。 """ # パネル名を定義(すでに存在する場合は閉じる処理) workspace_control_name = 'dragAndDropWorkspaceControl' # すでに存在する場合は一度閉じてから再作成 if cmds.workspaceControl(workspace_control_name, exists=True): try: cmds.workspaceControl(workspace_control_name, e=True, close=True) except RuntimeError: pass cmds.deleteUI(workspace_control_name, control=True) # パネルを作成してQtウィジェットをアタッチ widget = DragAndDropDockableWidget() # Mayaのワークスペースコントロールにウィジェットをアタッチ cmds.workspaceControl(workspace_control_name, label="D&D プロジェクト設定", retain=False) control = omui.MQtUtil.findControl(workspace_control_name) if control: qt_control = wrapInstance(int(control), QtWidgets.QWidget) qt_layout = qt_control.layout() qt_layout.addWidget(widget) # パネルを表示 show_drag_and_drop_panel()
既出バグ
ウィンドウ表示中に再実行するとエラー