# API de scripts Lua do pxstud.io — Seleção

> Parte da referência de scripts Lua do pxstud.io, cuja visão geral (https://pxstud.io/pt-br/docs/scripting.md) explica as convenções. Os grupos de opções e os tipos a que ela remete estão em https://pxstud.io/pt-br/docs/scripting/option-groups.md e https://pxstud.io/pt-br/docs/scripting/types.md. Tudo em um único arquivo (em inglês): https://pxstud.io/llms-full.txt. O índice de todo o site (em inglês): https://pxstud.io/llms.txt.

### Seleção
As formas de seleção se combinam com a seleção atual (substituir, adicionar, subtrair, intersectar). A máscara de seleção pode ser lida e escrita.

#### `app.canReselect()` — lê
Indica se app.reselect() tem uma seleção anterior para restaurar.

Retorna (boolean): true se houver.

#### `app.deselect()` — altera
Limpa a seleção (Seleção ▸ Desmarcar); os comandos de desenho passam então a pintar em qualquer lugar. app.reselect() a traz de volta.

Não retorna nada.

#### `app.enterQuickMask()` — altera, desfazível
Liga a máscara rápida: a seleção vira uma máscara que você pinta, e nada fica selecionado. Enquanto está ligada, as funções de desenho pintam a máscara quando você passa `"quickMask"` como layerId e frameId (qualquer cor adiciona, tinta transparente remove); todo o resto que mudaria o sprite é recusado até app.exitQuickMask().

Não retorna nada.

#### `app.exitQuickMask()` — altera, desfazível
Desliga a máscara rápida: cada pixel da máscara com metade da opacidade ou mais vira a seleção.

Não retorna nada.

#### `app.getSelection()` — lê
A seleção atual como { x, y, width, height, mask }, ou nil se nada estiver selecionado. mask é uma lista plana de 0/1 sobre os limites (em ordem de linhas: (px, py) no índice py*width + px + 1), incluída quando os limites contêm no máximo 262144 pixels; para seleções maiores, leia-a em partes com app.getSelectionMask.

Retorna (table): Tabela de seleção ou nil.

#### `app.getSelectionBounds()` — lê
O { x, y, width, height } da seleção atual, ou nil se nada estiver selecionado.

Retorna (table): { x, y, width, height } ou nil.

#### `app.getSelectionMask(x, y, width, height)` — lê
Quais pixels de um retângulo em coordenadas do sprite estão selecionados, como uma lista plana de 0/1 (em ordem de linhas: (px, py) no índice py*width + px + 1). Tudo 0 quando nada está selecionado. No máximo 262144 pixels por chamada.

- `x` (number)
- `y` (number)
- `width` (number)
- `height` (number)

Retorna (table): Lista plana de 0/1.

#### `app.isSelected(x, y)` — lê
Indica se o pixel (x, y) do sprite está dentro da seleção atual (false quando nada está selecionado).

- `x` (number)
- `y` (number)

Retorna (boolean): true se estiver selecionado.

#### `app.magicWand(layerId, frameId, points, opts?)` — altera, desfazível
Seleciona os pixels que correspondem à cor sob cada ponto em uma camada, com todas as regiões em uma única seleção, exatamente como a varinha mágica da interface (um clique ou um arraste).

- `layerId` (string)
- `frameId` (string)
- `points` (table) — Lista de pontos { x = n, y = n } (ou { n, n }), de 1 a 1024: { { x = 3, y = 4 } } seleciona uma região, como um clique; com vários, a região de cada ponto entra em uma única seleção, como um arraste.
- `opts` (table, opcional)
  - `mode` (SelectionCombineMode: "replace" | "add" | "subtract" | "intersect"; padrão "replace") — Como a nova forma se combina com a seleção atual.
  - `tolerance` (integer 0–255; padrão context.wandTolerance) — A maior diferença de cor por canal que ainda conta como correspondência.
  - `contiguous` (boolean; padrão context.wandFillMode (true para o modo contíguo do contexto, false para global)) — Apenas a região conectada (true) ou todos os pixels correspondentes na tela (false).
  - `diagonal` (boolean; padrão context.wandDiagonal) — Somente contíguo: também se espalha para vizinhos diagonais (8 conectados), então a região vaza por linhas diagonais de 1px.
  - `stopAtGrid` (boolean; padrão context.wandStopAtGrid) — Limita a região à célula da grade em que o clique cai (a célula de uma grade isométrica é o losango que ela desenha, com os pixels de linha das suas duas bordas superiores).

Não retorna nada.

#### `app.modifySelection(op, amount, opts?)` — altera, desfazível
Expande, contrai ou contorna a seleção, recortada pela tela, exatamente como Seleção > Modificar. A borda da tela conta como a borda da seleção.

- `op` (SelectionModifyOp: "expand" | "contract" | "border")
- `amount` (number) — Pixels, de 1 a 256.
- `opts` (table, opcional)
  - `shape` (SelectionModifyShape: "circle" | "square"; padrão "circle") — Como a distância até a borda é medida.

Não retorna nada.

#### `app.reselect()` — altera
Restaura a seleção não vazia mais recente (Seleção ▸ Selecionar novamente). Lança um erro se não houver nenhuma; verifique com app.canReselect().

Não retorna nada.

#### `app.selectAll()` — altera, desfazível
Seleciona a tela inteira.

Não retorna nada.

#### `app.selectEllipse(x0, y0, x1, y1, opts?)` — altera, desfazível
Seleciona a elipse inscrita na caixa definida pelos dois cantos, exatamente como a ferramenta de seleção elíptica da interface.

- `x0` (number) — Primeiro canto.
- `y0` (number)
- `x1` (number) — Canto oposto (inclusivo).
- `y1` (number)
- `opts` (table, opcional)
  - `mode` (SelectionCombineMode: "replace" | "add" | "subtract" | "intersect"; padrão "replace") — Como a nova forma se combina com a seleção atual.

Não retorna nada.

#### `app.selectGridCells(x0, y0, x1, y1, opts?)` — altera, desfazível
Seleciona células inteiras da grade do sprite (retangular, isométrica ou hexagonal): cada célula que contém um pixel da caixa entre os dois pontos, exatamente como um clique duplo (e arrasto) com uma ferramenta de seleção da interface.

- `x0` (number) — Um pixel na primeira célula.
- `y0` (number)
- `x1` (number) — Um pixel na última célula (o mesmo ponto de novo seleciona uma única célula).
- `y1` (number)
- `opts` (table, opcional)
  - `mode` (SelectionCombineMode: "replace" | "add" | "subtract" | "intersect"; padrão "replace") — Como a nova forma se combina com a seleção atual.

Não retorna nada.

#### `app.selectInverse()` — altera, desfazível
Inverte a seleção atual dentro dos limites da tela.

Não retorna nada.

#### `app.selectLayerPixels(layerId, frameId, opts?)` — altera, desfazível
Seleciona os pixels pintados (ou, com transparent = true, não pintados) de uma camada em um quadro, exatamente como Seleção > Selecionar opacos / Selecionar transparentes e Alt+clique em uma camada da linha do tempo.

- `layerId` (string) — Um grupo seleciona os pixels de todas as camadas dentro dele.
- `frameId` (string)
- `opts` (table, opcional)
  - `mode` (SelectionCombineMode: "replace" | "add" | "subtract" | "intersect"; padrão "replace") — Como a nova forma se combina com a seleção atual.
  - `transparent` (boolean; padrão false) — Seleciona os pixels sem tinta em vez dos pintados.

Não retorna nada.

#### `app.selectPolygon(vertices, opts?)` — altera, desfazível
Seleciona o interior (e o contorno) do polígono fechado que passa pelos vértices, exatamente como o laço / laço poligonal da interface.

- `vertices` (table) — Lista de vértices { x = n, y = n } (ou { n, n }); o polígono se fecha de volta ao primeiro automaticamente. Cobre tanto o laço quanto o laço poligonal.
- `opts` (table, opcional)
  - `mode` (SelectionCombineMode: "replace" | "add" | "subtract" | "intersect"; padrão "replace") — Como a nova forma se combina com a seleção atual.

Não retorna nada.

#### `app.selectRectangle(x0, y0, x1, y1, opts?)` — altera, desfazível
Seleciona o retângulo definido pelos dois cantos, exatamente como a ferramenta de seleção retangular da interface (radius arredonda seus cantos).

- `x0` (number) — Primeiro canto.
- `y0` (number)
- `x1` (number) — Canto oposto (inclusivo).
- `y1` (number)
- `opts` (table, opcional)
  - `mode` (SelectionCombineMode: "replace" | "add" | "subtract" | "intersect"; padrão "replace") — Como a nova forma se combina com a seleção atual.
  - `radius` (an integer 0–1024 for every corner, or a list of four { topLeft, topRight, bottomRight, bottomLeft }; padrão context.selectionCornerRadius) — Arredonda os cantos, em pixels (0 = reto): um raio para os quatro, ou um por canto no sentido horário a partir do canto superior esquerdo. Cada um é limitado à metade do lado menor.

Não retorna nada.

#### `app.setSelection(x, y, width, height, mask?)` — altera, desfazível
Substitui a seleção por um retângulo, ou por qualquer forma via `mask`.

- `x` (number)
- `y` (number)
- `width` (number)
- `height` (number)
- `mask` (table, opcional) — Lista plana de 0/1 (width*height, em ordem de linhas, o formato que app.getSelection retorna) que seleciona apenas esses pixels do retângulo; omitida = o retângulo inteiro.

Não retorna nada.
