Example #1
0
 def OnNamespaceFilePathSwapped(self, objNS, pOldPath, pNewPath, applyEdits ):
     
     lScene = self.mSys.Scene
     
     if (False == applyEdits):
         
         # do we have any other instances with old path
         anyOtherInstance = False
         for ns in self.mSys.Scene.Namespaces:
             if isinstance(ns, FBFileReference):
                 refPath = ns.ReferenceFilePath
                 if pOldPath == refPath and ns != objNS:
                     anyOtherInstance = True
                     break
         
         if True == anyOtherInstance:
             misc.DisconnectAllShaders(objNS)
             misc.DescriptionDisconnect(objNS)
         else:
             misc.DeleteShadersGraph(objNS, pOldPath)
         
         modelsMask = []
         objNS.RevertRefEdit()
         imp.DoFbxShadersGraphImport(True, 2, objNS, modelsMask)
         
         # holder
         base = os.path.splitext(pNewPath)[0]
         newXml = base + '.xml'
         misc.DescriptionStore(objNS, str(newXml))
         
     else:
         misc.SwapShadersGraph(objNS, str(pOldPath), str(pNewPath))
Example #2
0
def HasReferenceNewUpdate(objNS):

    filename = objNS.ReferenceFilePath
    date = misc.GetFileLastWrite(filename)

    # check for xml last write
    xmlname, origFName = misc.DescriptionGetLocalFileName(objNS)

    if '' == xmlname:
        lOption = FBMessageBox(
            'Reference Tool',
            'Description Holder is missing for ' + objNS.LongName, 'Ok',
            'Create A New')

        if 2 == lOption:
            misc.DescriptionStore(objNS)

        return False

    xmldoc = minidom.parse(xmlname)
    shadersGraphElem = xmldoc.getElementsByTagName('ShadersGraph')
    if 0 == len(shadersGraphElem):
        return False

    xmlLastWrite = str(shadersGraphElem[0].getAttribute('LastWrite'))

    print date
    print xmlLastWrite

    return (date > xmlLastWrite)
Example #3
0
    def PopulateShadersGraph(self, pParentItem, pNSObj):

        lList = []
        misc.CollectReferenceContent(pNSObj, lList)
        lShaders = []
        lShaderModels = []
        
        for lPlug in lList:
            
            if isinstance(lPlug, FBModel):
                for lShader in lPlug.Shaders:
                    if lShader in lShaders:
                        ndx = lShaders.index(lShader)
                        lShaderModels[ndx].append(lPlug)
                    else:
                        lShaders.append(lShader)
                        lShaderModels.append([lPlug])
                    
        
        for shader, models in zip(lShaders, lShaderModels):
        
            lStrList = [shader.LongName]
            lStrModels = misc.MBGetShaderTypeName(shader)
            '''
            for model in models:
                lStrModels = lStrModels + model.Name
                lStrModels = lStrModels + '; '
            '''
            lStrList.append(lStrModels)
            
            lItem = QtGui.QTreeWidgetItem( lStrList )
            pParentItem.addChild( lItem )
            self.uiTreeNamespace.expandItem( lItem )
Example #4
0
def StoreShader(newdoc, top_element, shader, namespaceToRemove):

    shader_elem = newdoc.createElement('Shader')
    shader_elem.setAttribute('ClassName', misc.MBGetShaderTypeName(shader))
    shader_elem.setAttribute('Name', shader.Name)
    shader_elem.setAttribute(
        'LongName',
        misc.RemoveFirstNamespace(shader.LongName, namespaceToRemove + 'S'))
    shader_elem.setAttribute(
        'System', str(shader.HasObjectFlags(FBObjectFlag.kFBFlagSystem)))

    top_element.appendChild(shader_elem)

    # Attachments
    atts_elem = newdoc.createElement('Attachments')

    attCount = 0
    for i in range(shader.GetDstCount()):
        comp = shader.GetDst(i)

        if False == isinstance(comp, FBScene):
            attCount += 1

    atts_elem.setAttribute('Count', str(attCount))
    shader_elem.appendChild(atts_elem)

    for i in range(shader.GetDstCount()):
        comp = shader.GetDst(i)

        if isinstance(comp, FBScene):
            continue

        dst_elem = newdoc.createElement('Dst')
        atts_elem.appendChild(dst_elem)

        longname = comp.LongName
        longname = misc.RemoveFirstNamespace(longname, namespaceToRemove)

        dst_elem.setAttribute('ClassName', comp.ClassName())
        dst_elem.setAttribute('Name', comp.Name)
        dst_elem.setAttribute('LongName', longname)

    # Properties

    props_elem = newdoc.createElement('Properties')
    shader_elem.appendChild(props_elem)

    numberOfExported = 0
    for prop in shader.PropertyList:
        status = StoreProperty(newdoc, props_elem, prop, namespaceToRemove)
        numberOfExported += status

    props_elem.setAttribute('Count', str(numberOfExported))
