Maya Selected Node All Childs node disconnectAttr Loop

選択したノード以下のすべての接続を解除するループ

import maya.cmds as cmds
selectionNode=cmds.ls(sl=True)
# 指定したノード以下全てを検索
selectionNodes=cmds.ls(selectionNode,dag=1)
for node in selectionNodes:
	try:
		attribute1 =node+"_translateX.output"
		attribute2 =node+".translateX"
		cmds.disconnectAttr(attribute1, attribute2)
	except RuntimeError as err:
		pass
	

	try:
		attribute1 =node+"_translateY.output"
		attribute2 =node+".translateY"
		cmds.disconnectAttr(attribute1, attribute2)
	except RuntimeError as err:
		pass

	try:
		attribute1 =node+"_translateZ.output"
		attribute2 =node+".translateZ"
		cmds.disconnectAttr(attribute1, attribute2)
	except RuntimeError as err:
		pass

	try:
		attribute1 =node+"_rotateX.output"
		attribute2 =node+".rotateX"
		cmds.disconnectAttr(attribute1, attribute2)
	except RuntimeError as err:
		pass

	try:
		attribute1 =node+"_rotateY.output"
		attribute2 =node+".rotateY"
		cmds.disconnectAttr(attribute1, attribute2)
	except RuntimeError as err:
		pass

	try:
		attribute1 =node+"_rotateZ.output"
		attribute2 =node+".rotateZ"
		cmds.disconnectAttr(attribute1, attribute2)
	except RuntimeError as err:
		pass

	try:
		attribute1 =node+"_scaleX.output"
		attribute2 =node+".scaleX"
		cmds.disconnectAttr(attribute1, attribute2)
	except RuntimeError as err:
		pass

	try:
		attribute1 =node+"_scaleY.output"
		attribute2 =node+".scaleY"
		cmds.disconnectAttr(attribute1, attribute2)
	except RuntimeError as err:
		pass

	try:
		attribute1 =node+"_scaleZ.output"
		attribute2 =node+".scaleZ"
		cmds.disconnectAttr(attribute1, attribute2)
	except RuntimeError as err:
		pass

illustrator jsx でレイヤー表示3x5x6=90パターンpng24で書き出し

カラーの展開を納品確認するために90パターンをjsxで再現してpng24で書き出すスクリプトを書いた。

 メインのオブジェクトの色3色(ホワイト、ブラック、グリーン)
 文字5色(ホワイト、ブラック、グレー、グリーン、パープル) 
 背景6色(透明、ホワイト、ブラック、グレー、グリーン、パープル)

がほしいみたいなすごいこと言われて、マジかと思って。作りました。

//var folder = Folder.selectDialog();


//alert(  "filepath= "+filepath);

//var folder =filepath;
var document = app.activeDocument;


