/** * Recursively rebuild the tree nodes. * * @param root The full abstract path to the root saved layout directory. * @param local The current directory relative to root (null if none). * @param tnode The current parent tree node. */ private void rebuildTreeModel(Path root, Path local, DefaultMutableTreeNode tnode) { TreeSet<Path> subdirs = new TreeSet<Path>(); TreeSet<String> layouts = new TreeSet<String>(); { Path current = new Path(root, local); File files[] = current.toFile().listFiles(); if (files != null) { int wk; for (wk = 0; wk < files.length; wk++) { String name = files[wk].getName(); if (files[wk].isDirectory()) subdirs.add(new Path(local, name)); else if (files[wk].isFile()) layouts.add(name); } } } for (Path subdir : subdirs) { TreeData data = new TreeData(subdir); DefaultMutableTreeNode child = new DefaultMutableTreeNode(data, true); tnode.add(child); rebuildTreeModel(root, subdir, child); } for (String lname : layouts) { TreeData data = new TreeData(new Path(local, lname), lname); DefaultMutableTreeNode child = new DefaultMutableTreeNode(data, false); tnode.add(child); } }
/** * Construct a {@link SubProcessHeavy SubProcessHeavy} instance which when executed will fulfill * the given action agenda. * * <p> * * @param agenda The agenda to be accomplished by the action. * @param outFile The file to which all STDOUT output is redirected. * @param errFile The file to which all STDERR output is redirected. * @return The SubProcess which will fulfill the agenda. * @throws PipelineException If unable to prepare a SubProcess due to illegal, missing or * imcompatable information in the action agenda or a general failure of the prep method code. */ public SubProcessHeavy prep(ActionAgenda agenda, File outFile, File errFile) throws PipelineException { NodeID nodeID = agenda.getNodeID(); /* sanity checks */ Path fromPath = null; FileSeq fromSeq = null; FileSeq toSeq = null; { ArrayList<String> formats = new ArrayList<String>(); formats.add("xml"); String sname = (String) getSingleParamValue("XmlSource"); if (sname == null) throw new PipelineException("The Image Source was not set!"); String xmlpath = null; if (sname != null) { FileSeq fxml = agenda.getPrimarySource(sname); xmlpath = fxml.toString(); } NodeID snodeID = new NodeID(nodeID, sname); ArrayList<String> suffixes = new ArrayList<String>(); suffixes.add("html"); suffixes.add("htm"); Path targetPath = getPrimaryTargetPath(agenda, suffixes, "Html fil"); // ******************************************************************** // Build the mencoder command // ******************************************************************** ArrayList<String> args = new ArrayList<String>(); args.add("/intranet/jpt/phpCliPrograms/Edit2pipe.php"); args.add("none"); args.add(xmlpath); args.add(xmlpath); args.add(targetPath.toOsString()); // Create sub process return createSubProcess( agenda, "php5", args, agenda.getEnvironment(), agenda.getTargetPath().toFile(), outFile, errFile); } }
/** * Returns all the paths that are located directly underneath a given path. From Globals * * @param w Wrapper class. * @param start The path to start the search underneath * @return * @throws PipelineException */ public ArrayList<String> getChildrenNodes(MasterMgrClient mclient, String start) throws PipelineException { ArrayList<String> toReturn = new ArrayList<String>(); TreeMap<String, Boolean> comps = new TreeMap<String, Boolean>(); comps.put(start, false); NodeTreeComp treeComps = mclient.updatePaths(pUser, pView, comps); Path p = new Path(start); ArrayList<String> parts = p.getComponents(); for (String comp : parts) { if (treeComps != null) treeComps = treeComps.get(comp); } for (String s : treeComps.keySet()) { toReturn.add(s); } return toReturn; }
/** * Check that the user has properly selected a target node for this tool * * <p> * * @return The phase progress message or <CODE>null</CODE> to abort early. * @throws PipelineException If unable to validate the given user input. */ public synchronized String collectPhaseInput() throws PipelineException { if ((pPrimary == null) || (pSelected.size() != 1)) throw new PipelineException("Please selected one node only."); // folder = nPath.getParent(); // assetName = nPath.getName(); Path nPath = new Path(pPrimary); nPath = nPath.getParentPath().getParentPath(); if (!nPath.toString().matches(assetPattern)) throw new PipelineException( "This tool only works on assets." + nPath.toString() + " " + nPath.toOsString()); // if(!pPrimary.matches(matPattern)) // throw new PipelineException("This tool will only work on a lgt node!"); File errFile; try { errFile = File.createTempFile("MaterialsCheckOut", ".err", PackageInfo.sTempPath.toFile()); err = new PrintWriter(errFile); FileCleaner.add(errFile); } catch (IOException e) { e.printStackTrace(); } NodeStatus status = pSelected.get(pPrimary); NodeID nodeID = status.getNodeID(); pUser = nodeID.getAuthor(); pView = nodeID.getView(); OverallNodeState state = status.getHeavyDetails().getOverallNodeState(); JToolDialog tool = new JToolDialog("MaterialsCheckOut", new JPanel(), "Continue"); if (!state.equals(OverallNodeState.Identical)) { JConfirmDialog dialog = new JConfirmDialog( tool, "This node is different from the checked in node. Do you want to continue with this check out?"); dialog.setVisible(true); if (!dialog.wasConfirmed()) { return null; } // end if } // end if return "...Sing Hallelujah!"; }
/** * Update the layouts tree. * * @param current The name of the current layout or <CODE>null</CODE> if none. */ public void updateLayouts(Path current) throws PipelineException { DefaultMutableTreeNode root = null; { root = new DefaultMutableTreeNode(new TreeData(), true); { Path path = new Path(PackageInfo.getSettingsPath(), "layouts"); rebuildTreeModel(path, new Path("/"), root); } DefaultTreeModel model = (DefaultTreeModel) pTree.getModel(); model.setRoot(root); { Enumeration e = root.depthFirstEnumeration(); if (e != null) { while (e.hasMoreElements()) { DefaultMutableTreeNode tnode = (DefaultMutableTreeNode) e.nextElement(); pTree.expandPath(new TreePath(tnode.getPath())); } } } } pTree.clearSelection(); if (current != null) { TreePath tpath = null; DefaultMutableTreeNode tnode = root; for (String comp : current.getComponents()) { DefaultMutableTreeNode next = null; Enumeration e = tnode.children(); if (e != null) { while (e.hasMoreElements()) { DefaultMutableTreeNode child = (DefaultMutableTreeNode) e.nextElement(); TreeData data = (TreeData) child.getUserObject(); if (data.toString().equals(comp)) { tpath = new TreePath(child.getPath()); next = child; break; } } } if (next == null) break; tnode = next; } if (tpath != null) { pTree.setSelectionPath(tpath); pTree.makeVisible(tpath); } } }
/** * Updates the asset references for a shot within Maya and then in pipeline. * * @param shotName The name of the shot being processed. * @param pRemoveRef The list of assets being dereferenced from the shot. * @param pReplaceRef The list of assets being referenced into the shot. * @param nameMap */ private void editShotReferences( String shotName, NodeMod targetMod, TreeSet<String> pRemoveRef, TreeSet<String> pReplaceRef, TreeMap<String, String> nameMap) throws PipelineException { logLine("Editing shot: " + shotName); boolean anim = !shotName.matches(lgtPattern); /* writing the mel script */ if (anim) { File script = null; try { script = File.createTempFile("UpdateAssetGUI.", ".mel", PackageInfo.sTempPath.toFile()); FileCleaner.add(script); } // end try catch (IOException ex) { throw new PipelineException( "Unable to create the temporary MEL script used to collect " + "texture information from the Maya scene!"); } // end catch try { PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter(script))); for (String asset : pReplaceRef) { String nameSpace; if (asset.endsWith(lr)) nameSpace = nameMap.get(getShortName(asset.substring(0, asset.length() - 3))); else { System.err.println("This should not be happening, a hi res asset in a lo-res node."); continue; // nameSpace = nameMap.get(getShortName(asset)); } out.println("print (\"referencing file: $WORKING" + asset + ".ma\");"); out.println( "file -reference -namespace \"" + nameSpace + "\" \"$WORKING" + asset + ".ma\";"); } // end for for (String asset : pRemoveRef) { out.println("print (\"dereferencing file: $WORKING" + asset + ".ma\");"); out.println("file -rr \"$WORKING" + asset + ".ma\";"); } // end for out.println("// SAVE"); out.println("file -save;"); out.close(); } // end try catch (IOException ex) { throw new PipelineException( "Unable to write the temporary MEL script(" + script + ") used add the references!"); } // end catch NodeID targetID = new NodeID(w.user, w.view, shotName); // NodeStatus targetStat = mclient.status(targetID); /* run Maya to collect the information */ try { Path targetPath = getNodePath(shotName); ArrayList<String> args = new ArrayList<String>(); args.add("-batch"); args.add("-script"); args.add(script.getPath()); args.add("-file"); args.add(targetPath.toOsString()); Path wdir = new Path(PackageInfo.sProdPath.toOsString() + targetID.getWorkingParent()); TreeMap<String, String> env = mclient.getToolsetEnvironment( w.user, w.view, targetMod.getToolset(), PackageInfo.sOsType); Map<String, String> nenv = env; String midefs = env.get("PIPELINE_MI_SHADER_PATH"); if (midefs != null) { nenv = new TreeMap<String, String>(env); Path dpath = new Path(new Path(wdir, midefs)); nenv.put("MI_CUSTOM_SHADER_PATH", dpath.toOsString()); } String command = "maya"; if (PackageInfo.sOsType.equals(OsType.Windows)) command += ".exe"; SubProcessLight proc = new SubProcessLight("UpdateAssetGUI", command, args, env, wdir.toFile()); try { proc.start(); proc.join(); if (!proc.wasSuccessful()) { throw new PipelineException( "Did not correctly edit the reference due to a maya error.!\n\n" + proc.getStdOut() + "\n\n" + proc.getStdErr()); } // end if } // end try catch (InterruptedException ex) { throw new PipelineException(ex); } // end catch } // end try catch (Exception ex) { throw new PipelineException(ex); } // end catch } /*-edit the references in pipeline once they are done in the file-*/ BaseAction targetAction = targetMod.getAction(); for (String asset : pReplaceRef) { mclient.link( w.user, w.view, shotName, asset, LinkPolicy.Reference, LinkRelationship.All, null); if (anim) { /*Set the namespaces*/ String nameSpace = nameMap.get(getShortName(asset.substring(0, asset.length() - 3))); System.err.println(nameSpace); targetAction.initSourceParams(asset); targetAction.setSourceParamValue(asset, "PrefixName", nameSpace); targetMod.setAction(targetAction); } } w.mclient.modifyProperties(w.user, w.view, targetMod); for (String asset : pRemoveRef) mclient.unlink(w.user, w.view, shotName, asset); if (!anim) { System.err.println("Queuing the switchLgt node " + shotName); mclient.submitJobs(w.user, w.view, shotName, null); } } // end editShotReferences
private String getShortAssetName(String s) { Path sPath = new Path(s); return sPath.getName(); // return s.replaceAll(".*/assets/.*/",""); } // getShortAssetName(String)
private String getShortName(String s) { Path sPath = new Path(s); return sPath.getName(); }
@SuppressWarnings("unchecked") @Override public void validatePhase() throws PipelineException { /* the slate and format Nuke script nodes */ String slatePrefix = null; { String script = getStringParamValue(new ParamMapping(aSlateScript), false); Path path = new Path(pProjectNamer.getSlateNukeScriptsParentPath(), script); pSlateNodeName = path.toString(); slatePrefix = path.getName(); pRequiredNodeNames.add(pSlateNodeName); } String formatPrefix = null; { String script = getStringParamValue(new ParamMapping(aFormatScript), false); Path path = new Path(pProjectNamer.getFormatNukeScriptsParentPath(), script); pFormatNodeName = path.toString(); formatPrefix = path.getName(); pRequiredNodeNames.add(pFormatNodeName); } /* the final QuickTime codec settings */ String codecPrefix = null; { String settings = getStringParamValue(new ParamMapping(aCodecSettings), false); Path path = new Path(pProjectNamer.getQtCodecSettingsParentPath(), settings); pCodecNodeName = path.toString(); codecPrefix = path.getName(); pRequiredNodeNames.add(pCodecNodeName); } /* lookup the rest of the parameters */ pDeliveryType = getStringParamValue(new ParamMapping(aDeliveryType)); pDeliverable = getStringParamValue(new ParamMapping(DeliverNamer.aDeliverable), false); pClientVersion = getStringParamValue(new ParamMapping(aClientVersion)); pClientShotName = getStringParamValue(new ParamMapping(aClientShotName)); pLensInfo = getStringParamValue(new ParamMapping(aLensInfo), false); pTakeInfo = getStringParamValue(new ParamMapping(aTakeInfo), false); pNotes = getStringParamValue(new ParamMapping(aNotes)); pSlateHold = getIntegerParamValue(new ParamMapping(aSlateHold), new Range<Integer>(0, null)); /* compute the full frame range with slate holds added */ FrameRange range = pSourceVersion.getPrimarySequence().getFrameRange(); if (range.getBy() != 1) throw new PipelineException( "The source images node (" + pSourceVersion.getName() + " v" + pSourceVersion.getVersionID() + ") must have a frame step increment of (1)!"); pFrameRange = new FrameRange(range.getStart(), range.getEnd() + pSlateHold, 1); /* initialize internal Deliver (Shot) namer */ { pDeliverNamer = new DeliverNamer(pClient, pQueue, getBuilderInformation(), pStudioDefs); pShotNamer = pDeliverNamer; pDeliverNamer.setParamValue(new ParamMapping(StudioDefinitions.aProjectName), pProjectName); pDeliverNamer.setParamValue(new ParamMapping(StudioDefinitions.aSequenceName), pSeqName); pDeliverNamer.setParamValue(new ParamMapping(StudioDefinitions.aShotName), pShotName); pDeliverNamer.setParamValue(new ParamMapping(DeliverNamer.aDeliverable), pDeliverable); pDeliverNamer.setParamValue(new ParamMapping(DeliverNamer.aTaskType), pTaskType.toString()); pDeliverNamer.setParamValue(new ParamMapping(DeliverNamer.aSlatePrefix), slatePrefix); pDeliverNamer.setParamValue(new ParamMapping(DeliverNamer.aFormatPrefix), formatPrefix); pDeliverNamer.setParamValue(new ParamMapping(DeliverNamer.aCodecPrefix), codecPrefix); pDeliverNamer.generateNames(); } }
/** * Phase in which parameter values should be extracted from parameters and checked for * consistency and applicability. */ @Override public void validatePhase() throws PipelineException { /* sets up the built-in parameters common to all builders */ validateBuiltInParams(); /* setup the StudioDefinitions version of the UtilContext */ pStudioDefs.setContext(pContext); /* lookup the source images node */ String sourceNodeName = null; VersionID sourceVersionID = null; { Path spath = (Path) getParamValue(aSourceNode); if (spath == null) throw new PipelineException("No " + aSourceNode + " was specified!"); sourceNodeName = spath.toString(); pSourcePrefix = spath.getName(); String sversion = (String) getParamValue(aSourceVersion); if (sversion == null) throw new PipelineException("No " + aSourceVersion + " was specified!"); try { sourceVersionID = new VersionID(sversion); } catch (Exception ex) { throw new PipelineException( "The value supplied for the " + aSourceVersion + " parameter " + "(" + sversion + ") is not a legal node revision number!\n\n" + ex.getMessage()); } try { pSourceVersion = pClient.getCheckedInVersion(sourceNodeName, sourceVersionID); } catch (PipelineException ex) { throw new PipelineException( "The source images node (" + sourceNodeName + " v" + sourceVersionID + ") " + "does not exist!"); } } /* set namer/builder parameters based on the annotations on the source images node */ { boolean validated = false; String projName = null; String taskName = null; String taskType = null; TreeMap<String, BaseAnnotation> annotations = pClient.getAnnotations(sourceNodeName); TreeSet<String> otherPurposes = new TreeSet<String>(); for (String aname : annotations.keySet()) { if (aname.equals("Task") || aname.startsWith("AltTask")) { BaseAnnotation annot = annotations.get(aname); String purpose = lookupPurpose(sourceNodeName, aname, annot); if (purpose == null) { otherPurposes.add("<UNKNWON>"); } else if (purpose.equals(aFocus) || purpose.equals(aEdit) || purpose.equals(aProduct)) { projName = lookupProjectName(sourceNodeName, aname, annot); taskName = lookupTaskName(sourceNodeName, aname, annot); taskType = lookupTaskType(sourceNodeName, aname, annot); validated = true; break; } else { otherPurposes.add(purpose); } } } if (!validated) { StringBuilder buf = new StringBuilder(); buf.append( "Unable to find an valid " + aEdit + ", " + aFocus + " or " + aProduct + " " + "task annotation for the source images node (" + sourceNodeName + " v" + sourceVersionID + ")!"); if (!otherPurposes.isEmpty()) { buf.append( "\n\nHowever, there were task annotations on the source images node for " + "the following unsupported purposes:"); for (String purpose : otherPurposes) buf.append(" " + purpose); } throw new PipelineException(buf.toString()); } if (taskName.length() != 5) throw new PipelineException( "The " + aTaskName + " (" + taskName + ") of the source images " + "node (" + sourceNodeName + " v" + sourceVersionID + ") did not conform to " + "the 2-letter sequence name followed by 3-digit shot number format!"); pProjectName = projName; pSeqName = taskName.substring(0, 2); pShotName = taskName.substring(2, 5); try { pTaskType = TaskType.valueOf(TaskType.class, taskType); } catch (IllegalArgumentException ex) { throw new PipelineException( "The " + DeliverNamer.aTaskType + " (" + taskType + ") of the source images " + "node (" + sourceNodeName + " v" + sourceVersionID + ") was an unknown type " + "by this builder!"); } } /* generate a temporary working area where the approval process will take place and change the util context to use it instead for all future operations */ { String tempView = ("QtDeliver" + "-" + pProjectName + "-" + pSeqName + pShotName + "-" + pSourcePrefix); tempView = tempView.replaceAll(" ", "_"); setContext(new UtilContext(pContext.getAuthor(), tempView, pContext.getToolset())); } /* turn on the DoAnnotations flag for the StageInformation shared by all of the Stages created by this builder since we always want task annotations */ getStageInformation().setDoAnnotations(true); /* initialize internal Project namer */ { pProjectNamer.setParamValue(new ParamMapping(StudioDefinitions.aProjectName), pProjectName); pProjectNamer.generateNames(); } }
/** * Construct a {@link SubProcessHeavy SubProcessHeavy} instance which when executed will fulfill * the given action agenda. * * <p> * * @param agenda The agenda to be accomplished by the action. * @param outFile The file to which all STDOUT output is redirected. * @param errFile The file to which all STDERR output is redirected. * @return The SubProcess which will fulfill the agenda. * @throws PipelineException If unable to prepare a SubProcess due to illegal, missing or * imcompatable information in the action agenda or a general failure of the prep method code. */ public SubProcessHeavy prep(ActionAgenda agenda, File outFile, File errFile) throws PipelineException { NodeID nodeID = agenda.getNodeID(); /* sanity checks */ Path loadScene = null; Path saveScene = null; boolean isAscii = false; TreeMap<Integer, LinkedList<Path>> mel = new TreeMap<Integer, LinkedList<Path>>(); { /* generate the filename of the Maya scene to load */ { String sname = (String) getSingleParamValue("MayaScene"); if (sname != null) { FileSeq fseq = agenda.getPrimarySource(sname); if (fseq == null) throw new PipelineException( "Somehow the Maya Scene node (" + sname + ") was not one of the source " + "nodes!"); String suffix = fseq.getFilePattern().getSuffix(); if (!fseq.isSingle() || (suffix == null) || !(suffix.equals("ma") || suffix.equals("mb"))) throw new PipelineException( "The MayaMEL Action requires that the source node specified by the Maya " + "Scene parameter (" + sname + ") must have a single Maya scene file as " + "its primary file sequence!"); NodeID snodeID = new NodeID(nodeID, sname); loadScene = new Path(PackageInfo.sProdPath, snodeID.getWorkingParent() + "/" + fseq.getPath(0)); } } /* generate the name of the Maya scene to save */ { Boolean save = (Boolean) getSingleParamValue("SaveResult"); if ((save != null) && save) { FileSeq fseq = agenda.getPrimaryTarget(); String suffix = fseq.getFilePattern().getSuffix(); if (!fseq.isSingle() || (suffix == null) || !(suffix.equals("ma") || suffix.equals("mb"))) throw new PipelineException( "The MayaMEL Action requires that the primary target file sequence must " + "be a single Maya scene file if the Save Result parameter is set!"); isAscii = suffix.equals("ma"); saveScene = new Path(PackageInfo.sProdPath, nodeID.getWorkingParent() + "/" + fseq.getPath(0)); } } /* generate the table of MEL script files to evaluate */ for (String sname : getSourceNames()) { Integer order = (Integer) getSourceParamValue(sname, "Order"); FileSeq fseq = agenda.getPrimarySource(sname); if (fseq == null) throw new PipelineException( "Somehow an per-source Order parameter exists for a node (" + sname + ") " + "which was not one of the source nodes!"); String suffix = fseq.getFilePattern().getSuffix(); if (!fseq.isSingle() || (suffix == null) || !suffix.equals("mel")) throw new PipelineException( "The MayaMEL Action requires that the source node (" + sname + ") with " + "per-source Order parameter must have a single MEL script file as its " + "primary file sequence!"); NodeID snodeID = new NodeID(nodeID, sname); Path script = new Path(PackageInfo.sProdPath, snodeID.getWorkingParent() + "/" + fseq.getPath(0)); LinkedList<Path> scripts = mel.get(order); if (scripts == null) { scripts = new LinkedList<Path>(); mel.put(order, scripts); } scripts.add(script); } } /* create a temporary MEL script file */ File script = createTemp(agenda, 0755, "mel"); try { FileWriter out = new FileWriter(script); /* a workaround needed in "maya -batch" mode */ out.write("// WORK AROUNDS:\n" + "lightlink -q;\n\n"); /* rename the current scene as the output scene */ if (saveScene != null) { out.write( "// SCENE SETUP\n" + "file -rename \"" + saveScene + "\";\n" + "file -type \"" + (isAscii ? "mayaAscii" : "mayaBinary") + "\";\n\n"); } /* evaluate the MEL scripts */ if (!mel.isEmpty()) { out.write("// MEL SCRIPTS \n"); for (LinkedList<Path> scripts : mel.values()) { for (Path spath : scripts) out.write("source \"" + spath + "\";\n"); } out.write("\n"); } /* save the file */ if (saveScene != null) out.write("// SAVE\n" + "file -save;\n"); out.close(); } catch (IOException ex) { throw new PipelineException( "Unable to write temporary MEL script file (" + script + ") for Job " + "(" + agenda.getJobID() + ")!\n" + ex.getMessage()); } /* create the process to run the action */ try { ArrayList<String> args = new ArrayList<String>(); args.add("-batch"); args.add("-script"); args.add(script.getPath()); if (loadScene != null) { args.add("-file"); args.add(loadScene.toOsString()); } String program = "maya"; if (PackageInfo.sOsType == OsType.Windows) program = (program + ".exe"); return new SubProcessHeavy( agenda.getNodeID().getAuthor(), getName() + "-" + agenda.getJobID(), program, args, agenda.getEnvironment(), agenda.getWorkingDir(), outFile, errFile); } catch (Exception ex) { throw new PipelineException( "Unable to generate the SubProcess to perform this Action!\n" + ex.getMessage()); } }
/** * Construct a {@link SubProcessHeavy SubProcessHeavy} instance which when executed will fulfill * the given action agenda. * * <p> * * @param agenda The agenda to be accomplished by the action. * @param outFile The file to which all STDOUT output is redirected. * @param errFile The file to which all STDERR output is redirected. * @return The SubProcess which will fulfill the agenda. * @throws PipelineException If unable to prepare a SubProcess due to illegal, missing or * imcompatable information in the action agenda or a general failure of the prep method code. */ public SubProcessHeavy prep(ActionAgenda agenda, File outFile, File errFile) throws PipelineException { /* model filenames */ TreeMap<String, Path> modelPaths = new TreeMap<String, Path>(); TreeMap<String, Path> animPaths = new TreeMap<String, Path>(); TreeMap<String, String> nameSpaces = new TreeMap<String, String>(); TreeMap<String, String> reverseNameSpaces = new TreeMap<String, String>(); TreeMap<String, Boolean> usesNameSpace = new TreeMap<String, Boolean>(); TreeMap<String, String> buildTypes = new TreeMap<String, String>(); for (String sname : agenda.getSourceNames()) { if (hasSourceParams(sname)) { FileSeq fseq = agenda.getPrimarySource(sname); String suffix = fseq.getFilePattern().getSuffix(); if (fseq.isSingle() && (suffix != null)) { if (suffix.equals("ma") || suffix.equals("mb")) { Path npath = new Path(sname); String type = getSourceStringParamValue(sname, aSceneType); String nspace = getSourceStringParamValue(sname, aPrefixName); if (nspace == null) { nspace = npath.getName(); } if (type.equals(aModel)) modelPaths.put(sname, new Path(npath.getParentPath(), fseq.getPath(0))); else { animPaths.put(sname, new Path(npath.getParentPath(), fseq.getPath(0))); nspace += "_a"; } boolean useNSpace = false; { Boolean tf = (Boolean) getSourceParamValue(sname, aNameSpace); useNSpace = ((tf != null) && tf); } String buildType = getSourceStringParamValue(sname, aBuildType); if (buildType == null) throw new PipelineException( "The value of the " + aBuildType + " source parameter for node " + "(" + sname + ") was not set!"); buildTypes.put(sname, buildType); nameSpaces.put(sname, nspace); reverseNameSpaces.put(nspace, sname); usesNameSpace.put(sname, useNSpace); } } } } /* the target Maya scene */ Path targetScene = getMayaSceneTargetPath(agenda); String sceneType = getMayaSceneType(agenda); /* create a temporary MEL script file */ File script = createTemp(agenda, "mel"); try { FileWriter out = new FileWriter(script); /* provide parameters as MEL variables */ out.write(genFrameRangeVarsMEL()); /* rename the current scene as the output scene */ out.write( "// SCENE SETUP\n" + "file -rename \"" + targetScene + "\";\n" + "file -type \"" + sceneType + "\";\n\n"); out.write(genUnitsMEL()); writeInitialMEL(agenda, out); /* the model file reference imports */ TreeMap<String, Path> all = new TreeMap<String, Path>(modelPaths); all.putAll(animPaths); for (String sname : all.keySet()) { Path mpath = all.get(sname); String buildType = buildTypes.get(sname); out.write( "// MODEL: " + sname + "\n" + "print \"" + buildType + " Model: " + mpath + "\\n\";\n" + "file\n"); String nspace = nameSpaces.get(sname); boolean useNSpace = usesNameSpace.get(sname); if (buildType.equals(aImport)) { out.write(" -import\n"); if (useNSpace) out.write(" -namespace \"" + nspace + "\"\n"); } else if (buildType.equals(aReference)) { out.write(" -reference\n"); if (useNSpace) out.write(" -namespace \"" + nspace + "\"\n"); else out.write(" -renamingPrefix \"" + nspace + "\"\n"); } else { throw new PipelineException( "Unknown value for the " + aBuildType + " source parameter for node " + "(" + sname + ") encountered!"); } { String fname = mpath.getName(); if (fname.endsWith("ma")) out.write(" -type \"mayaAscii\"\n"); else if (fname.endsWith("mb")) out.write(" -type \"mayaBinary\"\n"); else throw new PipelineException( "Unknown Maya scene format for source file (" + mpath + ")!"); } out.write(" -options \"v=0\"\n" + " \"$WORKING" + mpath + "\";\n\n"); } writeModelMEL(agenda, out); out.write( "global proc string removePrefix(string $name)\n" + "{\n" + " string $toReturn;\n" + " string $buffer[];\n" + " tokenize($name, \"|\", $buffer);\n" + " string $part;\n" + " for ($part in $buffer) {\n" + " string $buffer2[];\n" + " tokenize($part, \":\", $buffer2);\n" + " if ($toReturn == \"\")\n" + " $toReturn += $buffer2[(size($buffer2) -1)];\n" + " else\n" + " $toReturn += \"|\" + $buffer2[(size($buffer2) -1)];\n" + " }\n" + " return $toReturn; \n" + "}\n"); out.write( "global proc string addPrefix(string $name, string $prefix)\n" + "{\n" + " string $toReturn;\n" + " string $buffer[];\n" + " tokenize($name, \"|\", $buffer);\n" + " string $part;\n" + " for ($part in $buffer) {\n" + " if ($toReturn == \"\")\n" + " $toReturn += $prefix + $buffer[(size($buffer) -1)];\n" + " else\n" + " $toReturn += \"|\" + $prefix + $buffer[(size($buffer) -1)];\n" + " }\n" + " return $toReturn;\n" + "}\n"); for (String sname : animPaths.keySet()) { String nspace = nameSpaces.get(sname); String otherNspace = nspace.substring(0, nspace.length() - 2); String modelName = reverseNameSpaces.get(otherNspace); if (modelName != null) { boolean useNSpace = usesNameSpace.get(sname); boolean otherUseNSpace = usesNameSpace.get(modelName); String buildType = buildTypes.get(sname); String otherBuildType = buildTypes.get(modelName); String prefix = generatePrefix(nspace, useNSpace, buildType); String otherPrefix = generatePrefix(otherNspace, otherUseNSpace, otherBuildType); out.write( "{\n" + " string $crvPrefix = \"" + prefix + "\";\n" + " string $objPrefix = \"" + otherPrefix + "\";\n" + " string $obj = $crvPrefix + \"curveInfo\";\n" + " if (`objExists $obj`) {\n" + " int $size = `getAttr -s ($obj + \".cn\")`;\n" + " int $i = 0;\n" + " for ($i = 0; $i < $size; $i++) {\n" + " string $curve = `getAttr ($obj + \".cn[\" + $i + \"]\")`;\n" + " string $attr = `getAttr ($obj + \".an[\" + $i + \"]\")`;\n" + " $curve = addPrefixToName($crvPrefix, $curve);\n" + " $attr = addPrefixToName($objPrefix, $attr);\n" + " print(\"connectAttr -f \" + $curve + \" \" + $attr + \"\\n\");\n" + " connectAttr -f $curve $attr; \n" + " }\n" + " }\n" + " else {\n" + " string $curves[] = `ls -type animCurve ($crvPrefix + \"*\")`;\n" + " string $curve;\n" + " for ($curve in $curves) {\n" + " string $shortName = removePrefix($curve);\n" + " string $buffer[];\n" + " tokenize($shortName, \"_\", $buffer);\n" + " string $attr = $buffer[(size($buffer) -1)];\n" + " string $name = \"\";\n" + " int $length = (size($buffer) -1);\n" + " int $i;\n" + " for ($i = 0; $i < $length; $i++) {\n" + " $name += $buffer[$i];\n" + " if ($i != ($length - 1) )\n" + " $name += \"_\";\n" + " }\n" + " string $channel = addPrefix($name, $objPrefix) + \".\" + $attr;\n" + " print ($curve + \"\\t\" + $channel + \"\\n\");\n" + " if (!`getAttr -l $channel`)\n" + " connectAttr -f ($curve + \".output\") $channel;\n" + " }\n" + " }\n" + "}\n"); } } /* set the time options */ out.write(genPlaybackOptionsMEL()); writeAnimMEL(agenda, out); /* save the file */ out.write( "// SAVE\n" + "print \"Saving Generated Scene: " + targetScene + "\\n\";\n" + "file -save;\n\n"); writeFinalMEL(agenda, out); out.close(); } catch (IOException ex) { throw new PipelineException( "Unable to write temporary MEL script file (" + script + ") for Job " + "(" + agenda.getJobID() + ")!\n" + ex.getMessage()); } /* create the process to run the action */ return createMayaSubProcess(null, script, true, agenda, outFile, errFile); }
private boolean dylanate( MasterMgrClient mclient, String switchName, DoubleMap<String, String, TreeSet<VersionID>> plugs) throws PipelineException { err.println("\nProcessing: " + switchName); String animName = null; { NodeMod switchMod = null; try { switchMod = mclient.getWorkingVersion(pUser, pView, switchName); } catch (PipelineException e) { mclient.checkOut(pUser, pView, switchName, null, keep, pFroz); switchMod = mclient.getWorkingVersion(pUser, pView, switchName); } TreeSet<String> switchSrcs = new TreeSet<String>(switchMod.getSourceNames()); for (String src : switchSrcs) { if (src.matches(animPattern)) { animName = src; err.println("Found anim node: " + src); mclient.checkOut(pUser, pView, src, null, over, frozU); continue; } // end if mclient.checkOut(pUser, pView, src, null, over, frozU); LinkMod lMod = switchMod.getSource(src); LinkPolicy rel = lMod.getPolicy(); System.err.println(src + ": " + rel); if (!rel.equals(REF)) { System.err.println("umm"); lMod.setPolicy(REF); switchMod.setSource(lMod); mclient.modifyProperties(pUser, pView, switchMod); } } // end for err.println("anim node: " + animName); mclient.modifyProperties(pUser, pView, switchMod); if (animName == null) throw new PipelineException("This switch node does not have an associated anim node"); } err.println("Checked out the anim and switch nodes"); String actionName = null; VersionID ttVer = null; boolean toCache = false; /*change the action setting on the Switch node*/ { NodeMod switchMod = mclient.getWorkingVersion(pUser, pView, switchName); Path p = new Path(switchName); Path syfRoot = new Path(p.getParentPath().getParentPath(), "syf"); System.err.println("Going to look for caches in: " + syfRoot); ArrayList<String> syfDirs = getChildrenDirs(mclient, syfRoot.toString()); for (String dir : syfDirs) { System.err.println(dir); Path dPath = new Path(syfRoot, dir); ArrayList<String> simDir = getChildrenNodes(mclient, dPath.toString()); for (String pCache : simDir) { Path cPath = new Path(dPath, pCache); if (cPath.toString().matches(cltPattern)) { System.err.println("\t" + cPath.toString()); try { mclient.checkOut(pUser, pView, cPath.toString(), null, over, froz); mclient.lock(pUser, pView, cPath.toString(), null); mclient.link(pUser, pView, switchMod.getName(), cPath.toString(), DEP, LINKALL, null); } catch (PipelineException e) { e.printStackTrace(); } toCache = true; } } } { BaseAction action = switchMod.getAction(); if (!switchMod.getToolset().equals(pToolset)) { switchMod.setToolset(pToolset); mclient.modifyProperties(pUser, pView, switchMod); } if (!toCache) { actionName = modRep; } else { actionName = modRep + "Syflex"; } ttVer = plugs.get("SCEA", actionName).last(); if ((action == null) || (!action.getName().equals(actionName)) || (!action.getVersionID().equals(ttVer))) { System.err.println( "Action name is incorrect - the switch node " + switchName + " doesn't have a " + actionName + "Action"); action = plug.newAction(actionName, ttVer, "SCEA"); action.setSingleParamValue("Source", animName); action.setSingleParamValue("Response", "Ignore"); if (toCache) action.setSingleParamValue(aApplyCache, true); switchMod.setAction(action); mclient.modifyProperties(pUser, pView, switchMod); } else { if (!action.getSingleParamValue("Response").equals("Ignore")) { // action = plug.newAction(actionName, ttVer, "SCEA"); // action.setSingleParamValue("Source", animName); action.setSingleParamValue("Response", "Ignore"); // if(toCache) // action.setSingleParamValue(aApplyCache, true); switchMod.setAction(action); mclient.modifyProperties(pUser, pView, switchMod); } // end if } // end else } } { /*-check out and lock the animation sources-*/ NodeMod animMod = mclient.getWorkingVersion(pUser, pView, animName); Set<String> animSrcs = animMod.getSourceNames(); for (String src : animSrcs) { if (src.matches(loresPattern)) { pLoresSrcs.add(src); err.println("Adding lores src " + src); } mclient.checkOut(pUser, pView, src, null, keep, pFroz); } // end for err.println("lores:" + pLoresSrcs); } /*-sync the animation assets with the switch assets.*/ // also remove unnecessary hires models { NodeMod switchMod = mclient.getWorkingVersion(pUser, pView, switchName); for (String src : switchMod.getSourceNames()) { if (src.matches(hiresPattern)) { err.println("Found hires source " + src); if (pLoresSrcs.contains(src + "_lr")) { pHiresSrcs.add(src); err.println("The hires source matched the anim node."); } else { err.println("Gotta remove " + src); } // end else } // end if } // end for } // add necessary hires models for (String lores : pLoresSrcs) { String hr = lores.replace("_lr", ""); err.println("Looking at lores source " + lores + " which matches " + hr); if (!pHiresSrcs.contains(hr)) { err.println("Gotta add " + hr + " to " + switchName); pHiresSrcs.add(hr); } } { NodeMod switchMod = mclient.getWorkingVersion(pUser, pView, switchName); TreeSet<String> switchSrcs = new TreeSet<String>(switchMod.getSourceNames()); err.println("Final hiRes list:" + pHiresSrcs + "\n"); err.println("switch now has:\n\t" + switchSrcs + "\n"); err.println("Looking for things to add."); for (String src : pHiresSrcs) { if ((src.matches(hiresPattern) && (!switchSrcs.contains(src)))) { err.print("Linking "); mclient.checkOut(pUser, pView, src, null, over, frozU); mclient.link(pUser, pView, pPrimary, src, REF, LINKALL, null); switchSrcs.add(src); } err.println("src from hiRes list: " + src); } } { NodeMod switchMod = mclient.getWorkingVersion(pUser, pView, switchName); TreeSet<String> switchSrcs = new TreeSet<String>(switchMod.getSourceNames()); err.println("switch now has:\n\t" + switchSrcs + "\n"); for (String src : switchSrcs) { if ((src.matches(hiresPattern) && (!pHiresSrcs.contains(src)))) { err.print("Unlinking "); mclient.unlink(pUser, pView, pPrimary, src); } err.println("src from switch node list: " + src); } } /*queue the switch node*/ mclient.submitJobs(pUser, pView, switchName, null); return false; }