Example #5
0
def SaveShaderGraph(filename, FBXFileName, shadersList, modelsList,
                    namespaceToRemove):

    impl = minidom.getDOMImplementation()

    newdoc = impl.createDocument(None, 'ShadersGraph', None)
    top_element = newdoc.documentElement
    top_element.setAttribute('FileName', FBXFileName)

    # TODO: put file size and file last write
    size = os.path.getsize(FBXFileName)
    date = misc.GetFileLastWrite(FBXFileName)

    top_element.setAttribute("FileSize", str(size))
    top_element.setAttribute("LastWrite", str(date))

    shaders_elem = newdoc.createElement('Shaders')
    shaders_elem.setAttribute('Count', str(len(shadersList)))
    top_element.appendChild(shaders_elem)

    for shader in shadersList:
        StoreShader(newdoc, shaders_elem, shader, namespaceToRemove)

    models_elem = newdoc.createElement('Models')
    models_elem.setAttribute('Count', str(len(modelsList)))
    top_element.appendChild(models_elem)

    for comp in modelsList:
        StoreModel(newdoc, models_elem, comp, namespaceToRemove)

    res = open(filename, 'w')
    res.writelines(newdoc.toprettyxml())
    res.close()
Example #6
0
    def OnBtnInstanceClicked( self ):
        lIndexes = self.uiTableNamespace.selectedIndexes()
        for lIndex in lIndexes:
            if lIndex.column() == 0:
                lNSObj = self.mNSModel.GetNamespace(lIndex.row())

        lInstanceCount = self.uiSpinInstanceTimes.value()
        lBtnClicked, lName = PickRefName()
        if lBtnClicked == 2: return

        lNameList = FBStringList()
        if lInstanceCount == 1:
            lNameList.Add( lName )
        else:
            for lCount in range( 0, lInstanceCount ):
                lNameList.Add( lName + str(lCount+1) )

        lApplyRefEdits = False
        if lNSObj.GetContentModified( FBPlugModificationFlag.kFBContentAllModifiedMask ):
            lMsgBox = QtGui.QMessageBox( QtGui.QMessageBox.Question, 'Instancing', 'Do you want to apply reference edits after instancing?', QtGui.QMessageBox.Yes | QtGui.QMessageBox.No, self )
            if lMsgBox.exec_() == QtGui.QMessageBox.Yes:
                lApplyRefEdits = True

        lStatus = lNSObj.DuplicateFileRef( lNameList, lApplyRefEdits )

        if True == lStatus:
            misc.DescriptionConnectModels(lNSObj, lNameList)
                    
        self.mNSModel.Refresh()
        self.UpdateUI()
        self.UpdateTreeNamespace()
Example #7
0
def DoFbxShadersGraphImport(silent, importMode, objNS, modelsMask):

    userChoise = 1  #importMode

    if not silent:
        userChoise = FBMessageBox('Shader Graph Importer',
                                  'Please choose an operation',
                                  'Apply to reference',
                                  'Apply to source scene', 'Cancel')

    if 1 == userChoise:

        # auto load for references

        filename = objNS.ReferenceFilePath

        base = os.path.splitext(filename)[0]
        xmlname = base + '.xml'

        # TODO: if description file is not exist, let's try to make it from fbx
        # TODO: xml will be update if it's out of date

        if os.path.isfile(filename):
            misc.RunCmdExtractXml(filename)

        #
        #
        if os.path.isfile(xmlname):

            # step 1 - load missing resources
            #   ?! promt if user wants to revert shaders properties values

            LoadShaderGraphResources(xmlname, xmlname, objNS, True,
                                     (importMode > 1))

            # step 2 - apply connections and modifications (on top of last user edits)

            LoadShaderGraphConnections(xmlname, xmlname, objNS, True)

        else:
            FBMessageBox('Shading Graph Importer',
                         'Shading Graph Description is not found !', 'Ok')

    elif 2 == userChoise:

        # we don't have reference namespace in a source scene

        filename = lApp.FBXFileName
        base = os.path.splitext(filename)[0]
        xmlname = base + '.xml'

        if os.path.isfile(xmlname):
            # apply changes to orig scene
            LoadShaderGraphResources(xmlname, xmlname, None, False, True)
            LoadShaderGraphConnections(xmlname, xmlname, None, False)
        else:
            FBMessageBox('Shading Graph Importer',
                         'Shading Graph Description is not found!', 'Ok')
