Skip to content

5. Adding Plotter Models & Device Profiles

LINTO is not restricted to the Mutoh XP-500. Every supported plotter model is defined by a declarative YAML profile. LINTO reads profiles from two places and offers them in the Device Settings Dialog:

  • Bundled profiles shipped with LINTO (src/linto/resources/devices/ in the source code).
  • Your own profiles in ~/.config/linto/devices/. A profile there with the same file name as a bundled one replaces the bundled profile, so you can adjust e.g. roland_cm_24.yaml without touching the installation.

1. Creating Custom YAML Device Profiles (~/.config/linto/devices/*.yaml)

To add a new plotter model, create a new file ~/.config/linto/devices/<model_id>.yaml. The quickest way to get there is the folder button next to Model Profile in the Device Settings dialog: it creates the folder and opens it in your file manager. The file name must match the model_id inside the file. New profiles appear the next time you open the Device Settings dialog.

A good starting point is a copy of a similar bundled profile (see the profile list on GitHub). If a profile contains an error, LINTO skips it and logs a warning in the terminal. If your profile works, please share it in Hardware reports.

Example 1: Flatbed Plotter (roland_dxy.yaml, Bottom-Left Origin)

model_id: "roland_dxy"
name: "Roland DXY-1300 Flatbed"
manufacturer: "Roland DG"
emulation: "HP-GL / RD-GL"
protocol: "hpgl"
origin: "bottom_left"          # Flatbed: origin bottom-left
units_per_mm: 40.0             # Resolution: 0.025 mm per step
max_pens: 8                    # 8-pen carousel
swap_xy: false
invert_x: false
invert_y: false
rotation_deg: 0

connection:
  baudrate: 9600
  bytesize: 8
  parity: "N"
  stopbits: 1
  rtscts: true
  xonxoff: false

margins_mm:
  default:
    top: 8.0
    bottom: 8.0
    left: 8.0
    right: 8.0

default_margin_profile: "default"

Example 2: Grit-Roller Plotter with Full Options (mutoh_xp500.yaml, Center Origin)

model_id: "mutoh_xp500"
name: "Mutoh XP-500"
manufacturer: "Mutoh"
emulation: "HP-7585B"
protocol: "hpgl"
origin: "center"
units_per_mm: 40.0
max_pens: 8
max_speed_mm_s: 900.0
travel_speed_mm_s: 900.0
pen_change_time_s: 2.5
pen_actuation_time_s: 0.04
auto_pen_force: true
force_unit: "grams"
decimal_speed: true
swap_xy: true
invert_x: false
invert_y: true
rotation_deg: 0

connection:
  baudrate: 19200
  bytesize: 8
  parity: "N"
  stopbits: 1
  rtscts: true
  xonxoff: false

margins_mm:
  exp:
    top: 25.0
    bottom: 5.0
    left: 5.0
    right: 5.0
  norm:
    top: 35.0
    bottom: 15.0
    left: 15.0
    right: 15.0
  type1:
    top: 25.0
    bottom: 5.0
    left: 11.0
    right: 11.0
  type3:
    top: 25.0
    bottom: 10.0
    left: 10.0
    right: 10.0

default_margin_profile: "exp"

2. Complete Reference of All YAML Fields

2.1 Identification & Protocol

Field Type Default Description
model_id string Filename without .yaml Unique internal identifier for the plotter model (e.g. "mutoh_xp500", "hpgl_generic").
name string "Unknown Plotter" Display name shown in the device selector.
manufacturer string "Unknown" Manufacturer name (e.g. "Mutoh", "Roland", "Graphtec").
emulation string "HP-7585B" Emulation identifier (informational and matched against OI; responses).
protocol string "hpgl" Command language of the plotter (currently "hpgl").

2.2 Coordinate System & Intrinsic Axis Mapping

In Layout Mode, LINTO works with sheet coordinates in millimeters (origin at top-left, +X right, +Y down). The HP-GL emitter first converts these coordinates into the centered or corner-based Cartesian sheet coordinate system (+X right, +Y up) and then applies the device profile's intrinsic hardware axis mapping:

Field Type Default Description
origin string "center" "center": Origin (0,0) is at the center of the plottable hard-clip window (e.g. Mutoh XP-500, large-format grit-roller plotters).
"bottom_left": Origin (0,0) is at the bottom-left corner (e.g. classic flatbed plotters).
units_per_mm float 40.0 Plotter steps per millimeter (40.0 equals 0.025 mm/unit, 100.0 equals 0.01 mm/unit). Automatically updated when querying the hardware (OF;).
rotation_deg int 0 Intrinsic base rotation of hardware axes counter-clockwise (0, 90, 180, 270).
invert_x bool false Mirrors the X axis before axis swapping.
invert_y bool false Mirrors the Y axis before axis swapping.
swap_xy bool false Swaps X and Y axes after rotation/mirroring. On the Mutoh XP-500 (swap_xy: true, invert_y: true), the plotter X axis is the paper feed direction (positive downward) and the plotter Y axis is carriage movement (positive rightward).

Note

The axis options available in the Device Settings dialog and Plot Dock are user overrides applied on top of the device profile's intrinsic mapping (default: no override).

2.3 Pens, Pen Sensing & Kinematics (Plot Time Estimation)

Field Type Default Description
max_pens int 8 Maximum number of pens in the magazine/carousel.
auto_pen_force bool false true if the plotter features automatic pen type detection and automatic force regulation (such as the Mutoh XP-500 using coded pen holders for technical pens, pencils, ballpoints, etc.).
• When auto_pen_force: true, the “Send manual pen force (FS)” option in the Plot Dock is unchecked by default so hardware regulates pressure automatically (can be enabled manually if desired).
• When auto_pen_force: false, the option in the Plot Dock is checked by default, sending the FS values configured in the Pens Dock.
force_unit string "grams" Unit for the FS command:
• "grams": Direct gram value (e.g. FS30; for 30 g on Mutoh XP-500).
• "hp_level": Maps gram values to HP force levels 1..8 (FS1; through FS8;).
decimal_speed bool true When true, allows decimal values in VS commands (e.g. VS12.5;); otherwise rounds to integer cm/s.
max_speed_mm_s float 900.0 Maximum drawing speed along a single axis in mm/s (upper bound for plot time estimation). On Mutoh XP-500: 900 mm/s (1272 mm/s diagonal).
travel_speed_mm_s float 900.0 Rapid travel speed with pen raised (PU) in mm/s used for plot time estimation and the real-time emulator.
pen_change_time_s float 2.5 Mechanical duration of a physical pen swap (SPn;) at the carousel in seconds for plot time estimation.
pen_actuation_time_s float 0.04 Duration of a single pen-down/pen-up actuation cycle in seconds.

2.4 Serial Interface (connection)

Defines the default serial parameters when creating or selecting the device profile in the Device Settings dialog:

Field Type Default Description
baudrate int 19200 Default baud rate (e.g. 9600, 19200).
bytesize int 8 Number of data bits (7 or 8).
parity string "N" Parity: "N" (None), "E" (Even), "O" (Odd).
stopbits int 1 Number of stop bits (1 or 2).
flow_control string "rtscts" Flow control: "rtscts" (hardware RTS/CTS handshake), "xonxoff" (software XON/XOFF handshake), or "none". Alternatively, boolean fields rtscts: true/false and xonxoff: true/false are also supported.

2.5 Margin Profiles (margins_mm & default_margin_profile)

One or more named margin profiles can be defined under margins_mm. Each profile specifies the unplottable margins (for pinch rollers and grippers) in millimeters:

  • top: Margin at the paper feed edge (leading edge)
  • bottom: Margin at the trailing edge
  • left: Left side margin (left pinch roller)
  • right: Right side margin (right pinch roller)
  • default_margin_profile: Key of the margin profile selected by default (e.g. "exp" or "default").

3. Importing Device Drivers from Inkcut (tools/import_inkcut_devices.py)

LINTO includes a converter script to import HP-GL device drivers directly from an Inkcut installation (manifest.enaml):

# List devices detected from Inkcut:
python3 tools/import_inkcut_devices.py --list-only

# Convert and export profiles to src/linto/resources/devices/:
python3 tools/import_inkcut_devices.py

LINTO includes over 25 pre-installed profiles for Roland (Stika SV-8/12/15, CAMM-1), Graphtec (CE5000), US Cutter (Refine MH-721/1351), Secabo, Summa, Sekonic, and others.

Note

Note on Vinyl Cutters: Many imported models are vinyl cutters. They work well in LINTO when fitted with a pen holder. Blade cutting of adhesive vinyl is not yet supported due to missing drag-knife offset compensation.