Advanced Content Editor
Der Advanced Content Editor ermöglicht es, PowerPoint-Shapes direkt mit C#-Code zu erstellen, zu testen und als Snippet in der Bibliothek zu speichern. Scripts werden mit Roslyn (Microsoft C# Scripting) zur Laufzeit ausgeführt.
Kein Support
Der Advanced Content Editor richtet sich an erfahrene Nutzer mit C#-Kenntnissen.
PPPTools bietet für selbst erstellte Scripts keinen Support.
Fehlerhafte Scripts können unerwartete Auswirkungen auf die geöffnete Präsentation haben.
Aufrufen
- Ribbon → Tools → Advanced Content Editor
- oder: in der Snippet- bzw. Action-Verwaltung über Code editieren — öffnet das Script des gewählten Eintrags direkt im Editor
Geändert
Der Editor war früher zusätzlich über das Burger-Menü ≡ der Taskpane erreichbar. Dieser Eintrag ist entfallen; der Aufruf läuft jetzt über den Ribbon-Button. Auch die Ribbon-Schaltfläche selbst ist umgezogen: von der Gruppe Content Manager in die Gruppe Tools — Symbol und Funktion sind unverändert.
Die Taskpane öffnet sich automatisch in der breiten Ansicht.
Interface
| Bereich | Beschreibung |
|---|---|
| Zeilennummern | Schmales Panel links vom Code-Feld — zeigt Zeilennummern synchron beim Scrollen |
| Code-Feld | C#-Script eingeben oder einfügen |
| Cursor-Anzeige | Zeigt aktuelle Zeile und Spalte (rechts in der Toolbar: Ln 1 Col 1) |
| Fehler-Panel | Zeigt Compiler- und Laufzeitfehler (erscheint automatisch bei Fehler) |
Toolbar
Die Toolbar ist in Schaltflächen-Gruppen organisiert. Schaltflächen mit einem kleinen Pfeil ▾ öffnen ein Dropdown mit Optionen.
Ausführen & Speichern
| Schaltfläche | Funktion |
|---|---|
| ▶ Ausführen | Script auf der aktiven Folie ausführen |
| 💾 Speichern ▾ | Dropdown: Snippet speichern oder als Draft zur öffentlichen Bibliothek hochladen |
Dropdown «💾 Speichern»:
| Option | Beschreibung |
|---|---|
| Als Snippet speichern | Script ausführen, Vorschaubild generieren, Metadaten eingeben und lokal speichern |
| Als Draft hochladen | Snippet als Entwurf zur öffentlichen Bibliothek senden (zur Freigabe durch Admin) |
Analyse & Code
| Schaltfläche | Funktion |
|---|---|
| 📂 Laden | Code eines bestehenden Snippets in den Editor laden |
| 🔍 Analyse ▾ | Dropdown mit Analyse- und Code-Werkzeugen |
Dropdown «🔍 Analyse»:
| Option | Beschreibung |
|---|---|
| Code analysieren | Script statisch analysieren: erkannte @param-Definitionen, Compiler-Warnungen und -Fehler im Dialog anzeigen |
| Code generieren (ersetzen) | ppptools.*-Code aus dem selektierten Shape generieren und den Editor-Inhalt ersetzen (nur wenn leer oder Starter-Template) |
| Code generieren (anfügen) | Generierten Code an den bestehenden Editor-Inhalt anhängen (mit Trennkommentar) |
| Nodes anzeigen | Knotenpunkte des selektierten Shapes als farbige Markierungen auf der Folie visualisieren |
| Editor zurücksetzen | Code auf das Starter-Template zurücksetzen und Fehler-Panel leeren |
Zeilennummern & Cursor-Position
Das schmale Panel links vom Code-Feld zeigt automatisch die Zeilennummern — synchron beim vertikalen Scrollen. Rechts in der Toolbar wird die aktuelle Cursor-Position angezeigt:
Ln 12 Col 5
Die Anzeige aktualisiert sich bei jeder Cursor-Bewegung.
Verfügbare Variablen
Im Script stehen folgende Variablen direkt zur Verfügung:
| Variable | Typ | Beschreibung |
|---|---|---|
ppptools |
AdvancedScriptHelper |
Alle PowerPoint-Operationen (Shape-Erstellung, Selektion, Boolean-Ops, Styling …) |
Params |
SnippetParamBag |
Parameter-Werte aus dem @param-Dialog (bei parametrisierten Snippets) |
Kein direkter COM-Zugriff
oSlide und aPowerPoint sind im Script nicht verfügbar — alle Operationen erfolgen
über ppptools.*-Methoden. Das verhindert unkontrollierten Zugriff auf die PowerPoint-Anwendung.
ppptools-Methoden (Übersicht)
→ Vollständige Referenz mit Parametern und Codebeispielen: PPPTools-Referenz
| Kategorie | Methoden |
|---|---|
| Folie | SlideWidth, SlideHeight |
| Erstellen | AddShape, AddRect, AddOval, BuildFreeform, AddPolygon, AddPolyline |
| Selektion | GetSelected, GetSelectedRange |
| Boolean-Ops | Union, Intersect, Combine, Subtract |
| Gruppieren | GroupSelected, Group |
| Duplizieren | Duplicate |
| Z-Order | SendBackward, BringForward, SendToBack, BringToFront |
| Spiegeln | FlipH, FlipV |
| Position | CenterOnSlide, Scale |
| Styling | SetFill, SetGradient, SetLine, HideLine, SetText |
| Fragen | AskColor, AskRgb, AskFont, AskLine, AskFill |
| Antwort anwenden | ApplyColor, ApplyFont, ApplyLine, ApplyFill, ToColor |
| Animationen | AddAnimation |
Wichtige Scripting-Regeln
Roslyn-Scripts laufen in einem speziellen Kontext. Folgende Regeln müssen eingehalten werden:
var / dynamic statt Shape
Der Typ Shape existiert in zwei Namespaces gleichzeitig (Microsoft.Office.Core und Microsoft.Office.Interop.PowerPoint) — das führt zu einem Compiler-Fehler.
// ❌ Fehler — ambiguous reference (wenn Shape-Typen gemischt verwendet werden)
Shape oRect = ppptools.AddRect(...);
// ✅ Korrekt
var oRect = ppptools.AddRect(...);
Enums ohne PowerPoint.-Vorsatz
Ein Script bekommt die Namensräume Microsoft.Office.Core, Microsoft.Office.Interop.PowerPoint,
System, System.Drawing und System.Collections.Generic bereits importiert. Enums werden
deshalb ohne Vorsatz geschrieben — PowerPoint. ist im Script kein Alias.
// ❌ Fehler CS0103: The name 'PowerPoint' does not exist in the current context
ppptools.SetText(sh, "Titel", align: PowerPoint.PpParagraphAlignment.ppAlignCenter);
// ✅ Korrekt
ppptools.SetText(sh, "Titel", align: PpParagraphAlignment.ppAlignCenter);
Dasselbe gilt für MsoTriState, MsoLineDashStyle und alle übrigen Office-Enums. Umgekehrt ist
der Namensraum PPPTools nicht importiert: Wer einen Typ daraus ausschreibt — etwa
FD_FillSpec — braucht using PPPTools; am Anfang des Scripts oder gleich var.
Lokale Funktion statt Action<T>
Action<Shape> scheitert am mehrdeutigen Typ Shape (siehe oben), nicht am Namensraum System — der ist importiert. Eine lokale Funktion mit dynamic umgeht die Mehrdeutigkeit:
// ❌ Fehler
Action<Shape> style = sh => { sh.Fill.ForeColor.RGB = ...; };
// ✅ Korrekt — lokale void-Funktion
void ApplyStyle(dynamic sh)
{
sh.Fill.ForeColor.RGB = ...;
}
Selektion für Boolean-Operationen
List<Shape> ist wegen des Namespace-Konflikts nicht direkt verwendbar. Shapes werden stattdessen über .Select() selektiert:
// ✅ Korrekt
oShape1.Select(MsoTriState.msoTrue); // erstes Shape: Replace = true
oShape2.Select(MsoTriState.msoFalse); // weiteres Shape: Replace = false
ppptools.Union();
dynamic oResult = ppptools.GetSelected(); // Ergebnis-Shape abgreifen
Farben mit Design-Bezug setzen
Eine Farbe steht in einer PowerPoint-Datei auf eine von zwei Arten: als fester RGB-Wert oder als Verweis auf einen Farbplatz des Designs — „Akzent 1, 40 % heller“. Nur der Verweis folgt einem Vorlagenwechsel. Von Hand ist er unangenehm zu setzen, weil zwei Eigenschaften in der richtigen Reihenfolge dran müssen:
// Der Weg zu Fuss — und die Reihenfolge ist nicht beliebig:
// ObjectThemeColor setzt Brightness auf 0 zurück.
sh.Fill.ForeColor.ObjectThemeColor = MsoThemeColorIndex.msoThemeColorAccent1;
sh.Fill.ForeColor.Brightness = 0.4f;
PPPTools bringt für genau das ein eigenes Farbmodell mit — dasselbe, das hinter den Format-Dialogen steckt. Ein Script kann es direkt benutzen: der Script-Host referenziert die PPPTools-Assembly.
Der kurze Weg
using PPPTools; // nötig für die .ApplyTo(...)-Schreibweise
var farbe = FD_ColorValue.Parse("accent1+40");
farbe.ApplyTo(sh.Fill.ForeColor);
farbe.ApplyTo(sh.Line.ForeColor);
ApplyTo entscheidet selbst: Design-Bezug → ObjectThemeColor + Brightness in der
richtigen Reihenfolge, feste Farbe → RGB, „Automatisch“ → das Ziel bleibt unangetastet.
Der Rückgabewert sagt, ob etwas gesetzt wurde.
Ohne using
ApplyTo ist eine Erweiterungsmethode — die gibt es nur mit using PPPTools; am Anfang des Scripts. Wer darauf verzichten will, ruft sie ausgeschrieben auf: PPPTools.FD_ColorApply.ApplyTo(farbe, sh.Fill.ForeColor);
Was in den Text passt
| Schreibweise | Bedeutung |
|---|---|
accent1 … accent6 |
die sechs Akzentfarben des Designs |
lt1 dk1 lt2 dk2 |
Hell 1 · Dunkel 1 · Hell 2 · Dunkel 2 |
hlink folHlink |
Link · besuchter Link |
accent1+40 |
40 % heller |
accent1-25 |
25 % dunkler |
#8EAADB |
fester RGB-Wert — folgt der Vorlage nicht |
auto |
nicht gesetzt; das Ziel bleibt, wie es ist |
Es sind dieselben Kürzel wie im Dateiformat (schemeClr val) und dieselben, die PPPTools in
Vorlagen und Shape-Tags speichert. Parse wirft nie — Unlesbares ergibt auto.
Statt Text: direkt aufbauen
var a = FD_ColorValue.FromTheme(FD_ThemeSlot.Accent1, 0.4f, null); // Bezug
var b = FD_ColorValue.FromHex("#8EAADB"); // fest
var c = FD_ColorValue.FromRgb(System.Drawing.Color.Firebrick); // fest
var d = FD_ColorValue.Auto; // nicht gesetzt
Das null bei FromTheme ist die Designquelle. Fürs Setzen braucht es keine — der
Farbplatz landet als Verweis in der Datei, PowerPoint rechnet ihn selbst aus. Gebraucht wird
sie nur, wenn das Script die Farbe selbst kennen muss.
Die Farbe ausrechnen oder zurücklesen
var theme = FD_Theme.Snapshot(); // frischer Abzug der Designfarben
System.Drawing.Color rgb = farbe.Resolve(theme); // was der Bezug im aktuellen Deck ergibt
var vorhanden = FD_ColorApply.Read(sh.Fill.ForeColor, theme);
if (vorhanden.HasThemeRef) { /* die Form folgt der Vorlage */ }
In Schleifen
FD_Theme.Snapshot() liest fünfzehn Farben über COM. Wer pro Durchgang eine Farbe braucht — Puzzleteile, Wordclouds, Kachelwände — nimmt FD_Theme.Recent(): derselbe Abzug, für eine Viertelsekunde wiederverwendet.
Die Regel: den Bezug speichern, nicht den ausgerechneten Wert
Resolve ist zum Anzeigen und Rechnen da, nicht zum Speichern. Wer die ausgerechnete
Zahl in die Form schreibt, friert die Farbe ein — der nächste Vorlagenwechsel geht daran
vorbei. Fest ist trotzdem richtig, wo die Farbe nicht folgen soll: Markenfarben,
Pipettenfarben, Farben aus einem Bild.
@param color liefert einen festen Wert
Ein Parameter vom Typ color oder themecolor übergibt dem Script ein System.Drawing.Color — also RGB ohne Bezug. Wer im Snippet einen Design-Bezug will, baut ihn im Code (FD_ColorValue.Parse("accent1")) oder lässt das Kürzel über einen @param enum wählen.
Schrift, Rahmen und Füllung am Stück
Dieselbe Mechanik gibt es für ganze Formate. Jedes Feld ist optional — was null bleibt,
wird nicht angefasst:
using PPPTools;
using System.Collections.Generic;
var theme = FD_Theme.Snapshot();
new FD_FontSpec { Family = "Segoe UI", Size = 18f, Bold = true,
Color = FD_ColorValue.Parse("accent2") }
.ApplyToShape(sh, theme);
new FD_LineSpec { Visible = true, Weight = 1.5f, Dash = FD_LineDash.Dash,
Color = FD_ColorValue.Parse("dk1") }
.ApplyToShape(sh, theme);
new FD_FillSpec
{
Kind = FD_FillKind.Gradient,
Angle = 90f,
Stops = new List<FD_GradientStop>
{
new FD_GradientStop(FD_ColorValue.Parse("accent1"), 0f),
new FD_GradientStop(FD_ColorValue.Parse("accent1-30"), 1f)
}
}.ApplyToShape(sh, theme);
Position und Transparenz eines Verlaufsstopps liegen als 0…1 vor, nicht in Prozent.
ApplyToShape liefert zurück, wie viele Merkmale tatsächlich gesetzt wurden — 0 heisst
„nichts angefordert“ oder „das Ziel kann nichts davon“.
Format-Dialoge aus dem Snippet heraus öffnen
Bis hierhin ging es um das Modell: Farben, Schriften, Rahmen und Füllungen, die als Werte im Script stehen. Ein Snippet kann die Format-Dialoge aber auch selbst öffnen und den Nutzer mitten im Lauf fragen — es sind dieselben Fenster, die auch das Menüband öffnet.
Der Unterschied zu den Snippet-Parametern: die werden vor dem Lauf abgefragt, es muss also schon vorher feststehen, wonach zu fragen ist. Mitten im Lauf geht auch, was sich erst beim Rechnen ergibt — pro gefundener Form, pro Gruppe, je nach Zwischenergebnis.
| Frage | Antwort | Dialog |
|---|---|---|
ppptools.AskColor(titel, start, autoText) |
FD_ColorValue |
Farbwähler — mit Design-Bezug |
ppptools.AskRgb(titel, start) |
Color? |
Farbwähler — fester Farbwert |
ppptools.AskFont(titel, start, aendernModus) |
FD_FontSpec |
Schrift |
ppptools.AskLine(titel, start, aendernModus) |
FD_LineSpec |
Rahmen |
ppptools.AskFill(titel, start, aendernModus) |
FD_FillSpec |
Füllung, auch Verlauf |
Alle Argumente sind freiwillig. Angewendet wird die Antwort mit ApplyColor, ApplyFont,
ApplyLine und ApplyFill — die brauchen kein using PPPTools;.
Zum Ausprobieren: eine Form, vier Dialoge
Das Snippet erzeugt ein Rechteck und fragt nacheinander nach Füllung, Rahmen, Schrift und Textfarbe — einfügen, ausführen, fertig:
var sh = ppptools.AddRect(120, 120, 320, 140);
ppptools.SetText(sh, "Formatierte Testform",
align: PpParagraphAlignment.ppAlignCenter);
var fuellung = ppptools.AskFill("Füllung der Testform", sh); // Startwerte aus der Form
if (fuellung == null) return; // null = abgebrochen
ppptools.ApplyFill(sh, fuellung);
var rahmen = ppptools.AskLine("Rahmen der Testform", sh);
if (rahmen != null) ppptools.ApplyLine(sh, rahmen);
var schrift = ppptools.AskFont("Schrift der Testform", sh);
if (schrift != null) ppptools.ApplyFont(sh, schrift);
var textfarbe = ppptools.AskColor("Textfarbe", "lt1"); // Vorschlag: Hintergrund 1
if (textfarbe != null) ppptools.ApplyColor(sh, textfarbe, "text");
ppptools.ShowResult("Fertig", "Testform formatiert.", "OK", "success");
Reihenfolge
SetText setzt selbst Schriftart und -grösse (Vorgaben Arial / 12 pt). Es muss deshalb vor ApplyFont stehen — sonst überschreibt der Text die eben gewählte Schrift.
Zum Vergleich dasselbe mit Parametern, also vor dem Lauf gefragt:
// @param font Schrift "Schrift" default="Segoe UI,20,Bold"
// @param fill Fuellung "Füllung" default="gradient:#0070C0,#00B0F0,90"
// @param line Rahmen "Rahmen" default="#003A66,1.5,solid"
// @param color Textfarbe "Textfarbe" default="#FFFFFF"
// @button Testform erzeugen
var sh = ppptools.AddRect(120, 120, 320, 140);
ppptools.SetText(sh, "Formatierte Testform", color: Params.GetColor("Textfarbe"),
align: PpParagraphAlignment.ppAlignCenter);
ppptools.ApplyFill(sh, Params.GetFill("Fuellung")); // FillSpec aus @param fill
ppptools.SetLine (sh, Params.GetLine("Rahmen")); // LineSpec aus @param line
ppptools.SetFont (sh, Params.GetFont("Schrift")); // Font aus @param font
Der Unterschied steckt nicht im Aufwand, sondern im Ergebnis: AskColor liefert die Farbe
mit Design-Bezug zurück, @param color nur einen fertigen Farbwert.
Welche Variante wann?
@param — vor dem Lauf |
Ask* — mitten im Lauf |
|
|---|---|---|
| Wann gefragt wird | einmal, im Parameter-Dialog vor dem Start | so oft das Snippet will, an jeder Stelle |
| Wonach gefragt werden kann | was beim Schreiben des Snippets feststeht | auch, was sich erst beim Rechnen ergibt — pro gefundener Form, pro Gruppe |
| Vorbelegung | default="…" in der @param-Zeile |
eine Form (deren Werte) oder die letzte Antwort (start) |
| Design-Bezug einer Farbe | geht an der Parametergrenze verloren → fester Farbwert | bleibt erhalten → FD_ColorValue, ApplyColor schreibt ihn auf die Folie |
| Abbruch | der Lauf startet gar nicht | null — das Snippet entscheidet: aufhören, überspringen, Vorgabe |
| Ablesbarkeit | alle Einstellungen stehen im Snippet-Kopf | die Fragen stehen im Code, verteilt über den Ablauf |
Beides schliesst sich nicht aus: ein Snippet darf im Kopf @param-Zeilen führen und
später nachfragen — etwa die Grundeinstellung vorab, die Ausnahme pro Form mitten im Lauf.
Fragen und anwenden
var farbe = ppptools.AskColor("Farbe für die Kopfzeile", "accent1+40");
if (farbe == null) return; // abgebrochen
ppptools.ApplyColor(sh, farbe); // Füllung (Vorgabe)
ppptools.ApplyColor(sh, farbe, "line"); // Rahmen
ppptools.ApplyColor(sh, farbe, "text"); // Schriftfarbe
var schrift = ppptools.AskFont("Schrift", sh); // Startwerte aus der Form
if (schrift != null) ppptools.ApplyFont(sh, schrift);
var rahmen = ppptools.AskLine("Rahmen", sh);
if (rahmen != null) ppptools.ApplyLine(sh, rahmen);
var fuellung = ppptools.AskFill("Füllung", sh);
if (fuellung != null) ppptools.ApplyFill(sh, fuellung);
ApplyFont, ApplyLine und ApplyFill liefern zurück, wie viele Merkmale gesetzt wurden.
null heisst abgebrochen
Alle fünf Fragen liefern null, wenn der Nutzer den Dialog schliesst, ohne zu bestätigen. Die Apply-Methoden schlucken null still — sie tun dann nichts. Was ein Abbruch bedeutet, entscheidet also das Snippet selbst: aufhören (return), diese eine Form überspringen (continue) oder mit einem Vorgabewert weitermachen.
Womit der Dialog aufgeht
start nimmt bei AskFont, AskLine und AskFill zweierlei: eine Form — dann liest
der Dialog deren jetzige Werte als Startwerte — oder eine frühere Antwort, dann steht
er wieder dort, wo der Nutzer ihn zuletzt verlassen hat. Bei AskColor ist start ein
Speicherstring ("accent1+40", "#1F4E79", "auto").
Zusammen ergibt das die Schleife, die mit Parametern nicht auszudrücken war:
FD_FillSpec zuletzt = null; // braucht using PPPTools; — oder gleich var
foreach (dynamic sh in ppptools.GetSelectedRange())
{
string name = sh.Name;
object start = (object)zuletzt ?? (object)sh;
zuletzt = ppptools.AskFill("Füllung für " + name, start);
if (zuletzt == null) break; // Abbruch beendet die Schleife
ppptools.ApplyFill(sh, zuletzt);
}
Zeitlimit
Ein Script darf höchstens 5 Minuten rechnen, danach bricht PPPTools es ab. Gezählt wird nur die Rechenzeit: solange einer dieser Dialoge offen ist, steht die Uhr still. Eine Schleife über viele Formen darf also so lange dauern, wie Sie zum Antworten brauchen. (In der Snippet-Galerie gilt dasselbe, dort mit 30 Sekunden Rechenzeit.)
Nur ändern, was angehakt ist
Der dritte Schalter bei AskFont, AskLine und AskFill ist der Änderungsmodus: jedes
einzelne Merkmal darf dann auf „unverändert" stehen bleiben. Gesetzt wird nur, was der
Nutzer wirklich anhakt, der Rest der Form bleibt, wie er ist. Ohne den Schalter liefert der
Dialog einen vollständigen Satz Werte.
var nur = ppptools.AskFont("Was soll sich ändern?", sh, true);
if (nur != null) ppptools.ApplyFont(sh, nur);
Bezug statt Wert
AskColor liefert einen FD_ColorValue, und ApplyColor schreibt den Design-Bezug als
solchen auf die Form — die Farbe folgt danach einem Vorlagenwechsel. Genau das können die
Parameter nicht: @param color reicht an der Parametergrenze nur noch einen fertigen
Farbwert weiter.
Für die Methoden, die eine feste Farbe erwarten (SetFill, SetLine, SetGradient), löst
ToColor den Bezug am Design des Foliensatzes auf:
var c = ppptools.AskColor("Farbe", "accent1");
if (c == null) return;
ppptools.ApplyColor(sh, c); // behält „Akzent 1"
ppptools.SetGradient(sh2, ppptools.ToColor(c), Color.White); // fester Wert
AskRgb ist dasselbe eine Stufe früher: Es fragt gleich nach einem festen Farbwert.
Während der Dialog offen ist
Die Dialoge gehen in der Bildschirmmitte auf, nicht am Mauszeiger — das Snippet hat den Zeiger irgendwo gelassen. Läuft gerade eine Fortschrittsanzeige, tritt sie beiseite und kommt danach mit ihrem Stand zurück.
Beispiele
Jedes Beispiel hat eine eigene Seite mit Ergebnis-Vorschau, vollständigem Code und Schritt-für-Schritt-Erklärung.
Grundlagen-Beispiele (Boolean-Operationen):
| # | Beispiel | Themen |
|---|---|---|
| 1 | Rechteck | ppptools.AddRect, Füllfarbe, Rahmen entfernen |
| 2 | Kreis | ppptools.AddOval, Mittelpunkt-Berechnung, Rahmenfarbe |
| 3 | Union | Selektions-Muster, ppptools.Union(), ppptools.GetSelected() |
| 4 | Quadrat mit Loch | ppptools.Combine(), echte geometrische Löcher |
| 5 | Zahnrad | 3 Boolean-Ops verketten, Adjustments[1], alle Zahnzahlen |
Vollständige parametrisierte Beispiele (alle ppptools-Methoden):
| Beispiel | ppptools-Methoden |
|---|---|
| Zahnrad (parametrisiert) | AddShape, AddOval, GetSelected, GetSelectedRange, Union, Intersect, Combine, SlideWidth/Height |
| PostIt (parametrisiert) | BuildFreeform, AddRect, GetSelected, Duplicate, Intersect, Subtract, FlipH, SendBackward, SetGradient, HideLine, Group |
| Persona (parametrisiert) | BuildFreeform, AddOval, AddRect, Group, Scale, SlideWidth/Height |
Workflow
Code aus selektiertem Shape generieren
Die Optionen Code generieren (ersetzen) und Code generieren (anfügen) lesen das aktuell in PowerPoint selektierte Shape und erzeugen sofort ausführbaren ppptools.*-Code.
Ersetzen vs. Anfügen:
| Option | Verhalten |
|---|---|
| Code generieren (ersetzen) | Editor ist leer oder zeigt nur das Starter-Template → Code wird direkt eingefügt und ersetzt den Inhalt |
| Code generieren (anfügen) | Vorhandener Code bleibt erhalten → neuer Code wird mit Trennkommentar angehängt |
Was wird generiert:
| Shape-Typ | Generierter Code |
|---|---|
| Rechteck | ppptools.AddRect(...) |
| Oval / Kreis | ppptools.AddOval(...) |
| Anderes AutoShape | ppptools.AddShape(MsoAutoShapeType.xxx, ...) |
| FreeForm (nur gerade Segmente) | ppptools.AddPolygon(new float[]{...}, new float[]{...}) |
| FreeForm (mit Kurven) | ppptools.BuildFreeform(...) + AddNodes(...) |
| Gruppe | Rekursiver Code für alle Elemente + ppptools.Group(...) |
| Füllung | ppptools.SetFill(...) oder ppptools.SetGradient(...) |
| Rahmen | ppptools.SetLine(...) oder ppptools.HideLine(...) |
| Text | ppptools.SetText(...) |
| Animationen | ppptools.AddAnimation(...) inkl. Timing |
Idealer Workflow
Shape in PowerPoint manuell zeichnen → Code generieren (ersetzen) → Editor zeigt den exakten Code zum Nacherstellen → Parameter anpassen → ▶ Ausführen zum Testen → 💾 Als Snippet speichern.
Nodes anzeigen
Die Option Nodes anzeigen platziert farbige Markierungen direkt auf der Folie für jeden Knotenpunkt des selektierten Shapes.
FreeForm-Shapes
Bei FreeForm-Shapes wird jeder Knoten mit Koordinaten, Index, Segment-Typ (Line / Curve) und Editing-Typ (Corner / Auto) beschriftet.
Farb-Kodierung:
| Farbe | Bedeutung |
|---|---|
| 🟢 Grün | Start-Knoten (Index 0) |
| 🔴 Rot | Zwischenknoten |
| 🔵 Blau | Letzter Knoten |
Standard-Shapes (Rechteck, Oval, AutoShape …)
Bei Standard-Shapes werden die 4 Eckpunkte (TL / TR / BR / BL) und der Mittelpunkt (C) angezeigt:
| Marker | Position | Form |
|---|---|---|
| TL / TR / BR / BL | Ecken | Kleiner blauer Kreis |
| C | Mittelpunkt | Kleiner orangefarbener Diamant |
Darüber erscheint ein Info-Label mit Name, Typ und Abmessungen des Shapes.
Aufräumen
Markierungen nach der Analyse löschen: Alle Shapes mit dem Namen Node_*, NodeLabel_* oder NodeInfo_* markieren und löschen, oder Ctrl+Z verwenden.
Code analysieren
Die Option Code analysieren prüft das aktuelle Script statisch und zeigt das Ergebnis in einem Dialog:
- Erkannte
@param-Definitionen (Name, Typ, Standardwert) - Compiler-Warnungen
- Compiler-Fehler
Nützlich um zu prüfen, ob alle @param-Deklarationen korrekt sind, bevor das Script ausgeführt wird.
→ Mehr zu @param: Parametrisierte Snippets
Script testen
- Code in das Code-Feld eingeben oder per 📂 Laden ein bestehendes Snippet öffnen
- ▶ Ausführen klicken — das Shape erscheint auf der aktiven Folie
- Bei Fehlern: Fehler-Panel lesen, Code korrigieren, erneut ausführen
- Testweise erstellte Shapes manuell löschen (Entf-Taste)
Hinweis
Es muss eine Präsentation geöffnet und eine Folie aktiv sein.
Als Snippet speichern
- 💾 Speichern ▾ → Als Snippet speichern klicken
- Script wird ausgeführt — neu erstellte Shapes werden automatisch erkannt
- Vorschaubild wird aus den neuen Shapes generiert
- Shapes werden nach dem Vorschaubild-Export wieder gelöscht
- Metadaten-Dialog: Name*, Kategorie, Tags, Beschreibung usw. eingeben
- Speichern — Snippet erscheint sofort in der Galerie
Tech. Name & Gruppieren
Der Metadaten-Dialog bietet auch Tech. Name (Ziel-Objektname beim Einfügen) und Gruppieren (mehrere erzeugte Objekte zusammenfassen). Details: Snippet speichern.
Bestehendes Snippet bearbeiten
Ein bereits gespeichertes Code-Snippet öffnest du nicht über 📂 Laden, sondern direkt aus der Verwaltung:
- Content Manager → Snippets → Verwalten, Snippet auswählen
- Unter dem Vorschaubild auf Code editieren klicken
Der Editor öffnet sich im Snippet-Edit-Modus mit einer reduzierten Toolbar:
| Schaltfläche | Funktion |
|---|---|
| ▶ Ausführen | Script auf der aktiven Folie ausführen (wie sonst) |
| Speichern | Überschreibt die code.cs dieses Snippets — gleiche ID, Metadaten bleiben unverändert |
| Vorschaubild neu | Erzeugt das Vorschaubild neu — aus dem aktuellen Editor-Code, nicht aus der gespeicherten Datei |
| Schliessen | Zurück ins Snippet-Verwalten, das Snippet ist dort wieder ausgewählt |
Eigene Dateien des Snippets
Im Edit-Modus zeigt ppptools.AssetPath() auf den Ordner des bearbeiteten Snippets — mitgelieferte Bilder oder Datenlisten funktionieren also schon beim Testen im Editor.
Nur Code-Snippets
Bei Fragment- und Bild-Snippets ist Code editieren inaktiv. Der Einstieg benötigt eine Pro-Lizenz — wie der Editor selbst.
Als Draft zur öffentlichen Bibliothek hochladen
Fertige Snippets können direkt aus dem Editor als Entwurf (Draft) zur öffentlichen Bibliothek gesendet werden:
- 💾 Speichern ▾ → Als Draft hochladen klicken
- Script wird ausgeführt und ein Vorschaubild generiert
- Metadaten-Dialog ausfüllen (Name*, Kategorie, Tags, Beschreibung)
- Snippet wird als Draft an den Library-Server übertragen
- Ein Admin prüft und veröffentlicht das Snippet
Draft-Status
Nach dem Upload ist das Snippet noch nicht öffentlich — es muss zuerst von einem Admin geprüft und freigegeben werden.
Microsoft-Dokumentation
| Thema | Link |
|---|---|
| Alle Shape-Typen (MsoAutoShapeType) | learn.microsoft.com |
| Shapes.AddShape Methode | learn.microsoft.com |
| Shape-Objekt (alle Eigenschaften) | learn.microsoft.com |
| FillFormat (Füllung) | learn.microsoft.com |
| LineFormat (Rahmen) | learn.microsoft.com |