Example #8
0
def StoreModel(newdoc, top_element, model, namespaceToRemove):

    longname = model.LongName
    longName = misc.RemoveFirstNamespace(longname, namespaceToRemove)

    model_elem = newdoc.createElement('Model')
    model_elem.setAttribute('ClassName', model.ClassName())
    model_elem.setAttribute('Name', model.Name)
    model_elem.setAttribute('LongName', longName)
    model_elem.setAttribute('Visibility', str(model.Visibility))
    model_elem.setAttribute('Show', str(model.Show))

    top_element.appendChild(model_elem)
Example #9
0
def BakeShadersGraphEdits(objNS, xmlname):

    if objNS is None:
        return False
    if False == os.path.isfile(xmlname):
        #raise NameError('Shaders Graph description is not found!')
        print('Shaders Graph description is not found!')
        return False

    shadersList = []
    modelsList = []

    filename = objNS.ReferenceFilePath

    #shadersList = misc.FindAllShadersByTags(xmlname, objNS)
    misc.CollectReferenceModels(objNS, modelsList)

    for model in modelsList:
        for shader in model.Shaders:

            if not (shader in shadersList):
                shadersList.append(shader)

    # write a new one
    SaveShaderGraph(xmlname, objNS.ReferenceFilePath, shadersList, modelsList,
                    objNS.LongName)

    # 1. bake updates into ref file

    misc.RunCmdBake(objNS.ReferenceFilePath, xmlname, objNS.ReferenceFilePath)

    # 2. store a new description holder - make baked state as initial
    misc.DescriptionStore(objNS)

    #except NameError:
    #    FBMessageBox( 'Shaders Graph', 'Reference object or shaders are not found!', 'Ok')
    return True
Example #10
0
def RestoreShadersGraph(objNS):

    xmlname, origDescFile = misc.DescriptionGetLocalFileName(objNS)

    if xmlname == '' or False == os.path.isfile(xmlname):
        filename = objNS.ReferenceFilePath
        base = os.path.splitext(filename)[0]
        xmlname = base + '.xml'
        origDescFile = xmlname

    #DeleteShadersGraph(objNS)
    if os.path.isfile(xmlname):
        modelsMask = []
        LoadShaderGraphResources(xmlname, origDescFile, objNS, True, True)
        LoadShaderGraphConnections(xmlname, origDescFile, objNS, True)
Example #11
0
def ComputeShadersMask(objNS):

    mask = []

    importNS = objNS.LongName + ':'
    filename = objNS.ReferenceFilePath

    # look to description holder at first
    xmlname, origFName = misc.DescriptionGetLocalFileName(objNS)

    if xmlname == '' or False == os.path.isfile(xmlname):

        base = os.path.splitext(filename)[0]
        xmlname = base + '.xml'

    if os.path.isfile(xmlname):

        xmldoc = minidom.parse(xmlname)
        shadersGraphElem = xmldoc.getElementsByTagName('Shader')
Example #12
0
    def OnBtnShowShaderEditsClicked(self):
        
        if self.mSingleSelection:
            lIndexes = self.uiTableNamespace.selectedIndexes()
            lNSObj = self.mNSModel.GetNamespace(lIndexes[0].row())
        
            lShaders = []
            lList = []
            
            misc.CollectReferenceContent(lNSObj, lList)
            
            for lPlug in lList:
                
                if isinstance(lPlug, FBModel):
                    for lShader in lPlug.Shaders:
                        if not (lShader in lShaders):
                            lShaders.append(lShader)

            # compare shaders with shaders Graph description
            text = imp.CompareShadersGraph(lNSObj, lShaders)
            
            lMsgBox = QtGui.QMessageBox( self )
            lMsgBox.setText( text )
            lMsgBox.exec_()
