Calculiva Cut Planner

Plans flooring, trim and wallpaper orders from computed cut layouts. Free, read-only, no account.

사용해야 할까요

품질 및 안전성

A
설명 품질
100%
스키마 완전성
89%
이름 품질
85%
오염 위험
100%
권한 일치
100%
프로토콜 준수
100%

도구 정의와 프로토콜 준수에 대한 자동 분석을 기반으로 합니다.

컨텍스트 비용

~16,616토큰 (도구 정의)
~42.4 KB일반적인 응답 크기
상당한 주의 영향 (128k 컨텍스트의 12.98%)

이는 서버의 도구가 모델의 컨텍스트에 로드될 때마다 소비되는 대략적인 토큰 수입니다. 수치가 높을수록 다른 작업에 사용할 수 있는 주의가 줄어듭니다.

설치

원클릭 설치

`claude_desktop_config.json` 파일에 다음을 추가하세요:

{
  "mcpServers": {
    "cut-planner": {
      "url": "https://mcp.calculiva.com/mcp"
    }
  }
}

원격 엔드포인트

https://mcp.calculiva.com/mcpstreamable-http

할 수 있는 일

도구 목록

도구 (4)

🟢 읽기 전용🟡 쓰기🔴 삭제⚪ 알 수 없음
🟢plan_trim_order(project, wallWidth, wallHeight, baseboardHeight, openings, ...)

Plans board and batten, wainscoting or picture frame molding on one wall: spacing, the cut list (miter long and short points for frames) and how many boards of each retail length to buy, with the total length bought and offcut percentage for each stock length; the length to buy is the one that buys the least total length, then the least offcut, then the fewest boards. The cut plan is first-fit decreasing: feasible, not proven optimal. Lengths accept feet and inches. Returns a link to the full plan on calculiva.com.

입력 스키마

{
  "type": "object",
  "properties": {
    "project": {
      "type": "string",
      "enum": [
        "board-and-batten",
        "wainscoting",
        "picture-frame-molding"
      ],
      "description": "board-and-batten, wainscoting (applied frames or stile and rail) or picture-frame-molding (boxes of 45° mitered molding)."
    },
    "wallWidth": {
      "anyOf": [
        {
          "type": "string",
          "minLength": 1,
          "maxLength": 80
        },
        {
          "type": "number",
          "minimum": 0
        }
      ],
      "description": "Wall width. Length with its unit, e.g. \"12 ft 6 in\", \"12'6\\\"\", \"150 in\", \"3m80\"; a bare number is read as inches."
    },
    "wallHeight": {
      "anyOf": [
        {
          "type": "string",
          "minLength": 1,
          "maxLength": 80
        },
        {
          "type": "number",
          "minimum": 0
        }
      ],
      "description": "Wall height, floor to ceiling. Length with its unit, e.g. \"12 ft 6 in\", \"12'6\\\"\", \"150 in\", \"3m80\"; a bare number is read as inches."
    },
    "baseboardHeight": {
      "anyOf": [
        {
          "type": "string",
          "minLength": 1,
          "maxLength": 80
        },
        {
          "type": "number",
          "minimum": 0
        }
      ],
      "description": "Existing baseboard height; \"0\" if none. Default 5 1/4 in. Length with its unit, e.g. \"12 ft 6 in\", \"12'6\\\"\", \"150 in\", \"3m80\"; a bare number is read as inches."
    },
    "openings": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "position": {
            "anyOf": [
              {
                "type": "string",
                "minLength": 1,
                "maxLength": 80
              },
              {
                "type": "number",
                "minimum": 0
              }
            ],
            "description": "Distance from the left end of the wall to the left edge of the opening or obstacle. Length with its unit, e.g. \"12 ft 6 in\", \"12'6\\\"\", \"150 in\", \"3m80\"; a bare number is read as inches."
          },
          "width": {
            "anyOf": [
              {
                "type": "string",
                "minLength": 1,
                "maxLength": 80
              },
              {
                "type": "number",
                "minimum": 0
              }
            ],
            "description": "Width of the opening or obstacle (window, door, outlet, switch). Length with its unit, e.g. \"12 ft 6 in\", \"12'6\\\"\", \"150 in\", \"3m80\"; a bare number is read as inches."
          },
          "label": {
            "type": "string",
            "maxLength": 40,
            "description": "Name shown in the plan, e.g. \"window\""
          }
        },
        "required": [
          "position",
          "width"
        ],
        "additionalProperties": false
      },
      "maxItems": 4,
      "description": "Up to 4 openings or obstacles on the wall; pieces that land on them are flagged and left out of the cut list."
    },
    "stockLengthsFt": {
      "type": "array",
      "items": {
        "type": "number",
        "exclusiveMinimum": 0,
        "maximum": 24
      },
      "minItems": 1,
      "maxItems": 8,
      "description": "Board lengths you can buy, in feet (1 to 8 values, each up to 24). Default: 8, 10, 12 and 16 ft are compared and any of them can be recommended; pass the lengths your store sells to plan on those."
    },
    "kerf": {
      "anyOf": [
        {
          "type": "string",
          "minLength": 1,
          "maxLength": 80
        },
        {
          "type": "number",
          "minimum": 0
        }
      ],
      "description": "Saw kerf, charged between two cuts on the same board. Default 1/8 in. Length with its unit, e.g. \"12 ft 6 in\", \"12'6\\\"\", \"150 in\", \"3m80\"; a bare number is read as inches."
    },
    "extraPercent": {
      "type": "number",
      "minimum": 0,
      "maximum": 100,
      "description": "Extra boards to buy, % of the boards in the cut plan. Default 10."
    },
    "battenWidth": {
      "anyOf": [
        {
          "type": "string",
          "minLength": 1,
          "maxLength": 80
        },
        {
          "type": "number",
          "minimum": 0
        }
      ],
      "description": "board-and-batten: actual batten width (a 1x3 is 2 1/2 in). Default 2 1/2 in. Length with its unit, e.g. \"12 ft 6 in\", \"12'6\\\"\", \"150 in\", \"3m80\"; a bare number is read as inches."
    },
    "battenCount": {
      "type": "integer",
      "minimum": 1,
      "maximum": 400,
      "description": "board-and-batten: number of battens. Omit to use battenSpacing."
    },
    "battenSpacing": {
      "anyOf": [
        {
          "type": "string",
          "minLength": 1,
          "maxLength": 80
        },
        {
          "type": "number",
          "minimum": 0
        }
      ],
      "description": "board-and-batten: target gap between battens, used when battenCount is omitted. Default 12 in. Length with its unit, e.g. \"12 ft 6 in\", \"12'6\\\"\", \"150 in\", \"3m80\"; a bare number is read as inches."
    },
    "edge": {
      "type": "string",
      "enum": [
        "space",
        "batten"
      ],
      "description": "board-and-batten: start and end the wall with a space (default) or with a batten."
    },
    "layout": {
      "type": "string",
      "enum": [
        "vertical",
        "grid"
      ],
      "description": "board-and-batten: vertical battens (default) or a grid with horizontal rails."
    },
    "railCount": {
      "type": "integer",
      "minimum": 1,
      "maximum": 20,
      "description": "board-and-batten grid: horizontal rails per bay. Default 2."
    },
    "fullHeight": {
      "type": "boolean",
      "description": "board-and-batten: battens run to the ceiling. Default false."
    },
    "topRailHeight": {
      "anyOf": [
        {
          "type": "string",
          "minLength": 1,
          "maxLength": 80
        },
        {
          "type": "number",
          "minimum": 0
        }
      ],
      "description": "board-and-batten: height of the top of the top rail from the floor. Default 32 in. Length with its unit, e.g. \"12 ft 6 in\", \"12'6\\\"\", \"150 in\", \"3m80\"; a bare number is read as inches."
    },
    "topRailWidth": {
      "anyOf": [
        {
          "type": "string",
          "minLength": 1,
          "maxLength": 80
        },
        {
          "type": "number",
          "minimum": 0
        }
      ],
      "description": "board-and-batten top rail, or wainscoting stile-and-rail top rail width. Default 3 1/2 in. Length with its unit, e.g. \"12 ft 6 in\", \"12'6\\\"\", \"150 in\", \"3m80\"; a bare number is read as inches."
    },
    "style": {
      "type": "string",
      "enum": [
        "applied-frames",
        "stile-and-rail"
      ],
      "description": "wainscoting: applied molding frames (default) or stiles and rails."
    },
    "wainscotHeight": {
      "anyOf": [
        {
          "type": "string",
          "minLength": 1,
          "maxLength": 80
        },
        {
          "type": "number",
          "minimum": 0
        }
      ],
      "description": "wainscoting: overall height from the floor, chair rail included. Default 32 in. Length with its unit, e.g. \"12 ft 6 in\", \"12'6\\\"\", \"150 in\", \"3m80\"; a bare number is read as inches."
    },
    "chairRailWidth": {
      "anyOf": [
        {
          "type": "string",
          "minLength": 1,
          "maxLength": 80
        },
        {
          "type": "number",
          "minimum": 0
        }
      ],
      "description": "wainscoting: chair rail height (board width). Default 2 1/2 in. Length with its unit, e.g. \"12 ft 6 in\", \"12'6\\\"\", \"150 in\", \"3m80\"; a bare number is read as inches."
    },
    "memberWidth": {
      "anyOf": [
        {
          "type": "string",
          "minLength": 1,
          "maxLength": 80
        },
        {
          "type": "number",
          "minimum": 0
        }
      ],
      "description": "wainscoting: stile width, or side reveal between frames. Default 3 1/2 in. Length with its unit, e.g. \"12 ft 6 in\", \"12'6\\\"\", \"150 in\", \"3m80\"; a bare number is read as inches."
    },
    "panelCount": {
      "type": "integer",
      "minimum": 1,
      "maximum": 60,
      "description": "wainscoting: number of panels or frames. Omit to use panelWidth."
    },
    "panelWidth": {
      "anyOf": [
        {
          "type": "string",
          "minLength": 1,
          "maxLength": 80
        },
        {
          "type": "number",
          "minimum": 0
        }
      ],
      "description": "wainscoting: target panel width, used when panelCount is omitted. Default 30 in. Length with its unit, e.g. \"12 ft 6 in\", \"12'6\\\"\", \"150 in\", \"3m80\"; a bare number is read as inches."
    },
    "revealVertical": {
      "anyOf": [
        {
          "type": "string",
          "minLength": 1,
          "maxLength": 80
        },
        {
          "type": "number",
          "minimum": 0
        }
      ],
      "description": "wainscoting applied-frames: reveal above and below each frame. Default 3 1/2 in. Length with its unit, e.g. \"12 ft 6 in\", \"12'6\\\"\", \"150 in\", \"3m80\"; a bare number is read as inches."
    },
    "bottomRailWidth": {
      "anyOf": [
        {
          "type": "string",
          "minLength": 1,
          "maxLength": 80
        },
        {
          "type": "number",
          "minimum": 0
        }
      ],
      "description": "wainscoting stile-and-rail: bottom rail width. Default 5 1/2 in. Length with its unit, e.g. \"12 ft 6 in\", \"12'6\\\"\", \"150 in\", \"3m80\"; a bare number is read as inches."
    },
    "moldingWidth": {
      "anyOf": [
        {
          "type": "string",
          "minLength": 1,
          "maxLength": 80
        },
        {
          "type": "number",
          "minimum": 0
        }
      ],
      "description": "wainscoting applied-frames (default 1 1/4 in) or picture-frame-molding (default 1 in): molding face width. Length with its unit, e.g. \"12 ft 6 in\", \"12'6\\\"\", \"150 in\", \"3m80\"; a bare number is read as inches."
    },
    "hasCap": {
      "type": "boolean",
      "description": "picture-frame-molding: a chair rail caps the boxes (default true); false = boxes run to the ceiling."
    },
    "capHeight": {
      "anyOf": [
        {
          "type": "string",
          "minLength": 1,
          "maxLength": 80
        },
        {
          "type": "number",
          "minimum": 0
        }
      ],
      "description": "picture-frame-molding: height of the underside of the chair rail. Default 36 in. Length with its unit, e.g. \"12 ft 6 in\", \"12'6\\\"\", \"150 in\", \"3m80\"; a bare number is read as inches."
    },
    "columns": {
      "type": "integer",
      "minimum": 1,
      "maximum": 40,
      "description": "picture-frame-molding: boxes across. Default 4."
    },
    "rows": {
      "type": "integer",
      "minimum": 1,
      "maximum": 10,
      "description": "picture-frame-molding: rows of boxes. Default 1."
    },
    "gapX": {
      "anyOf": [
        {
          "type": "string",
          "minLength": 1,
          "maxLength": 80
        },
        {
          "type": "number",
          "minimum": 0
        }
      ],
      "description": "picture-frame-molding: gap between boxes. Default 4 in. Length with its unit, e.g. \"12 ft 6 in\", \"12'6\\\"\", \"150 in\", \"3m80\"; a bare number is read as inches."
    },
    "gapY": {
      "anyOf": [
        {
          "type": "string",
          "minLength": 1,
          "maxLength": 80
        },
        {
          "type": "number",
          "minimum": 0
        }
      ],
      "description": "picture-frame-molding: gap between rows. Default 4 in. Length with its unit, e.g. \"12 ft 6 in\", \"12'6\\\"\", \"150 in\", \"3m80\"; a bare number is read as inches."
    },
    "edgeX": {
      "anyOf": [
        {
          "type": "string",
          "minLength": 1,
          "maxLength": 80
        },
        {
          "type": "number",
          "minimum": 0
        }
      ],
      "description": "picture-frame-molding: side margin. Default 4 in. Length with its unit, e.g. \"12 ft 6 in\", \"12'6\\\"\", \"150 in\", \"3m80\"; a bare number is read as inches."
    },
    "edgeTop": {
      "anyOf": [
        {
          "type": "string",
          "minLength": 1,
          "maxLength": 80
        },
        {
          "type": "number",
          "minimum": 0
        }
      ],
      "description": "picture-frame-molding: top margin. Default 4 in. Length with its unit, e.g. \"12 ft 6 in\", \"12'6\\\"\", \"150 in\", \"3m80\"; a bare number is read as inches."
    },
    "edgeBottom": {
      "anyOf": [
        {
          "type": "string",
          "minLength": 1,
          "maxLength": 80
        },
        {
          "type": "number",
          "minimum": 0
        }
      ],
      "description": "picture-frame-molding: bottom margin. Default 4 in. Length with its unit, e.g. \"12 ft 6 in\", \"12'6\\\"\", \"150 in\", \"3m80\"; a bare number is read as inches."
    }
  },
  "required": [
    "project",
    "wallWidth",
    "wallHeight"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}

