User Guide Cancel

demos_batchtools | Substance 3D Automation ToolKit

  1. Substance 3D home
  2. Home
  3. Command Line Tools
    1. Command Line overview
    2. sbsbaker
      1. sbsbaker overview
      2. sbsbaker command line options
      3. sbsbaker Example Command Lines
    3. sbscooker
      1. sbscooker overview
      2. sbscooker command line options
      3. sbscooker pattern variables
    4. sbsmtools
      1. sbsmtools overview
      2. sbsmtools command line options
    5. sbsmutator
      1. sbsmutator overview
      2. sbsmutator command line options
      3. sbsmutator Example Command Lines
    6. sbsrender
      1. sbsrender overview
      2. sbsrender base parameters and pattern variables
      3. sbsrender command line options
      4. sbsrender example command lines
    7. sbsupdater
      1. sbsupdater overview
      2. sbsupdater command line options
  4. Pysbs - Python API
    1. Pysbs - Python API overview
    2. Getting started
    3. General topics
      1. Basic manipulation
      2. Substance creation
      3. Substances modification
      4. Dependencies management
      5. PySbs batchtools module
      6. metadata manipulation
      7. SAT demos
      8. Edit sbsar with SBSARManager
      9. Spot Colors
      10. Thumbnail creation with SAT
    4. Examples
      1. demohelloworld
      2. demos
      3. demos_batchtools
      4. script_update_with_sbsupdater
    5. API Content
      1. API Content overview
      2. Substance definitions
        1. Common interfaces
          1. basegraph
          2. package
          3. sbsarobject
          4. sbsobject
        2. compnode
          1. compnode overview
          2. common
          3. compimplementation
          4. paramgraph
        3. context projectmgr
        4. graph
          1. graph overview
          2. function
          3. inputparameters
          4. output
        5. mdl
          1. mdlannotation
          2. mdlcommon
          3. mdldictionaries
          4. mdlenum
          5. mdlgraph
          6. mdllibclasses
          7. mdlmanager
          8. mdlnode
          9. mdlnodeimpl
          10. mdloperand
          11. mdlsbsbridge
        6. modelgraphindex
          1. modelannotationnames
          2. modelgraph
          3. modelgraphgenerator
          4. modelgraphimplementation
          5. modelnodenames
          6. modeloperand
          7. modulegraphindex
          8. moduleannotation
          9. moduleconnection
          10. modulegraph
          11. modulegraphgenerator
          12. modulegraphimplementation
          13. modulegraphlibrary
          14. modulegraphregister
          15. modulenode
          16. modulenodeimplementation
          17. modulenodeinstance
          18. moduleoperand
          19. moduleoutputbridging
          20. moduleparaminput
        7. params
          1. params overview
          2. dynamicvalue
          3. paramnode
        8. projectmgrdoc
        9. sbsarchive
          1. sbsarchive overview
          2. sbsarenum
          3. sbsargraph
          4. sbsargui
          5. sbsarguiwidgets
          6. sbsarmanager
        10. sbscommon
          1. connections
          2. gui
          3. nodes
          4. values
        11. sbspreset
        12. sbsproject
        13. substance
          1. substance overview
          2. content
          3. resource
      3. Libraries
        1. sbsenum
        2. sbslibrary
          1. sbslibrary overview
          2. sbsdictionaries
          3. sbsfilters
          4. sbsfunctions
          5. sbsfxmapnodes
          6. sbslibclasses
          7. sbswidgets
        3. sbsbakerslibrary
          1. sbsbakerslibrary overview
          2. sbsbakersdef
          3. sbsbakersdefaultprops
          4. sbsbakersdictionaries
          5. sbsbakersenum
          6. sbsbakingconverter
          7. sbsbakingconverterparam
          8. sbsbakingparameters
          9. sbsdialogstate
          10. sbsscenedata
        4. Helpers
          1. sbscleaner
          2. sbsexporter
          3. sbsgenerator
          4. sbsparser
          5. sbswriter
          6. qtclasses
            1. qtclasses overview
            2. qtvariantreader
            3. qtvariantwriter
          7. psdparser
          8. sbsimpactmanager
          9. batchtools
          10. autograph
            1. ag_functions
            2. ag_layout
            3. ag_types
          11. info_mesh_parser
          12. sbsbaker_info_handlers
          13. sbsrender_render_handlers
          14. output_handlers
          15. spotcolorinfo_handler
          16. thumbnail
          17. batchtools overview
        5. Execution context
          1. context
          2. functions
        6. API Change log
  5. Samples
    1. Samples overview
    2. Texturing Template Demo
    3. Batch Tools Demo
    4. Variations
    5. Texture Mat
    6. Pixel Processor Ray tracer
  6. Setup and Getting Started
    1. Setup and Getting Started overview
    2. Compatibility
    3. Frequently asked Questions
    4. Known issues
    5. SAT Cookbook
    6. Use Pysbs in different python interpreter (maya, sd, blender...)
  7. Integrations
    1. Substance Maya toolset
      1. Substance Maya Toolset overview
      2. Installing
      3. Launching
      4. Baking
        1. Baking overview
        2. Export parameters
        3. Baker parameters
        4. Mesh setup
        5. Using a template
      5. Changelog
  8. Changelog overview