//if(document && folder)
if(document)
{  
  var options = new ExportOptionsPNG24();
  options.antiAliasing = true;
  options.transparency = true;
  options.artBoardClipping = true;
  options.verticalScale = 1413.4276;
  options.horizontalScale = 1413.4276;
  
  
  //alert(  "document.layers= "+document.layers);
  //配列グループの中にレイヤー番号を集める

  var kupuTopArr=[];

  for(var i=0; i<document.layers.length; ++i)
  {
	  layerName=document.layers[i].name;
	  if(layerName.indexOf( 'kupu_' )>-1)
		  kupuTopArr.push(i);
  }
  //alert(  "kupuTopArr= "+kupuTopArr);
  
  var kupuUnderArr=[];
  for(var i=0; i<document.layers.length; ++i)
  {
	  layerName=document.layers[i].name;
	  if(layerName.indexOf( 'kupuunder_' )>-1)
		  kupuUnderArr.push(i);
  }
  //alert(  "kupuUnderArr= "+kupuUnderArr);
  
  var fontArr=[];
  for(var i=0; i<document.layers.length; ++i)
  {
	  layerName=document.layers[i].name;
	  if(layerName.indexOf( 'font_' )>-1)
		  fontArr.push(i);
  }
  //alert(  "fontArr= "+fontArr);
  var bgArr=[];
  for(var i=0; i<document.layers.length; ++i)
  {
	  layerName=document.layers[i].name;
	  if(layerName.indexOf( 'bg_' )>-1)
		  bgArr.push(i);
  }
  //alert(  "bgArr= "+bgArr);
  
  //全パターンを出力
  //alert(  "kupuTopArr.length= "+kupuTopArr.length);
  for(var kupuTop_i=0; kupuTop_i<kupuTopArr.length; ++kupuTop_i)
  {
	  //alert(  "kupuTop_i= "+kupuTop_i);
	  
	  //他のkupu_レイヤーを非表示
	  hideArrAllLayers(kupuTopArr)

	  //今回のkupu_レイヤーを表示
	  var kupuTop_Laynum=kupuTopArr[kupuTop_i];
	  //alert(  "kupuTop_Laynum= "+kupuTop_Laynum);
	  document.layers[kupuTop_Laynum].visible = true;
	  
	  //他のkupuunderレイヤーを非表示
	  hideArrAllLayers(kupuUnderArr)

	  //今回のkupuunderレイヤーを表示
	  var kupuUnder_Laynum=kupuUnderArr[kupuTop_i];
	  //alert(  "kupuUnder_Laynum= "+kupuUnder_Laynum);
	  document.layers[kupuUnder_Laynum].visible = true;
	  
	  var kupuTop_Layer_Name=document.layers[kupuTop_Laynum].name+"";
	  //alert(  "kupuTop_Layer_Name= "+kupuTop_Layer_Name);
	  
	  
	  for(var font_i=0; font_i<fontArr.length; ++font_i)
	  {
			//他のfontレイヤーを非表示
			hideArrAllLayers(fontArr)
	  
		    //今回のfontイヤーを表示
			var font_Laynum=fontArr[font_i];
			//alert(  "kupuUnder_Laynum= "+kupuUnder_Laynum);
			document.layers[font_Laynum].visible = true;
			
			var font_Layer_Name=document.layers[font_Laynum].name+"";
			
			
			
			for(var bg_i=0; bg_i<bgArr.length; ++bg_i)
			{
				
				//他のbgレイヤーを非表示
				hideArrAllLayers(bgArr)
		  
				//今回のbgイヤーを表示
				var bg_Laynum=bgArr[bg_i];
				//alert(  "kupuUnder_Laynum= "+kupuUnder_Laynum);
				document.layers[bg_Laynum].visible = true;
				
				var bg_Layer_Name=document.layers[bg_Laynum].name+"";
					
				
			
				//Export -------------------------------------------------------------
				
				filepath=app.activeDocument.path.fsName.toString()+"";
				filepathArr = filepath.split('\\'); // ["apple", "banana", "orange"]
				filepath=filepathArr.join('/');
				
				var makedDirPath = mkdirp(filepath + '/nouhin/'+kupuTop_Layer_Name+'/'+font_Layer_Name+"");
				//alert("makedDirPath= "+makedDirPath);
		  
				var ExportfilePath = makedDirPath+kupuTop_Layer_Name+"_"+font_Layer_Name+"_"+bg_Layer_Name+".png"
				//alert(  "ExportfilePath= "+ExportfilePath);
		  
				var file = new File(ExportfilePath);
				document.exportFile(file,ExportType.PNG24,options);
			}
	  }
	  

	  
	  
	  
  }
  /*
  var n = document.layers.length;
  for(var i=0; i<n; ++i)
  {
    hideAllLayers();
    var layer = document.layers[i];
	alert(  "document.layers["+i+"].name= "+document.layers[i].name);
    layer.visible = true;

    //var file = new File(folder.fsName+"/"+layer.name+".png");
    var file = new File(filepath+"/"+layer.name+".png");

    document.exportFile(file,ExportType.PNG24,options);
  }
  */
  
  showAllLayers();
  
  
  alert(  " 処理が完了しました ");
}