출력 스키마

{
  "type": "object",
  "properties": {
    "project": {
      "type": "string",
      "enum": [
        "board-and-batten",
        "wainscoting",
        "picture-frame-molding"
      ]
    },
    "buy": {
      "anyOf": [
        {
          "type": "object",
          "properties": {
            "stockLengthFt": {
              "type": "number"
            },
            "boardsToBuy": {
              "type": "integer"
            },
            "boardsInPlan": {
              "$ref": "#/properties/buy/anyOf/0/properties/boardsToBuy"
            },
            "extraBoards": {
              "$ref": "#/properties/buy/anyOf/0/properties/boardsToBuy"
            },
            "boughtFt": {
              "$ref": "#/properties/buy/anyOf/0/properties/stockLengthFt"
            },
            "offcutPercent": {
              "$ref": "#/properties/buy/anyOf/0/properties/stockLengthFt"
            }
          },
          "required": [
            "stockLengthFt",
            "boardsToBuy",
            "boardsInPlan",
            "extraBoards",
            "boughtFt",
            "offcutPercent"
          ],
          "additionalProperties": false
        },
        {
          "type": "null"
        }
      ],
      "description": "Boards to buy: the best stock length by comparisonRule; null when no length holds the longest piece."
    },
    "noStockFits": {
      "anyOf": [
        {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        {
          "type": "null"
        }
      ]
    },
    "stockComparison": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "stockLengthFt": {
            "$ref": "#/properties/buy/anyOf/0/properties/stockLengthFt"
          },
          "feasible": {
            "type": "boolean"
          },
          "boardsToBuy": {
            "anyOf": [
              {
                "$ref": "#/properties/buy/anyOf/0/properties/boardsToBuy"
              },
              {
                "type": "null"
              }
            ]
          },
          "boughtFt": {
            "type": [
              "number",
              "null"
            ]
          },
          "offcutPercent": {
            "type": [
              "number",
              "null"
            ]
          }
        },
        "required": [
          "stockLengthFt",
          "feasible",
          "boardsToBuy",
          "boughtFt",
          "offcutPercent"
        ],
        "additionalProperties": false
      }
    },
    "comparisonRule": {
      "type": "string",
      "description": "The ranking used for every \"better\" statement in this result; a tie recommends nothing."
    },
    "cutList": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "label": {
            "$ref": "#/properties/noStockFits/anyOf/0/items"
          },
          "qty": {
            "$ref": "#/properties/buy/anyOf/0/properties/boardsToBuy"
          },
          "length": {
            "$ref": "#/properties/noStockFits/anyOf/0/items"
          }
        },
        "required": [
          "label",
          "qty",
          "length"
        ],
        "additionalProperties": false
      }
    },
    "layout": {
      "type": "object",
      "properties": {
        "battens": {
          "$ref": "#/properties/buy/anyOf/0/properties/boardsToBuy"
        },
        "battensToInstall": {
          "$ref": "#/properties/buy/anyOf/0/properties/boardsToBuy"
        },
        "battensOnOpenings": {
          "$ref": "#/properties/buy/anyOf/0/properties/boardsToBuy"
        },
        "gap": {
          "$ref": "#/properties/noStockFits/anyOf/0/items"
        },
        "spacerBlock": {
          "$ref": "#/properties/noStockFits/anyOf/0/items"
        },
        "battenLength": {
          "$ref": "#/properties/noStockFits/anyOf/0/items"
        },
        "horizontalRailsPerBay": {
          "$ref": "#/properties/buy/anyOf/0/properties/boardsToBuy"
        },
        "railSpacing": {
          "$ref": "#/properties/noStockFits/anyOf/0/items"
        },
        "style": {
          "$ref": "#/properties/noStockFits/anyOf/0/items"
        },
        "panels": {
          "$ref": "#/properties/buy/anyOf/0/properties/boardsToBuy"
        },
        "panelWidth": {
          "$ref": "#/properties/noStockFits/anyOf/0/items"
        },
        "panelHeight": {
          "$ref": "#/properties/noStockFits/anyOf/0/items"
        },
        "stiles": {
          "$ref": "#/properties/buy/anyOf/0/properties/boardsToBuy"
        },
        "reveals": {
          "$ref": "#/properties/buy/anyOf/0/properties/boardsToBuy"
        },
        "boxes": {
          "$ref": "#/properties/buy/anyOf/0/properties/boardsToBuy"
        },
        "boxesOnObstacles": {
          "$ref": "#/properties/buy/anyOf/0/properties/boardsToBuy"
        },
        "columns": {
          "$ref": "#/properties/buy/anyOf/0/properties/boardsToBuy"
        },
        "rows": {
          "$ref": "#/properties/buy/anyOf/0/properties/boardsToBuy"
        },
        "boxWidth": {
          "$ref": "#/properties/noStockFits/anyOf/0/items"
        },
        "boxHeight": {
          "$ref": "#/properties/noStockFits/anyOf/0/items"
        }
      },
      "additionalProperties": false
    },
    "miter": {
      "anyOf": [
        {
          "type": "object",
          "properties": {
            "frames": {
              "$ref": "#/properties/buy/anyOf/0/properties/boardsToBuy"
            },
            "rail": {
              "type": "object",
              "properties": {
                "perFrame": {
                  "$ref": "#/properties/buy/anyOf/0/properties/boardsToBuy"
                },
                "longPoint": {
                  "$ref": "#/properties/noStockFits/anyOf/0/items"
                },
                "shortPoint": {
                  "$ref": "#/properties/noStockFits/anyOf/0/items"
                }
              },
              "required": [
                "perFrame",
                "longPoint",
                "shortPoint"
              ],
              "additionalProperties": false
            },
            "stile": {
              "$ref": "#/properties/miter/anyOf/0/properties/rail"
            }
          },
          "required": [
            "frames",
            "rail",
            "stile"
          ],
          "additionalProperties": false
        },
        {
          "type": "null"
        }
      ]
    },
    "linearFeet": {
      "$ref": "#/properties/buy/anyOf/0/properties/stockLengthFt"
    },
    "wallAreaSqFt": {
      "$ref": "#/properties/buy/anyOf/0/properties/stockLengthFt"
    },
    "kerf": {
      "$ref": "#/properties/noStockFits/anyOf/0/items"
    },
    "extraPercent": {
      "$ref": "#/properties/buy/anyOf/0/properties/stockLengthFt"
    },
    "optimal": {
      "$ref": "#/properties/stockComparison/items/properties/feasible"
    },
    "method": {
      "$ref": "#/properties/noStockFits/anyOf/0/items"
    },
    "warnings": {
      "type": "array",
      "items": {
        "$ref": "#/properties/noStockFits/anyOf/0/items"
      }
    },
    "shareUrl": {
      "$ref": "#/properties/noStockFits/anyOf/0/items"
    },
    "shareUrlComplete": {
      "$ref": "#/properties/stockComparison/items/properties/feasible"
    }
  },
  "required": [
    "project",
    "buy",
    "noStockFits",
    "stockComparison",
    "comparisonRule",
    "cutList",
    "layout",
    "miter",
    "linearFeet",
    "wallAreaSqFt",
    "kerf",
    "extraPercent",
    "optimal",
    "method",
    "warnings",
    "shareUrl",
    "shareUrlComplete"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢plan_wallpaper_order(walls, openings, rollWidth, rollLength, repeat, ...)

Counts the wallpaper rolls to buy from the walls, doors and windows and the roll label (width, length, pattern repeat, match): drops per roll, every cut placed on its roll, match waste, and the straight / half-drop / random comparison. Lengths accept feet and inches. Returns a link to the full plan on calculiva.com.

입력 스키마

{
  "type": "object",
  "properties": {
    "walls": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "width": {
            "anyOf": [
              {
                "type": "string",
                "minLength": 1,
                "maxLength": 80
              },
              {
                "type": "number",
                "minimum": 0
              }
            ],
            "description": "Wall width. Length with its unit, e.g. \"12 ft 6 in\", \"12'6\\\"\", \"150 in\", \"3m80\"; a bare number is read as inches."
          },
          "height": {
            "anyOf": [
              {
                "type": "string",
                "minLength": 1,
                "maxLength": 80
              },
              {
                "type": "number",
                "minimum": 0
              }
            ],
            "description": "Wall height. Length with its unit, e.g. \"12 ft 6 in\", \"12'6\\\"\", \"150 in\", \"3m80\"; a bare number is read as inches."
          }
        },
        "required": [
          "width",
          "height"
        ],
        "additionalProperties": false
      },
      "minItems": 1,
      "maxItems": 12,
      "description": "Walls to paper, 1 to 12."
    },
    "openings": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "wall": {
            "type": "integer",
            "minimum": 1,
            "maximum": 12,
            "description": "Wall number (1 = first wall). Default 1."
          },
          "width": {
            "anyOf": [
              {
                "type": "string",
                "minLength": 1,
                "maxLength": 80
              },
              {
                "type": "number",
                "minimum": 0
              }
            ],
            "description": "Opening width. Length with its unit, e.g. \"12 ft 6 in\", \"12'6\\\"\", \"150 in\", \"3m80\"; a bare number is read as inches."
          },
          "height": {
            "anyOf": [
              {
                "type": "string",
                "minLength": 1,
                "maxLength": 80
              },
              {
                "type": "number",
                "minimum": 0
              }
            ],
            "description": "Opening height. Length with its unit, e.g. \"12 ft 6 in\", \"12'6\\\"\", \"150 in\", \"3m80\"; a bare number is read as inches."
          },
          "fromLeft": {
            "anyOf": [
              {
                "type": "string",
                "minLength": 1,
                "maxLength": 80
              },
              {
                "type": "number",
                "minimum": 0
              }
            ],
            "description": "Distance from the left end of the wall to the opening. Length with its unit, e.g. \"12 ft 6 in\", \"12'6\\\"\", \"150 in\", \"3m80\"; a bare number is read as inches."
          },
          "sillHeight": {
            "anyOf": [
              {
                "type": "string",
                "minLength": 1,
                "maxLength": 80
              },
              {
                "type": "number",
                "minimum": 0
              }
            ],
            "description": "Height of the bottom of the opening from the floor; \"0\" for a door. Default 0. Length with its unit, e.g. \"12 ft 6 in\", \"12'6\\\"\", \"150 in\", \"3m80\"; a bare number is read as inches."
          }
        },
        "required": [
          "width",
          "height",
          "fromLeft"
        ],
        "additionalProperties": false
      },
      "maxItems": 12,
      "description": "Doors and windows; only drops fully crossed by an opening are shortened."
    },
    "rollWidth": {
      "anyOf": [
        {
          "type": "string",
          "minLength": 1,
          "maxLength": 80
        },
        {
          "type": "number",
          "minimum": 0
        }
      ],
      "description": "Roll width, from the label of the roll. Length with its unit, e.g. \"12 ft 6 in\", \"12'6\\\"\", \"150 in\", \"3m80\"; a bare number is read as inches."
    },
    "rollLength": {
      "anyOf": [
        {
          "type": "string",
          "minLength": 1,
          "maxLength": 80
        },
        {
          "type": "number",
          "minimum": 0
        }
      ],
      "description": "Roll length, from the label (e.g. \"33 ft\"). Length with its unit, e.g. \"12 ft 6 in\", \"12'6\\\"\", \"150 in\", \"3m80\"; a bare number is read as inches."
    },
    "repeat": {
      "anyOf": [
        {
          "type": "string",
          "minLength": 1,
          "maxLength": 80
        },
        {
          "type": "number",
          "minimum": 0
        }
      ],
      "description": "Vertical pattern repeat from the label; \"0\" for none. Length with its unit, e.g. \"12 ft 6 in\", \"12'6\\\"\", \"150 in\", \"3m80\"; a bare number is read as inches."
    },
    "match": {
      "type": "string",
      "enum": [
        "straight",
        "half-drop",
        "random"
      ],
      "description": "Pattern match from the label: straight (default), half-drop or random."
    },
    "trim": {
      "anyOf": [
        {
          "type": "string",
          "minLength": 1,
          "maxLength": 80
        },
        {
          "type": "number",
          "minimum": 0
        }
      ],
      "description": "Trim allowance per drop, top and bottom together. Default 4 in. Length with its unit, e.g. \"12 ft 6 in\", \"12'6\\\"\", \"150 in\", \"3m80\"; a bare number is read as inches."
    },
    "deductOpenings": {
      "type": "boolean",
      "description": "Shorten drops over doors and windows (default true)."
    }
  },
  "required": [
    "walls",
    "rollWidth",
    "rollLength",
    "repeat"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}

출력 스키마

{
  "type": "object",
  "properties": {
    "rollsToBuy": {
      "type": "integer"
    },
    "match": {
      "type": "string",
      "enum": [
        "straight",
        "half-drop",
        "random"
      ]
    },
    "dropsPerRoll": {
      "$ref": "#/properties/rollsToBuy"
    },
    "drops": {
      "$ref": "#/properties/rollsToBuy"
    },
    "cuts": {
      "$ref": "#/properties/rollsToBuy"
    },
    "longestCut": {
      "type": "string"
    },
    "cutTotalFt": {
      "type": "number"
    },
    "linearYards": {
      "$ref": "#/properties/cutTotalFt"
    },
    "matchWasteFt": {
      "$ref": "#/properties/cutTotalFt"
    },
    "wastePercent": {
      "$ref": "#/properties/cutTotalFt"
    },
    "wallAreaSqFt": {
      "$ref": "#/properties/cutTotalFt"
    },
    "openingAreaSqFt": {
      "$ref": "#/properties/cutTotalFt"
    },
    "areaMethodRolls": {
      "$ref": "#/properties/rollsToBuy"
    },
    "rolls": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "roll": {
            "$ref": "#/properties/longestCut"
          },
          "cuts": {
            "type": "array",
            "items": {
              "$ref": "#/properties/longestCut"
            }
          },
          "leftover": {
            "$ref": "#/properties/longestCut"
          }
        },
        "required": [
          "roll",
          "cuts",
          "leftover"
        ],
        "additionalProperties": false
      }
    },
    "matchComparison": {
      "type": "array",
      "items": {
        "anyOf": [
          {
            "type": "object",
            "properties": {
              "match": {
                "type": "string",
                "enum": [
                  "straight",
                  "half-drop",
                  "random"
                ]
              },
              "rollsToBuy": {
                "$ref": "#/properties/rollsToBuy"
              },
              "linearYards": {
                "$ref": "#/properties/cutTotalFt"
              },
              "matchWasteFt": {
                "$ref": "#/properties/cutTotalFt"
              }
            },
            "required": [
              "match",
              "rollsToBuy",
              "linearYards",
              "matchWasteFt"
            ],
            "additionalProperties": false
          },
          {
            "type": "object",
            "properties": {
              "match": {
                "type": "string",
                "enum": [
                  "straight",
                  "half-drop",
                  "random"
                ]
              },
              "error": {
                "$ref": "#/properties/longestCut"
              }
            },
            "required": [
              "match",
              "error"
            ],
            "additionalProperties": false
          }
        ]
      },
      "description": "The same walls with each pattern match; the match is printed on the roll label, so this is not a choice."
    },
    "warnings": {
      "type": "array",
      "items": {
        "$ref": "#/properties/longestCut"
      }
    },
    "shareUrl": {
      "$ref": "#/properties/longestCut"
    },
    "shareUrlComplete": {
      "type": "boolean"
    }
  },
  "required": [
    "rollsToBuy",
    "match",
    "dropsPerRoll",
    "drops",
    "cuts",
    "longestCut",
    "cutTotalFt",
    "linearYards",
    "matchWasteFt",
    "wastePercent",
    "wallAreaSqFt",
    "openingAreaSqFt",
    "areaMethodRolls",
    "rolls",
    "matchComparison",
    "warnings",
    "shareUrl",
    "shareUrlComplete"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢plan_flooring_order(rooms, plankLength, plankWidth, planksPerBox, direction, ...)

Plans laminate, vinyl plank (LVP) or engineered plank flooring for 1 to 12 rooms, rectangles or L shapes, with the plank size and planks per carton from the carton: cartons to buy, every cut piece traced to its source plank, offcuts carried from one room to the next, the 8 scenarios (direction x offset 1/3 or 1/2 x reuse, plus aligned joints in the chosen direction when offset 0 is chosen) and the best one when no other ties it (fewest cartons, then least offcut, then fewest planks), and how many planks a flat waste allowance would miss. Up to 3,000 planks per call. Lengths accept feet and inches. Returns a link per room to the full plan on calculiva.com.

입력 스키마

{
  "type": "object",
  "properties": {
    "rooms": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "maxLength": 40,
            "description": "Room name, e.g. \"living room\". Default \"room 1\", \"room 2\"…"
          },
          "width": {
            "anyOf": [
              {
                "type": "string",
                "minLength": 1,
                "maxLength": 80
              },
              {
                "type": "number",
                "minimum": 0
              }
            ],
            "description": "Room width, wall to wall (overall outside dimension for an L). Length with its unit, e.g. \"12 ft 6 in\", \"12'6\\\"\", \"150 in\", \"3m80\"; a bare number is read as inches."
          },
          "length": {
            "anyOf": [
              {
                "type": "string",
                "minLength": 1,
                "maxLength": 80
              },
              {
                "type": "number",
                "minimum": 0
              }
            ],
            "description": "Room length, wall to wall (overall outside dimension for an L). Length with its unit, e.g. \"12 ft 6 in\", \"12'6\\\"\", \"150 in\", \"3m80\"; a bare number is read as inches."
          },
          "notch": {
            "type": "object",
            "properties": {
              "width": {
                "anyOf": [
                  {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 80
                  },
                  {
                    "type": "number",
                    "minimum": 0
                  }
                ],
                "description": "Width of the missing corner rectangle. Length with its unit, e.g. \"12 ft 6 in\", \"12'6\\\"\", \"150 in\", \"3m80\"; a bare number is read as inches."
              },
              "length": {
                "anyOf": [
                  {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 80
                  },
                  {
                    "type": "number",
                    "minimum": 0
                  }
                ],
                "description": "Length of the missing corner rectangle. Length with its unit, e.g. \"12 ft 6 in\", \"12'6\\\"\", \"150 in\", \"3m80\"; a bare number is read as inches."
              },
              "corner": {
                "type": "string",
                "enum": [
                  "top-right",
                  "top-left",
                  "bottom-right",
                  "bottom-left"
                ],
                "description": "Missing corner on the plan. Default top-right."
              }
            },
            "required": [
              "width",
              "length"
            ],
            "additionalProperties": false,
            "description": "L-shaped room: the rectangle missing from one corner of width x length."
          }
        },
        "required": [
          "width",
          "length"
        ],
        "additionalProperties": false
      },
      "minItems": 1,
      "maxItems": 12,
      "description": "Rooms to floor with the same plank, 1 to 12, in laying order unless order is given."
    },
    "plankLength": {
      "anyOf": [
        {
          "type": "string",
          "minLength": 1,
          "maxLength": 80
        },
        {
          "type": "number",
          "minimum": 0
        }
      ],
      "description": "Installed plank length (face), from the carton. Length with its unit, e.g. \"12 ft 6 in\", \"12'6\\\"\", \"150 in\", \"3m80\"; a bare number is read as inches."
    },
    "plankWidth": {
      "anyOf": [
        {
          "type": "string",
          "minLength": 1,
          "maxLength": 80
        },
        {
          "type": "number",
          "minimum": 0
        }
      ],
      "description": "Installed plank width (face), from the carton. Length with its unit, e.g. \"12 ft 6 in\", \"12'6\\\"\", \"150 in\", \"3m80\"; a bare number is read as inches."
    },
    "planksPerBox": {
      "type": "integer",
      "minimum": 1,
      "maximum": 1000,
      "description": "Planks per carton, from the carton label."
    },
    "direction": {
      "type": "string",
      "enum": [
        "horizontal",
        "vertical"
      ],
      "description": "horizontal = planks run along the room width (default); vertical = along the room length."
    },
    "offset": {
      "type": "string",
      "enum": [
        "0",
        "1/3",
        "1/2"
      ],
      "description": "End-joint stagger between rows, as a fraction of the plank: 1/3 (default), 1/2 or 0 (aligned)."
    },
    "reuse": {
      "type": "boolean",
      "description": "Cut a row end from the offcut of a row start in the same room (default true)."
    },
    "carryBetweenRooms": {
      "type": "boolean",
      "description": "Offcuts of a room feed the next rooms (default true)."
    },
    "order": {
      "type": "array",
      "items": {
        "type": "string",
        "maxLength": 40
      },
      "maxItems": 12,
      "description": "Laying order by room name; offcuts only flow forward. Default: the order of rooms."
    },
    "allowancePercent": {
      "type": "number",
      "minimum": 0,
      "maximum": 100,
      "description": "Flat waste allowance you would otherwise buy (e.g. 10): the answer says how many planks it misses."
    },
    "clearance": {
      "anyOf": [
        {
          "type": "string",
          "minLength": 1,
          "maxLength": 80
        },
        {
          "type": "number",
          "minimum": 0
        }
      ],
      "description": "Expansion gap on every wall, from the product instructions. Default 0. Length with its unit, e.g. \"12 ft 6 in\", \"12'6\\\"\", \"150 in\", \"3m80\"; a bare number is read as inches."
    },
    "kerf": {
      "anyOf": [
        {
          "type": "string",
          "minLength": 1,
          "maxLength": 80
        },
        {
          "type": "number",
          "minimum": 0
        }
      ],
      "description": "Saw kerf, charged on each cut. Default 1/8 in. Length with its unit, e.g. \"12 ft 6 in\", \"12'6\\\"\", \"150 in\", \"3m80\"; a bare number is read as inches."
    },
    "balancedRows": {
      "type": "boolean",
      "description": "Split the partial row width between the first and last rows (default true)."
    },
    "firstStarter": {
      "anyOf": [
        {
          "type": "string",
          "minLength": 1,
          "maxLength": 80
        },
        {
          "type": "number",
          "minimum": 0
        }
      ],
      "description": "Length of the first row starter; 0 = full plank. Default 0. Length with its unit, e.g. \"12 ft 6 in\", \"12'6\\\"\", \"150 in\", \"3m80\"; a bare number is read as inches."
    },
    "minStarter": {
      "anyOf": [
        {
          "type": "string",
          "minLength": 1,
          "maxLength": 80
        },
        {
          "type": "number",
          "minimum": 0
        }
      ],
      "description": "Minimum row starter length; 0 disables the check. Default 0. Length with its unit, e.g. \"12 ft 6 in\", \"12'6\\\"\", \"150 in\", \"3m80\"; a bare number is read as inches."
    },
    "minJointSpacing": {
      "anyOf": [
        {
          "type": "string",
          "minLength": 1,
          "maxLength": 80
        },
        {
          "type": "number",
          "minimum": 0
        }
      ],
      "description": "Minimum distance between end joints of adjacent rows; 0 disables the check. Default 0. Length with its unit, e.g. \"12 ft 6 in\", \"12'6\\\"\", \"150 in\", \"3m80\"; a bare number is read as inches."
    },
    "minRowWidth": {
      "anyOf": [
        {
          "type": "string",
          "minLength": 1,
          "maxLength": 80
        },
        {
          "type": "number",
          "minimum": 0
        }
      ],
      "description": "Minimum edge-row width; 0 disables the check. Default 0. Length with its unit, e.g. \"12 ft 6 in\", \"12'6\\\"\", \"150 in\", \"3m80\"; a bare number is read as inches."
    },
    "minReuse": {
      "anyOf": [
        {
          "type": "string",
          "minLength": 1,
          "maxLength": 80
        },
        {
          "type": "number",
          "minimum": 0
        }
      ],
      "description": "Shortest offcut worth carrying to another room. Default 0 (any offcut long enough). Length with its unit, e.g. \"12 ft 6 in\", \"12'6\\\"\", \"150 in\", \"3m80\"; a bare number is read as inches."
    }
  },
  "required": [
    "rooms",
    "plankLength",
    "plankWidth",
    "planksPerBox"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}

