Skip to content

Creating a scroll case

Scroll cases are generated by the scrollcase Python package in scrollcase/. Given a scroll mesh, it aligns the scroll, builds a lining that follows its surface, and wraps the lining in the split honeycomb case: left half (with mount disc), right half, and assembly stand.

Requirements

  • uv
  • (Optional) MeshLab, for repairing a mesh that isn't watertight

Steps

  1. Prepare the mesh. Any format meshlib reads (PLY, STL, OBJ). It should be a single watertight surface. Orientation and position don't matter. If it isn't in millimeters, set scroll.scale.

  2. Write a config. Copy scrollcase/examples/template.toml next to your mesh:

# Starting point for a scroll case. Copy it next to your mesh and edit.
# Anything left out comes from the style preset; every option is listed in
# the config reference, or run: scrollcase defaults --style educelab.v1
style = "educelab.v1"
name = "PHerc-XXXX"          # output files are <name>-L.stl, -R.stl, ...

[scroll]
mesh = "PHerc-XXXX.ply"      # relative to this file
scale = 1.0                  # set if the mesh isn't in millimeters
rotate = [0, 0, 0]           # degrees about X, Y, Z, applied after alignment
smoothing = "none"           # "denoise" or "shrink_expand" for very detailed meshes

[split]
type = "plane"               # "curve" avoids a flat seam lined up with the beam

[nubs]
# [x, z] pairs on the divider, between the lining and the shell. The build
# prints both diameters; place nubs after a first draft.
positions = []

[escape_holes]
enabled = false

[label]
line1 = "PHerc-XXXX"
line2 = ""

Set name, scroll.mesh (relative to the config file), and the label. Every option is described in the config reference. To start from every option instead, print a style's full config:

cd scrollcase
uv run scrollcase defaults --style educelab.v1 > my-scroll.toml
  1. Generate a draft.
uv run scrollcase -v build -c my-scroll.toml -o out/ --preview

This writes <name>-L.stl, -R.stl, -Stand.stl, and -Scroll.stl. The scroll STL is the aligned scroll in case coordinates; load it with the halves in a viewer to check placement and clearances. --preview also writes and opens <name>-preview.html, which shows every part together. Make the halves see-through or explode them apart to check the fit, and use Save snapshot to save a PNG of the view.

  1. Adjust.
  2. The scroll is auto-aligned to the case axis, with its widest direction in the split plane. Use scroll.rotate (degrees, XYZ) to adjust it, e.g. to put a fragile edge away from the split.
  3. Add nubs.positions as [x, z] pairs. Place them in the divider wall between the lining and the shell (the build prints both diameters).
  4. scroll.smoothing ("denoise" or "shrink_expand") simplifies a very detailed lining. Smoothing never cuts into the scroll.

  5. Print. Overhang removal (on by default) extrudes each half's cavity toward the split, so the scroll can be lowered straight into either half without catching on the lining.

What changed from the OpenSCAD generator

The manual MeshLab/MeshMixer lining steps, modelRotate/modelTranslate positioning, and slow iterative overhang removal are now automatic. The case design and parameters are the same; parameter names are snake_case.