/** * 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 */ String opname = null; File source = null; File preRender = null; File postRender = null; File preFrame = null; File postFrame = null; { { FileSeq fseq = agenda.getPrimaryTarget(); if (!fseq.hasFrameNumbers()) throw new PipelineException( "The HfsComposite Action requires that the output images have frame numbers."); } /* generate the filename of the Houdini scene to load */ { String sname = (String) getSingleParamValue("HoudiniScene"); if (sname != null) { FileSeq fseq = agenda.getPrimarySource(sname); if (fseq == null) throw new PipelineException( "Somehow the Houdini Scene node (" + sname + ") was not one of the source " + "nodes!"); String suffix = fseq.getFilePattern().getSuffix(); if (!fseq.isSingle() || (suffix == null) || !suffix.equals("hip")) throw new PipelineException( "The HfsComposite Action requires that the source node specified by the " + "Houdini Scene parameter (" + sname + ") must have a single Houdini scene " + "file (.hip) as its primary file sequence!"); NodeID snodeID = new NodeID(nodeID, sname); source = new File(PackageInfo.sProdDir, snodeID.getWorkingParent() + "/" + fseq.getFile(0)); } else { throw new PipelineException( "The HfsComposite Action requires the Houdini Scene parameter to be set!"); } } /* the full name of the geometry output operator */ { String name = (String) getSingleParamValue("OutputOperator"); if ((name == null) || (name.length() == 0)) throw new PipelineException( "The HfsComposite Action requires a valid Output Operator name!"); opname = ("/out/" + name); } /* command script files */ { String sname = (String) getSingleParamValue("PreRenderScript"); if (sname != null) { FileSeq fseq = agenda.getPrimarySource(sname); if (fseq == null) throw new PipelineException( "Somehow the Pre Render Script node (" + sname + ") was not one of the " + "source nodes!"); String suffix = fseq.getFilePattern().getSuffix(); if (!fseq.isSingle() || (suffix == null) || !(suffix.equals("cmd"))) throw new PipelineException( "The HfsComposite Action requires that the source node specified by the Pre " + "Render Script parameter (" + sname + ") must have a single command script " + "(.cmd) as its primary file sequence!"); NodeID snodeID = new NodeID(nodeID, sname); preRender = new File(PackageInfo.sProdDir, snodeID.getWorkingParent() + "/" + fseq.getFile(0)); } } { String sname = (String) getSingleParamValue("PostRenderScript"); if (sname != null) { FileSeq fseq = agenda.getPrimarySource(sname); if (fseq == null) throw new PipelineException( "Somehow the Post Render Script node (" + sname + ") was not one of the " + "source nodes!"); String suffix = fseq.getFilePattern().getSuffix(); if (!fseq.isSingle() || (suffix == null) || !(suffix.equals("cmd"))) throw new PipelineException( "The HfsComposite Action requires that the source node specified by the " + "Post Render Script parameter (" + sname + ") must have a single command " + "script (.cmd) as its primary file sequence!"); NodeID snodeID = new NodeID(nodeID, sname); postRender = new File(PackageInfo.sProdDir, snodeID.getWorkingParent() + "/" + fseq.getFile(0)); } } { String sname = (String) getSingleParamValue("PreFrameScript"); if (sname != null) { FileSeq fseq = agenda.getPrimarySource(sname); if (fseq == null) throw new PipelineException( "Somehow the Pre Frame Script node (" + sname + ") was not one of the " + "source nodes!"); String suffix = fseq.getFilePattern().getSuffix(); if (!fseq.isSingle() || (suffix == null) || !(suffix.equals("cmd"))) throw new PipelineException( "The HfsComposite Action requires that the source node specified by the Pre " + "Frame Script parameter (" + sname + ") must have a single command script " + "(.cmd) as its primary file sequence!"); NodeID snodeID = new NodeID(nodeID, sname); preFrame = new File(PackageInfo.sProdDir, snodeID.getWorkingParent() + "/" + fseq.getFile(0)); } } { String sname = (String) getSingleParamValue("PostFrameScript"); if (sname != null) { FileSeq fseq = agenda.getPrimarySource(sname); if (fseq == null) throw new PipelineException( "Somehow the Post Frame Script node (" + sname + ") was not one of the " + "source nodes!"); String suffix = fseq.getFilePattern().getSuffix(); if (!fseq.isSingle() || (suffix == null) || !(suffix.equals("cmd"))) throw new PipelineException( "The HfsComposite Action requires that the source node specified by the " + "Post Frame Script parameter (" + sname + ") must have a single command " + "script (.cmd) as its primary file sequence!"); NodeID snodeID = new NodeID(nodeID, sname); postFrame = new File(PackageInfo.sProdDir, snodeID.getWorkingParent() + "/" + fseq.getFile(0)); } } } /* create the temporary Houdini command script */ File hscript = createTemp(agenda, 0644, "cmd"); try { FileWriter out = new FileWriter(hscript); FileSeq fseq = new FileSeq( PackageInfo.sProdDir.getPath() + nodeID.getWorkingParent(), agenda.getPrimaryTarget()); if (fseq.hasFrameNumbers()) { FilePattern fpat = fseq.getFilePattern(); FrameRange frange = fseq.getFrameRange(); out.write( "opparm " + opname + " trange on\n" + "opparm " + opname + " f1 " + frange.getStart() + "\n" + "opparm " + opname + " f2 " + frange.getEnd() + "\n" + "opparm " + opname + " f3 " + frange.getBy() + "\n" + "opparm " + opname + " copoutput '" + fpat.getPrefix() + ".$F"); if (fpat.getPadding() > 1) out.write(String.valueOf(fpat.getPadding())); out.write("." + fpat.getSuffix() + "'\n"); } else { out.write("opparm " + opname + " trange off\n" + "opparm " + opname + " " + fseq + "\n"); } if (preRender != null) out.write("opparm " + opname + " prerender '" + preRender + "'\n"); if (postRender != null) out.write("opparm " + opname + " postrender '" + postRender + "'\n"); if (preFrame != null) out.write("opparm " + opname + " preframe '" + preFrame + "'\n"); if (postFrame != null) out.write("opparm " + opname + " postframe '" + postFrame + "'\n"); out.write("opparm -c " + opname + " execute\n"); out.close(); } catch (IOException ex) { throw new PipelineException( "Unable to write temporary script file (" + hscript + ") for Job " + "(" + agenda.getJobID() + ")!\n" + ex.getMessage()); } /* create the wrapper shell script */ File script = createTemp(agenda, 0755, "bash"); try { FileWriter out = new FileWriter(script); out.write("#!/bin/bash\n\n" + "cat " + hscript + " | hscript -v " + source); out.close(); } catch (IOException ex) { throw new PipelineException( "Unable to write temporary script file (" + script + ") for Job " + "(" + agenda.getJobID() + ")!\n" + ex.getMessage()); } try { return new SubProcessHeavy( agenda.getNodeID().getAuthor(), getName() + "-" + agenda.getJobID(), script.getPath(), new ArrayList<String>(), agenda.getEnvironment(), agenda.getWorkingDir(), outFile, errFile); } catch (Exception ex) { throw new PipelineException( "Unable to generate the SubProcess to perform this Action!\n" + ex.getMessage()); } }
@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(); } }