Example #13
0
def StoreProperty(newdoc, top_element, prop, namespaceToRemove):

    if prop.GetPropertyFlag(FBPropertyFlag.kFBPropertyFlagHideProperty):
        return 0
    if prop.IsReferenceProperty():
        return 0

    propname = prop.Name
    if 'RefFileName' == propname or 'RefOrigShader' == propname:
        return 0

    elem = newdoc.createElement('Property')
    elem.setAttribute('Name', propname)
    elem.setAttribute('Type', str(prop.GetPropertyTypeName()))

    value = ""
    try:
        data = prop.Data

        if type(data) is FBTime:
            value = data.GetTimeString()
        elif type(data) is FBVector2d:
            elem.setAttribute("X", str(data[0]))
            elem.setAttribute("Y", str(data[1]))
            elem.setAttribute("Z", str(data[2]))
            value = str(data)
        elif type(data) in [FBVector3d, FBColor]:
            elem.setAttribute("X", str(data[0]))
            elem.setAttribute("Y", str(data[1]))
            elem.setAttribute("Z", str(data[2]))
            value = str(data)
        elif type(data) in [FBVector4d, FBColorAndAlpha]:
            elem.setAttribute("X", str(data[0]))
            elem.setAttribute("Y", str(data[1]))
            elem.setAttribute("Z", str(data[2]))
            elem.setAttribute("W", str(data[3]))
            value = str(data)
        else:
            value = str(data)

    except NotImplementedError:
        value = "undefined"
    except Exception:
        value = "undefined"

    elem.setAttribute("Value", value)
    top_element.appendChild(elem)

    # write property connectors (models, textues, etc. like FBPropertyObjectList)
    srcCount = prop.GetSrcCount()
    if srcCount > 0:
        conns_elem = newdoc.createElement('Connections')
        conns_elem.setAttribute('Count', str(srcCount))
        elem.appendChild(conns_elem)

        for i in range(srcCount):
            comp = prop.GetSrc(i)

            src_elem = newdoc.createElement('Source')
            conns_elem.appendChild(src_elem)

            longname = comp.LongName
            longname = misc.RemoveFirstNamespace(longname, namespaceToRemove)

            src_elem.setAttribute('ClassName', comp.ClassName())
            src_elem.setAttribute('Name', comp.Name)
            src_elem.setAttribute('LongName', longname)

    return 1
Example #14
0
def DoFbxShadersGraphImport2(silent, importMode, objNS, modelsMask):

    userChoise = 1  #importMode

    if not silent:
        userChoise = FBMessageBox('Shader Graph Importer',
                                  'Please choose an operation',
                                  'Apply to reference',
                                  'Apply to source scene', 'Cancel')

    if 1 == userChoise:

        # auto load for references

        NS = objNS.LongName + ':'
        filename = objNS.ReferenceFilePath

        base = os.path.splitext(filename)[0]
        xmlname = base + '.xml'

        # DONE: if description file is not exist, let's try to make it from fbx
        # DONE: xml will be update if it's out of date

        if os.path.isfile(filename):
            misc.RunCmdExtractXml(filename)

        #
        #

        if os.path.isfile(xmlname):

            refEdits = ''
            #if objNS.GetContentModified( FBPlugModificationFlag.kFBContentAllModifiedMask ):
            #    refEdits = objNS.GetRefEdit()
            #    objNS.RevertRefEdit()

            # step 1 - load missing resources
            #   ?! promt if user wants to revert shaders properties values

            LoadShaderGraphResources(xmlname, xmlname, NS, True,
                                     (importMode > 1))

            # step 2 - apply connections and modifications (on top of last user edits)

            if len(refEdits) > 0:
                objNS.RevertRefEdit()
                objNS.ApplyRefEditPyScriptFromString(refEdits)
                LoadShaderGraphConnections(xmlname, xmlname, objNS, True)
                # restore missing connections, like when merging new objects
            else:
                userChoise = 1  #FBMessageBox('Shading Graph Importer', 'Do you want to restore shaders graph connections?', 'Ok', 'Cancel')
                if 1 == userChoise:
                    LoadShaderGraphConnections(xmlname, xmlname, objNS, True)

            #del(refEdits)

        else:
            FBMessageBox('Shading Graph Importer',
                         'Shading Graph Description is not found !', 'Ok')

    elif 2 == userChoise:

        # we don't have reference namespace in a source scene

        filename = lApp.FBXFileName
        base = os.path.splitext(filename)[0]
        xmlname = base + '.xml'

        if os.path.isfile(xmlname):
            # apply changes to orig scene
            LoadShaderGraphResources(xmlname, xmlname, None, False, True)
            LoadShaderGraphConnections(xmlname, xmlname, None, False)
        else:
            FBMessageBox('Shading Graph Importer',
                         'Shading Graph Description is not found!', 'Ok')
