Skip to content

Instantly share code, notes, and snippets.

@SEVEZ
Forked from fereria/floatingShelf.py
Last active September 5, 2017 15:00
Show Gist options
  • Save SEVEZ/f96f60ab580c2868404ff34a931207d9 to your computer and use it in GitHub Desktop.
Save SEVEZ/f96f60ab580c2868404ff34a931207d9 to your computer and use it in GitHub Desktop.
Floating shelf #starred
## -*- coding: utf-8 -*-
## last updated:<2013/12/06 11:57:06>
## Megumi Ando
#MayaModlue-----------------------------------##
import pymel.core as pm
import pymel.util as pmUtil
import maya.mel as mm
#----------------------------------------------#
import os.path
import logging
import json
import re
#orignalModule---------------------------------#
import remitools.lib.fileIO as fileIO
#PathSetting----------------------------------##
pathThisFile = os.path.dirname(os.path.abspath(__file__))
settingPath = os.path.normpath(os.path.join(pathThisFile,"../setting"))
dataPath = os.path.normpath(os.path.join(pathThisFile,"../data" ))
shelfSaveDir = re.sub("\\\\","/",dataPath + "/floatingShelf")
#EnvSetting-----------------------------------*#
pmUtil.putEnv("XBMLANGPATH" , pmUtil.getEnv("XBMLANGPATH") + ";" + dataPath +"/icon")
pmUtil.putEnv("MAYA_SCRIPT_PATH" , pmUtil.getEnv("MAYA_SCRIPT_PATH") + ";" + shelfSaveDir)
"""
縦横を自由に変えられるタイプのShelf
ShelfEditorでShelfのアイコン変更ができない・・・?
"""
class floatingShelf():
uiName = "floatingShelf"
tabColumnLo = {}
shelfLo = {}
tabLo = None
mainLo = None
width = 300
height = 400
shelfTabSave = shelfSaveDir + "/fs_tabData.json"
def __init__(self):
if pm.window(self.uiName,exists=True) == True:
pm.deleteUI(self.uiName)
self.hWindow = pm.window(self.uiName,w=self.width,h=self.height,menuBar=True)
with self.hWindow:
#pm.menu(label="File",tearOff=True)
#pm.menuItem(label="Tool Setting",c=pm.Callback(self.settingUI))
#pm.menuItem(label="Save Shelf",c=pm.Callback(self.mainUI_Save))
with pm.columnLayout(adj=True):
self.mainLo = pm.columnLayout(adj=True)
self.tabLo = pm.shelfTabLayout(parent=self.mainLo,
height=self.height,
image='rmtools_setting.png',
imageVisible=True,
cc=pm.Callback(self.mainUI_Save),
dgc=pm.Callback(self.mainUI_Save))
pm.setParent("..")
with pm.rowLayout(numberOfColumns=2,adj=True):
pm.button(l="Tool Setting" ,w=(self.width / 2),c=pm.Callback(self.settingUI))
pm.button(l="Save Shelf",w=(self.width / 2),c=pm.Callback(self.mainUI_Save))
self.createUI()
def createUI(self):
"""
UIの構築部分。
いずれは、Textの保存情報を元に組み立てるようにする。
(現状は、タブ作成テスト)
"""
self.loadTab()
self.loadShelf()
def mainUI_Save(self):
"""
ツール情報の保存ルーチン
"""
self.saveTab()
self.saveShelf()
def addTab(self,tabName):
"""
引数で指定したtabのShelfを作成する。
"""
with self.tabLo:
self.shelfLo[tabName] = pm.shelfLayout(tabName,
height=self.height,
width=self.width,
dpc=pm.Callback(self.mainUI_Save))
def saveShelf(self):
"""
現状のShelf情報を保存する。
保存先は、tools/data/floatingShelf 下。
saveShelfで保存すると、mel形式で出力される。Pathの通っているところにおいておけば
Tab名と同じコマンドを実行すれば、シェルフ情報を復帰させることができる。
"""
tabList = self.tabLo.getTabLabel()
if tabList != None:
for tabName in tabList:
pm.saveShelf(tabName,shelfSaveDir + "/" + tabName)
def loadShelf(self):
"""
Shelfに登録してあったIcon情報を復帰する
"""
tabList = self.tabLo.getTabLabel()
if tabList != None:
for tab in tabList:
mm.eval("source \""+ shelfSaveDir+"/" + tab + ".mel" + "\";")
mm.eval("setParent "+tab+";"+tab+";")
def saveTab(self,tabList=None):
"""
ツールのTab情報をJson形式(単純な配列)で保存する。
"""
if tabList == None:
tabList = self.tabLo.getTabLabel()
fileIO.fileIO(self.shelfTabSave).writeLines([json.dumps(tabList)])
def loadTab(self):
"""
保存しておいたShelfTab情報から、ディスプレイを復帰する。
ファイルがない場合は、実行しない。
"""
if os.path.exists(self.shelfTabSave) == True:
tabIO = open(self.shelfTabSave,'r')
tabList = json.load(tabIO)
tabIO.close()
self.tabLo.clear()
for tab in tabList:
self.addTab(tab)
#*----------------------------------------------*#
#設定UI部分
#*----------------------------------------------*#
def settingUI(self,*args):
"""
ツールの設定UI
タブの追加や削除、タブ名の変更をする。
"""
if pm.window("toolSetting",exists=True) == True:
pm.deleteUI("toolSetting")
with pm.window("toolSetting",w=200,mnb=False,mxb=False):
with pm.columnLayout(adj=True):
with pm.rowLayout(numberOfColumns=2,adj=True):
pm.text("tabList")
self.settingTab = pm.optionMenu(cc=pm.Callback(self._changeSelectTab))
self._settingUpdate()
self.tabText = pm.textField()
pm.button(l="AddTab" , c=pm.Callback(self._settingAddTab))
pm.button(l="ChangeTab" , c=pm.Callback(self._changeTabName))
pm.button(l="DeleteTab" , c=pm.Callback(self._deleteTab))
def _settingAddTab(self,*args):
"""
ツール設定画面のTab追加を押したときに実行されるコマンド。
"""
self.addTab(self.tabText.getText())
self._settingUpdate()
def _settingUpdate(self,*args):
"""
Settingの画面情報(Tab)を更新する。
"""
tabList = self.tabLo.getTabLabel()
self.settingTab.clear()
if tabList != None:
with self.settingTab:
for tab in tabList:
pm.menuItem(l=tab)
self.saveTab()
def _changeTabName(self,*args):
"""
タブの名前を変更する。
Shelfの内容を、変更後のもので保存→TabDelete
→Tabを新規で作成し、Tab情報保存(Tabの並び順は維持)
→UI作り直し
"""
srcTab = self.settingTab.getValue()
changeName = self.tabText.getText()
tabList = self.tabLo.getTabLabel()
if srcTab in tabList:
pm.saveShelf(srcTab,shelfSaveDir+"/"+changeName)
self.shelfLo[srcTab].delete()
index = tabList.index(srcTab)
tabList[index] = changeName
self.saveTab(tabList)
self.createUI()
def _deleteTab(self,*args):
self.shelfLo[self.settingTab.getValue()].delete()
self._settingUpdate()
def _changeSelectTab(self,*args):
"""
selectUIのoptionを切り替えると、
textFieldに選択されているoptionMenuの内容を表示する。
"""
self.tabText.setText(self.settingTab.getValue())
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment