Selection

Selection

Keeps whole shapes of A when the relation holds for at least one shape of B. The first matching B is enough.

← Language overview

inside(a, b)

Available · yields polygons

layer i = inside(a, b)

Keeps shapes of A when every vertex lies in at least one B polygon. The method form a.inside(b) is the same.

Input Result Small box on the right leaves B → discarded

inside tests vertices, not a full edge-inside test on concave B.

Empty B: nothing kept. A vertex on the B edge: often treated as inside — do not rely on on-edge as a stable rule. Concave pocket: all corners in B, but an edge cuts outside — still treated as inside. This is the main pitfall. A identical to B: kept (vertices lie in themselves). A sticks out with one corner: not inside, even if 99 % of the area is in B (that would be inside_part). Several B: OR — one enclosing B is enough.

not_inside(a, b)

Available · yields polygons

layer n = not_inside(a, b)

Complement of inside on whole shapes: keeps A that is not fully (vertex-wise) in any B. May still overlap.

Input Result

Partial overlap without full inside: kept. Touch without overlap and not inside: kept. Not the same as outside (outside also drops overlap). A entirely in B: dropped.

outside(a, b)

Available · yields polygons

layer o = outside(a, b)

Keeps A that is neither vertex-inside nor has an area AND (> 0.5 dbu²) with any B.

Input Result The middle one overlaps B → dropped; the outside one stays

Pure edge contact without area: AND empty, not inside → kept (touch counts as outside). Point contact (shared vertex): AND empty → outside, although interacting would be true. Overlap of any size: dropped. A in B: dropped.

interacting(a, b)

Available · yields polygons

layer t = interacting(a, b)

Keeps A that touches or cuts B: bounding box, point-in-polygon, a shared vertex, or a segment intersection.

Input Result

A shared corner without edge overlap: yes. Separate boxes without a touch: no. A completely in B (no edge cut needed): yes, via point-in-polygon. B completely in A: yes.

not_interacting(a, b)

Available · yields polygons

layer n = not_interacting(a, b)

A without any interaction with B (see interacting).

Input Result

Only a shared vertex counts as interacting → dropped here. Empty B: all of A kept.

overlapping(a, b)

Available · yields polygons

layer o = overlapping(a, b)

Keeps A whose boolean AND with at least one B has area > 0.5 dbu².

Input Result

Edge to edge, area 0: no (that is touching / abutting). A covers B or the reverse with area: yes. A 1 dbu slit overlap: yes as soon as the area is > 0.5.

not_overlapping(a, b)

Available · yields polygons

layer n = not_overlapping(a, b)

A without an area overlap with B. Touch remains.

Input Result

Abutting: kept. Inside without AND area (rare degenerate): follows the AND.

covering(a, b)

Available · yields polygons

layer c = covering(a, b)

Keeps A that fully contains at least one B-shape vertex-wise (B inside A).

Input Result

A smaller than B, only overlap: no. A contains B, B has a corner on A's edge: follows point-in-polygon. Two B, only one covered: A is kept once (the whole A, not clipped). Empty B: nothing.

not_covering(a, b)

Available · yields polygons

layer n = not_covering(a, b)

A that does not fully contain any B.

Input Result

A overlaps B but does not cover it: kept. A contains one B and not a second: still covering (one hit is enough) → dropped.

touching(a, b)

Available · yields polygons

layer t = touching(a, b)

interacting and not overlapping: contact without an area share.

Input Result Edge to edge, no overlap area

A shared corner: yes. A collinear shared edge without overlap area: yes (often also abutting). Overlap: no. A in B with area: no (overlapping).

not_touching(a, b)

Available · yields polygons

layer n = not_touching(a, b)

A that does not fulfil the touching condition with any B. Overlap shapes stay (they are not touching).

Input Result

Overlap: kept. Isolated: kept. Only a vertex kiss: dropped.

cutting(a, b)

Available · yields polygons

layer c = cutting(a, b)

Overlap and neither A covers B nor B covers A: the shapes cross.

Input Result

A contains B: not cutting (covering). B contains A: not cutting. Crossing stripes: yes. Only touch: no.

not_cutting(a, b)

Available · yields polygons

layer n = not_cutting(a, b)

A without a crossing overlap with B (complement of cutting).

Input Result

Containment: kept. A cross: dropped.

abutting(a, b)

Available · yields polygons

layer u = abutting(a, b)

A shared collinear edge segment and no area AND.

Input Result Shared vertical edge

Only a corner, no positive segment length: no (unlike touching). Overlap area: no, even if an edge is shared. Opposite edges on the same line with an overlap in t: yes.

not_abutting(a, b)

Available · yields polygons

layer n = not_abutting(a, b)

A without a collinear edge overlap without area to B.

Input Result

Only a vertex touch: kept (not abutting). Abut: dropped.