출력 스키마

{
  "type": "object",
  "properties": {
    "boxesToBuy": {
      "type": "integer"
    },
    "planksPerBox": {
      "$ref": "#/properties/boxesToBuy"
    },
    "planksToBuy": {
      "$ref": "#/properties/boxesToBuy"
    },
    "sourcePlanks": {
      "$ref": "#/properties/boxesToBuy"
    },
    "sparePlanks": {
      "$ref": "#/properties/boxesToBuy"
    },
    "floorAreaSqFt": {
      "type": "number"
    },
    "wastePercent": {
      "$ref": "#/properties/floorAreaSqFt"
    },
    "scenario": {
      "type": "object",
      "properties": {
        "direction": {
          "type": "string",
          "enum": [
            "horizontal",
            "vertical"
          ]
        },
        "offset": {
          "type": "string",
          "enum": [
            "0",
            "1/3",
            "1/2"
          ]
        },
        "reuse": {
          "type": "boolean"
        },
        "carryBetweenRooms": {
          "$ref": "#/properties/scenario/properties/reuse"
        },
        "layingOrder": {
          "type": "array",
          "items": {
            "type": "string"
          }
        }
      },
      "required": [
        "direction",
        "offset",
        "reuse",
        "carryBetweenRooms",
        "layingOrder"
      ],
      "additionalProperties": false
    },
    "roomsAlonePlanks": {
      "$ref": "#/properties/boxesToBuy"
    },
    "planksSavedBetweenRooms": {
      "$ref": "#/properties/boxesToBuy"
    },
    "allowance": {
      "anyOf": [
        {
          "type": "object",
          "properties": {
            "percent": {
              "$ref": "#/properties/floorAreaSqFt"
            },
            "planksBought": {
              "$ref": "#/properties/boxesToBuy"
            },
            "boxes": {
              "$ref": "#/properties/floorAreaSqFt"
            },
            "missingPlanks": {
              "$ref": "#/properties/boxesToBuy"
            }
          },
          "required": [
            "percent",
            "planksBought",
            "boxes",
            "missingPlanks"
          ],
          "additionalProperties": false
        },
        {
          "type": "null"
        }
      ]
    },
    "comparisonRule": {
      "type": "string",
      "description": "The ranking used for every \"better\" statement in this result; a tie recommends nothing."
    },
    "bestScenario": {
      "type": [
        "string",
        "null"
      ],
      "description": "The single best of the scenarios (8, or 10 when offset 0 is chosen) by comparisonRule; null when several tie."
    },
    "bestDecidedBy": {
      "type": [
        "string",
        "null"
      ],
      "description": "The first criterion of comparisonRule on which the two options differ."
    },
    "scenariosTiedAtBest": {
      "$ref": "#/properties/boxesToBuy"
    },
    "scenarios": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "direction": {
            "type": "string",
            "enum": [
              "horizontal",
              "vertical"
            ]
          },
          "offset": {
            "$ref": "#/properties/scenario/properties/offset"
          },
          "reuse": {
            "$ref": "#/properties/scenario/properties/reuse"
          },
          "sourcePlanks": {
            "$ref": "#/properties/boxesToBuy"
          },
          "boxes": {
            "$ref": "#/properties/boxesToBuy"
          },
          "wastePercent": {
            "$ref": "#/properties/floorAreaSqFt"
          },
          "roomsAlonePlanks": {
            "$ref": "#/properties/boxesToBuy"
          },
          "missingPlanksAtAllowance": {
            "anyOf": [
              {
                "$ref": "#/properties/boxesToBuy"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "required": [
          "direction",
          "offset",
          "reuse",
          "sourcePlanks",
          "boxes",
          "wastePercent",
          "roomsAlonePlanks",
          "missingPlanksAtAllowance"
        ],
        "additionalProperties": false
      }
    },
    "rooms": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "name": {
            "$ref": "#/properties/scenario/properties/layingOrder/items"
          },
          "shape": {
            "type": "string",
            "enum": [
              "rectangle",
              "L"
            ]
          },
          "areaSqFt": {
            "$ref": "#/properties/floorAreaSqFt"
          },
          "sourcePlanks": {
            "$ref": "#/properties/boxesToBuy"
          },
          "planksAlone": {
            "$ref": "#/properties/boxesToBuy"
          },
          "boxesAlone": {
            "$ref": "#/properties/boxesToBuy"
          },
          "piecesFromOffcuts": {
            "$ref": "#/properties/boxesToBuy"
          },
          "bestScenario": {
            "type": [
              "string",
              "null"
            ]
          },
          "scenarios": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "direction": {
                  "$ref": "#/properties/scenarios/items/properties/direction"
                },
                "offset": {
                  "$ref": "#/properties/scenario/properties/offset"
                },
                "reuse": {
                  "$ref": "#/properties/scenario/properties/reuse"
                },
                "sourcePlanks": {
                  "$ref": "#/properties/boxesToBuy"
                },
                "boxes": {
                  "$ref": "#/properties/boxesToBuy"
                },
                "wastePercent": {
                  "$ref": "#/properties/floorAreaSqFt"
                }
              },
              "required": [
                "direction",
                "offset",
                "reuse",
                "sourcePlanks",
                "boxes",
                "wastePercent"
              ],
              "additionalProperties": false
            }
          },
          "shareUrl": {
            "$ref": "#/properties/scenario/properties/layingOrder/items"
          }
        },
        "required": [
          "name",
          "shape",
          "areaSqFt",
          "sourcePlanks",
          "planksAlone",
          "boxesAlone",
          "piecesFromOffcuts",
          "bestScenario",
          "scenarios",
          "shareUrl"
        ],
        "additionalProperties": false
      }
    },
    "transfers": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "fromRoom": {
            "$ref": "#/properties/scenario/properties/layingOrder/items"
          },
          "toRoom": {
            "$ref": "#/properties/scenario/properties/layingOrder/items"
          },
          "offcut": {
            "$ref": "#/properties/scenario/properties/layingOrder/items"
          },
          "sourcePlank": {
            "$ref": "#/properties/scenario/properties/layingOrder/items"
          },
          "piece": {
            "$ref": "#/properties/scenario/properties/layingOrder/items"
          },
          "length": {
            "$ref": "#/properties/scenario/properties/layingOrder/items"
          }
        },
        "required": [
          "fromRoom",
          "toRoom",
          "offcut",
          "sourcePlank",
          "piece",
          "length"
        ],
        "additionalProperties": false
      }
    },
    "offcutsLeft": {
      "$ref": "#/properties/boxesToBuy"
    },
    "method": {
      "$ref": "#/properties/scenario/properties/layingOrder/items"
    },
    "warnings": {
      "type": "array",
      "items": {
        "$ref": "#/properties/scenario/properties/layingOrder/items"
      }
    },
    "shareUrl": {
      "type": [
        "string",
        "null"
      ]
    },
    "shareUrlComplete": {
      "$ref": "#/properties/scenario/properties/reuse"
    }
  },
  "required": [
    "boxesToBuy",
    "planksPerBox",
    "planksToBuy",
    "sourcePlanks",
    "sparePlanks",
    "floorAreaSqFt",
    "wastePercent",
    "scenario",
    "roomsAlonePlanks",
    "planksSavedBetweenRooms",
    "allowance",
    "comparisonRule",
    "bestScenario",
    "bestDecidedBy",
    "scenariosTiedAtBest",
    "scenarios",
    "rooms",
    "transfers",
    "offcutsLeft",
    "method",
    "warnings",
    "shareUrl",
    "shareUrlComplete"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢build_order_sheet(flooring, trim, wallpaper, stockLengthsFt, kerf, ...)

Builds one consolidated order sheet from the flooring, trim and wallpaper plans of the same project (pass the same arguments as plan_flooring_order, plan_trim_order and plan_wallpaper_order): cartons, boards per stock length, rolls, total offcuts, the cut list by material and a CSV. Trim pieces of all walls and all types (battens, rails, chair rail, frames) are packed together on the stock boards, and the sheet compares that with one order per wall, each wall on its own best stock length (total length bought, then offcut, then boards).

입력 스키마

{
  "type": "object",
  "properties": {
    "flooring": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "maxLength": 40,
            "description": "Name of this floor product, e.g. \"oak LVP\""
          },
          "rooms": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "name": {
                  "type": "string",
                  "maxLength": 40,
                  "description": "Room name, e.g. \"living room\". Default \"room 1\", \"room 2\"…"
                },
                "width": {
                  "anyOf": [
                    {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 80
                    },
                    {
                      "type": "number",
                      "minimum": 0
                    }
                  ],
                  "description": "Room width, wall to wall (overall outside dimension for an L). Length with its unit, e.g. \"12 ft 6 in\", \"12'6\\\"\", \"150 in\", \"3m80\"; a bare number is read as inches."
                },
                "length": {
                  "anyOf": [
                    {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 80
                    },
                    {
                      "type": "number",
                      "minimum": 0
                    }
                  ],
                  "description": "Room length, wall to wall (overall outside dimension for an L). Length with its unit, e.g. \"12 ft 6 in\", \"12'6\\\"\", \"150 in\", \"3m80\"; a bare number is read as inches."
                },
                "notch": {
                  "type": "object",
                  "properties": {
                    "width": {
                      "anyOf": [
                        {
                          "type": "string",
                          "minLength": 1,
                          "maxLength": 80
                        },
                        {
                          "type": "number",
                          "minimum": 0
                        }
                      ],
                      "description": "Width of the missing corner rectangle. Length with its unit, e.g. \"12 ft 6 in\", \"12'6\\\"\", \"150 in\", \"3m80\"; a bare number is read as inches."
                    },
                    "length": {
                      "anyOf": [
                        {
                          "type": "string",
                          "minLength": 1,
                          "maxLength": 80
                        },
                        {
                          "type": "number",
                          "minimum": 0
                        }
                      ],
                      "description": "Length of the missing corner rectangle. Length with its unit, e.g. \"12 ft 6 in\", \"12'6\\\"\", \"150 in\", \"3m80\"; a bare number is read as inches."
                    },
                    "corner": {
                      "type": "string",
                      "enum": [
                        "top-right",
                        "top-left",
                        "bottom-right",
                        "bottom-left"
                      ],
                      "description": "Missing corner on the plan. Default top-right."
                    }
                  },
                  "required": [
                    "width",
                    "length"
                  ],
                  "additionalProperties": false,
                  "description": "L-shaped room: the rectangle missing from one corner of width x length."
                }
              },
              "required": [
                "width",
                "length"
              ],
              "additionalProperties": false
            },
            "minItems": 1,
            "maxItems": 12,
            "description": "Rooms to floor with the same plank, 1 to 12, in laying order unless order is given."
          },
          "plankLength": {
            "anyOf": [
              {
                "type": "string",
                "minLength": 1,
                "maxLength": 80
              },
              {
                "type": "number",
                "minimum": 0
              }
            ],
            "description": "Installed plank length (face), from the carton. Length with its unit, e.g. \"12 ft 6 in\", \"12'6\\\"\", \"150 in\", \"3m80\"; a bare number is read as inches."
          },
          "plankWidth": {
            "anyOf": [
              {
                "type": "string",
                "minLength": 1,
                "maxLength": 80
              },
              {
                "type": "number",
                "minimum": 0
              }
            ],
            "description": "Installed plank width (face), from the carton. Length with its unit, e.g. \"12 ft 6 in\", \"12'6\\\"\", \"150 in\", \"3m80\"; a bare number is read as inches."
          },
          "planksPerBox": {
            "type": "integer",
            "minimum": 1,
            "maximum": 1000,
            "description": "Planks per carton, from the carton label."
          },
          "direction": {
            "type": "string",
            "enum": [
              "horizontal",
              "vertical"
            ],
            "description": "horizontal = planks run along the room width (default); vertical = along the room length."
          },
          "offset": {
            "type": "string",
            "enum": [
              "0",
              "1/3",
              "1/2"
            ],
            "description": "End-joint stagger between rows, as a fraction of the plank: 1/3 (default), 1/2 or 0 (aligned)."
          },
          "reuse": {
            "type": "boolean",
            "description": "Cut a row end from the offcut of a row start in the same room (default true)."
          },
          "carryBetweenRooms": {
            "type": "boolean",
            "description": "Offcuts of a room feed the next rooms (default true)."
          },
          "order": {
            "type": "array",
            "items": {
              "type": "string",
              "maxLength": 40
            },
            "maxItems": 12,
            "description": "Laying order by room name; offcuts only flow forward. Default: the order of rooms."
          },
          "allowancePercent": {
            "type": "number",
            "minimum": 0,
            "maximum": 100,
            "description": "Flat waste allowance you would otherwise buy (e.g. 10): the answer says how many planks it misses."
          },
          "clearance": {
            "anyOf": [
              {
                "type": "string",
                "minLength": 1,
                "maxLength": 80
              },
              {
                "type": "number",
                "minimum": 0
              }
            ],
            "description": "Expansion gap on every wall, from the product instructions. Default 0. Length with its unit, e.g. \"12 ft 6 in\", \"12'6\\\"\", \"150 in\", \"3m80\"; a bare number is read as inches."
          },
          "kerf": {
            "anyOf": [
              {
                "type": "string",
                "minLength": 1,
                "maxLength": 80
              },
              {
                "type": "number",
                "minimum": 0
              }
            ],
            "description": "Saw kerf, charged on each cut. Default 1/8 in. Length with its unit, e.g. \"12 ft 6 in\", \"12'6\\\"\", \"150 in\", \"3m80\"; a bare number is read as inches."
          },
          "balancedRows": {
            "type": "boolean",
            "description": "Split the partial row width between the first and last rows (default true)."
          },
          "firstStarter": {
            "anyOf": [
              {
                "type": "string",
                "minLength": 1,
                "maxLength": 80
              },
              {
                "type": "number",
                "minimum": 0
              }
            ],
            "description": "Length of the first row starter; 0 = full plank. Default 0. Length with its unit, e.g. \"12 ft 6 in\", \"12'6\\\"\", \"150 in\", \"3m80\"; a bare number is read as inches."
          },
          "minStarter": {
            "anyOf": [
              {
                "type": "string",
                "minLength": 1,
                "maxLength": 80
              },
              {
                "type": "number",
                "minimum": 0
              }
            ],
            "description": "Minimum row starter length; 0 disables the check. Default 0. Length with its unit, e.g. \"12 ft 6 in\", \"12'6\\\"\", \"150 in\", \"3m80\"; a bare number is read as inches."
          },
          "minJointSpacing": {
            "anyOf": [
              {
                "type": "string",
                "minLength": 1,
                "maxLength": 80
              },
              {
                "type": "number",
                "minimum": 0
              }
            ],
            "description": "Minimum distance between end joints of adjacent rows; 0 disables the check. Default 0. Length with its unit, e.g. \"12 ft 6 in\", \"12'6\\\"\", \"150 in\", \"3m80\"; a bare number is read as inches."
          },
          "minRowWidth": {
            "anyOf": [
              {
                "type": "string",
                "minLength": 1,
                "maxLength": 80
              },
              {
                "type": "number",
                "minimum": 0
              }
            ],
            "description": "Minimum edge-row width; 0 disables the check. Default 0. Length with its unit, e.g. \"12 ft 6 in\", \"12'6\\\"\", \"150 in\", \"3m80\"; a bare number is read as inches."
          },
          "minReuse": {
            "anyOf": [
              {
                "type": "string",
                "minLength": 1,
                "maxLength": 80
              },
              {
                "type": "number",
                "minimum": 0
              }
            ],
            "description": "Shortest offcut worth carrying to another room. Default 0 (any offcut long enough). Length with its unit, e.g. \"12 ft 6 in\", \"12'6\\\"\", \"150 in\", \"3m80\"; a bare number is read as inches."
          }
        },
        "required": [
          "rooms",
          "plankLength",
          "plankWidth",
          "planksPerBox"
        ],
        "additionalProperties": false
      },
      "maxItems": 4,
      "description": "Flooring orders, one per plank product, with the plan_flooring_order arguments."
    },
    "trim": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "maxLength": 40,
            "description": "Wall name, e.g. \"dining north wall\". Default \"wall 1\"…"
          },
          "material": {
            "type": "string",
            "maxLength": 40,
            "description": "Board or molding the pieces are cut from; walls with the same material are packed together. Default \"trim boards\" (all walls together)."
          },
          "project": {
            "type": "string",
            "enum": [
              "board-and-batten",
              "wainscoting",
              "picture-frame-molding"
            ],
            "description": "board-and-batten, wainscoting (applied frames or stile and rail) or picture-frame-molding (boxes of 45° mitered molding)."
          },
          "wallWidth": {
            "anyOf": [
              {
                "type": "string",
                "minLength": 1,
                "maxLength": 80
              },
              {
                "type": "number",
                "minimum": 0
              }
            ],
            "description": "Wall width. Length with its unit, e.g. \"12 ft 6 in\", \"12'6\\\"\", \"150 in\", \"3m80\"; a bare number is read as inches."
          },
          "wallHeight": {
            "anyOf": [
              {
                "type": "string",
                "minLength": 1,
                "maxLength": 80
              },
              {
                "type": "number",
                "minimum": 0
              }
            ],
            "description": "Wall height, floor to ceiling. Length with its unit, e.g. \"12 ft 6 in\", \"12'6\\\"\", \"150 in\", \"3m80\"; a bare number is read as inches."
          },
          "baseboardHeight": {
            "anyOf": [
              {
                "type": "string",
                "minLength": 1,
                "maxLength": 80
              },
              {
                "type": "number",
                "minimum": 0
              }
            ],
            "description": "Existing baseboard height; \"0\" if none. Default 5 1/4 in. Length with its unit, e.g. \"12 ft 6 in\", \"12'6\\\"\", \"150 in\", \"3m80\"; a bare number is read as inches."
          },
          "openings": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "position": {
                  "anyOf": [
                    {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 80
                    },
                    {
                      "type": "number",
                      "minimum": 0
                    }
                  ],
                  "description": "Distance from the left end of the wall to the left edge of the opening or obstacle. Length with its unit, e.g. \"12 ft 6 in\", \"12'6\\\"\", \"150 in\", \"3m80\"; a bare number is read as inches."
                },
                "width": {
                  "anyOf": [
                    {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 80
                    },
                    {
                      "type": "number",
                      "minimum": 0
                    }
                  ],
                  "description": "Width of the opening or obstacle (window, door, outlet, switch). Length with its unit, e.g. \"12 ft 6 in\", \"12'6\\\"\", \"150 in\", \"3m80\"; a bare number is read as inches."
                },
                "label": {
                  "type": "string",
                  "maxLength": 40,
                  "description": "Name shown in the plan, e.g. \"window\""
                }
              },
              "required": [
                "position",
                "width"
              ],
              "additionalProperties": false
            },
            "maxItems": 4,
            "description": "Up to 4 openings or obstacles on the wall; pieces that land on them are flagged and left out of the cut list."
          },
          "battenWidth": {
            "anyOf": [
              {
                "type": "string",
                "minLength": 1,
                "maxLength": 80
              },
              {
                "type": "number",
                "minimum": 0
              }
            ],
            "description": "board-and-batten: actual batten width (a 1x3 is 2 1/2 in). Default 2 1/2 in. Length with its unit, e.g. \"12 ft 6 in\", \"12'6\\\"\", \"150 in\", \"3m80\"; a bare number is read as inches."
          },
          "battenCount": {
            "type": "integer",
            "minimum": 1,
            "maximum": 400,
            "description": "board-and-batten: number of battens. Omit to use battenSpacing."
          },
          "battenSpacing": {
            "anyOf": [
              {
                "type": "string",
                "minLength": 1,
                "maxLength": 80
              },
              {
                "type": "number",
                "minimum": 0
              }
            ],
            "description": "board-and-batten: target gap between battens, used when battenCount is omitted. Default 12 in. Length with its unit, e.g. \"12 ft 6 in\", \"12'6\\\"\", \"150 in\", \"3m80\"; a bare number is read as inches."
          },
          "edge": {
            "type": "string",
            "enum": [
              "space",
              "batten"
            ],
            "description": "board-and-batten: start and end the wall with a space (default) or with a batten."
          },
          "layout": {
            "type": "string",
            "enum": [
              "vertical",
              "grid"
            ],
            "description": "board-and-batten: vertical battens (default) or a grid with horizontal rails."
          },
          "railCount": {
            "type": "integer",
            "minimum": 1,
            "maximum": 20,
            "description": "board-and-batten grid: horizontal rails per bay. Default 2."
          },
          "fullHeight": {
            "type": "boolean",
            "description": "board-and-batten: battens run to the ceiling. Default false."
          },
          "topRailHeight": {
            "anyOf": [
              {
                "type": "string",
                "minLength": 1,
                "maxLength": 80
              },
              {
                "type": "number",
                "minimum": 0
              }
            ],
            "description": "board-and-batten: height of the top of the top rail from the floor. Default 32 in. Length with its unit, e.g. \"12 ft 6 in\", \"12'6\\\"\", \"150 in\", \"3m80\"; a bare number is read as inches."
          },
          "topRailWidth": {
            "anyOf": [
              {
                "type": "string",
                "minLength": 1,
                "maxLength": 80
              },
              {
                "type": "number",
                "minimum": 0
              }
            ],
            "description": "board-and-batten top rail, or wainscoting stile-and-rail top rail width. Default 3 1/2 in. Length with its unit, e.g. \"12 ft 6 in\", \"12'6\\\"\", \"150 in\", \"3m80\"; a bare number is read as inches."
          },
          "style": {
            "type": "string",
            "enum": [
              "applied-frames",
              "stile-and-rail"
            ],
            "description": "wainscoting: applied molding frames (default) or stiles and rails."
          },
          "wainscotHeight": {
            "anyOf": [
              {
                "type": "string",
                "minLength": 1,
                "maxLength": 80
              },
              {
                "type": "number",
                "minimum": 0
              }
            ],
            "description": "wainscoting: overall height from the floor, chair rail included. Default 32 in. Length with its unit, e.g. \"12 ft 6 in\", \"12'6\\\"\", \"150 in\", \"3m80\"; a bare number is read as inches."
          },
          "chairRailWidth": {
            "anyOf": [
              {
                "type": "string",
                "minLength": 1,
                "maxLength": 80
              },
              {
                "type": "number",
                "minimum": 0
              }
            ],
            "description": "wainscoting: chair rail height (board width). Default 2 1/2 in. Length with its unit, e.g. \"12 ft 6 in\", \"12'6\\\"\", \"150 in\", \"3m80\"; a bare number is read as inches."
          },
          "memberWidth": {
            "anyOf": [
              {
                "type": "string",
                "minLength": 1,
                "maxLength": 80
              },
              {
                "type": "number",
                "minimum": 0
              }
            ],
            "description": "wainscoting: stile width, or side reveal between frames. Default 3 1/2 in. Length with its unit, e.g. \"12 ft 6 in\", \"12'6\\\"\", \"150 in\", \"3m80\"; a bare number is read as inches."
          },
          "panelCount": {
            "type": "integer",
            "minimum": 1,
            "maximum": 60,
            "description": "wainscoting: number of panels or frames. Omit to use panelWidth."
          },
          "panelWidth": {
            "anyOf": [
              {
                "type": "string",
                "minLength": 1,
                "maxLength": 80
              },
              {
                "type": "number",
                "minimum": 0
              }
            ],
            "description": "wainscoting: target panel width, used when panelCount is omitted. Default 30 in. Length with its unit, e.g. \"12 ft 6 in\", \"12'6\\\"\", \"150 in\", \"3m80\"; a bare number is read as inches."
          },
          "revealVertical": {
            "anyOf": [
              {
                "type": "string",
                "minLength": 1,
                "maxLength": 80
              },
              {
                "type": "number",
                "minimum": 0
              }
            ],
            "description": "wainscoting applied-frames: reveal above and below each frame. Default 3 1/2 in. Length with its unit, e.g. \"12 ft 6 in\", \"12'6\\\"\", \"150 in\", \"3m80\"; a bare number is read as inches."
          },
          "bottomRailWidth": {
            "anyOf": [
              {
                "type": "string",
                "minLength": 1,
                "maxLength": 80
              },
              {
                "type": "number",
                "minimum": 0
              }
            ],
            "description": "wainscoting stile-and-rail: bottom rail width. Default 5 1/2 in. Length with its unit, e.g. \"12 ft 6 in\", \"12'6\\\"\", \"150 in\", \"3m80\"; a bare number is read as inches."
          },
          "moldingWidth": {
            "anyOf": [
              {
                "type": "string",
                "minLength": 1,
                "maxLength": 80
              },
              {
                "type": "number",
                "minimum": 0
              }
            ],
            "description": "wainscoting applied-frames (default 1 1/4 in) or picture-frame-molding (default 1 in): molding face width. Length with its unit, e.g. \"12 ft 6 in\", \"12'6\\\"\", \"150 in\", \"3m80\"; a bare number is read as inches."
          },
          "hasCap": {
            "type": "boolean",
            "description": "picture-frame-molding: a chair rail caps the boxes (default true); false = boxes run to the ceiling."
          },
          "capHeight": {
            "anyOf": [
              {
                "type": "string",
                "minLength": 1,
                "maxLength": 80
              },
              {
                "type": "number",
                "minimum": 0
              }
            ],
            "description": "picture-frame-molding: height of the underside of the chair rail. Default 36 in. Length with its unit, e.g. \"12 ft 6 in\", \"12'6\\\"\", \"150 in\", \"3m80\"; a bare number is read as inches."
          },
          "columns": {
            "type": "integer",
            "minimum": 1,
            "maximum": 40,
            "description": "picture-frame-molding: boxes across. Default 4."
          },
          "rows": {
            "type": "integer",
            "minimum": 1,
            "maximum": 10,
            "description": "picture-frame-molding: rows of boxes. Default 1."
          },
          "gapX": {
            "anyOf": [
              {
                "type": "string",
                "minLength": 1,
                "maxLength": 80
              },
              {
                "type": "number",
                "minimum": 0
              }
            ],
            "description": "picture-frame-molding: gap between boxes. Default 4 in. Length with its unit, e.g. \"12 ft 6 in\", \"12'6\\\"\", \"150 in\", \"3m80\"; a bare number is read as inches."
          },
          "gapY": {
            "anyOf": [
              {
                "type": "string",
                "minLength": 1,
                "maxLength": 80
              },
              {
                "type": "number",
                "minimum": 0
              }
            ],
            "description": "picture-frame-molding: gap between rows. Default 4 in. Length with its unit, e.g. \"12 ft 6 in\", \"12'6\\\"\", \"150 in\", \"3m80\"; a bare number is read as inches."
          },
          "edgeX": {
            "anyOf": [
              {
                "type": "string",
                "minLength": 1,
                "maxLength": 80
              },
              {
                "type": "number",
                "minimum": 0
              }
            ],
            "description": "picture-frame-molding: side margin. Default 4 in. Length with its unit, e.g. \"12 ft 6 in\", \"12'6\\\"\", \"150 in\", \"3m80\"; a bare number is read as inches."
          },
          "edgeTop": {
            "anyOf": [
              {
                "type": "string",
                "minLength": 1,
                "maxLength": 80
              },
              {
                "type": "number",
                "minimum": 0
              }
            ],
            "description": "picture-frame-molding: top margin. Default 4 in. Length with its unit, e.g. \"12 ft 6 in\", \"12'6\\\"\", \"150 in\", \"3m80\"; a bare number is read as inches."
          },
          "edgeBottom": {
            "anyOf": [
              {
                "type": "string",
                "minLength": 1,
                "maxLength": 80
              },
              {
                "type": "number",
                "minimum": 0
              }
            ],
            "description": "picture-frame-molding: bottom margin. Default 4 in. Length with its unit, e.g. \"12 ft 6 in\", \"12'6\\\"\", \"150 in\", \"3m80\"; a bare number is read as inches."
          }
        },
        "required": [
          "project",
          "wallWidth",
          "wallHeight"
        ],
        "additionalProperties": false
      },
      "maxItems": 12,
      "description": "Trim walls, one per wall, with the plan_trim_order arguments (stock, kerf and extra are set once below)."
    },
    "wallpaper": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "maxLength": 40,
            "description": "Name of this paper, e.g. \"bedroom paper\""
          },
          "walls": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "width": {
                  "anyOf": [
                    {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 80
                    },
                    {
                      "type": "number",
                      "minimum": 0
                    }
                  ],
                  "description": "Wall width. Length with its unit, e.g. \"12 ft 6 in\", \"12'6\\\"\", \"150 in\", \"3m80\"; a bare number is read as inches."
                },
                "height": {
                  "anyOf": [
                    {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 80
                    },
                    {
                      "type": "number",
                      "minimum": 0
                    }
                  ],
                  "description": "Wall height. Length with its unit, e.g. \"12 ft 6 in\", \"12'6\\\"\", \"150 in\", \"3m80\"; a bare number is read as inches."
                }
              },
              "required": [
                "width",
                "height"
              ],
              "additionalProperties": false
            },
            "minItems": 1,
            "maxItems": 12,
            "description": "Walls to paper, 1 to 12."
          },
          "openings": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "wall": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 12,
                  "description": "Wall number (1 = first wall). Default 1."
                },
                "width": {
                  "anyOf": [
                    {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 80
                    },
                    {
                      "type": "number",
                      "minimum": 0
                    }
                  ],
                  "description": "Opening width. Length with its unit, e.g. \"12 ft 6 in\", \"12'6\\\"\", \"150 in\", \"3m80\"; a bare number is read as inches."
                },
                "height": {
                  "anyOf": [
                    {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 80
                    },
                    {
                      "type": "number",
                      "minimum": 0
                    }
                  ],
                  "description": "Opening height. Length with its unit, e.g. \"12 ft 6 in\", \"12'6\\\"\", \"150 in\", \"3m80\"; a bare number is read as inches."
                },
                "fromLeft": {
                  "anyOf": [
                    {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 80
                    },
                    {
                      "type": "number",
                      "minimum": 0
                    }
                  ],
                  "description": "Distance from the left end of the wall to the opening. Length with its unit, e.g. \"12 ft 6 in\", \"12'6\\\"\", \"150 in\", \"3m80\"; a bare number is read as inches."
                },
                "sillHeight": {
                  "anyOf": [
                    {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 80
                    },
                    {
                      "type": "number",
                      "minimum": 0
                    }
                  ],
                  "description": "Height of the bottom of the opening from the floor; \"0\" for a door. Default 0. Length with its unit, e.g. \"12 ft 6 in\", \"12'6\\\"\", \"150 in\", \"3m80\"; a bare number is read as inches."
                }
              },
              "required": [
                "width",
                "height",
                "fromLeft"
              ],
              "additionalProperties": false
            },
            "maxItems": 12,
            "description": "Doors and windows; only drops fully crossed by an opening are shortened."
          },
          "rollWidth": {
            "anyOf": [
              {
                "type": "string",
                "minLength": 1,
                "maxLength": 80
              },
              {
                "type": "number",
                "minimum": 0
              }
            ],
            "description": "Roll width, from the label of the roll. Length with its unit, e.g. \"12 ft 6 in\", \"12'6\\\"\", \"150 in\", \"3m80\"; a bare number is read as inches."
          },
          "rollLength": {
            "anyOf": [
              {
                "type": "string",
                "minLength": 1,
                "maxLength": 80
              },
              {
                "type": "number",
                "minimum": 0
              }
            ],
            "description": "Roll length, from the label (e.g. \"33 ft\"). Length with its unit, e.g. \"12 ft 6 in\", \"12'6\\\"\", \"150 in\", \"3m80\"; a bare number is read as inches."
          },
          "repeat": {
            "anyOf": [
              {
                "type": "string",
                "minLength": 1,
                "maxLength": 80
              },
              {
                "type": "number",
                "minimum": 0
              }
            ],
            "description": "Vertical pattern repeat from the label; \"0\" for none. Length with its unit, e.g. \"12 ft 6 in\", \"12'6\\\"\", \"150 in\", \"3m80\"; a bare number is read as inches."
          },
          "match": {
            "type": "string",
            "enum": [
              "straight",
              "half-drop",
              "random"
            ],
            "description": "Pattern match from the label: straight (default), half-drop or random."
          },
          "trim": {
            "anyOf": [
              {
                "type": "string",
                "minLength": 1,
                "maxLength": 80
              },
              {
                "type": "number",
                "minimum": 0
              }
            ],
            "description": "Trim allowance per drop, top and bottom together. Default 4 in. Length with its unit, e.g. \"12 ft 6 in\", \"12'6\\\"\", \"150 in\", \"3m80\"; a bare number is read as inches."
          },
          "deductOpenings": {
            "type": "boolean",
            "description": "Shorten drops over doors and windows (default true)."
          }
        },
        "required": [
          "walls",
          "rollWidth",
          "rollLength",
          "repeat"
        ],
        "additionalProperties": false
      },
      "maxItems": 6,
      "description": "Wallpaper orders, one per paper, with the plan_wallpaper_order arguments."
    },
    "stockLengthsFt": {
      "type": "array",
      "items": {
        "type": "number",
        "exclusiveMinimum": 0,
        "maximum": 24
      },
      "minItems": 1,
      "maxItems": 8,
      "description": "Board lengths you can buy, in feet (1 to 8 values, each up to 24). Default: 8, 10, 12 and 16 ft are compared and any of them can be recommended; pass the lengths your store sells to plan on those."
    },
    "kerf": {
      "anyOf": [
        {
          "type": "string",
          "minLength": 1,
          "maxLength": 80
        },
        {
          "type": "number",
          "minimum": 0
        }
      ],
      "description": "Saw kerf, charged between two cuts on the same board. Default 1/8 in. Length with its unit, e.g. \"12 ft 6 in\", \"12'6\\\"\", \"150 in\", \"3m80\"; a bare number is read as inches."
    },
    "extraPercent": {
      "type": "number",
      "minimum": 0,
      "maximum": 100,
      "description": "Extra boards to buy, % of the boards in the cut plan. Default 10."
    }
  },
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}