demos_batchtools

Module demos_batchtools provides samples of usage of Pysbs in particular with the module batchtools.py.

demos_batchtools.demoUdimPipeline(aContext, aTemplateSbsPath, aDestSbsPath, aMeshPath, aUdimList, aOutputSize, aOutputBakingPath, aOutputRenderPath, aOutputSbsarPath=None)

Demonstrates an automated pipeline implying a mesh with udim, executing this process:

sbsbaker => fill template .sbs with Pysbs => sbscooker => sbsrender

Parameters:
  • aContext (context.Context) – Execution context
  • aTemplateSbsPath (str) – The absolute path of the template .sbs file
  • aDestSbsPath (str) – The absolute path of the .sbs file specified for the mesh.
  • aMeshPath (str) – The absolute path of the mesh to use to specify this template Substance
  • aUdimList (str) – The list of UDIM ids (MARI convention: “1001”) available on this mesh. For instance “1001,1002”
  • aOutputSize (str) – Output size, as a power of two.
  • aOutputBakingPath (str) – Folder path where to save the output of the baking process for each udim
  • aOutputRenderPath (str) – Folder path where to save the output renderings of the Substance graph for each udim
  • aOutputSbsarPath (str, optional) – Folder path where to save the output .sbsar specialized for each udim. Keep the value to None if there is no need to keep the .sbsar
Returns:

True if success

Here is the code of function demoUdimPipeline:

def bakeUdim(_meshPath, _outputSize, _outputFormat, _outputBakingPath, _bakerName, _udim): 
    """ 
    Call sbsbaker with the provided udim 
 
    :param _meshPath: Path to the mesh 
    :param _outputSize: Output size as a power of two 
    :param _outputFormat: Output format of the baked map (e.g. extension) 
    :param _outputBakingPath: Output folder path 
    :param _bakerName: Name of the baker 
    :param _udim: The udim to process 
    :type _meshPath: str 
    :type _outputSize: int 
    :type _outputFormat: str 
    :type _outputBakingPath: str 
    :type _bakerName: str 
    :type _udim: str 
    """ 
    _outputName = '%s_%s' % (_bakerName,_udim) 
    batchtools.sbsbaker_curvature(_meshPath, 
                                  output_size=[_outputSize,_outputSize], 
                                  output_format=_outputFormat, 
                                  output_path=_outputBakingPath, 
                                  udim=_udim, 
                                  output_name=_outputName).wait() 
 
 
def cookAndRender(_context, _inputSbs, _inputGraphPath, _outputCookPath, _outputRenderPath, _outputSize, _udim): 
    """ 
    Call sbscooker with the provided udim, and then sbsrender on the resulting .sbsar 
 
    :param _context: API execution context 
    :param _inputSbs: Path to the .sbs file to cook 
    :param _inputGraphPath: Internal path of the graph to render 
    :param _context: Path to the default packages folder 
    :param _outputCookPath: Output folder path of the .sbsar 
    :param _outputRenderPath: Output folder path of the rendered maps 
    :param _outputSize: Output size as a power of two 
    :param _udim: The udim to process 
    :type _context: :class:`context.Context` 
    :type _inputSbs: str 
    :type _inputGraphPath: str 
    :type _outputCookPath: str 
    :type _outputRenderPath: str 
    :type _outputSize: int 
    :type _udim: str 
    """ 
    _sbsarName = os.path.splitext(os.path.basename(_inputSbs))[0] 
    _outputName = '%s_%s' % (_sbsarName,_udim) 
 
    batchtools.sbscooker(inputs=_inputSbs, 
                         includes=_context.getDefaultPackagePath(), 
                         alias=_context.getUrlAliasMgr().getAllAliases(), 
                         udim=_udim, 
                         output_path=_outputCookPath, 
                         output_name=_outputName, 
                         compression_mode=2).wait() 
 
    batchtools.sbsrender_render(inputs=os.path.join(_outputCookPath, _outputName+'.sbsar'), 
                                input_graph=_inputGraphPath, 
                                output_path=_outputRenderPath, 
                                output_name=_outputName, 
                                set_value='$outputsize@%s,%s' % (_outputSize,_outputSize), 
                                png_format_compression="best_speed").wait() 
 
 
