title: NodeSlicer Configuration Schema
type: object
oneOf:
  - required: [inputFile]
  - required: [inputFiles]
properties:
  # Additional NodeSlicer parameters
  header:
    description: Print the Slic3r header line with timestamp
    default: true
    type: boolean
  # IO settings
  save:
    description: Save configuration to the specified file
    type: string

  load:
    description: >
      Load configuration from the specified file.
      It can be used more than once to load options from multiple files.
    type: string

  outputFile:
    description: File to output GCode to
    type: string

  outputFiles:
    description: Files to output GCode to
    type: array
    items:
      type: string

  outputDirectory:
    description: Directory to output GCode-files to
    type: string

  inputFile:
    description: Input STL-file
    type: string

  inputFiles:
    description: Input STL-files
    type: array
    items:
      type: string

  # Non-slicing actions (no GCode will be generated):
  repair:
    description: Repair given STL files and save them as <name>_fixed.obj
    type: boolean

  cut:
    description: >
      Cut given input files at given Z (relative) and
      export them as <name>_upper.stl and <name>_lower.stl
    type: number

  info:
    description: Output information about the supplied file(s)
    type: boolean

  split:
    description: Split the shells contained in given STL file into several STL files
    type: boolean
    default: false

  threads:
    description: Number of threads to use
    type: number
    default: 2
    minimum: 1

  # Output options:
  postProcessScripts:
    description: >
      Generated GCode will be processed with the supplied scripts.
    type: array
    item:
      type: string

  exportSvg:
    description: Export a SVG file containing slices instead of GCode.
    type: boolean

  outputFilenameFormat:
    description: Output file name format; all config options enclosed in brackets   will be replaced by their values, as well as [input_filename_base] and [input_filename]
    type: string

  merge:
    description: >
      If multiple files are supplied, they will be composed into a single
      print rather than processed individually.
    type: boolean

  # Printer Options
  nozzleDiameter:
    description: Diameter of nozzle in mm
    type: number
    default: 0.5

  printCenter:
    description: Coordinates in mm of the point to center the print around
    type: object
    properties:
      x:
        type: number
      y:
        type: number
    default:
      x: 100
      y: 100

  zOffset:
    description: Additional height in mm to add to vertical coordinates
    type: number
    default: 0

  GCodeFlavor:
    description: The type of GCode to generate
    default: marlin
    type: string
    enum:
      - reprap
      - marlin
      - teacup
      - makerware
      - sailfish
      - mach3
      - noExtrusion
  useRelativeEDistances:
    description: Enable this to get relative E values
    type: boolean
    default: false

  useFirmwareRetraction:
    description: Enable firmwareControlled retraction using G10/G11
    type: boolean
    default: false

  useVolumetricE:
    description: Express E in cubic millimeters and prepend M200
    type: boolean
    default: false

  GCodeArcs:
    description: >
      Use G2/G3 commands for native arcs
      (experimental, not supported by all firmwares)
    type: boolean
    default: false

  g0:
    description: >
      Use G0 commands for retraction
      (experimental, not supported by all firmwares)
    type: boolean
    default: false

  GCodeComments:
    description: Make GCode verbose by adding comments
    type: boolean
    default: false

  vibrationLimit:
    description: >
      Limit the frequency of moves on x- and yAxes in Hz
      (set zero to disable)
    default: 0
    type: number 

  pressureAdvance:
    description: >
      Adjust pressure using the experimental advance algorithm
      (K constant, set zero to disable)
    type: number
    default: 0

  # Filament Options
  filamentDiameter:
    description: Diameter in mm of your raw filament
    type: number
    default: 3

  extrusionMultiplier:
    description: >
      Change this to alter the amount of plastic extruded.
      There should be very little need to change this value,
      which is only useful to compensate for filament packing
    type: number
    default: 1

  temperature:
    description: Extrusion temperature in degree Celsius (set 0 to disable)
    type: number
    default: 200

  firstLayerTemperature:
    description: >
      Extrusion temperature for the first layer in degree Celsius,
      (set 0 to disable)
    default: 200
    type: number

  bedTemperature:
    description: Heated bed temperature in degree Celsius (set 0 to disable)
    type: number
    default: 0

  firstLayerBedTemperature:
    description: >
      Heated bed temperature for the first layer in degree Celsius
      (set 0 to disable)
    default: 0
    type: number
  # Speed options
  travelSpeed:
    description: Speed of non-print moves in mm/s
    type: number
    default: 130

  perimeterSpeed:
    description: Speed of print moves for perimeters in mm/s
    type: number
    default: 30

  smallPerimeterSpeed:
    description: >
      Speed of print moves for small perimeters in mm/s
      or % over perimeter speed
    oneOf:
      - type: number
      - type: string
    default: 30
    type: number

  externalPerimeterSpeed:
    description: >
      Speed of print moves for the external perimeter in mm/s
      or % over perimeter speed
    oneOf:
      - type: number
      - type: string
    default: 70%
    type: number

  infillSpeed:
    description: Speed of print moves in mm/s
    type: number
    default: 60

  solidInfillSpeed:
    description: >
      Speed of print moves for solid surfaces in mm/s
      or % over infill speed
    anyOf:
      - type: number
      - type: string
    default: 60
    type: number

  topSolidInfillSpeed:
    description: >
      Speed of print moves for top surfaces in mm/s
      or % over solid infill speed
    anyOf:
      - type: number
      - type: string
    default: 50
    type: number

  supportMaterialSpeed:
    description: Speed of support material print moves in mm/s
    type: number
    default: 60

  supportMaterialInterfaceSpeed:
    description: >
      Speed of support material interface print moves in mm/s
      or % over support material speed
    anyOf:
      - type: number
      - type: string
    default: 100%
    type: number

  bridgeSpeed:
    description: Speed of bridge print moves in mm/s
    type: number
    default: 60

  gapFillSpeed:
    description: Speed of gap fill print moves in mm/s
    type: number
    default: 20

  firstLayerSpeed:
    description: >
      Speed of print moves for bottom layer,
      expressed either as an absolute value
      or as a percentage over normal speeds
    anyOf:
      - type: number
      - type: string
    default: 30%
    type: number

  # Acceleration Options
  perimeterAcceleration:
    description: >
      Overrides firmware's default acceleration for perimeters in mm/s^2
      (set zero to disable)
    type: number
    default: 0

  infillAcceleration:
    description: >
      Overrides firmware's default acceleration for infill in mm/s^2
      (set zero to disable)
    type: number
    default: 0

  bridgeAcceleration:
    description: >
      Overrides firmware's default acceleration for bridges in mm/s^2
      (set zero to disable)
    type: number
    default: 0

  firstLayerAcceleration:
    description: >
      Overrides firmware's default acceleration for first layer in mm/s^2
      (set zero to disable)
    type: number
    default: 0

  defaultAcceleration:
    description: >
      Acceleration will be reset to this value in mm/s^2
      after the specific settings above have been applied.
      (set zero to disable).
      This is the acceleration your printer will be reset to after
      the role-specific acceleration values are used (perimeter/infill).
      Set zero to prevent resetting acceleration at all.
    type: number
    default: 0

  # Accuracy Options:
  layerHeight:
    description: Layer height in mm
    type: number
    default: 0.4

  firstLayerHeight:
    description: Layer height for first layer in mm or %
    anyOf:
      - type: number
      - type: string
    default: 0.35
    type: number

  infillEveryLayers:
    description: Infill every N layers
    type: number
    default: 1

  solidInfillEveryLayers:
    description: Force a solid layer every N layers
    type: number
    default: 0

  # Print Options
  perimeters:
    description: Number of perimeters/horizontal skins
    type: number
    minimum: 0
    default: 3

  topSolidLayers:
    description: Number of solid layers to do for top surfaces
    type: number
    minimum: 0
    default: 3

  bottomSolidLayers:
    description: Number of solid layers to do for bottom surfaces
    minimum: 0
    default: 3
    type: number

  solidLayers:
    description: Shortcut for setting the two options above at once
    type: boolean

  fillDensity:
    description: Infill density
    type: number
    minimum: 0
    maximum: 1
    default: 0.4

  fillAngle:
    description: Infill angle in degrees
    type: number
    minimum: 0
    maximum: 90
    default: 45

  fillPattern:
    description: Pattern to use to fill nonSolid layers
    type: string
    default: honeycomb

  solidFillPattern:
    description: Pattern to use to fill solid layers
    type: string
    default: rectilinear

  startGCode:
    description: >
      Load initial GCode from the supplied file.
      This will overwrite the default command (home all axes [G28]).
    type: boolean

  endGCode:
    description: >
      Load final GCode from the supplied file.
      This will overwrite the default commands
      (turn off temperature [M104 S0],
      home X axis [G28 X], disable motors [M84]).
    type: boolean

  layerGCode:
    description: Load layer-change GCode from the supplied file
    type: boolean

  toolchangeGCode:
    description: Load toolChange GCode from the supplied file
    type: boolean

  seamPosition:
    description: Position of loop starting points
    enum:
      - random
      - nearest
      - aligned
    default: aligned
    type: string

  externalPerimetersFirst:
    description: Reverse perimeter order
    type: boolean
    default: false

  spiralVase:
    description: >
      Experimental option to raise Z gradually
      when printing singleWalled vases
    type: boolean
    default: false

  onlyRetractWhenCrossingPerimeters:
    description: >
      Disable retraction when travelling between
      infill paths inside the same island.
    type: boolean
    default: false

  solidInfillBelowArea:
    description: >
      Force solid infill when a region has a smaller area
      than this threshold in mm^2
    type: number
    default: 70

  infillOnlyWhereNeeded:
    description: Only infill under ceilings
    type: boolean
    default: false

  infillFirst:
    description: Make infill before perimeters
    type: boolean
    default: false

  # Quality options (slower slicing)
  extraPerimeters:
    description: Add more perimeters when needed
    type: boolean
    default: true

  avoidCrossingPerimeters:
    description: Optimize travel moves so that no perimeters are crossed
    type: boolean
    default: false

  thinWalls:
    description: Detect single-width walls
    type: boolean
    default: true

  overhangs:
    description: >
      Experimental option to use bridge flow,
      speed and fan for overhangs
    type: boolean
    default: true

  # Support material options
  supportMaterial:
    description: Generate support material for overhangs
    type: boolean

  supportMaterialThreshold:
    description: Overhang threshold angle (set 0 for automatic detection)
    type: number
    minimum: 0
    maximum: 90
    default: 0

  supportMaterialPattern:
    description: Pattern to use for support material
    type: string
    default: pillars

  supportMaterialSpacing:
    description: Spacing between pattern lines in mm
    type: number
    default: 2.5

  supportMaterialAngle:
    description: Support material angle in degrees
    type: number
    minimum: 0
    maximum: 90
    default: 0

  supportMaterialInterfaceLayers:
    description: >
      Number of perpendicular layers between
      support material and object
    type: number
    minimum: 0
    default: 3

  supportMaterialInterfaceSpacing:
    description: >
      Spacing between interface pattern lines in mm
      (set 0 to get a solid layer)
    type: number
    default: 0

  raftLayers:
    description: Number of layers to raise the printed objects by
    type: number
    minimum: 0
    default: 0

  supportMaterialEnforceLayers:
    description: >
      Enforce support material on the specified number of layers from bottom,
      regardless of support-material and threshold
    type: number
    minimum: 0
    default: 0

  dontSupportBridges:
    description: >
      Experimental option for preventing support-material
      from being generated under bridged areas
    type: boolean
    default: true

  # Retraction options:
  retractLength:
    description: Length of retraction in mm when pausing extrusion
    type: number
    default: 1

  retractSpeed:
    description: Speed for retraction in mm/s
    type: number
    default: 30

  retractRestartExtra:
    description: >
      Additional amount of filament in mm
      to push after compensating retraction
    type: number
    default: 0

  retractBeforeTravel:
    description: Only retract before travel moves of this length in mm
    type: number
    default: 2

  retractLift:
    description: Lift Z by the given distance in mm when retracting
    type: number
    default: 0

  retractLayerChange:
    description: Enforce a retraction before each Z move
    type: boolean
    default: true

  wipe:
    description: Wipe the nozzle while doing a retraction
    type: boolean
    default: false

  # Retraction options for multi-extruder setups
  retractLengthToolchange:
    description: >
      Length of retraction in mm when disabling tool.
      When retraction is triggered before changing tool,
      filament is pulled back by the specified amount
      (the length is measured on raw filament, before it enters the extruder).
    type: number
    default: 10

  retractRestartExtraToolchange:
    description: >
      Additional amount of filament in mm
      to push after switching tool
    type: number
    default: 0

  # Cooling options:
  cooling:
    description: Enable fan and cooling control
    type: boolean

  minFanSpeed:
    description: Minimum fan speed
    type: number
    minimum: 0
    maximum: 1
    default: 0.35

  maxFanSpeed:
    description: Maximum fan speed
    type: number
    minimum: 0
    maximum: 1
    default: 1

  bridgeFanSpeed:
    description: Fan speed to use when bridging
    type: number
    minimum: 0
    maximum: 1
    default: 1

  fanBelowLayerTime:
    description: >
      Enable fan if layer print time is below
      this approximate number of seconds
    type: number
    default: 60

  slowdownBelowLayerTime:
    description: >
      Slow down if layer print time is below
      this approximate number of seconds
    type: number
    default: 30

  minPrintSpeed:
    description: Minimum print speed in mm/s
    type: number
    default: 10

  disableFanFirstLayers:
    description: Disable fan for the first n layers
    type: number
    default: 1

  fanAlwaysOn:
    description: >
      Keep fan always on at min fan speed,
      even for layers that don't need cooling
    type: boolean

  # Skirt options:
  skirts:
    description: Number of skirts to draw
    type: number
    minimum: 0
    default: 1

  skirtDistance:
    description: Distance in mm between innermost skirt and object
    type: number
    default: 6

  skirtHeight:
    description: Height of skirts to draw (expressed in layers)
    type: number
    minimum: 0
    default: 1

  minSkirtLength:
    description: >
      Generate no less than the number of loops required to consume
      this length of filament on the first layer, for each extruder in mm
    type: number
    minimum: 0
    default: 0

  brimWidth:
    description: >
      Width of the brim in mm that will get added to
      each object to help adhesion
    type: number
    default: 0

  # Transform options:
  scale:
    description: Factor for scaling input object
    type: number
    default: 1

  rotate:
    description: Rotation angle in degrees
    type: number
    minimum: 0
    maximum: 360
    default: 0

  duplicate:
    description: Number of items with autoArrange
    type: number
    minimum: 1
    default: 1

  duplicateGrid:
    description: Number of items with grid arrangement
    type: string
    default: 1,1

  duplicateDistance:
    description: Distance in mm between copies
    type: number
    default: 6

  xySizeCompensation:
    description: Grow/shrink objects by the configured absolute distance in mm
    default: 0

  # Sequential printing options
  completeObjects:
    description: >
      When printing multiple objects and/or copies,
      complete each one before starting the next one
      (watch out for extruder collisions)
    type: boolean
    default: false

  extruderClearanceRadius:
    description: >
      Radius in mm above which extruder
      won't collide with anything
    type: number
    default: 20

  extruderClearanceHeight:
    description: >
      Maximum vertical extruder depth.
      I.e. vertical distance from extruder tip and carriage bottom
    type: number
    default: 20

  # Miscellaneous options
  notes:
    description: Notes to be added as comments to the output file
    type: string
    default: ""

  resolution:
    description: >
      Minimum detail resolution in mm
      (set 0 for full resolution)
    type: number
    default: 0

  bedSize:
    description: Bed size in mm (only used for auto-arrange)
    type: object
    properties:
      width:
        type: number
        default: 200
      height:
        type: number
        default: 200

  # Flow options (advanced)
  extrusionWidth:
    description: >
      Set extrusion width manually.
      It accepts either an absolute value in mm (like 0.65)
      or a percentage over layer height (like 200%).
      If left to zero, width gets calculated automatically.
    oneOf:
      - type: number
      - type: string
    default: 0

  firstLayerExtrusionWidth:
    description: >
      Set a different extrusion width for first layer.
      When printing with very low layer heights,
      you might still want to print a thicker bottom layer to improve adhesion
      and tolerance for non perfect build plates.
      This can be expressed as an absolute value in mm or as a percentage
      (for example: 150%) over the default layer height.
    oneOf:
      - type: number
      - type: string
    default: 0

  perimeterExtrusionWidth:
    description: >
      Set this to a non-zero value in mm to set a manual extrusion width
      for perimeters.
      You may want to use thinner extrudates to get more accurate surfaces.
      If expressed as percentage (for example 200%)
      it will be computed over layer height.
    oneOf:
      - type: number
      - type: string
    default: 0

  externalPerimeterExtrusionWidth:
    description: >
      Set a different extrusion width for external perimeters.
      Set this to a non-zero value to set a manual extrusion width in mm
      for external perimeters.
      If left 0, an automatic value will be used that maximizes accuracy
      of the external visible surfaces.
      If expressed as percentage (for example 200%)
      it will be computed over layer height.
    oneOf:
      - type: number
      - type: string
    default: 0

  infillExtrusionWidth:
    description: >
      Set a different extrusion width for infill.
      Set this to a non-zero value to set a manual extrusion width
      in mm for infill.
      You may want to use fatter extrudates to speed up the infill
      and make your parts stronger.
      If expressed as percentage (for example 90%)
      it will be computed over layer height.
    oneOf:
      - type: number
      - type: string
    default: 0

  solidInfillExtrusionWidth:
    description: >
      Set a different extrusion width for solid infill.
      Set this to a non-zero value to set a manual extrusion width
      in mm for infill for solid surfaces.
      If expressed as percentage (for example 90%)
      it will be computed over layer height.
    oneOf:
      - type: number
      - type: string
    default: 0

  topInfillExtrusionWidth:
    description: >
      Set a different extrusion width for top infill.
      Set this to a non-zero value to set a manual extrusion width
      in mm for infill for top surfaces.
      You may want to use thinner extrudates to fill all narrow regions and
      get a smoother finish.
      If expressed as percentage (for example 90%)
      it will be computed over layer height.
    oneOf:
      - type: number
      - type: string
    default: 0

  supportMaterialExtrusionWidth:
    description: >
      Set a different extrusion width for support material.
      Set this to a non-zero value to set a manual extrusion width
      in mm for support material.
      If expressed as percentage (for example 90%)
      it will be computed over layer height.
    oneOf:
      - type: number
      - type: string
    default: 0

  bridgeFlowRatio:
    description: >
      Multiplier for extrusion when bridging.
      This factor affects the amount of plastic for bridging.
      You can decrease it slightly to pull the extrudates and prevent sagging,
      although default settings are usually good and you should experiment
      with cooling (use a fan) before tweaking this.
    type: number
    minimum: 0
    exclusiveMinimum: true
    default: 1

  # Multiple extruder options:
  extruderOffset:
    description: >
      Offset of each extruder if firmware doesn't handle the displacement
      (can be specified multiple times).
      If your firmware doesn't handle the extruder displacement you need
      the G-code to take it into account.
      This option lets you specify the displacement of each extruder with
      respect to the first one. It expects positive coordinates
      (they will be subtracted from the XY coordinate).
    type: object
    properties:
      x:
        type: number
        default: 0
      y:
        type: number
        default: 0

  perimeterExtruder:
    description: Extruder to use for perimeters
    type: number
    minimum: 1
    default: 1

  infillExtruder:
    description: Extruder to use for infill
    type: number
    minimum: 1
    default: 1

  solidInfillExtruder:
    description: Extruder to use for solid infill
    type: number
    minimum: 1
    default: 1

  supportMaterialExtruder:
    description: Extruder to use for support material
    type: number
    minimum: 1
    default: 1

  supportMaterialInterfaceExtruder:
    description: Extruder to use for support material interface
    type: number
    minimum: 1
    default: 1

  oozePrevention:
    description: >
      Drop temperature and park extruders outside a full
      skirt for automatic wiping
    type: boolean
    default: false

  standbyTemperatureDelta:
    description: >
      Temperature difference to be applied when an extruder
      is not active and ooze-prevention is enabled
    type: number
    minimum: -400
    maximum: 400
    default: -5
