Assets im Snippet (@param asset)
Ein Snippet kann eigene Dateien mitbringen — Bilder, Icons oder Datenlisten. Sie liegen im Ordner des Snippets, werden beim Publizieren, Sichern und Hochladen automatisch mitgenommen, und das Script greift über ppptools.* darauf zu.
Mit dem Parametertyp asset bekommt der Nutzer daraus eine Auswahlliste mit Vorschaubild — gespeist aus einer CSV-Datei, die neben dem Snippet liegt.
Diese Seite erklärt beides am durchgehenden Beispiel eines Länderflaggen-Snippets: 271 Länder, je zwei Seitenverhältnisse, als PNG und als SVG.
Warum nicht einfach Dateipfade im Code?
Ein Snippet läuft auf fremden Rechnern und wird über die Bibliothek verteilt. Ein fester Pfad wie C:\Bilder\ch.png funktioniert dort nicht. Assets im Snippet-Ordner wandern dagegen mit dem Snippet mit.
Der Snippet-Ordner
Assets liegen direkt neben code.cs. Unterordner sind erlaubt:
<Snippet-Ordner>\
├── code.cs ← vom Editor erzeugt
├── snippet.xml ← vom Editor erzeugt
├── preview.png ← vom Editor erzeugt
├── countries.csv ← eigene Datenliste
├── flags_png\
│ ├── 1x1\ ch.png · de.png · …
│ └── 4x3\ ch.png · de.png · …
└── flags_svg\
├── 1x1\ ch.svg · de.svg · …
└── 4x3\ ch.svg · de.svg · …
So kommen die Dateien hinein: Snippet einmal speichern, dann in Snippet-Verwalten auf „Ordner öffnen" klicken und die Dateien im Explorer hineinkopieren. Erneutes Speichern überschreibt nur code.cs und snippet.xml — die Assets bleiben liegen.
Erlaubte Dateitypen
| Kategorie | Endungen |
|---|---|
| Bilder | .png · .jpg · .jpeg · .svg |
| Daten | .xml · .csv · .json |
| Inhalte | .pptx (Fragmente und Folien) |
Andere Dateitypen werden beim ZIP-Export und beim Hochladen abgewiesen. Das schützt davor, dass über die Bibliothek ungewollte Dateien verteilt werden.
Die Datenliste
Die CSV braucht eine Kopfzeile und verwendet Semikolon als Trennzeichen. Spalten werden später über ihren Namen angesprochen, die Reihenfolge ist also frei:
iso;de;en;svg_1x1;svg_4x3;png_1x1;png_4x3
CH;Schweiz;Switzerland;flags_svg\1x1\ch.svg;flags_svg\4x3\ch.svg;flags_png\1x1\ch.png;flags_png\4x3\ch.png
DE;Deutschland;Germany;flags_svg\1x1\de.svg;flags_svg\4x3\de.svg;flags_png\1x1\de.png;flags_png\4x3\de.png
Die Pfade sind relativ zum Snippet-Ordner. Benennst du einen Ordner um, musst du nur die CSV anpassen — nicht den Code.
Auswahl mit Vorschau: @param asset
// @param asset <name> "<Label>" source="<datei.csv>" labelcol="<spalte>"
// [valuecol="<spalte>"] [previewcol="<spalte>"] [default="<wert>"] [tooltip="…"]
- source — die CSV im Snippet-Ordner
- labelcol — Spalte, die in der Liste angezeigt wird
- valuecol — Spalte, die das Script als Wert erhält (fehlt sie, wird das Label zurückgegeben)
- previewcol — Spalte mit dem Vorschaubild
- default — Eintrag, der beim Öffnen vorausgewählt ist (Wert aus
labelcol)
Im Script liefert Params.GetString("<name>") den Inhalt von valuecol.
Für das Flaggen-Beispiel:
// @param asset Land "Land" source="countries.csv" labelcol="de" valuecol="de"
// previewcol="png_1x1" default="Schweiz" tooltip="Land wählen"
Vorschau nur als PNG oder JPG
previewcol muss auf ein PNG oder JPG zeigen. SVG kann im Parameter-Dialog nicht angezeigt werden — Windows bringt dafür keinen Decoder mit. Zeigt die Spalte auf eine SVG-Datei, bleibt die Vorschau einfach leer.
Das ist kein Problem: Die Vorschau darf ruhig ein anderes Format zeigen als das, was am Ende eingefügt wird. Im Flaggen-Beispiel zeigt sie immer png_1x1, während das Script je nach Nutzerwahl SVG oder PNG einfügt.
Zugriff aus dem Script
Scripts dürfen aus Sicherheitsgründen kein System.IO verwenden. Der Zugriff läuft deshalb über ppptools — und ist dabei fest auf den eigenen Snippet-Ordner begrenzt:
| Methode | Zweck |
|---|---|
ppptools.SnippetDir |
Pfad des Snippet-Ordners (leer, wenn noch nie gespeichert) |
ppptools.AssetExists("a", "b.png") |
Prüft, ob eine Datei vorhanden ist |
ppptools.AssetPath("a", "b.png") |
Vollständiger Pfad — für AddPicture |
ppptools.ReadAssetText("liste.csv") |
Textdatei als String |
ppptools.ReadAssetLines("liste.csv") |
Textdatei zeilenweise |
Pfadteile werden einzeln übergeben. Absolute Pfade und Sprünge nach oben (..) werden abgewiesen.
// Aus "flags_png\4x3\ch.png" in der CSV wird der volle Pfad:
string[] teile = pfad.Split('\\');
string datei = ppptools.AssetPath(teile);
Vollständiges Beispiel
// @param asset Land "Land" source="countries.csv" labelcol="de" valuecol="de"
// previewcol="png_1x1" default="Schweiz"
// @param enum Dateiformat "Dateiformat" options="PNG (Bild)|SVG (Vektor)" default="PNG (Bild)"
// @param float Breite "Breite (pt)" default=120 min=8 max=720
string land = Params.GetString("Land", "Schweiz");
bool istPng = Params.GetString("Dateiformat", "PNG (Bild)").StartsWith("PNG");
float breite = (float)Params.GetFloat("Breite", 120.0);
float hoehe = breite * 3f / 4f;
string datei = null, hinweis = null;
if (!ppptools.AssetExists("countries.csv"))
{
hinweis = "countries.csv fehlt im Snippet-Ordner.";
}
else
{
foreach (string zeile in ppptools.ReadAssetLines("countries.csv"))
{
if (zeile.Length == 0 || zeile.StartsWith("iso;")) continue; // Kopfzeile
string[] sp = zeile.Split(';');
if (sp.Length < 7) continue;
if (!string.Equals(sp[1], land, StringComparison.OrdinalIgnoreCase)) continue;
string pfad = istPng ? sp[6] : sp[4]; // png_4x3 bzw. svg_4x3
string[] teile = pfad.Split('\\');
if (ppptools.AssetExists(teile)) datei = ppptools.AssetPath(teile);
else hinweis = "Datei fehlt: " + pfad;
break;
}
}
if (datei != null)
{
var flagge = ppptools.AddPicture(datei, 100f, 100f, breite, hoehe);
flagge.Name = "Flagge_" + land;
}
else
{
// Kein throw — siehe Hinweis unten
var ph = ppptools.AddRect(100f, 100f, breite, hoehe);
ph.TextFrame.TextRange.Text = hinweis;
}
Drei Fallstricke
1. Nie eine Exception werfen, wenn Assets fehlen
Beim Speichern im Advanced Snippet Editor wird das Script ausgeführt, um daraus das Vorschaubild zu erzeugen. Wirft es, lässt sich das Snippet nicht speichern — und ohne gespeichertes Snippet gibt es keinen Ordner, in den man die Assets legen könnte.
Zeige stattdessen einen sichtbaren Platzhalter auf der Folie. So lässt sich das Snippet anlegen, danach kopierst du die Dateien hinein.
2. Im Editor kennt nur ein gespeichertes Snippet seinen Ordner
ppptools.SnippetDir ist leer, solange das Snippet nie gespeichert wurde. Zum Testen mit echten Assets: erst speichern, dann aus der Galerie einfügen.
3. SVG wird als Gruppe eingefügt
PowerPoint macht aus einem eingefügten SVG eine Gruppe aus Einzelformen. Setzt du darauf Line, erscheinen Rahmen innerhalb der Grafik. Zwei Auswege: PNG verwenden, oder ein eigenes Rechteck über die Grafik legen und beides gruppieren.
Ein eingefügtes SVG sollte ausserdem nicht per Ungroup aufgelöst werden — das kann PowerPoint zum Absturz bringen.
Weitergeben
| Weg | Assets dabei |
|---|---|
| Speichern als ZIP | ✔ inklusive Unterordner |
| In Online-Bibliothek hochladen | ✔ |
| In den Public-Share publizieren | ✔ |
| Backup und Wiederherstellen | ✔ |
Grosse Asset-Pakete werden beim Hochladen mit einer Rückfrage bestätigt.
Aus der Online-Bibliothek werden Assets einzeln bei Bedarf geladen, nicht als ganzes Paket: Beim Einfügen holt PPPTools nur die Dateien, die das Snippet tatsächlich anfasst, und legt sie lokal ab. Beim zweiten Mal kommt alles aus diesem Cache. Ein Snippet mit tausend Bildern ist damit genauso schnell wie eines mit einem einzigen — solange nur eines gebraucht wird.
Lizenzen mitliefern
Bringst du fremdes Material mit (Icons, Bilder, Datensätze), gehört die zugehörige Lizenzdatei in den Snippet-Ordner. Sie wird wie jedes andere Asset mitverteilt.