def performPostDialogChecks(self, fields):
    # check all outputs, and if there are some files on disc already exist
    results = {}
    for field in fields:
      results[field['name']] = field['value']

    if results.get('overwrite', False):
      return True

    scene = self.__app.ActiveProject.ActiveScene
    currentPass = scene.ActivePass
    frameBuffers = currentPass.FrameBuffers

    # we need 5 padding...
    self.__app.SetValue("Passes.RenderOptions.FramePadding", 5)

    existingFiles = []
    for i in range(frameBuffers.Count):
      fb = frameBuffers(i)
      if not fb.Parameters.GetItem('Enabled').Value:
        continue

      # for now let's check last and first frame
      times = [results['framestart'], results['frameend']]
      for t in times:
        path = fb.GetResolvedPath(t)
        path = zk_uncFromDrivePath(path)
        if os.path.exists(path):
          existingFiles += [path]
    if len(existingFiles) > 0:
      msgBox = QtGui.QMessageBox()
      msgBox.setText("Are you sure?")
      text = "There are already files on disc which will be\noverwritten if you submit this job!\n\n%s\n\nThis info has been copied to the clipboard." % '\n'.join(existingFiles)
      clipboard = QtGui.QApplication.clipboard()
      clipboard.setText(text)
      msgBox.setInformativeText(text)
      msgBox.setStandardButtons(QtGui.QMessageBox.Ok | QtGui.QMessageBox.Cancel)
      msgBox.setDefaultButton(QtGui.QMessageBox.Ok)
      ret = msgBox.exec_()
      return ret == QtGui.QMessageBox.Ok

    return True
  def createJobFramesAndOutput(self, fields, connection, bracket, project, input):

    #persist all standard changes in scene....
    prop = self.__app.ActiveSceneRoot.Properties.GetItem('zookeeper')
    if not prop:
      self.__app.AddProp("Custom_parameter_list", "Scene_Root", "", "zookeeper", "")
      self.__app.SIAddCustomParameter("Scene_Root.zookeeper", "projectid", "siString", "", 0, 1, "", 4, 0, 1, "", "")
      self.__app.SIAddCustomParameter("Scene_Root.zookeeper", "mincores", "siString", "", 0, 1, "", 4, 0, 1, "", "")
      self.__app.SIAddCustomParameter("Scene_Root.zookeeper", "minramgb", "siString", "", 0, 1, "", 4, 0, 1, "", "")
      self.__app.SIAddCustomParameter("Scene_Root.zookeeper", "mingpuramgb", "siString", "", 0, 1, "", 4, 0, 1, "", "")
      self.__app.SIAddCustomParameter("Scene_Root.zookeeper", "packagesize", "siString", "", 0, 1, "", 4, 0, 1, "", "")
      prop = self.__app.ActiveSceneRoot.Properties.GetItem('zookeeper')

    if prop:
      for f in fields:
        param = prop.Parameters.GetItem(f['name'])
        if param:
          param.Value = f['value']

    results = {}
    for field in fields:
      results[field['name']] = field['value']

    scene = self.__app.ActiveProject.ActiveScene
    currentPass = scene.ActivePass
    frameBuffers = currentPass.FrameBuffers

    framestart = results['framestart']
    frameend = results['frameend']
    framestep = results['framestep']
    packagesize = results['packagesize']
    capturejob = results.get('capturejob', False)
    highprio_firstlast = results['highprio_firstlast']

    # submit all external files
    xsiFiles = scene.ExternalFiles
    for i in range(xsiFiles.Count):
      xsiFile = xsiFiles(i)
      resolvedPath = xsiFile.ResolvedPath

      # invalid rigid body cache
      if resolvedPath.lower().endswith('rigidbodycache.xsi'):
        continue

      resolution = -1
      if xsiFile.FileType == 'Models':
        param = xsiFile.Owners(0)
        model = param.Parent
        if param.Name == 'res'+str(model.active_resolution.value):
          resolution = model.active_resolution.value
      f = zookeeper.zkDB.zkExternalFile.getOrCreateByProjectAndPaths(self.connection, project.id, xsiFile.Path, xsiFile.ResolvedPath, type = xsiFile.FileType, resolution = resolution)
      if f.id is None:
        self.__app.LogMessage('Error: Could not create external file for '+xsiFile.Path)

    # redshift IES profile files
    objects = self.__app.FindObjects('', '{6495C5C1-FD18-474E-9703-AEA66631F7A7}')
    for i in range(objects.Count):
      o = objects(i)
      if not o.Name.lower() == 'redshift_ies':
        continue
      iesPath = str(o.profileString.Value)
      resolvedPath = iesPath
      if not os.path.exists(iesPath):
        resolvedPath = os.path.join(self.__app.ActiveProject.Path, resolvedPath)
      f = zookeeper.zkDB.zkExternalFile.getOrCreateByProjectAndPaths(self.connection, project.id, iesPath, resolvedPath, type = 'IESProfiles', resolution = -1)
      if f.id is None:
        self.__app.LogMessage('Error: Could not create external file for '+iesPath)

    if capturejob:

      job = zookeeper.zkDB.zkJob.createNew(self.connection)
      job.project = project
      job.name = results['jobname']+' capture'
      job.input = input
      job.type = 'CAPTURE'
      self.decorateJobWithDefaults(fields, job)
      bracket.push(job)

      # make a single frame for the capture movie
      frame = zookeeper.zkDB.zkFrame.createNew(self.connection)
      frame.job = job
      frame.time = framestart
      frame.timeend = frameend
      frame.priority = 100
      job.pushFrameForSubmit(frame)

      # create a single output for the movie
      mainBuffer = frameBuffers(0)
      capturePath = str(mainBuffer.GetResolvedPath(framestart))
      capturePath = capturePath.rpartition('.')[0]
      capturePath += '.mov'
      output = zookeeper.zkDB.zkOutput.createNew(self.connection)
      output.frame = frame
      output.name = mainBuffer.Name
      output.path = zk_uncFromDrivePath(capturePath)
      frame.pushOutputForSubmit(output)

    passes = scene.Passes
    for i in range(passes.Count):
      passObj = passes(i)
      sceneName = str(scene.Name)
      passName = str(passObj.Name)

      if not results.get('pass_'+str(passObj.Name), False):
        continue

      job = zookeeper.zkDB.zkJob.createNew(self.connection)
      job.project = project
      job.name = '%s|%s' % (sceneName, passName)
      job.input = input
      job.type = 'ALL'
      self.decorateJobWithDefaults(fields, job)
      bracket.push(job)

      packageoffset = 0
      package = 0

      # --- edit JPB --- take line out before push ---
      # add a modulo for every 10th frame to prioritize
      fm = 0
      # --- edit JPB --- take line out before push ---

      for f in range(framestart, frameend+1, framestep):

        self.__app.LogMessage('Submitting frame '+str(f))

        if packageoffset % packagesize == 0:
          package = package + 1
        packageoffset = packageoffset + 1

        frame = zookeeper.zkDB.zkFrame.createNew(self.connection)
        frame.job = job
        frame.time = f

        # --- edit JPB --- take line out before push ---
        # modulo every 10th frame
        if fm%10 == 0:
          frame.priority = 75
        else:
          frame.priority = 50
        # --- edit JPB --- take line out before push ---

        frame.package = package
        if highprio_firstlast:
          if f == framestart or f == frameend:
            frame.priority = 75
            #frame.package = 1
        job.pushFrameForSubmit(frame)

        fm+=1