if any([not i for i in [aTemplateSbsPath, aDestSbsPath, aMeshPath, aUdimList, aOutputSize, aOutputBakingPath, aOutputRenderPath]]): 
    log.error("Please provide all the appropriate arguments for demoUdimPipeline ") 
    return False 
 
try: 
    # Get information from the mesh: materials and uvset count 
    materials, _, uvsetCount = batchtools.sbsbaker_info_get_mesh_info(aMeshPath) 
 
    # Bake mesh information 
    log.info('Baking into %s ...' % aOutputBakingPath) 
 
    python_helpers.createFolderIfNotExists(aOutputBakingPath) 
    bakerName = sbsbakers.getBakerDefaultIdentifier(sbsbakers.BakerEnum.CURVATURE) 
    bitmapExt = 'png' 
    aOutputSize = int(aOutputSize) 
    for udim in aUdimList.split(','): 
        bakeUdim(aMeshPath, aOutputSize, bitmapExt, aOutputBakingPath, bakerName, udim) 
 
    # Parse the .sbs file and get required data 
    sbsDoc = substance.SBSDocument(aContext, aTemplateSbsPath) 
    sbsDoc.parseDoc() 
    graph = sbsDoc.getSBSGraphList()[0] 
    graphPath = sbsDoc.getObjectInternalPath(graph.mUID, addDependencyUID=True) 
    bitmapRes = sbsDoc.getSBSResourceList()[0] 
 
    # Init a scene resource with the mesh information 
    sceneRes = sbsDoc.createSceneResource(aResourcePath=aMeshPath, aIdentifier='mesh', isUDIM=True) 
 
    # Proper configuration for the .sbs output so that it is correctly set for SD. This is not required if using only the batchtools: 
    # - Set the material entries 
    sceneRes.setMaterialMapEntries(aMaterialsList = materials, nbUVSet=uvsetCount) 
    for matMapEntry in sceneRes.getMaterialMapEntries(): 
        for uvset in range(uvsetCount): 
            matMapEntry.assignDefaultSBSGraph(aGraphPath=graphPath, aUVSet=uvset) 
 
    # - Define the bitmap resource as the result of the mesh baking process 
    bitmapRes.setResourceIsBakingOutput(sceneRes, sbsbakers.BakerEnum.CURVATURE_MAP_FROM_MESH) 
 
    # Relocate the resource so that it points to the baking output 
    sbsDoc.relocateResource(aResource=bitmapRes, 
                            aNewPath=os.path.join(aOutputBakingPath, bakerName+'_$(udim).'+bitmapExt), 
                            checkPathExists=False) 
 
    # Write the output Substance specialised for the given mesh 
    sbsDoc.writeDoc(aNewFileAbsPath=aDestSbsPath, aUpdateRelativePaths=True) 
 
    # Save the .sbsar in a temporary folder if aOutputSbsarPath is not specified 
    if not aOutputSbsarPath: 
        destSbsar = aContext.getUrlAliasMgr().buildTmpFolderPath(graph.mIdentifier+'_OutputSbsar') 
        os.mkdir(destSbsar) 
    else: 
        destSbsar = aOutputSbsarPath 
 
    # Create output directories if necessary 
    python_helpers.createFolderIfNotExists(destSbsar) 
    python_helpers.createFolderIfNotExists(aOutputRenderPath) 
 
    # Cook the substance for each Udim and render each resulting .sbsar 
    # Run this on several threads with a task queue 
    log.info('Rendering into %s ...' % aOutputRenderPath) 
    graphPath = 'pkg://'+graph.mIdentifier 
    for udim in aUdimList.split(','): 
        cookAndRender(aContext, aDestSbsPath, graphPath, destSbsar, aOutputRenderPath, aOutputSize, udim) 
 
    # Remove temporary folder 
    if aOutputSbsarPath is None: 
        shutil.rmtree(destSbsar) 
 
    log.info('All renders have been generated') 
    return True 
 
except BaseException as error: 
    log.error("!!! [demoUdimPipeline] Failed to process mesh %s " % aMeshPath) 
    raise error

Get help faster and easier

New user?