Macro to extract all leaf nodes of a multiblock dataset

Hi,
I would like to write a macro in which given an arbitrary multiblock dataset, apply Extract Blocks to every leaf block in that dataset.

@cory.quammen @spyridon97

Hi @boonth, here is a function that returns all selectors of leaf nodes in a multiblock dataset or a partitioned dataset collection:

def get_selectors(source):
  dataInfo = source.GetDataInformation()
  dataAssembly = dataInfo.GetDataAssembly()
  if dataAssembly == None:
    dataAssembly = dataInfo.GetHierarchy()
  childNodeIds = [x for x in dataAssembly.GetChildNodes(0) if dataAssembly.GetNumberOfChildren(x) == 0]
  blockSelectors = [dataAssembly.GetNodePath(x) for x in childNodeIds]
  return blockSelectors

You can then iterate over the list of selectors returned to create an Extract Blocks filter for each selector with something like:

blockSelectors = get_selectors(source)
for selector in blockSelectors:
  extract = ExtractBlock(Input=source)
  if source.GetDataInformation().GetDataAssembly():
    extract.Assembly = 'Assembly'
  else:
    extract.Assembly = 'Hierarchy'
  extract.Selectors = [selector]

Note the lines like source.GetDataInformation().GetDataAssembly() distinguish between dataset types where the hierarchy is encoded in a separate data assembly (partitioned dataset collections) and where the hierarchy is encoded as part of the data structure itset (multiblock dataset).