PPPTools Example — Gear Wheel
← 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