출력 스키마

{
  "type": "object",
  "properties": {
    "order": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "material": {
            "type": "string",
            "enum": [
              "flooring",
              "trim",
              "wallpaper"
            ]
          },
          "item": {
            "type": "string"
          },
          "quantity": {
            "type": "integer"
          },
          "unit": {
            "$ref": "#/properties/order/items/properties/item"
          }
        },
        "required": [
          "material",
          "item",
          "quantity",
          "unit"
        ],
        "additionalProperties": false
      }
    },
    "flooring": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "name": {
            "$ref": "#/properties/order/items/properties/item"
          },
          "boxes": {
            "$ref": "#/properties/order/items/properties/quantity"
          },
          "planks": {
            "$ref": "#/properties/order/items/properties/quantity"
          },
          "sourcePlanks": {
            "$ref": "#/properties/order/items/properties/quantity"
          },
          "sparePlanks": {
            "$ref": "#/properties/order/items/properties/quantity"
          },
          "offcutSqFt": {
            "type": "number"
          },
          "wastePercent": {
            "$ref": "#/properties/flooring/items/properties/offcutSqFt"
          },
          "piecesFromOtherRooms": {
            "$ref": "#/properties/order/items/properties/quantity"
          },
          "bestScenario": {
            "type": [
              "string",
              "null"
            ]
          },
          "missingPlanksAtAllowance": {
            "anyOf": [
              {
                "$ref": "#/properties/order/items/properties/quantity"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "required": [
          "name",
          "boxes",
          "planks",
          "sourcePlanks",
          "sparePlanks",
          "offcutSqFt",
          "wastePercent",
          "piecesFromOtherRooms",
          "bestScenario",
          "missingPlanksAtAllowance"
        ],
        "additionalProperties": false
      }
    },
    "trim": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "material": {
            "$ref": "#/properties/order/items/properties/item"
          },
          "walls": {
            "type": "array",
            "items": {
              "$ref": "#/properties/order/items/properties/item"
            }
          },
          "buy": {
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "boards": {
                    "$ref": "#/properties/order/items/properties/quantity"
                  },
                  "boardsInPlan": {
                    "$ref": "#/properties/order/items/properties/quantity"
                  },
                  "linearFt": {
                    "$ref": "#/properties/flooring/items/properties/offcutSqFt"
                  },
                  "stockLengthFt": {
                    "$ref": "#/properties/flooring/items/properties/offcutSqFt"
                  }
                },
                "required": [
                  "boards",
                  "boardsInPlan",
                  "linearFt",
                  "stockLengthFt"
                ],
                "additionalProperties": false
              },
              {
                "type": "null"
              }
            ]
          },
          "noStockFits": {
            "anyOf": [
              {
                "type": "array",
                "items": {
                  "$ref": "#/properties/order/items/properties/item"
                }
              },
              {
                "type": "null"
              }
            ]
          },
          "offcutFt": {
            "type": [
              "number",
              "null"
            ]
          },
          "offcutPercent": {
            "type": [
              "number",
              "null"
            ]
          },
          "separateOrders": {
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "boards": {
                    "$ref": "#/properties/order/items/properties/quantity"
                  },
                  "boardsInPlan": {
                    "$ref": "#/properties/order/items/properties/quantity"
                  },
                  "linearFt": {
                    "$ref": "#/properties/flooring/items/properties/offcutSqFt"
                  },
                  "offcutPercent": {
                    "$ref": "#/properties/flooring/items/properties/offcutSqFt"
                  },
                  "byWall": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "wall": {
                          "$ref": "#/properties/order/items/properties/item"
                        },
                        "boards": {
                          "$ref": "#/properties/order/items/properties/quantity"
                        },
                        "boardsInPlan": {
                          "$ref": "#/properties/order/items/properties/quantity"
                        },
                        "stockLengthFt": {
                          "$ref": "#/properties/flooring/items/properties/offcutSqFt"
                        }
                      },
                      "required": [
                        "wall",
                        "boards",
                        "boardsInPlan",
                        "stockLengthFt"
                      ],
                      "additionalProperties": false
                    }
                  }
                },
                "required": [
                  "boards",
                  "boardsInPlan",
                  "linearFt",
                  "offcutPercent",
                  "byWall"
                ],
                "additionalProperties": false
              },
              {
                "type": "null"
              }
            ],
            "description": "One order per wall, each wall on its own best stock length (what plan_trim_order answers for it)."
          },
          "boardsSaved": {
            "anyOf": [
              {
                "$ref": "#/properties/order/items/properties/quantity"
              },
              {
                "type": "null"
              }
            ]
          },
          "linearFtSaved": {
            "type": [
              "number",
              "null"
            ]
          },
          "packing": {
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "better": {
                    "anyOf": [
                      {
                        "type": "string",
                        "enum": [
                          "together",
                          "one order per wall"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "decidedBy": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "The first criterion of comparisonRule on which the two options differ."
                  }
                },
                "required": [
                  "better",
                  "decidedBy"
                ],
                "additionalProperties": false
              },
              {
                "type": "null"
              }
            ],
            "description": "Packed together vs one order per wall by comparisonRule; better is null on a tie."
          },
          "cutPatterns": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "boards": {
                  "$ref": "#/properties/order/items/properties/quantity"
                },
                "stockLengthFt": {
                  "$ref": "#/properties/flooring/items/properties/offcutSqFt"
                },
                "cuts": {
                  "$ref": "#/properties/order/items/properties/item"
                },
                "offcut": {
                  "$ref": "#/properties/order/items/properties/item"
                }
              },
              "required": [
                "boards",
                "stockLengthFt",
                "cuts",
                "offcut"
              ],
              "additionalProperties": false
            }
          },
          "stockComparison": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "stockLengthFt": {
                  "$ref": "#/properties/flooring/items/properties/offcutSqFt"
                },
                "boardsToBuy": {
                  "anyOf": [
                    {
                      "$ref": "#/properties/order/items/properties/quantity"
                    },
                    {
                      "type": "null"
                    }
                  ]
                }
              },
              "required": [
                "stockLengthFt",
                "boardsToBuy"
              ],
              "additionalProperties": false
            }
          }
        },
        "required": [
          "material",
          "walls",
          "buy",
          "noStockFits",
          "offcutFt",
          "offcutPercent",
          "separateOrders",
          "boardsSaved",
          "linearFtSaved",
          "packing",
          "cutPatterns",
          "stockComparison"
        ],
        "additionalProperties": false
      }
    },
    "wallpaper": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "name": {
            "$ref": "#/properties/order/items/properties/item"
          },
          "rolls": {
            "$ref": "#/properties/order/items/properties/quantity"
          },
          "drops": {
            "$ref": "#/properties/order/items/properties/quantity"
          },
          "dropsPerRoll": {
            "$ref": "#/properties/order/items/properties/quantity"
          },
          "leftoverFt": {
            "$ref": "#/properties/flooring/items/properties/offcutSqFt"
          },
          "matchWasteFt": {
            "$ref": "#/properties/flooring/items/properties/offcutSqFt"
          },
          "wastePercent": {
            "$ref": "#/properties/flooring/items/properties/offcutSqFt"
          }
        },
        "required": [
          "name",
          "rolls",
          "drops",
          "dropsPerRoll",
          "leftoverFt",
          "matchWasteFt",
          "wastePercent"
        ],
        "additionalProperties": false
      }
    },
    "offcuts": {
      "type": "object",
      "properties": {
        "flooringSqFt": {
          "type": [
            "number",
            "null"
          ]
        },
        "trimFt": {
          "type": [
            "number",
            "null"
          ]
        },
        "wallpaperLeftoverFt": {
          "type": [
            "number",
            "null"
          ]
        }
      },
      "required": [
        "flooringSqFt",
        "trimFt",
        "wallpaperLeftoverFt"
      ],
      "additionalProperties": false
    },
    "cutList": {
      "type": "object",
      "properties": {
        "flooring": {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "item": {
                "$ref": "#/properties/order/items/properties/item"
              },
              "where": {
                "$ref": "#/properties/order/items/properties/item"
              },
              "piece": {
                "$ref": "#/properties/order/items/properties/item"
              },
              "length": {
                "$ref": "#/properties/order/items/properties/item"
              },
              "width": {
                "$ref": "#/properties/order/items/properties/item"
              },
              "qty": {
                "$ref": "#/properties/order/items/properties/quantity"
              }
            },
            "required": [
              "item",
              "where",
              "piece",
              "length",
              "width",
              "qty"
            ],
            "additionalProperties": false
          }
        },
        "trim": {
          "type": "array",
          "items": {
            "$ref": "#/properties/cutList/properties/flooring/items"
          }
        },
        "wallpaper": {
          "type": "array",
          "items": {
            "$ref": "#/properties/cutList/properties/flooring/items"
          }
        }
      },
      "required": [
        "flooring",
        "trim",
        "wallpaper"
      ],
      "additionalProperties": false
    },
    "stockLengthsFt": {
      "type": "array",
      "items": {
        "$ref": "#/properties/flooring/items/properties/offcutSqFt"
      }
    },
    "comparisonRule": {
      "type": "string",
      "description": "The ranking used for every \"better\" statement in this result; a tie recommends nothing."
    },
    "optimal": {
      "type": "boolean"
    },
    "method": {
      "$ref": "#/properties/order/items/properties/item"
    },
    "links": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "what": {
            "$ref": "#/properties/order/items/properties/item"
          },
          "url": {
            "$ref": "#/properties/order/items/properties/item"
          }
        },
        "required": [
          "what",
          "url"
        ],
        "additionalProperties": false
      }
    },
    "warnings": {
      "type": "array",
      "items": {
        "$ref": "#/properties/order/items/properties/item"
      }
    },
    "csv": {
      "$ref": "#/properties/order/items/properties/item"
    }
  },
  "required": [
    "order",
    "flooring",
    "trim",
    "wallpaper",
    "offcuts",
    "cutList",
    "stockLengthsFt",
    "comparisonRule",
    "optimal",
    "method",
    "links",
    "warnings",
    "csv"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}

커뮤니티

이 서버 평가하기

증거

최근 관측

검증됨버전이 기록되지 않음도구 4개