Example #3
0
  def submitWithDialog(self):

    zkSubmitter.__app = zookeeper.zkUI.zkApp()

    # check input and external file paths
    brokenFiles = []
    inputpath = self.getInputPath()
    networkInputPath = zk_uncFromDrivePath(inputpath)
    if not self.validatePath(inputpath, shouldExist=True):
      brokenFiles += [{'path': inputpath, 'group': 'Scenes'}]
    else:
      # check if there is already a job logged for this
      jobName = self.getJobDefaultName()
      existingJob = zookeeper.zkDB.zkJob.getByCondition(
        self.__conn,
        condition = 'job_inputid = input_id AND job_name = %s AND input_path = %s AND job_type != \'DELETED\'' % (repr(str(jobName)), repr(str(networkInputPath))),
        additionalTables = ['input']
        )
      if existingJob:
        msgBox = QtGui.QMessageBox()
        msgBox.setText("Are you sure?")
        msgBox.setInformativeText("There's already a job (%s, %d) on the queue with this input path!" % (existingJob.name, existingJob.id))
        msgBox.setStandardButtons(QtGui.QMessageBox.Ok | QtGui.QMessageBox.Cancel)
        msgBox.setDefaultButton(QtGui.QMessageBox.Ok)
        ret = msgBox.exec_()
        if ret == QtGui.QMessageBox.Cancel:
          return

    externalfiles = self.getExternalFilePaths()
    for f in externalfiles:
      if not self.validatePath(f['path'], shouldExist=f.get('exist', True)):
        brokenFiles += [f]

    if len(brokenFiles) > 0:
      text = "Some paths are not accessible by other machines on the network.\n"
      text += "Submitting a job is not possible until this is fixed\n."
      for brokenFile in brokenFiles:
        text += '\n%s: %s' % (brokenFile.get('group', 'file'), brokenFile['path'])
      text += "\n\nThis info has been copied to the clipboard."

      clipboard = QtGui.QApplication.clipboard()
      clipboard.setText(text)

      QtGui.QMessageBox.warning(None, 'ZooKeeper Warning', text)
      return

    fields = []
    fields += [{'name': 'dcc', 'label': 'DCC', 'value': self.getDCCName(), 'type': 'str', 'readonly': True, 'tooltip': 'The name of the DCC'}]
    fields += [{'name': 'dccversion', 'label': 'DCC Version', 'value': self.getDCCVersion(), 'type': 'str', 'readonly': True, 'tooltip': 'The version of the DCC'}]
    fields += [{'name': 'renderer', 'label': 'Renderer', 'value': self.getRendererName(), 'type': 'str', 'readonly': True, 'tooltip': 'The name of the renderer'}]
    fields += [{'name': 'rendererversion', 'label': 'Renderer Version', 'value': self.getRendererVersion(), 'type': 'str', 'readonly': True, 'tooltip': 'The version of the renderer'}]

    # ensure that we have one project at least!
    pairs = zookeeper.zkDB.zkProject.getNameComboPairs(self.__conn, condition = 'project_type != \'DELETED\'')
    if len(pairs) == 0:
      self.createNewProjectWithDialog()
      pairs = zookeeper.zkDB.zkProject.getNameComboPairs(self.__conn, condition = 'project_type != \'DELETED\'')
      if len(pairs) == 0:
        return

    projectid = pairs[0][0]
    projectname = self.getProjectDefaultName()
    if projectname:
      for pair in pairs:
        if pair[1] == projectname:
          projectid = pair[0]
          break

    fields += [{'name': 'projectid', 'label': 'Project', 'value': projectid, 'type': 'combo', 'comboitems': pairs, 'tooltip': "The name of the project"}]
    fields += [{'name': 'jobname', 'label': 'Job', 'value': self.getJobDefaultName(), 'type': 'str', 'tooltip': "The name of the job", 'readonly': True}]
    fields += [{'name': 'jobpriority', 'label': 'Priority', 'value': 50, 'type': 'int', 'tooltip': "The priority of the job"}]
    fields += [{'name': 'mincores', 'label': 'Minimum Cores', 'value': 4, 'type': 'int', 'tooltip': "The minimum of CPU cores a client machine requires."}]
    fields += [{'name': 'minramgb', 'label': 'Minimum RAM', 'value': 8, 'type': 'int', 'tooltip': "The minimum of RAM (GB) a client machine requires."}]
    fields += [{'name': 'mingpuramgb', 'label': 'Minimum GPU RAM', 'value': 2, 'type': 'int', 'tooltip': "The minimum of GPU RAM (GB) a client machine requires."}]
    fields += [{'name': 'overwrite', 'label': 'Overwrite files', 'value': False, 'type': 'bool', 'tooltip': "If checked the delivery will overwrite existing frames without checking."}]
    fields += self.getExtraFields()

    def onAccepted(fields):

      if not self.performPostDialogChecks(fields):
        return

      results = {}
      for field in fields:
        results[field['name']] = field['value']

      b = zookeeper.zkDB.zkBracket(self.__conn)
      p = zookeeper.zkDB.zkProject.getById(self.__conn, results['projectid'])

      i = zookeeper.zkDB.zkInput.createNew(self.__conn)
      i.path = networkInputPath
      b.push(i)
      
      self.createJobFramesAndOutput(fields, self.__conn, b, p, i)
      b.write()

      msgBox = QtGui.QMessageBox()
      msgBox.setText("ZooKeeper")
      msgBox.setInformativeText('Job "%s" submitted.' % results['jobname'])
      msgBox.setStandardButtons(QtGui.QMessageBox.Ok)
      msgBox.setDefaultButton(QtGui.QMessageBox.Ok)
      msgBox.setWindowFlags(QtCore.Qt.WindowStaysOnTopHint)
      msgBox.exec_()

    dialog = zookeeper.zkUI.zkSubmitDialog(fields, onAccepted)
    dialog.exec_()