Example #15
0
def CompareShadersGraph(objNS, sceneShaders):

    global gReferenceContent
    global gReferenceContentNames

    gReferenceContent = []
    gReferenceContentNames = []

    GlobalCollectReferenceContent(objNS)

    text = ''

    importNS = objNS.LongName + ':'
    filename = objNS.ReferenceFilePath

    # look to description holder at first
    xmlname, origFName = misc.DescriptionGetLocalFileName(objNS)

    if xmlname == '' or False == os.path.isfile(xmlname):

        base = os.path.splitext(filename)[0]
        xmlname = base + '.xml'

    if os.path.isfile(xmlname):

        numberOfExistShaders = 0
        existShaders = []
        for shader in sceneShaders:
            existShaders.append(False)

        xmldoc = minidom.parse(xmlname)
        shadersGraphElem = xmldoc.getElementsByTagName('Shader')

        text = text + '== Parsing Shaders Graph Description - ' + xmlname + '\n'

        if len(shadersGraphElem) > 0:
            for shader in shadersGraphElem:

                shaderClass = str(shader.getAttribute('ClassName'))
                xmlShaderName = str(shader.getAttribute('LongName'))
                strSystem = str(shader.getAttribute('System'))

                text = text + '\n  = Shader ' + xmlShaderName + ' (Class: ' + shaderClass + ') ... '

                # DONE: situation when scene shader has been renamed (I'm using RefOrigShader Property)

                isExists = False
                lSceneShader = None

                if 'True' == strSystem:

                    for lShader in lSystem.Scene.Shaders:
                        if lShader.HasObjectFlags(
                                FBObjectFlag.kFBFlagSystem
                        ) or 'Default Shader' == lShader.Name:
                            lSceneShader = lShader
                            isExists = True
                            break
                else:

                    for i, sceneShader in enumerate(sceneShaders):
                        mbShaderName = sceneShader.LongName
                        refOrigShader = sceneShader.PropertyList.Find(
                            'RefOrigShader')
                        if refOrigShader is not None:
                            mbShaderName = refOrigShader.Data

                        if xmlShaderName == mbShaderName:
                            lSceneShader = sceneShader
                            existShaders[i] = True
                            isExists = True
                            break

                if isExists:
                    numberOfExistShaders += 1

                    text = text + ' Ok!\n'
                else:
                    text = text + ' Missing!\n'

                allTheAttElems = shader.getElementsByTagName('Dst')
                allThePropElems = shader.getElementsByTagName('Property')

                # DONE: compare prop values

                if lSceneShader is not None:

                    # DONE: we could not have a scene load for retreiving mod state
                    xmlprops = []
                    xmlprops = GetXmlProps(allThePropElems)

                    # shared, edits, collisions
                    compareInfo = []
                    compareInfo = ComparePropsAndValues(lSceneShader, xmlprops)

                    text = text + '   > Checking Properties - total: ' + str(
                        len(lSceneShader.PropertyList))
                    text = text + '; shared: ' + str(
                        compareInfo[0]) + '; edits: ' + str(
                            compareInfo[1]) + '; collisions: ' + str(
                                compareInfo[2]) + '; \n'

                    # DONE: compare attachments

                    att = []
                    att = GetXmlAttachments(allTheAttElems, importNS)
                    mbAtt = []
                    mbAtt = GetMBAttachments(lSceneShader, objNS)

                    diff1 = list(set(mbAtt) - set(att))
                    diff2 = list(set(att) - set(mbAtt))

                    diff = diff1 + diff2

                    if lSceneShader.HasObjectFlags(FBObjectFlag.kFBFlagSystem):
                        diff = diff2

                    if len(diff) > 0:
                        text = text + '    > Different shader-model assignment - '
                        for elem in diff:
                            text = text + elem + '; '
                        text = text + '\n'
                    else:
                        text = text + '    > No differents in shader-model assignments!\n'

        if numberOfExistShaders == len(sceneShaders):

            if len(shadersGraphElem) == len(sceneShaders):
                text = text + '\nThere are no changes in shaders\n'
            else:
                text = text + '\nSome Source Description shaders are missing (Disconnected or Removed)\n'
        else:

            text = text + '\nSome Scene Shaders are missing (User Added or Connected)\n'

            for lFlag, lShader in zip(existShaders, sceneShaders):
                if False == lFlag:
                    text = text + '  * ' + lShader.LongName + '\n'

    return text
