Rendering these values. This takes a few seconds.
Download STL
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.

MIT

Cat guard for plant pots

mick/plant-cat-guard@1.0.0

Remix this
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.

Sign in to report

0reused0 remixes · 0 imports1downloads1.3.0latest

Parameters

from source
80400, steps of 5
10200, steps of 2
26, steps of 0.5
28, steps of 0.5
210, steps of 1
210, steps of 1
0.53, steps of 0.1

Showing the render for these values.

Description

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 is a set of thin cuts through the whole 2D drawing, so all segments come out of one shape and are identical. The spokes are placed half a pitch off the cuts so a cut never runs along a spoke. 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. 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, 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. 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.0.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
Parameters of Cat guard for plant pots, with the ranges the source declares
NameDefaultRangeUnitDescription
diameter20080 to 400 step 5
hole_d4010 to 200 step 2
thickness32 to 6 step 0.5
bar_w32 to 8 step 0.5
rings42 to 10 step 1
spokes_per_segment42 to 10 step 1
segments42, 3, 4
gap10.5 to 3 step 0.1
part"all"all, one
spike_len250 to 60 step 1
spike_w42 to 10 step 0.5
spike_ring_step21 to 5 step 1
spike_spoke_step21 to 6 step 1
round_r0.50 to 2 step 0.25
smoothness9632 to 192 step 16
color_grid"ForestGreen"ForestGreen, Silver, Gainsboro, White, DimGray, Black, SlateGray, FireBrick, SteelBlue, Goldenrod

Lineage

0 models depend on this one

Only what this model came from and what came from it.

Remix, the code changed Import, used unchanged and pinned The version you are on Withdrawn, still recorded

License

Whoever downloads this takes these obligations along
  • mick/plant-cat-guard@1.0.0 is MIT

Source

main.scad is the entrypoint
main.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.

/* [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]
// Radial spokes in each segment.
spokes_per_segment = 4; // [2:1:10]

/* [Split] */
// Number of loose segments the guard is cut into.
segments = 4; // [2, 3, 4]
// Width of the cut between 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.
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;
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, half a pitch off the cuts so a cut never runs along a spoke.
function spoke_a(j) = (j + 0.5) * 360 / spokes;

// 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 and leaves the hole open.
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])
    rotate(spoke_a(j))
      translate([hole / 2, -bar_w / 2]) square([(diameter - hole) / 2, bar_w]);
}

// The cuts that split the disc into segments.
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])
      if (i % spike_ring_step == 0 && j % spike_spoke_step == 0)
        rotate(spoke_a(j)) translate([ring_r(i), 0, 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.

Sign in to comment