User Guide Cancel

metadata manipulation | 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. Release notes
    1. Version 11.3.0
    2. Version 11.2.0
    3. Version 11.1.0

metadata manipulation

Since 2019.2, Substance Designer allow users to add metadata to substance files.

It’s possible to add metadata for packages, graph and input / output nodes. For each of them a common interface is shared to manipulate metadata.

It’s possible to create two type of metadata:

  • String:
# create a new doc 
sbs_doc = sbsgenerator.createSBSDocument(context.Context(), "foo.sbs") 
 
# add two new string metadata to the package (doc) 
sbs_doc.createMetaDataStr("foo", "bar") 
sbs_doc.createMetaDataStr("fooz", "baz")
  • Resources:
# create a new doc 
sbs_doc = sbsgenerator.createSBSDocument(context.Context(), "foo.sbs") 
# link a resource 
res = sbs_doc.createLinkedResource(aResourceTypeEnum=sbsenum.ResourceTypeEnum.BITMAP, aResourcePath="resource.png") 
 
# add a new url metadata 
sbs_doc.createMetaDataUrl("baz", res)

Note, an url metadata value must be a resource object (SBSResource) or a pkg url of type “pkg:///…”. Each metadata has a unique key name, it’s not possible to create several metadata with the same key name and trying to do that will raise an exception (SBSMetaDataTreeNameConflict)

To get or set a value of already existing metadata:

# get a string metadata 
meta_srt = sbs_doc.getMetaData("foo") 
# get a value 
meta_str.getValue() 
# >>> bar 
# set a value 
meta_str.setValue("foofoo") 
# get an url metadata 
meta_url = sbs_doc.getMetaData("fooz") 
# get a value 
meta_url.getValue() 
# >>> pkg:///resource.png 
# set a value 
meta_url.setValue(a_resource)

To remove metadata:

# delete a metadata, key and value 
sbs_doc.deleteMetaData("foo") 
# >>> True

To get a dict of all metadata:

# get a dict 
sbs_doc.getAllMetadata() 
# >>> {"foo": "foofoo", "fooz": "pkg:///resource.png"}

Same for graph and input / output nodes:

# get a dict 
graph = sbs_doc.getSBSGraphList()[0]() 
md_graph = graph.getAllMetaData() 
 
input_param = graph.mParamInputs[0] 
md_input = input_param.getAllMetaData() 
 
output_graph = graph.mGraphOutputs[0] 
md_output = output_graph.getAllMetaData()

Metadata from a sbsar

Metadata are published within the sbsar and their related resource files. Since sbsar is a publish format it’s not yet possible to edit the metadata. If you want to do that, edit the sbs file and re-cook it.

Sbsar package, sbsar graph and sbsar input / output nodes share the same metadata common interface. sbsarmetadata module inherited by metadata module Except some specific methods like extractSbsarMetaDataResource and extractSbsarMetaDataPack.

Like in SBSDocument users can get all metadata:

sbsar = sbsarchive.SBSArchive(context.Context(), "foo.sbsar") 
# as a dict 
sbsar.getAllMetaData() 
# >>> {"foo": "foofoo", "fooz": "resources/1/resource.png"} 
 
# as a json file 
sbsar.extractSbsarMetaDataJson("metadata.json") 
# >>> metadata.json

Note the change of the url, it is converted as a sbsar resource path.

As metadata resource files are present in the sbsar it’s also possible to get them:

sbsar = sbsarchive.SBSArchive(context.Context(), "foo.sbsar") 
meta = sbsar.getAllMetaData() 
# by a url metadata value 
sbsar.extractSbsarMetaDataResource("a_destination/directory", meta["fooz"]) 
# >>> a_destination/directory/resource.png 
 
# or all in one 
extract_files = sbsar.extractSbsarMetaDataPack("a_destination/directory") 
# >>> ['a_destination/directory/resource.png']

Same for sbsar graph and sbsar input / output nodes:

# get a dict 
graph = sbsar.getSBSGraphList()[0]() 
md_graph = graph.getAllMetaData() 
 
input_param = graph.getInputs()[0] 
md_input = input_param.getAllMetaData() 
 
output_graph = graph.getGraphOutputs()[0] 
md_output = output_graph.getAllMetaData()

Resource of type OTHER

With the arrival of metadata a new type of resource has been added, OTHER. This makes it possible to link any type of resource regardless of if Substance Designer supports it or not but it can’t be used in any graphs. Resource metadata of type OTHER will be exported with the sbsar.

Here is an example of creating metadata of the type OTHER:

sbs_doc = sbsgenerator.createSBSDocument(context.Context(), "foo.sbs") 
# link an OTHER resource 
res = sbs_doc.createLinkedResource("my_resource.blend", sbsenum.ResourceTypeEnum.OTHER)

 Adobe

Get help faster and easier

New user?

Adobe MAX 2024

Adobe MAX
The Creativity Conference

Oct 14–16 Miami Beach and online

Adobe MAX

The Creativity Conference

Oct 14–16 Miami Beach and online

Adobe MAX 2024

Adobe MAX
The Creativity Conference

Oct 14–16 Miami Beach and online

Adobe MAX

The Creativity Conference

Oct 14–16 Miami Beach and online