function kupu_white_view(){
  forEach(document.layers, function(layer) {
	if(layer.name=="kupu_white"){
	   layer.visible = true;
	}
    layer.visible = false;
  });
}

function hideArrAllLayers(Arr)
{
	for(var i=0; i<Arr.length; ++i)
    {
		  var Laynum=Arr[i];
		  //alert(  "kupuTop_Laynum= "+kupuTop_Laynum);
		  document.layers[Laynum].visible = false;
	}
}

function hideAllLayers()
{
  forEach(document.layers, function(layer) {
    layer.visible = false;
  });
}

function showAllLayers()
{
  forEach(document.layers, function(layer) {
    layer.visible = true;
  });    
}

function forEach(collection, fn)
{
  var n = collection.length;
  for(var i=0; i<n; ++i)
  {
    fn(collection[i]);
  }
}

function mkdirp(path) {
    var fullPath = "";
    path = path.toString();
    var arr = path.split("/");
    for (var i = 0; i < arr.length; i++) {
        var folderName = arr[i];
        fullPath += folderName + "/";
        var folder = new Folder(fullPath);
        if (!folder.exists) folder.create();
    }
    return fullPath;
}

mGearを使ってみた。021 GuidからRigContrallerのビルド とスキニング(Maya2020 +mGear3.7.0版)

どうにかこうにか手動でGuidを昔のジョイントに合わせたものがこれ

https://www.mediafire.com/file/c7jlzs28s5bpvn5/MiChoPa094_imported_mGearBipeGuide_And_Genesis8FemaleJoint.zip/file

指が間違ってた。

でこの動画の続きによると

型の始まりのGuidのCUBEをクリックして Dupl.Sym.を押すと左右が対象になるみたいだったけど
つかってない手でやった。

つぎにGuidのトップノードを選択して新シーンとして保存してる

Guidトップ選択して Build From Selection

走りだす。

リグが出力されたようだ このあと動画のようにコントロールリグのサイズを変更しなくてスキンバインドのテストしたほうがいいと思う。

リグデフォーマグループを選択する

上やじるしを押すとすべての読み取るのに必要なジョイントが選択されます。

つまりはこれがしたいみたい。

設定は
ジョイント階層
測地線ボクセル
クラシックリニア
インタラクティブ
距離
チェックあり

チェック
チェック
チェック
チェックなし

ではリグを動かしてみましょう!

動かしにくいので最後にリグコントローラーのサイズを変更しよう。

ここでジョイントの表示サイズがでかすぎたのか変更してる。

表示サイズを大きくすると、ジョイントやボーンが選択しやすくなります。 表示サイズを小さくすると、フレクサなど他のオブジェクトが選択しやすくなります。 ディスプレイ > アニメーション > ジョイント サイズ(Display > Animation > Joint Size)を選択します。

一番下の8角形が大きすぎたので

Control+右クリックで「CV」を選択して小さくスケールしてる。

スケールできないからスケールツールをダブルクリックで起動しなおすことで初期化してスケールしてる。

ここでは逆に大きくした。

手の幅ぐらいのサイズにした

コントローラーハンドルここではBOXが頭にめり込んでるので直している。

した

体も同じくボディに埋まっているコントロールハンドルをCVモードで拡大していく

こんな感じ