Example #16
0
            if False == os.path.isfile(ns.ReferenceFilePath):
                FBMessageBox('Reference A File',
                             'Referenced file is not found!', 'Ok')
            else:
                lNSObj = ns
            break

    filename = lArg1
    if lNSObj is not None:
        filename = lNSObj.ReferenceFilePath

    # check if we have any shaders graph connected to delete
    anyInstances = False
    for namespace in lScene.Namespaces:
        if namespace != lNSObj:
            if isinstance(namespace, FBFileReference):
                if namespace.ReferenceFilePath == filename:
                    anyInstances = True

    if False == anyInstances:
        misc.DeleteShadersGraph(lNSObj, filename)
        # let's find any Description Holder connection
        misc.DescriptionDelete(lNSObj)

        # remove from monitor manager
        lMon = FBFileMonitoringManager()
        lMon.RemoveFileFromMonitor(filename)

# Remove temp sys.path
#sys.path.remove( os.path.join( os.path.dirname(lCurFilePath), 'MBFileRefAdvanced' ) )
sys.path.remove(os.path.dirname(lCurFilePath))
Example #17
0
 
 if True == objNS.SwapReferenceFilePath( str(pNewPath), applyEdits, applyEdits ):
 
     if False == applyEdits:
     
         # do we have any other instances with old path
         anyOtherInstance = False
         for ns in self.mSys.Scene.Namespaces:
             if isinstance(ns, FBFileReference):
                 refPath = ns.ReferenceFilePath
                 if pOldPath == refPath and ns != objNS:
                     anyOtherInstance = True
                     break
         
         if True == anyOtherInstance:
             misc.DisconnectAllShaders(objNS)
             misc.DescriptionDisconnect(objNS)
         else:
             misc.DeleteShadersGraph(objNS, pOldPath)
         
         modelsMask = []
         objNS.RevertRefEdit()
         imp.DoFbxShadersGraphImport(True, 2, objNS, modelsMask)
         
         # holder
         base = os.path.splitext(pNewPath)[0]
         newXml = base + '.xml'
         misc.DescriptionStore(objNS, str(newXml))
         
     else:
         misc.SwapShadersGraph(objNS, str(pOldPath), str(pNewPath))         
Example #18
0
lSystem = FBSystem()
lScene = lSystem.Scene

lNSObj = None

if len(lRefName) > 0:

    for ns in lScene.Namespaces:
        if isinstance(ns, FBFileReference) and lRefName == ns.LongName:
            if False == os.path.isfile(ns.ReferenceFilePath):
                FBMessageBox('Reference A File',
                             'Referenced file is not found!', 'Ok')
            else:
                lNSObj = ns
            break

if lNSObj is not None:

    # change name of shaders namespace and change name of description holder
    lOldName = lArg1
    lNewName = lNSObj.LongName

    if True == lScene.NamespaceExist(str(lOldName) + 'S'):
        lScene.NamespaceRename(str(lOldName) + 'S', str(lNewName) + 'S')

    # holder
    misc.DescriptionRename(lNSObj, str(lNewName))

