"Load static MolecularNodes structures, compose geometry-node
Scanned 9/8/2026
Install to Claude Code
npx -y skills add VectorSpaceLab/AREX-Skill --skill molecules-and-styles --agent claude-codeInstalls into .claude/skills of the current project.
Are you the author of Molecules And Styles?
Add the live security badge to your README — it updates automatically with every re-scan.
[](https://www.skillsdirectory.com/skills/vectorspacelab-molecules-and-styles)More formats (shields.io, HTML) on the badges page.
---
name: molecules-and-styles
description: "Load static MolecularNodes structures, compose geometry-node
styles and selections, and control named attributes, colors, materials, and
converter-backed molecule imports in a Blender 5.2 host."
disable-model-invocation: true
metadata:
disco-role: operating
license: NOASSERTION
---
# Molecules and styles
Use this sub-skill for the static-structure path of MolecularNodes: create a
Universe-backed `Molecule`, load a local PDB/mmCIF/BCIF/SDF/MOL file or fetch a
structure, then build one or more visible style branches with selections,
attributes, colors, and materials. The runtime is Blender 5.2 (or a compatible
`bpy` 5.2 host); pure Python helpers do not replace that host for object, mesh,
Geometry Nodes, or material work.
## Route here for
- `Molecule(universe, ...)`, `Molecule.from_file(...)`, `Molecule.load(...)`, and
`Molecule.fetch(...)` for static structures and file-backed multi-model input.
- `add_style()` with `spheres`, `sticks`, `ball_and_stick`, `cartoon`, `ribbon`,
or `surface`, including style keyword arguments and material assignment.
- MDAnalysis selection strings, `AtomGroup` selections, existing boolean named
attributes, and managed selection recovery.
- `with mol.tree:` composition, `tree.reset()` clean-slate composition, reusable
`atoms`/`join` sockets, `SetColor`, named attributes, and style-node inspection.
- MolecularNodes material presets, custom nodebpy materials, IUPAC/chain/PLDDT
color helpers, and Biotite-to-MDAnalysis static structure conversion.
## Do not handle here
- Frame playback, streaming trajectories, dynamic trajectory calculations, or
trajectory-specific interpolation: route to
[trajectories-and-annotations](../trajectories-and-annotations/SKILL.md).
- Annotation objects, labels, measurements, or annotation visibility: route to
[trajectories-and-annotations](../trajectories-and-annotations/SKILL.md).
- EM density, CellPack, STAR ensembles, and density-specific node trees: route to
[density-and-ensembles](../density-and-ensembles/SKILL.md).
- `Canvas`, cameras, render engines, snapshots, compositor, and render output:
route to [scene-and-rendering](../scene-and-rendering/SKILL.md).
## Operating workflow
1. **Confirm the host and input.** Run molecule/object/node/material operations in
Blender 5.2 with the MolecularNodes assets available. For deterministic checks,
prefer a local fixture and `Molecule.load(path)`; use `fetch(code, cache=...)`
only when the cache or network is intentionally available.
2. **Choose the loader.** Use `Molecule(universe)` when an MDAnalysis Universe
already exists, `from_file(path_or_supported_BytesIO)` for one structure file,
`load(topology, coordinates=None)` for a convenient file/MD split, and
`fetch(code, format='.bcif', cache=..., database='rcsb')` for a database source.
See [molecule API](references/molecule-api.md).
3. **Check the object before styling.** A successful load creates a Blender mesh,
standard attributes, and the `Molecular Nodes` modifier unless object creation
was explicitly disabled on the topology-plus-coordinates route. Inspect
`mol.universe`, `mol.object`, `mol.modifier_node_tree`, and
`mol.list_attributes(drop_hidden=False)` before adding branches.
4. **Start simple or take control.** Call `mol.add_style(style, selection=..., material=...,
**kwargs)` for an append-only style. Use `with mol.tree.reset() as (atoms, join):`
only when intentionally discarding the current tree. Use `with mol.tree as tree:`
to preserve branches and reuse the existing geometry input and final join.
5. **Make selection semantics explicit.** A string is first checked as an existing
boolean attribute, then parsed as an MDAnalysis selection phrase. An `AtomGroup`
becomes a managed named selection. Validate selection strings before relying on a
branch; an invalid `add_style` string warns and creates an unmasked branch.
6. **Attach color and material at the right layer.** Use a geometry color node and
`SetColor` to modify the `Color` field before a style, or let a style consume the
stored field. Pass a preset instance, its `.material`, a Blender material, an
asset material name, or `None` according to the style contract. See the material
and color reference.
7. **Validate the result in the host.** Confirm style nodes feed one final join,
the style selection input is driven by the intended `Named Attribute`, material
sockets point to the intended datablock, and evaluated geometry contains the
expected attributes. Run the local fixture cases in the verification section of
[troubleshooting](references/troubleshooting.md).
## Canonical recipes
### Append two independent representations
```python
import molecularnodes as mn
mol = mn.Molecule.load("1BNA.cif")
mol.add_style("cartoon", selection="protein", material="MN Ambient Occlusion")
mol.add_style(
"surface",
selection="resid 1:20",
material=mn.material.TransparentOutline(alpha=0.45),
quality=2,
)
```
Each call appends a branch to the same tree. Do not call `tree.reset()` between
these calls unless the first branch is meant to be removed.
### Compose a clean custom tree
```python
from molecularnodes.nodes import geometry as g
mat = mn.material.AmbientOcclusion(distance=0.5)
with mol.tree.reset() as (atoms, join):
atoms >> g.SetColor(color=g.ColorElement()) >> g.StyleCartoon(
quality=3, material=mat.material
) >> join
```
`reset()` returns the input and join sockets that belong to the new tree. Use
`with mol.tree` instead for incremental edits.
### Recover a managed selection without losing existing branches
```python
sel = mol.selections.from_string("resid 1:10", name="focus")
mol.add_style("spheres", selection=sel.name)
sel.string = "not a valid selection" # message is set; last good mask remains
sel.string = "resid 1:5" # message clears; attribute is updated
```
If `add_style(selection="bad syntax")` has already warned, leave existing style
branches intact, create a valid managed selection, and append a corrected branch.
Inspect or remove the bad branch explicitly rather than resetting the whole tree.
## Contracts and references
- [Molecule API and loading](references/molecule-api.md) — constructors,
loader distinctions, converter inputs, attributes, and local-file checks.
- [Styles, selections, and nodes](references/styles-selections-and-nodes.md) —
accepted styles, selection forms, tree lifecycle, node signatures, and branch
validation.
- [Materials and colors](references/materials-and-colors.md) — preset signatures,
material ownership, color helpers, and node-based coloring.
- [Troubleshooting and validation](references/troubleshooting.md) — failure
recovery, Blender context checks, synthetic hard cases, and fixture assertions.
When a workflow crosses a boundary, preserve the `Molecule` object and named
attribute names in the handoff so the sibling skill can continue without rebuilding
the structure or destroying its style tree.
Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.
No comments yet. Be the first to comment!