mGearを使ってみた。020 (Maya2020 +mGear3.7.0版

ちょっとさらに仕切り直し

Maya2016 +mGear2.6.1系 から

Maya2020 +mGear3.7.0_beta_01に乗り換えてみた。

1、モデルを用意した

2,mGear/Shifter/Guide Managerを起動

3,mGear/Shifter/Guid Template Samples/Biped Template を実行
黄色いguidが作成された。

4、guideのサイズをモデルに合わせる
  合わせやすいようにシェーディング/ワイヤーフレームシェードにした

ここではもとにあったジョイントに全くびったり合わせるために

ジョイントを読み込みました。

位置合わせツールがあったら楽なのにと思いました。

いろいろやったが下のスクリプトなど作ったがJointの数とターゲットの数も違うし使えなかった仕事としてならたぶん無理やりできるんだろうなと思う。

import maya.cmds as cmds
selectedList=cmds.ls( selection=True )
print("selectedList="+str(selectedList))
jointOriginal=selectedList[0]
guidTarget=selectedList[1]

#world座標を取る いろいろ考えたけど親基準にローカル座標そろえるのやめた。なぜなら親もローカル座標そろえないと話は始まらないから。
#cmds.pointPosition( 'particle1.pt[1]', world=True )
#def getParentWorldPos()
j_parentlist=cmds.listRelatives(jointOriginal, parent=True )
g_parentlist=cmds.listRelatives(jointOriginal, parent=True )
#print("parentlist="+str(parentlist))
jointOriginalParent=j_parentlist[0]
guidTargetParent=g_parentlist[0]
print("jointOriginalParent="+str(jointOriginalParent))
print("guidTargetParent="+str(guidTargetParent))
jointOriginalParentWorldXYZ=cmds.xform(jointOriginalParent,worldSpace=True, q=True, translation=True )
guidTargetParentWorldXYZ=cmds.xform(guidTargetParent,worldSpace=True, q=True, translation=True )
jointOriginalParentWorldXYZrot=cmds.xform(jointOriginalParent,worldSpace=True, q=True, rotation=True )
guidTargetParentWorldXYZrot=cmds.xform(guidTargetParent,worldSpace=True, q=True, rotation=True )
print("jointOriginalParentWorldXYZ="+str(jointOriginalParentWorldXYZ))
print("guidTargetParentWorldXYZ="+str(guidTargetParentWorldXYZ))
w_xDiff=jointOriginalParentWorldXYZ[0]-guidTargetParentWorldXYZ[0]
w_yDiff=jointOriginalParentWorldXYZ[1]-guidTargetParentWorldXYZ[1]
w_zDiff=jointOriginalParentWorldXYZ[2]-guidTargetParentWorldXYZ[2]

w_xDiffR=jointOriginalParentWorldXYZrot[0]-guidTargetParentWorldXYZrot[0]
w_yDiffR=jointOriginalParentWorldXYZrot[1]-guidTargetParentWorldXYZrot[1]
w_zDiffR=jointOriginalParentWorldXYZrot[2]-guidTargetParentWorldXYZrot[2]
worldDiff=[w_xDiff,w_yDiff,w_zDiff]
worldDiffR=[w_xDiffR,w_yDiffR,w_zDiffR]

print("worldDiff="+str(worldDiff))
print("worldDiffR="+str(worldDiffR))
""""""
tx=cmds.getAttr(jointOriginal+".tx")
ty=cmds.getAttr(jointOriginal+".ty")
tz=cmds.getAttr(jointOriginal+".tz")
print(" tx= "+str(tx)+" ty= "+str(ty)+" tz= "+str(tz))
"""
cmds.setAttr(guidTarget+".tx",tx)
cmds.setAttr(guidTarget+".ty",ty)
cmds.setAttr(guidTarget+".tz",tz)
"""
guid_Scale=9.869
goTX=guid_Scale/tx+w_xDiff
goTY=guid_Scale/ty+w_yDiff
goTZ=guid_Scale/tz+w_zDiff
print(" goTX= "+str(goTX)+" goTY= "+str(goTY)+" goTZ= "+str(goTZ))

""""""
#ZをXに
""""""
cmds.setAttr(guidTarget+".tx",goTZ)
cmds.setAttr(guidTarget+".ty",goTY)
cmds.setAttr(guidTarget+".tz",goTX)

"""
cmds.setAttr(guidTarget+".rx",goTZ)
cmds.setAttr(guidTarget+".ry",goTX)
cmds.setAttr(guidTarget+".rz",goTY)
"""

地道にジョイントにguideを合わせるしかない。(今のところ)

単位が違くなってるのはさっきguide側にスケールかけたからだった。

これはjoint rHand

これはguide のarm_R0_wrist

もう少しで、いけそうなのになあ

mGearを使ってみた。004

用意したモデルに

Shifter/Guide Template Samples /Biped Templateをやってみたらエラー

エラー: AttributeError: file C:\Users\whaison\Documents\maya\2016\ja_JP\scripts\mGear\mgear_3.7.0_beta_01\release\scripts\mgear\core\utils.py line 223: nt.NurbsCurve(u’global_C0_axisShape’) has no attribute or method named ‘lineWidth’ #

バージョン的にだめな予感がしてきたので過去のmGearを探すことにした。

https://github.com/mgear-dev/mgear/releases/tag/v2.6.1

mGearを使ってみた。004

こんどは

mGear/Shifter/Guid Mannager起動してみたら起動したエラー

File “C:/Users/whaison/Documents/maya/2016/ja_JP/scripts/mGear/mgear_3.7.0_beta_01/release/scripts/mgear/shifter_classic_components\ui_slider_01\settingsUI.py”, line 11, in
from PySide2 import QtCore, QtGui, QtWidgets
ImportError: No module named PySide2

Maya2016にはPyside2はありませんよねそりゃ

以下の3つのファイルのソースを変更する

C:\Users\whaison\Documents\maya\2016\ja_JP\scripts\mGear\mgear_3.7.0_beta_01\release\scripts\mgear\shifter_classic_components\ui_slider_01\settingsUI.py

C:\Users\whaison\Documents\maya\2016\ja_JP\scripts\mGear\mgear_3.7.0_beta_01\release\scripts\mgear\shifter_classic_components\ui_container_01\settingsUI.py

C:\Users\whaison\Documents\maya\2016\ja_JP\scripts\mGear\mgear_3.7.0_beta_01\release\scripts\mgear\shifter_classic_components\sdk_control_01\settingsUI.py

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'C:\Users\Justi\OneDrive\Documents\maya\mGear\scripts\mgear\shifter_classic_components\sdk_control_01\settingsUI.ui'
#
# Created: Sat Aug 24 10:20:58 2019
#      by: pyside2-uic  running on PySide2 2.0.0~alpha0
#
# WARNING! All changes made in this file will be lost!

#from PySide2 import QtCore, QtGui, QtWidgets
from PySide import QtCore, QtGui

エラーなく動いた。

今回の変更はただのUIのロード先の変更なのでたーぶーん全体的には動く予感

mGearを使ってみた。003

エラー: AttributeError: file C:\Users\whaison\Documents\maya\2016\ja_JP\scripts\mGear\mgear_3.7.0_beta_01\release\scripts\mgear\core\pyqt.py line 160: ‘module’ object has no attribute ‘workspaceControl’

についてだが

この160行目をコメントしたら動いた。

C:\Users\whaison\Documents\maya\2016\ja_JP\scripts\mGear\mgear_3.7.0_beta_01\release\scripts\mgear\core\pyqt.py

"""pyQt/pySide widgets and helper functions for mGear"""

#############################################
# GLOBAL
#############################################
import os
import traceback
import maya.OpenMayaUI as omui
import pymel.core as pm

from mgear.vendor.Qt import QtWidgets
from mgear.vendor.Qt import QtCompat
from mgear.vendor.Qt import QtGui
from mgear.vendor.Qt import QtSvg

UI_EXT = "ui"

_LOGICAL_DPI_KEY = "_LOGICAL_DPI"

#################
# Old qt importer
#################


def _qt_import(binding, shi=False, cui=False):
    QtGui = None
    QtCore = None
    QtWidgets = None
    wrapInstance = None

    if binding == "PySide2":
        from PySide2 import QtGui, QtCore, QtWidgets
        import shiboken2 as shiboken
        from shiboken2 import wrapInstance
        from pyside2uic import compileUi

    elif binding == "PySide":
        from PySide import QtGui, QtCore
        import PySide.QtGui as QtWidgets
        import shiboken
        from shiboken import wrapInstance
        from pysideuic import compileUi

    elif binding == "PyQt4":
        from PyQt4 import QtGui
        from PyQt4 import QtCore
        import PyQt4.QtGui as QtWidgets
        from sip import wrapinstance as wrapInstance
        from PyQt4.uic import compileUi
        print("Warning: 'shiboken' is not supported in 'PyQt4' Qt binding")
        shiboken = None

    else:
        raise Exception("Unsupported python Qt binding '%s'" % binding)

    rv = [QtGui, QtCore, QtWidgets, wrapInstance]
    if shi:
        rv.append(shiboken)
    if cui:
        rv.append(compileUi)
    return rv


def qt_import(shi=False, cui=False):
    """
    import pyside/pyQt

    Returns:
        multi: QtGui, QtCore, QtWidgets, wrapInstance

    """
    lookup = ["PySide2", "PySide", "PyQt4"]

    preferredBinding = os.environ.get("MGEAR_PYTHON_QT_BINDING", None)
    if preferredBinding is not None and preferredBinding in lookup:
        lookup.remove(preferredBinding)
        lookup.insert(0, preferredBinding)

    for binding in lookup:
        try:
            return _qt_import(binding, shi, cui)
        except Exception:
            pass

    raise _qt_import("ThisBindingSurelyDoesNotExist", False, False)


compileUi = qt_import(shi=True, cui=True)[-1]

#############################################
# helper Maya pyQt functions
#############################################


def ui2py(filePath=None, *args):
    """Convert qtDesigner .ui files to .py"""

    if not filePath:
        startDir = pm.workspace(q=True, rootDirectory=True)
        filePath = pm.fileDialog2(dialogStyle=2,
                                  fileMode=1,
                                  startingDirectory=startDir,
                                  fileFilter='PyQt Designer (*%s)' % UI_EXT,
                                  okc="Compile to .py")
        if not filePath:
            return False
        filePath = filePath[0]
    if not filePath:
        return False

    if not filePath.endswith(UI_EXT):
        filePath += UI_EXT
    compiledFilePath = filePath[:-2] + "py"
    pyfile = open(compiledFilePath, 'w')
    compileUi(filePath, pyfile, False, 4, False)
    pyfile.close()

    info = "PyQt Designer file compiled to .py in: "
    pm.displayInfo(info + compiledFilePath)


def maya_main_window():
    """Get Maya's main window

    Returns:
        QMainWindow: main window.

    """

    main_window_ptr = omui.MQtUtil.mainWindow()
    return QtCompat.wrapInstance(long(main_window_ptr), QtWidgets.QWidget)


def showDialog(dialog, dInst=True, dockable=False, *args):
    """
    Show the defined dialog window

    Attributes:
        dialog (QDialog): The window to show.

    """
    if dInst:
        try:
            for c in maya_main_window().children():
                if isinstance(c, dialog):
                    c.deleteLater()
        except Exception:
            pass

    # Create minimal dialog object

    # if versions.current() >= 20180000:
    #     windw = dialog(maya_main_window())
    # else:
    windw = dialog()

    # ensure clean workspace name
    if hasattr(windw, "toolName") and dockable:
        control = windw.toolName + "WorkspaceControl"
        #if pm.workspaceControl(control, q=True, exists=True):
        #    pm.workspaceControl(control, e=True, close=True)
        #    pm.deleteUI(control, control=True)
    desktop = QtWidgets.QApplication.desktop()
    screen = desktop.screen()
    screen_center = screen.rect().center()
    windw_center = windw.rect().center()
    windw.move(screen_center - windw_center)

    # Delete the UI if errors occur to avoid causing winEvent
    # and event errors (in Maya 2014)
    try:
        if dockable:
            windw.show(dockable=True)
        else:
            windw.show()
        return windw
    except Exception:
        windw.deleteLater()
        traceback.print_exc()


def deleteInstances(dialog, checkinstance):
    """Delete any instance of a given dialog

    Delete any instance of a given dialog and if the dialog is
    instance of checkinstance.

    Attributes:
        dialog (QDialog): The dialog to delete.
        checkinstance (QDialog): The instance to check the type of dialog.

    """
    mayaMainWindow = maya_main_window()
    for obj in mayaMainWindow.children():
        if isinstance(obj, checkinstance):
            if obj.widget().objectName() == dialog.toolName:
                print 'Deleting instance {0}'.format(obj)
                mayaMainWindow.removeDockWidget(obj)
                obj.setParent(None)
                obj.deleteLater()


def fakeTranslate(*args):
    """Fake Translation

    fake QApplication.translate. This function helps to bypass the
    incompativility for the Unicode utf8  deprecated in pyside2

    """
    return args[1]


def position_window(window):
    """ set the position for the windonw

    Function borrowed from Cesar Saez QuickLauncher
    Args:
        window (QtWidget): the window to position
    """
    pos = QtGui.QCursor.pos()
    window.move(pos.x(), pos.y())


def get_main_window(widget=None):
    """Get the active window

    Function borrowed from Cesar Saez QuickLauncher
    Args:
        widget (QtWidget, optional): window

    Returns:
        QtWidget: parent of the window
    """
    widget = widget or QtWidgets.QApplication.activeWindow()
    if widget is None:
        return
    parent = widget.parent()
    if parent is None:
        return widget
    return get_main_window(parent)


def get_instance(parent, gui_class):
    """Get instace of a window from a given parent

    Function borrowed from Cesar Saez QuickLauncher
    Args:
        parent (QtWidget): parent
        gui_class (QtWidget): instance class to check

    """
    for children in parent.children():
        if isinstance(children, gui_class):
            return children
    return None


def get_icon_path(icon_name=None):
    """ Gets the directory path to the icon
    """

    file_dir = os.path.dirname(__file__)

    if "\\" in file_dir:
        file_dir = file_dir.replace("\\", "/")
    if icon_name:
        return "{0}/icons/{1}".format(file_dir, icon_name)
    else:
        return "{}/icons".format(file_dir)


def get_icon(icon, size=24):
    """get svg icon from icon resources folder as a pixel map
    """
    img = get_icon_path("{}.svg".format(icon))
    svg_renderer = QtSvg.QSvgRenderer(img)
    image = QtGui.QImage(size, size, QtGui.QImage.Format_ARGB32)
    # Set the ARGB to 0 to prevent rendering artifacts
    image.fill(0x00000000)
    svg_renderer.render(QtGui.QPainter(image))
    pixmap = QtGui.QPixmap.fromImage(image)

    return pixmap


# dpi scale test -------------------------------------------------------------
def get_logicaldpi():
    """attempting to "cache" the query to the maya main window for speed

    Returns:
        int: dpi of the monitor
    """
    if _LOGICAL_DPI_KEY not in os.environ.keys():
        try:
            logical_dpi = maya_main_window().logicalDpiX()
        except Exception:
            logical_dpi = 96
        finally:
            os.environ[_LOGICAL_DPI_KEY] = str(logical_dpi)
    return int(os.environ.get(_LOGICAL_DPI_KEY)) or 96


def dpi_scale(value, default=96, min_=1, max_=2):
    """Scale the provided value by the scale that maya is using
    which is derived from the 'average' dpi of 96 from windows, linux, osx.

    Args:
        value (int, float): value to scale
        default (int, optional): assumed default from various platforms
        min_ (int, optional): if you do not want the value under 96 dpi
        max_ (int, optional): if you do not want a value higher than 200% scale

    Returns:
        # int, float: scaled value
    """
    return value * max(min_, min(get_logicaldpi() / float(default), max_))

mGear/Shifter/Guid Mannager起動してみたら起動した。