def addSampleBlock(root = NodegraphAPI.GetRootNode(),name = 'sample',task='Object'): children = root.getChildren() nbChildren = root.getNumChildren() dotNode = None for child in children: if child.getType() == 'Dot': dotNode = child dotNodePos = NodegraphAPI.GetNodePosition(dotNode) newSampleNode = createOpScriptSample(root,name,task) paramUI(root,name,task) #reorder the button to be the last param newSampleParam = root.getParameters() paramAddBlocker = newSampleParam.getChild('addSampleNode') numberOfChild = newSampleParam.getNumChildren() -1 newSampleParam.reorderChild(paramAddBlocker,numberOfChild) if nbChildren == 1: sendGroup = root.getSendPort('in') newSampleNode.getInputPort('i0').connect(sendGroup) newSampleNode.getOutputPort('out').connect(dotNode.getInputPort('input')) NodegraphAPI.SetNodePosition(dotNode,(dotNodePos[0],dotNodePos[1]-50)) else: inputDotNodeProducer = dotNode.getInputSource('input',NodegraphAPI.GetCurrentGraphState())[0] inputDotNodeProducer.connect(newSampleNode.getInputPort('i0')) newSampleNode.getOutputPort('out').connect(dotNode.getInputPort('input')) NodegraphAPI.SetNodePosition(newSampleNode,dotNodePos) NodegraphAPI.SetNodePosition(dotNode,(dotNodePos[0],dotNodePos[1]-50))
def addBlocker(root=NodegraphAPI.GetRootNode()): children = root.getChildren() dotNode = None for child in children: if child.getType() == 'Dot': dotNode = child dotNodePos = NodegraphAPI.GetNodePosition(dotNode) newBlocker = createSingleBlocker(root, 'getParent().getParent().', False) paramui(root, newBlocker.getName(), False, True) #reorder the button to be the last param newBlockerParam = root.getParameters() paramAddBlocker = newBlockerParam.getChild('addBlocker') numberOfChild = newBlockerParam.getNumChildren() - 1 newBlockerParam.reorderChild(paramAddBlocker, numberOfChild) inputDotNodeProducer = dotNode.getInputSource( 'input', NodegraphAPI.GetCurrentGraphState())[0] inputDotNodeProducer.connect(newBlocker.getInputPort('in')) newBlocker.getOutputPort('out').connect(dotNode.getInputPort('input')) NodegraphAPI.SetNodePosition(newBlocker, dotNodePos) NodegraphAPI.SetNodePosition(dotNode, (dotNodePos[0], dotNodePos[1] - 50))
def bake(self, parentWidget=None): """ Performs the bake based on the settings of this current node parameter settings. If a parentWidget is provided, we create a progress widget and setup callbacks to update it. If no parentWidget is provided we can run this without calling any UI code. @type parentWidget: C{QtWidgets.QWidget} @param parentWidget: Parent for the progress widget. If set to None, the progress callback is not produced. """ graphState = NodegraphAPI.GetCurrentGraphState() frameTime = graphState.getTime() node = self inputPorts = node.getInputPorts() numPorts = len(inputPorts) if numPorts < 2: log.error("Requires at least two input ports to bake a USD Look") variantSetName = node.getParameter("variantSetName").getValue( frameTime) rootPrimName = node.getParameter("rootPrimName").getValue(frameTime) alwaysCreateVariantSet = bool( node.getParameter("alwaysCreateVariantSet").getValue(frameTime) == "Yes") looksFilename = node.getParameter("looksFilename").getValue(frameTime) looksFileFormat = node.getParameter("looksFileFormat").getValue( frameTime) createCompleteUsdAssemblyFile = bool( node.getParameter("createCompleteUsdAssemblyFile").getValue( frameTime)) assemblyFilename = node.getParameter("assemblyFilename").getValue( frameTime) payloadFilename = node.getParameter("payloadFilename").getValue( frameTime) createVariantSet = alwaysCreateVariantSet or (len(inputPorts) > 2) additionalSettings = { "variantSetName": variantSetName, "rootPrimName": rootPrimName, "createVariantSet": createVariantSet, "looksFileFormat": looksFileFormat, "looksFilename": looksFilename, "createCompleteUsdAssemblyFile": createCompleteUsdAssemblyFile, "assemblyFilename": assemblyFilename, "payloadFilename": payloadFilename, } # Ensure the interruptWidget is only created in a UI session if parentWidget: import UI4 self.__timer = time.time() self.__interruptWidget = UI4.Widgets.ModalProcessInterruptWidget( self.__interruptCallback, minWidth=512) else: self.__interruptWidget = None self.__timer = None assetId = node.getParameter("saveTo").getValue(frameTime) rootLocationsParam = node.getParameter("rootLocations") rootLocations = [ x.getValue(frameTime) for x in rootLocationsParam.getChildren() ] # Retrieve the Ops for each of the inputs referenceOp, passNamesAndOps = self.__getBakerOps( self._getPassInputPortNames(), graphState) sourceFile = NodegraphAPI.GetOriginalSourceFile() if not sourceFile: # Use legacy API call in case this file was created in a very old # version of Katana (1.6.11 or earlier) sourceFile = NodegraphAPI.GetSourceFile() sourceAsset = NodegraphAPI.GetKatanaSceneName() #When updating to the later version of the LookFileBakeAPI, dont # forget to update require3DInput from the Node.py baker = LookFileBaker("UsdExport") baker.progressCallback = self.__progressCallback baker.additionalSettings = additionalSettings baker.sourceAsset = sourceAsset baker.sourceFile = sourceFile if self.__interruptWidget: self.__interruptWidget.show() self.__interruptWidget.update("Saving Materials To %s" % assetId, True) try: baker.bakeAndPublish(referenceOp, passNamesAndOps, rootLocations, assetId) finally: if self.__interruptWidget: self.__interruptWidget.close() self.__interruptWidget.setParent(None) self.__interruptWidget.deleteLater() self.__interruptWidget = None