# Product Structure Management

> How to handle Product Structure entities with Python scripting in Asset Transformer Studio

Check the following examples to learn how to handle entities of the Product Structure (or Scene tree) with Python scripting.

## Parsing scene tree

```python
scene.getRoot()
scene.getChildren(occurrence)
scene.getParent(occurrence)
scene.hasComponent(occurrence, scene.ComponentType.Part)
scene.getComponent(occurrence, scene.ComponentType.Part)
```

### Example

```python
def traverseTree(occurrence):
    print("Occurrence " + str(occurrence))
    if scene.hasComponent(occurrence, scene.ComponentType.Part):
        print("-> has part")
    for child in scene.getChildren(occurrence):
        traverseTree(child)

traverseTree(scene.getRoot())
```

## Node creation

```python
scene.createOccurrence()
scene.addComponent(occurrence, componentType)
scene.prototypeSubTree(occurrence)
scene.setParent(occurrence, parent)
scene.setLocalMatrix(occurrence, matrix)
```

### Example

```python
part = scene.createOccurrence("Part1")
scene.addComponent(part, scene.ComponentType.Part)
instance1 = scene.prototypeSubTree(part)
instance2 = scene.prototypeSubTree(part)
assembly = scene.createOccurrence("Assembly")
scene.setParent(instance1, assembly)
scene.setParent(instance2, assembly)
scene.setParent(assembly, scene.getRoot())
```

![Node creation example](/api/media?file=/asset-transformer-studio/2026.5.0/media/NewItem412.png)

## Accessing part geometry

```python
scene.getPartActiveShape(part)
```

For TessellatedShape type:

```python
tessellation = scene.getPartMesh(shape)
polygonal.getMeshDefinitions(tessellation)
polygonal.createMeshFromDefinition(meshDefinition)
```

For BRepShape type:

```python
scene.getPartModel(shape)
```

### Simple CAD geometry example

```python
torus = pxz.cad.createBRepTorus(100,10)
model = cad.createModel()
cad.addBodyToModel(torus, model)
occurrence = scene.createOccurrence("Torus")
part = scene.addComponent(occurrence, scene.ComponentType.Part)
scene.setPartModel(part, model)
scene.setParent(occurrence, scene.getRoot())
algo.tessellate([occurrence], 0.200000, -1, -1)
```

## Properties

Not all entity types support custom properties.

```python
core.supportCustomProperties(entity)
core.addCustomProperty(node, "propertyName", "propertyValue")
core.getProperty(node, "property") # like any other built-in property
scene.getMetadata(occurrence, propertyName)
```

## Find nodes by properties

```python
scene.findPartOccurrencesByActiveMaterial()
scene.findOccurrencesByProperty("propertyName", "regex")
scene.findMaterialsByProperty("propertyName", "regex")
scene.findOccurrencesByMetadata("propertyName", "regex")
# ECMAScript type regex
```
