tatbot design — acquired DBV3 artwork to a portable design

Use DrawingBot V3 to acquire ordered physical paths first. Inkmap and ROS preparation require dbv3-batik-paths/1 artwork with a frozen recipe identity. The former SVG/raster tatbot design trace route is retired and refuses with a regeneration action.

tatbot design generate "an orbital drawing" --out source.png
tatbot drawingbot generate job.json --out acquisition --app /path/to/drawingbotv3
tatbot design place acquisition/artwork.json --target plane --out design.json
tatbot design check design.json --preview preview.svg
tatbot ros compile design.json -o prepared

design generate produces a source PNG and provenance sidecar. Supply those bytes and their exact hash to a version 3 DBV3 job with explicit dimensions, pen table, PFM settings and seed. It does not produce finished path artwork. The bundled web/inkmap/public/designs/dbv3-orbit/job.json is a working example, with its source in input/source.png. Job paths resolve relative to the job.

design place and design check require acquired DBV3 records. Placement changes translation, rotation and mirror; changing physical dimensions or pen settings requires a new acquisition. Paths retain native order, direction, subpaths, closedness and repeated passes. Preview SVGs are derived output, not accepted source records. A design contains artwork, placement and nominal chart geometry; ROS preparation binds the fitted tool and registered page.

place puts one artwork on a plane or cylinder chart and writes the design. --canvas-mm is the chart extent, defaulting to the smallest chart that holds the artwork, its offset and its margin. --offset-mm, --rotation-deg, --margin-mm and --mirror are the placement intent. Two refusals live here:

  • a cylinder chart closing its full circumference, where the band would meet itself and stop being a chart; the paper cylinder’s own band is three quarters of the way round, everything but the bottom quarter it rests on;

  • artwork that leaves its canvas once rotation, mirroring and stroke width are compiled. Every stroke goes through the target’s own margin rule.

check validates a design with the browser’s reader, recomputes every digest in Python, and reports the path footprint about chart zero: the target, the number of scheduled material strokes, the bounds, and the enclosing radius. Acquired paths retain their native sequence and direction; no fill planner, deduplication or travel optimizer substitutes for those paths. --preview writes the artwork’s checked SVG export. It does not predict deposition.

--radius-mm is nominal

The radius and canvas a design carries are what the design assumes about its target. They are not a measurement. tatbot ros compile accepts plane charts only (a 100 × 150 mm chart is the stencil page); a cylinder design waits for curved surfaces. Choosing a radius here never establishes registration, calibration accuracy, or reachability.

Where these verbs run

Placement and validation shell out to Node 22 with web/inkmap’s dependencies, so every design verb carries the design role and hops to a node that has them (config/nodes.json). The arm node does not need npm.

Drawing a design

tatbot ros compile design.json          # program.json + preview.svg, offline
tatbot ros draw program.json            # on the ROS 2 stack's arm

The ROS 2 stack registers the page, touches it and draws; ros/README.md section 4 is the path from a design to paper, and design format the file itself.

The same file draws in the simulator: tatbot sim generate paper-draw -- --design design.json ... records episodes of the design’s material strokes with the factory’s own cameras and ink dips, on the flat pad or, for a cylinder design, the paper cylinder. See simulation.

Checking it without hardware

scripts/check inkgen cli docs
uvx --with-requirements scripts/tests/requirements.txt pytest -q scripts/tests/test_cli_design.py
cd python/tatbot_sim && uv run pytest -q tests/test_design_build.py
cd web/inkmap && node --experimental-strip-types --test tests/design.test.ts

The acquired catalogue binds each source image, native recipe, project, pen table and output receipt. Browser and Python tests verify the unchanged records through placement and save/restore. ROS tests verify path traversal and explicit rejection of legacy artwork and physical resizing without regeneration.