PPPTools-Beispiel — Zahnrad
← PPPTools-Referenz · Advanced Snippet Editor
Parametrisiertes Zahnrad mit wählbarer Zahnanzahl, Grösse, Zahntiefe, Nabenöffnung, Füll- und Rahmenfarbe. Erzeugt durch drei aufeinanderfolgende Boolean-Operationen.
Verwendete ppptools-Methoden
| Methode | Verwendungszweck |
|---|---|
ppptools.SlideWidth / SlideHeight |
Folie zentrieren |
ppptools.AddShape(type, x, y, w, h) |
Stern und Kreise einfügen |
ppptools.AddOval(x, y, w, h) |
Kurzform für Kreise |
oX.Select(msoTrue/msoFalse) |
Shapes für Boolean-Op selektieren |
ppptools.Union() |
Zahnspitzen abrunden |
ppptools.Intersect() |
Aussenkontur begrenzen |
ppptools.Combine() |
Mittelloch ausstanzen |
ppptools.GetSelected() |
Ergebnis-Shape nach Boolean-Op greifen |
ppptools.GetSelectedRange() |
Alle Shapes in der Selektion iterieren |
Parameter
| @param | Typ | Standard | Beschreibung |
|---|---|---|---|
Zaehne |
enum | "8" |
Anzahl Zähne (4–32) |
Groesse |
float | 200 |
Aussendurchmesser in Punkten |
Zahntiefe |
float | 1.0 |
Zahntiefe-Faktor (0.5–2.0) |
Nabe |
float | 31.4 |
Nabenöffnung in % der Gesamtgrösse |
Fuellfarbe |
color | #8264DC |
Hintergrundfarbe |
Rahmenfarbe |
color | #5A3CB4 |
Konturlinie |
ShowBorder |
bool | true |
Konturlinie anzeigen |
Ergebnis
Vollständiger Code
// @help https://ppptools.happy-pc.ch/help/de/helper-beispiel-zahnrad
// @param enum Zaehne "Anzahl Zähne" options="4|5|6|7|8|10|12|16|24|32" default="8"
// @param float Groesse "Grösse (Punkte)" default=200 min=50 max=500
// @param float Zahntiefe "Zahntiefe (1=standard)" default=1.0 min=0.5 max=2.0
// @param float Nabe "Nabenöffnung (%)" default=31.4 min=10 max=55
// @param color Fuellfarbe "Füllfarbe" default=#8264DC
// @param color Rahmenfarbe "Rahmenfarbe" default=#5A3CB4
// @param bool ShowBorder "Rahmen anzeigen" 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);
// ── Mitte der Folie berechnen ─────────────────────────────────────────
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);
// ── Lokale Hilfsfunktion für einheitliches 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;
}
}
// ── Stern-Typ und kalibrierter Adjustment-Wert ────────────────────────
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. Stern ──────────────────────────────────────────────────────────
var oStar = ppptools.AddShape(starType, cx - size/2f, cy - size/2f, size, size);
oStar.Adjustments[1] = adj;
ApplyStyle(oStar);
// ── 2. Kleiner Kreis + Union → Zahnkranz ─────────────────────────────
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. Grosser Kreis + Intersect → Aussenkontur begrenzen ────────────
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. Loch + Combine → Mittelloch ausstanzen ────────────────────────
var oHole = ppptools.AddOval(cx - sizeHole/2f, cy - sizeHole/2f, sizeHole, sizeHole);
ApplyStyle(oHole);
oIntersect.Select(MsoTriState.msoTrue);
oHole.Select(MsoTriState.msoFalse);
ppptools.Combine();
// ── Fertig: Name und Style ────────────────────────────────────────────
foreach (dynamic sh in ppptools.GetSelectedRange())
{
sh.Name = "GearWheel_" + tooths;
ApplyStyle(sh);
}
Schritt-für-Schritt
1. Folie zentrieren mit ppptools.SlideWidth/Height
float left = (ppptools.SlideWidth - size) / 2f;
float top = (ppptools.SlideHeight - size) / 2f;
ppptools.SlideWidth und ppptools.SlideHeight geben die Folienmasse in Punkten zurück.
Kein Zugriff auf aPowerPoint.ActivePresentation.PageSetup.* mehr nötig.
2. Shapes einfügen mit ppptools.AddShape und ppptools.AddOval
// Stern — benötigt den vollen MsoAutoShapeType-Enum
var oStar = ppptools.AddShape(starType, cx - size/2f, cy - size/2f, size, size);
// Kreise — Kurzform AddOval statt AddShape(msoShapeOval, ...)
var oSmall = ppptools.AddOval(cx - sizeSmall/2f, cy - sizeSmall/2f, sizeSmall, sizeSmall);
ppptools.AddOval ist eine Kurzform für ppptools.AddShape(MsoAutoShapeType.msoShapeOval, ...).
3. Boolean-Operationen und ppptools.GetSelected()
oStar.Select(MsoTriState.msoTrue);
oSmall.Select(MsoTriState.msoFalse);
ppptools.Union();
dynamic oUnion = ppptools.GetSelected(); // ← Ergebnis-Shape greifen
Nach jeder Boolean-Op konsumiert PowerPoint die Input-Shapes — sie existieren nicht mehr. Das Ergebnis muss sofort in einer Variable gesichert werden, bevor die nächste Selektion es überschreibt.
Die drei Operationen nacheinander:
| Schritt | Operation | Ergebnis |
|---|---|---|
| Stern + kleiner Kreis | Union |
Täler zwischen Zähnen auffüllen |
| Union-Ergebnis + grosser Kreis | Intersect |
Zahnköpfe begrenzen/abrunden |
| Intersect-Ergebnis + Loch-Kreis | Combine |
Mittelloch ausstanzen |
4. Ergebnisse benennen mit ppptools.GetSelectedRange()
foreach (dynamic sh in ppptools.GetSelectedRange())
{
sh.Name = "GearWheel_" + tooths;
ApplyStyle(sh);
}
ppptools.GetSelectedRange() gibt das ShapeRange-Objekt der aktuellen Selektion zurück —
zum Iterieren über alle Shapes in der letzten Selektion.
Die drei Grössenproportionen
| Variable | Formel | Effekt |
|---|---|---|
sizeSmall |
size × 0.5713 |
Füllt Täler auf → Union rundet Zähne ein |
sizeBig |
size × 0.7143 |
Begrenzt Zahnköpfe → Intersect rundet Zähne ab |
sizeHole |
size × (nabeProz/100) |
Nabenöffnung, parametrisierbar |
Warum ApplyStyle auch auf Zwischenformen?
Alle Zwischen-Shapes werden mit ApplyStyle formatiert — damit die Boolean-Ops konsistente
Ergebnisse liefern. Unformatierte Shapes können beim Union/Intersect unerwartete Fill- oder
Line-Eigenschaften übernehmen.
Zurück: PPPTools-Referenz · Alle Beispiele