# importing libraries:
import maya.cmds as cmds
import maya.mel as mel

# global variables to this module:    
CLASS_NAME = "Isolate"
TITLE = "m095_isolate"
DESCRIPTION = "m096_isolateDesc"
ICON = "/Icons/dp_isolate.png"

dpIsolateVersion = 1.0

class Isolate():
    def __init__(self, dpUIinst, langDic, langName, *args):
        # redeclaring variables
        self.dpUIinst = dpUIinst
        self.langDic = langDic
        self.langName = langName
        
        self.rootName = "Root"
        self.isolateName = self.langDic[self.langName]['m095_isolate']
        
        # base item to isolate
        self.rootCtrl = self.rootName+"_Ctrl"
        # get selected item to create isolate setup on it
        self.selItem = self.dpGetSelItem()
        if self.selItem:
            # check if the selected item has a grand father node in hierarchy
            self.grandFatherItem = self.dpGetGrandFatherItem()
            if self.grandFatherItem:
                # call main function
                self.dpMain(self)
    
    
    def dpGetSelItem(self, *args):
        """ Get selected item
            Return selected item found
        """
        selList = cmds.ls(selection=True)
        if selList:
            return selList[0]
            
    
    def dpGetGrandFatherItem(self, *args):
        """ Get grandfather node from selected item
            Return grandfather node found
        """
        fatherItem = cmds.listRelatives(self.selItem, allParents=True, type="transform")[0]
        if fatherItem:
            grandFatherItem = cmds.listRelatives(fatherItem, allParents=True, type="transform")[0]
            if grandFatherItem:
                return grandFatherItem
        
        
    def dpMain(self, *args):
        """ Main function.
            Check existen nodes and call the scripted function.
            # nodeList[0] = Root_Ctrl
            # nodeList[1] = Grand Father transform from selected item
            # nodeList[2] = Selected item (control)
        """
        # declaring nodeList to create the isolate setup:
        nodeList = [self.rootCtrl, self.grandFatherItem, self.selItem]
        if len(nodeList) == 3:
            for nodeName in nodeList:
                if not cmds.objExists(nodeName):
                    print self.langDic[self.langName]['e004_objNotExist'], nodeName
                    return
        # call scripted function
        self.dpIsolate(self.isolateName, nodeList)
        
        
    def dpIsolate(self, attrName, nodeList, *args):
        """ Function to run isolate setup.
        """
        # get father zero out transform node
        zeroGrp = cmds.listRelatives(nodeList[2], allParents=True, type="transform")[0]
        # create parent constraint
        pConst = cmds.parentConstraint(nodeList[0], nodeList[1], zeroGrp, maintainOffset=True, skipTranslate=["x", "y", "z"])[0]
        # add isolate attribute to selected control
        cmds.addAttr(nodeList[2], longName=attrName, defaultValue=1.0, minValue=0, maxValue=1, keyable=True) 
        # create reverse node
        reverseNode = cmds.createNode('reverse', name=nodeList[2]+"_"+attrName.capitalize()+"_Rev")
        # do isolate connections
        cmds.connectAttr(nodeList[2]+"."+attrName, pConst+"."+nodeList[0]+"W0", force=True)
        cmds.connectAttr(nodeList[2]+"."+attrName, reverseNode+".inputX", force=True)
        cmds.connectAttr(reverseNode+".outputX", pConst+"."+nodeList[1]+"W1", force=True)
        cmds.select(nodeList[2])