Read this model as text
A round grid that lies on the soil of a plant pot so a cat cannot dig in it. It has a hole in the middle for the stem, is split into 2, 3 or 4 loose segments so it fits around an existing plant and on a small print bed, and carries spikes on the underside that pin it into the soil.
The image shows the solid OpenSCAD renders at diameter 200 · hole_d 40 · thickness 3 · bar_w 3 · rings 4 · spokes_per_segment 4 · segments 4 · gap 1 · part all · spike_len 25 · spike_w 4 · spike_ring_step 2 · spike_spoke_step 2 · round_r 0.5 · smoothness 96 · color_grid ForestGreen.
Cat guard for plant pots
mick/plant-cat-guard@1.1.0
Report
For a legal or policy problem: a license violation, personal data, somebody else’s work republished as their own. A model that prints badly is a comment, not a report.
Parameters
from sourceDescription
What is this
A round grid that lies on the soil of a plant pot so a cat cannot dig in it. It has a hole in the middle for the stem, is split into 2, 3 or 4 loose segments so it fits around an existing plant and on a small print bed, and carries spikes on the underside that pin it into the soil.
What you use it for
Keeping cats (and their toilet habits) out of plant pots. Set the diameter to the pot, the hole to the stem, pick the number of segments, print each segment upside down with the spikes pointing up and press them into the soil around the plant.
Design notes
The grid is deliberately plain: concentric rings crossed by radial spokes, drawn in 2D as circles and straight rectangles and extruded once. The split runs along the spokes: where a cut falls, the spoke is drawn twice, one full-width bar on each side of the gap, so every segment is a closed frame of outer rim, two edge spokes and inner rim, with the grid inside. The cuts are thin strips through the whole 2D drawing, so all segments come out of one shape and are identical. Rounding is a single offset pass over the finished 2D drawing, as a final polish, and zero turns it off.
Spikes are four-sided pyramids that sit on the crossings of rings and spokes, on every n-th ring and every n-th spoke, so their density is two numbers. On the edge spokes they follow the bar on either side of the gap. They are the only non-flat feature, which is why part = "one" flips a single segment onto its plate side: that is the print orientation, no supports needed.
Everything lives in two small modules, grid2d and spikes, driven by one list of spoke positions, so the pattern is easy to swap for something else while the split, hole, spikes and print layout keep working.
Parameters
diameter and hole_d size the plate, thickness and bar_w the bars. rings and spokes_per_segment set the density of the grid, where spokes_per_segment counts one edge spoke plus the spokes inside a segment. segments picks 2, 3 or 4 pieces and gap is the cut between them. part shows the whole guard or one segment in print orientation. spike_len and spike_w shape the spikes; spike_ring_step and spike_spoke_step decide on which crossings they appear. round_r is the polish, color_grid the display colour.
Use with your agent
{
"mcpServers": {
"remixcad": {
"type": "http",
"url": "https://remix-cad.vercel.app/api/mcp"
}
}
}get_model("mick/plant-cat-guard@1.1.0")Returns the manifest, the source, the import closure and the license obligations. Full MCP setup.
Parameter table
Parsed from the Customizer annotations in main.scad| Name | Default | Range | Unit | Description |
|---|---|---|---|---|
| diameter | 200 | 80 to 400 step 5 | ||
| hole_d | 40 | 10 to 200 step 2 | ||
| thickness | 3 | 2 to 6 step 0.5 | ||
| bar_w | 3 | 2 to 8 step 0.5 | ||
| rings | 4 | 2 to 10 step 1 | ||
| spokes_per_segment | 4 | 1 to 10 step 1 | ||
| segments | 4 | 2, 3, 4 | ||
| gap | 1 | 0.5 to 3 step 0.1 | ||
| part | "all" | all, one | ||
| spike_len | 25 | 0 to 60 step 1 | ||
| spike_w | 4 | 2 to 10 step 0.5 | ||
| spike_ring_step | 2 | 1 to 5 step 1 | ||
| spike_spoke_step | 2 | 1 to 6 step 1 | ||
| round_r | 0.5 | 0 to 2 step 0.25 | ||
| smoothness | 96 | 32 to 192 step 16 | ||
| color_grid | "ForestGreen" | ForestGreen, Silver, Gainsboro, White, DimGray, Black, SlateGray, FireBrick, SteelBlue, Goldenrod |
Lineage
0 models depend on this oneOnly what this model came from and what came from it.
License
Whoever downloads this takes these obligations along- mick/plant-cat-guard@1.1.0 is MIT
Source
main.scad is the entrypointmain.scad
// A round grid that lies on the soil of a plant pot to keep cats out. Split into loose
// segments so it fits around an existing plant, with spikes underneath to pin it down.
// The grid pattern is plain rings and spokes, drawn in 2D from circles and straight
// rectangles; rounding is one offset pass over the finished drawing, as a final polish.
// The cuts run along spokes: a cut spoke is drawn twice, one bar on each side of the
// gap, so every segment is closed by a full spoke on both edges.
/* [Size] */
// Outer diameter of the guard. Match it to the inside of the pot.
diameter = 200; // [80:5:400]
// Diameter of the hole in the middle, around the stem.
hole_d = 40; // [10:2:200]
// Thickness of the plate.
thickness = 3; // [2:0.5:6]
// Width of the bars.
bar_w = 3; // [2:0.5:8]
/* [Grid] */
// Concentric rings, counting the rim around the hole and the outer rim.
rings = 4; // [2:1:10]
// Spokes per segment: one edge spoke plus the spokes inside the segment.
spokes_per_segment = 4; // [1:1:10]
/* [Split] */
// Number of loose segments the guard is cut into.
segments = 4; // [2, 3, 4]
// Width of the cut between the two edge spokes of neighbouring segments.
gap = 1; // [0.5:0.1:3]
// The whole guard, or one segment flipped into print orientation.
part = "all"; // [all, one]
/* [Spikes] */
// Length of the spikes below the plate. Zero removes them.
spike_len = 25; // [0:1:60]
// Width of a spike at its base.
spike_w = 4; // [2:0.5:10]
// A spike on every n-th ring, counted from the outer rim inward.
spike_ring_step = 2; // [1:1:5]
// A spike on every n-th spoke, counted from the edge spoke of each segment.
spike_spoke_step = 2; // [1:1:6]
/* [Polish] */
// Radius the bar corners are rounded to. Zero keeps them sharp.
round_r = 0.5; // [0:0.25:2]
/* [Quality] */
// Facets on the rings. More is smoother and slower.
smoothness = 96; // [32:16:192]
/* [Colour] */
// Display only, the STL carries no colour.
color_grid = "ForestGreen"; // [ForestGreen, Silver, Gainsboro, White, DimGray, Black, SlateGray, FireBrick, SteelBlue, Goldenrod]
/* [Hidden] */
hole = min(hole_d, diameter - 4 * bar_w - 10);
r_out = diameter / 2 - bar_w / 2; // centre line of the outer rim
r_in = hole / 2 + bar_w / 2; // centre line of the rim around the hole
spokes = segments * spokes_per_segment;
seg_a = 360 / segments;
edge_off = (gap + bar_w) / 2; // sideways shift of an edge spoke off the cut line
r_polish = min(round_r, bar_w / 2 - 0.3);
// Ring i, with 0 the outer rim and rings-1 the rim around the hole.
function ring_r(i) = r_out - i * (r_out - r_in) / (rings - 1);
// Spoke j: its angle, and whether it lies on a cut.
function spoke_a(j) = j * 360 / spokes;
function on_cut(j) = j % spokes_per_segment == 0;
// Sideways offsets a spoke is drawn at: two bars beside a cut, one bar elsewhere.
function spoke_offs(j) = on_cut(j) ? [-edge_off, edge_off] : [0];
// The polish: a closing pass rounds the concave corners, an opening pass the convex ones.
module polish2d(r) {
if (r > 0)
offset(r = r, $fn = 24) offset(r = -2 * r, $fn = 24) offset(r = r, $fn = 24) children();
else
children();
}
// ---- Grid pattern ----
// Swap this module for another pattern; everything else keeps working as long as it
// stays inside the disc, leaves the hole open and keeps the edge spokes.
module grid2d() {
for (i = [0 : rings - 1])
difference() {
circle(r = ring_r(i) + bar_w / 2, $fn = smoothness);
circle(r = ring_r(i) - bar_w / 2, $fn = smoothness);
}
for (j = [0 : spokes - 1], o = spoke_offs(j))
rotate(spoke_a(j))
translate([hole / 2, o - bar_w / 2]) square([(diameter - hole) / 2, bar_w]);
}
// The cuts that split the disc into segments, each along a cut spoke.
module cuts2d() {
for (k = [0 : segments - 1])
rotate(k * seg_a) translate([0, -gap / 2]) square([diameter, gap]);
}
module plate() {
linear_extrude(height = thickness)
polish2d(r_polish) difference() { grid2d(); cuts2d(); }
}
// ---- Spikes ----
// Four-sided pyramids hanging below the plate at ring/spoke crossings.
module spike() {
translate([0, 0, 0.5]) mirror([0, 0, 1]) rotate(45)
cylinder(h = spike_len + 0.5, d1 = spike_w * sqrt(2), d2 = 0.8, $fn = 4);
}
module spikes() {
if (spike_len > 0)
for (i = [0 : rings - 1], j = [0 : spokes - 1], o = spoke_offs(j))
if (i % spike_ring_step == 0 && j % spike_spoke_step == 0)
rotate(spoke_a(j)) translate([ring_r(i), o, 0]) spike();
}
module guard() {
plate();
spikes();
}
// One segment: the wedge between the first two cuts.
module wedge() {
linear_extrude(height = 2 * spike_len + 2 * thickness + 2, center = true)
polygon(concat([[0, 0]], [for (a = [0 : 2 : seg_a]) (diameter / 2 + 5) * [cos(a), sin(a)]]));
}
// ---- Layout ----
if (part == "one") {
// Flipped onto its plate side, spikes up: the print orientation.
color(color_grid) rotate(-seg_a / 2) translate([0, 0, thickness]) mirror([0, 0, 1])
intersection() { guard(); wedge(); }
} else {
color(color_grid) guard();
}
Comments
Context, not a score. Comments never move a model up or down the results.No comments yet
Printed it? A note about your material and the clearance you landed on saves the next person a failed print.