# Remove temp sys.path
#sys.path.remove( os.path.join( os.path.dirname(lCurFilePath), 'MBFileRefAdvanced' ) )
sys.path.remove(os.path.dirname(lCurFilePath))
Example #19
0
    def OnTimer( self ):
        for lFilePath, lReload in self.mNSModel.mRefFileReload.items():
            
            if False == os.path.isfile(lFilePath) and True == lReload:
                FBMessageBox( "External File Not Found", "The referenced file '%s' is not found!\nReference goes offline" % ( lFilePath ), "Ok" )
                
                if lFilePath in self.mNSModel.mRefFilePath:
                    for lFileRefName in self.mNSModel.mRefFilePath[lFilePath]:
                        lFileRefObj = FBFindObjectByFullName( 'FileReference::' + lFileRefName )
                        
                        if lFileRefObj is not None:
                            self.mNSModel.RemoveFileFromWatcher( lFileRefObj )
                            lFileRefObj.IsLoaded = False
                                
                    self.mNSModel.mRefFileReload[lFilePath] = False
                
                self.UpdateUI()
                self.UpdateTreeNamespace()
                
            elif lReload:
                FBMessageBox( "External File Changed", "The referenced file '%s' has been changed externally!" % ( lFilePath ), "OK" )
                if lFilePath in self.mNSModel.mRefFilePath:
                    for lFileRefName in self.mNSModel.mRefFilePath[lFilePath]:
                        lNSObj = FBFindObjectByFullName( 'FileReference::' + lFileRefName )
                        lOption = FBMessageBox( "External File Changed", "Please choose the following action for Reference: %s!" % ( lFileRefName ), "Load", "Merge", "Ignore" )
                        
                        if lOption <> 3:
                            lUndo = FBUndoManager()
                            lUndo.Clear()
                            
                            diff = []
                            
                            edits = ''
                            misc.DisconnectAllShaders(lNSObj)
                            if lNSObj.GetContentModified( FBPlugModificationFlag.kFBContentAllModifiedMask ):
                                edits = lNSObj.GetRefEdit()
                            
                            lNSObj.IsLoaded = False
                            lNSObj.IsLoaded = True
                            
                            filename = lNSObj.ReferenceFilePath
                            
                            base = os.path.splitext(filename)[0]
                            xmlname = base + '.xml'
                            
                            if lOption == 2:
                                
                                imp.DoFbxShadersGraphImport(True, 2, lNSObj, diff)
                                if len(edits) > 0:
                                    lNSObj.RevertRefEdit()
                                    lNSObj.ApplyRefEditPyScriptFromString( edits )
                                 
                                imp.LoadShaderGraphConnections(xmlname, xmlname, lNSObj, True)
                                
                            else:
                                modelsMask = []
                                lNSObj.RevertRefEdit()
                                imp.DoFbxShadersGraphImport(True, 2, lNSObj, modelsMask)
                            
                            # store new xml data
                            misc.DescriptionStore(lNSObj)
                            
                    self.mNSModel.mRefFileReload[lFilePath] = False

        self.mNSModel.UpdateFileWatcher()
Example #20
0
def LoadShaderGraphConnections(filename, origFileName, objNS, findByTag):

    importNS = ''
    if objNS is not None:
        importNS = objNS.LongName + ':'

    global gReferenceContent
    global gReferenceContentNames

    gReferenceContent = []
    gReferenceContentNames = []

    GlobalCollectReferenceContent(objNS)

    xmldoc = minidom.parse(filename)
    shadersGraphElem = xmldoc.getElementsByTagName('Shader')

    if len(shadersGraphElem) > 0:
        for shader in shadersGraphElem:

            shaderClass = str(shader.getAttribute('ClassName'))
            shaderName = str(shader.getAttribute('LongName'))
            strSystem = str(shader.getAttribute('System'))

            # SHADER AND PROPERTIES
            allTheAttElems = shader.getElementsByTagName('Dst')
            allThePropElems = shader.getElementsByTagName('Property')

            newShader = None

            if 'True' == strSystem:
                for lShader in lSystem.Scene.Shaders:
                    if lShader.HasObjectFlags(
                            FBObjectFlag.kFBFlagSystem
                    ) or 'Default Shader' == lShader.Name:
                        newShader = lShader
                        break
            else:
                if True == findByTag:
                    newShader = misc.FindAShaderByTags(origFileName,
                                                       shaderName)
                else:
                    newShader = FBFindObjectByFullName('Shader::' + shaderName)

            # connections
            if newShader is not None:

                for prop in allThePropElems:
                    RetrieveShaderPropertyValue(newShader, prop, importNS)

                for attachment in allTheAttElems:
                    modelname = str(attachment.getAttribute('LongName'))
                    ndx = gReferenceContentNames.index(importNS + modelname)
                    if ndx >= 0:
                        FBConnect(newShader, gReferenceContent[ndx])

    #
    # import model visibility and show

    modelsElem = xmldoc.getElementsByTagName('Models')

    if len(modelsElem) > 0:

        allTheModels = modelsElem[0].getElementsByTagName('Model')

        for modelelem in allTheModels:

            modelName = str(modelelem.getAttribute('LongName'))
            show = ('True' == str(modelelem.getAttribute('Show')))
            vis = ('True' == str(modelelem.getAttribute('Visibility')))

            ndx = gReferenceContentNames.index(importNS + modelName)
            if ndx >= 0:
                model = gReferenceContent[ndx]

                currShow = model.Show
                if currShow != show:
                    model.Show = show

                currVis = model.Visibility.Data
                if currVis != vis:
                    model.Visibility = vis

                if False == show or False == vis:
                    print modelName
