PPPTools Example — Gear Wheel

Created: 2026-05-29 · Updated: 2026-05-29

Helper Reference · Advanced Snippet Editor

Parameterized gear wheel with selectable tooth count, size, tooth depth, hub opening, fill and border color. Created through three consecutive Boolean operations.


ppptools Methods Used

Method Purpose
ppptools.SlideWidth / SlideHeight Center on slide
ppptools.AddShape(type, x, y, w, h) Insert star and circles
ppptools.AddOval(x, y, w, h) Shorthand for circles
oX.Select(msoTrue/msoFalse) Select shapes for Boolean op
ppptools.Union() Round tooth tips
ppptools.Intersect() Clip outer contour
ppptools.Combine() Punch center hole
ppptools.GetSelected() Retrieve result shape after Boolean op
ppptools.GetSelectedRange() Iterate all shapes in selection

Parameters

@param Type Default Description
Zaehne enum "8" Number of teeth (4–32)
Groesse float 200 Outer diameter in points
Zahntiefe float 1.0 Tooth depth factor (0.5–2.0)
Nabe float 31.4 Hub opening as % of total size
Fuellfarbe color #8264DC Fill color
Rahmenfarbe color #5A3CB4 Border color
ShowBorder bool true Show border

Result


Full Code

// @help https://ppptools.happy-pc.ch/help/en/helper-example-gearwheel
// @param enum   Zaehne      "Tooth count"        options="4|5|6|7|8|10|12|16|24|32"  default="8"
// @param float  Groesse     "Size (points)"      default=200  min=50  max=500
// @param float  Zahntiefe   "Tooth depth (1=std)" default=1.0  min=0.5 max=2.0
// @param float  Nabe        "Hub opening (%)"    default=31.4 min=10  max=55
// @param color  Fuellfarbe  "Fill color"         default=#8264DC
// @param color  Rahmenfarbe "Border color"       default=#5A3CB4
// @param bool   ShowBorder  "Show border"        default=true

string tooths      = Params.GetString("Zaehne",     "8");
float  size        = (float)Params.GetFloat("Groesse",   200.0);
float  zahnFaktor  = (float)Params.GetFloat("Zahntiefe", 1.0);
float  nabeProz    = (float)Params.GetFloat("Nabe",      31.4);
var    fillColor   = Params.GetColor("Fuellfarbe",  System.Drawing.Color.FromArgb(130, 100, 220));
var    lineColor   = Params.GetColor("Rahmenfarbe", System.Drawing.Color.FromArgb( 90,  60, 180));
bool   showBorder  = Params.GetBool("ShowBorder", true);

int fillRgb = System.Drawing.ColorTranslator.ToOle(fillColor);
int lineRgb = System.Drawing.ColorTranslator.ToOle(lineColor);

// ── Center on slide ───────────────────────────────────────────────────
float left = (ppptools.SlideWidth  - size) / 2f;
float top  = (ppptools.SlideHeight - size) / 2f;
float cx   = left + size / 2f;
float cy   = top  + size / 2f;

float sizeSmall = size * 0.5713f;
float sizeBig   = size * 0.7143f;
float sizeHole  = size * (nabeProz / 100f);

// ── Local helper for consistent styling ───────────────────────────────
void ApplyStyle(dynamic sh)
{
    sh.Fill.ForeColor.RGB = fillRgb;
    sh.Fill.Transparency  = 0f;
    if (showBorder)
    {
        sh.Line.Visible        = MsoTriState.msoTrue;
        sh.Line.Weight         = 1.5f;
        sh.Line.ForeColor.RGB  = lineRgb;
        sh.Line.Transparency   = 0f;
        sh.Line.DashStyle      = MsoLineDashStyle.msoLineSolid;
        sh.Line.Style          = MsoLineStyle.msoLineSingle;
    }
    else
    {
        sh.Line.Visible = MsoTriState.msoFalse;
    }
}

