🌐 This page is not yet available in English — showing the German version.

PPPTools-Beispiel — Zahnrad

Erstellt: 2026-05-29 · Aktualisiert: 2026-05-29

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