Example #21
0
    if isUpdated:
        # ask user to reload a shaders graph
        lOption = FBMessageBox(
            "External File Changed",
            "Please choose the following action for Reference: %s!" %
            (filename), "Load", "Merge", "Ignore")

    if lOption <> 3:
        lUndo = FBUndoManager()
        lUndo.Clear()

        modelsMask = []

        edits = ''
        misc.DisconnectAllShaders(lNSObj)
        if lNSObj.GetContentModified(
                FBPlugModificationFlag.kFBContentAllModifiedMask):
            edits = lNSObj.GetRefEdit()

        lNSObj.IsLoaded = False
        lNSObj.IsLoaded = True

        filename = lNSObj.ReferenceFilePath

        base = os.path.splitext(filename)[0]
        xmlname = base + '.xml'

        if lOption == 2:

            imp.DoFbxShadersGraphImport(True, 2, lNSObj, modelsMask)
Example #22
0
def LoadShaderGraphResources(filename, origFileName, objNS, findByTag,
                             alwaysRetrieveProps):

    importNS = ''
    shaderNS = ''
    if objNS is not None:
        importNS = objNS.LongName + ':'
        shaderNS = objNS.LongName + 'S:'

    global gReferenceContent
    global gReferenceContentNames

    gReferenceContent = []
    gReferenceContentNames = []

    GlobalCollectReferenceContent(objNS)

    xmldoc = minidom.parse(filename)
    shadersGraphElem = xmldoc.getElementsByTagName('Shader')

    if len(shadersGraphElem) > 0:
        for shader in shadersGraphElem:

            shaderClass = str(shader.getAttribute('ClassName'))
            shaderName = str(shader.getAttribute('LongName'))
            isSystem = ('True' == str(shader.getAttribute('System')))

            # SHADER AND PROPERTIES
            allTheAttElems = shader.getElementsByTagName('Dst')
            allThePropElems = shader.getElementsByTagName('Property')

            newShader = None

            if True == isSystem:
                newShader = FBFindObjectByFullName('Shader::' + shaderName)
            else:
                if True == findByTag:
                    newShader = misc.FindAShaderByTags(origFileName,
                                                       shaderName)
                else:
                    newShader = FBFindObjectByFullName('Shader::' + shaderName)

            if newShader is None:
                newShader = CreateShader(shaderClass, shaderNS + shaderName,
                                         allThePropElems)

                if False == alwaysRetrieveProps:
                    if newShader is not None:
                        for prop in allThePropElems:
                            RetrieveShaderPropertyValue(
                                newShader, prop, importNS)

                    # add props for shader identification
                    fnameProp = newShader.PropertyCreate(
                        'RefFileName', FBPropertyType.kFBPT_charptr, 'String',
                        False, True, None)
                    origProp = newShader.PropertyCreate(
                        'RefOrigShader', FBPropertyType.kFBPT_charptr,
                        'String', False, True, None)

                    if fnameProp is not None:
                        fnameProp.Data = origFileName
                    if origProp is not None:
                        origProp.Data = shaderName

                    # connections
                    if newShader is not None:

                        for attachment in allTheAttElems:
                            modelname = str(
                                attachment.getAttribute('LongName'))

                            ndx = gReferenceContentNames.index(importNS +
                                                               modelname)
                            if ndx >= 0:
                                FBConnect(newShader, gReferenceContent[ndx])

            #
            if newShader is not None:

                if True == isSystem:
                    for attachment in allTheAttElems:
                        modelname = str(attachment.getAttribute('LongName'))
                        ndx = gReferenceContentNames.index(importNS +
                                                           modelname)
                        if ndx >= 0:
                            FBConnect(newShader, gReferenceContent[ndx])
                else:

                    if True == alwaysRetrieveProps:

                        for prop in allThePropElems:
                            RetrieveShaderPropertyValue(
                                newShader, prop, importNS)

                        for attachment in allTheAttElems:
                            modelname = str(
                                attachment.getAttribute('LongName'))
                            ndx = gReferenceContentNames.index(importNS +
                                                               modelname)
                            if ndx >= 0:
                                FBConnect(newShader, gReferenceContent[ndx])

                        # id props
                        fnameProp = newShader.PropertyList.Find('RefFileName')
                        if fnameProp is None:
                            fnameProp = newShader.PropertyCreate(
                                'RefFileName', FBPropertyType.kFBPT_charptr,
                                'String', False, True, None)
                        origProp = newShader.PropertyList.Find('RefOrigShader')
                        if origProp is None:
                            origProp = newShader.PropertyCreate(
                                'RefOrigShader', FBPropertyType.kFBPT_charptr,
                                'String', False, True, None)

                        if fnameProp is not None:
                            fnameProp.Data = origFileName
                        if origProp is not None:
                            origProp.Data = shaderName