// ── Star type and calibrated adjustment value ─────────────────────────
MsoAutoShapeType starType;
float adjKalibriert;
switch (tooths)
{
    case  "4": starType = MsoAutoShapeType.msoShape4pointStar;  adjKalibriert = 0.25f;    break;
    case  "5": starType = MsoAutoShapeType.msoShape5pointStar;  adjKalibriert = 0.25f;    break;
    case  "6": starType = MsoAutoShapeType.msoShape6pointStar;  adjKalibriert = 0.25f;    break;
    case  "7": starType = MsoAutoShapeType.msoShape7pointStar;  adjKalibriert = 0.25f;    break;
    case  "8": starType = MsoAutoShapeType.msoShape8pointStar;  adjKalibriert = 0.22781f; break;
    case "10": starType = MsoAutoShapeType.msoShape10pointStar; adjKalibriert = 0.23f;    break;
    case "12": starType = MsoAutoShapeType.msoShape12pointStar; adjKalibriert = 0.21753f; break;
    case "16": starType = MsoAutoShapeType.msoShape16pointStar; adjKalibriert = 0.22f;    break;
    case "24": starType = MsoAutoShapeType.msoShape24pointStar; adjKalibriert = 0.21f;    break;
    case "32": starType = MsoAutoShapeType.msoShape32pointStar; adjKalibriert = 0.20f;    break;
    default:   starType = MsoAutoShapeType.msoShape12pointStar; adjKalibriert = 0.21753f; break;
}
float adj = adjKalibriert * zahnFaktor;

// ── 1. Star ───────────────────────────────────────────────────────────
var oStar = ppptools.AddShape(starType, cx - size/2f, cy - size/2f, size, size);
oStar.Adjustments[1] = adj;
ApplyStyle(oStar);

// ── 2. Small circle + Union → round tooth tips ────────────────────────
var oSmall = ppptools.AddOval(cx - sizeSmall/2f, cy - sizeSmall/2f, sizeSmall, sizeSmall);
ApplyStyle(oSmall);
oStar.Select(MsoTriState.msoTrue);
oSmall.Select(MsoTriState.msoFalse);
ppptools.Union();
dynamic oUnion = ppptools.GetSelected();

// ── 3. Large circle + Intersect → clip outer contour ─────────────────
var oBig = ppptools.AddOval(cx - sizeBig/2f, cy - sizeBig/2f, sizeBig, sizeBig);
ApplyStyle(oBig);
oUnion.Select(MsoTriState.msoTrue);
oBig.Select(MsoTriState.msoFalse);
ppptools.Intersect();
dynamic oIntersect = ppptools.GetSelected();

// ── 4. Hole circle + Combine → punch center ───────────────────────────
var oHole = ppptools.AddOval(cx - sizeHole/2f, cy - sizeHole/2f, sizeHole, sizeHole);
ApplyStyle(oHole);
oIntersect.Select(MsoTriState.msoTrue);
oHole.Select(MsoTriState.msoFalse);
ppptools.Combine();

// ── Done: name and style ──────────────────────────────────────────────
foreach (dynamic sh in ppptools.GetSelectedRange())
{
    sh.Name = "GearWheel_" + tooths;
    ApplyStyle(sh);
}

Step by Step

1. Centering with ppptools.SlideWidth/Height

ppptools.SlideWidth and ppptools.SlideHeight return the slide dimensions in points. No access to aPowerPoint.ActivePresentation.PageSetup.* needed.

2. Inserting shapes with ppptools.AddShape and ppptools.AddOval

ppptools.AddOval is shorthand for ppptools.AddShape(MsoAutoShapeType.msoShapeOval, ...). The star shape requires the full MsoAutoShapeType enum value.

3. Boolean operations and ppptools.GetSelected()

After each Boolean op, PowerPoint consumes the input shapes — they no longer exist. ppptools.GetSelected() retrieves the result immediately before the next selection overwrites it.

Step Operation Effect
Star + small circle Union Fill valleys between teeth
Union result + large circle Intersect Clip/round tooth crowns
Intersect result + hole circle Combine Punch center hole

4. Naming shapes with ppptools.GetSelectedRange()

foreach (dynamic sh in ppptools.GetSelectedRange())
{
    sh.Name = "GearWheel_" + tooths;
}

ppptools.GetSelectedRange() returns the full ShapeRange object of the current selection.


Back: Helper Reference · All Examples