Beispiel 3 — Union: Rechteck und Kreis verschmelzen
Zwei sich überlappende Formen werden mit Union zu einer einzigen neuen Form zusammengeschmolzen. Zeigt das Grundprinzip aller Boolean-Operationen: Selektieren → Operation → Ergebnis abgreifen.
Ergebnis
Code
/* PARAMS */
float left = 80f;
float top = 100f;
float size = 150f;
int rgb = System.Drawing.ColorTranslator.ToOle(
System.Drawing.Color.FromArgb(155, 89, 182));
/* END PARAMS */
// Rechteck und Kreis erstellen (überlappend)
var oRect = ppptools.AddRect(left, top, size, size);
var oCircle = ppptools.AddOval(left + size * 0.6f, top, size, size);
// Union — beide Formen zu einer verschmelzen
oRect.Select(MsoTriState.msoTrue);
oCircle.Select(MsoTriState.msoFalse);
ppptools.Union();
// Ergebnis-Form formatieren
foreach (dynamic sh in ppptools.GetSelectedRange())
{
sh.Name = "UnionShape";
sh.Fill.ForeColor.RGB = rgb;
sh.Fill.Transparency = 0f;
sh.Line.Visible = MsoTriState.msoFalse;
}
Schritt-für-Schritt-Erklärung
1. Zwei überlappende Formen erstellen
var oRect = ppptools.AddRect(left, top, size, size);
var oCircle = ppptools.AddOval(left + size * 0.6f, top, size, size);
Der Kreis beginnt bei left + size * 0.6f, also 60 % der Grösse rechts vom Rechteck-Start. Damit überlappt er zu 40 % mit dem Rechteck — genug für eine sichtbare Verschmelzung.
2. Selektion aufbauen — der Kern aller Boolean-Operationen
oRect.Select(MsoTriState.msoTrue); // Erste Form: ersetzt bestehende Selektion
oCircle.Select(MsoTriState.msoFalse); // Zweite Form: wird zur Selektion hinzugefügt
| Parameter | Bedeutung |
|---|---|
msoTrue |
Replace — ersetzt die aktuelle Selektion |
msoFalse |
Add — fügt zur bestehenden Selektion hinzu |
Diese Selektions-Methode ist in Roslyn-Skripten die einzige zuverlässige Art, mehrere Formen für eine Boolean-Op zu markieren. List<Shape> funktioniert wegen des Namespace-Konflikts nicht.
3. Boolean-Operation ausführen
ppptools.Union();
ppptools.Union() entspricht dem PowerPoint-Befehl „Formen verbinden → Vereinigung". Die selektierten Formen werden zu einer einzigen Form zusammengeschmolzen. Die ursprünglichen Formen werden dabei gelöscht.
| ppptools-Methode | Ergebnis |
|---|---|
ppptools.Union() |
Alle selektierten Formen verschmelzen zu einer |
ppptools.Intersect() |
Nur der Überschneidungsbereich bleibt |
ppptools.Combine() |
Vereinigung, aber Überschneidung wird ausgestanzt (Loch) |
ppptools.Subtract() |
Zweite Form wird von erster abgezogen |
4. Ergebnis abgreifen und formatieren
foreach (dynamic sh in ppptools.GetSelectedRange())
{
sh.Name = "UnionShape";
sh.Fill.ForeColor.RGB = rgb;
sh.Fill.Transparency = 0f;
sh.Line.Visible = MsoTriState.msoFalse;
}
Nach ppptools.Union() ist die neue Ergebnis-Form automatisch selektiert. ppptools.GetSelectedRange() gibt das ShapeRange-Objekt zurück. Da Union immer genau eine Form erzeugt, liefert das foreach nur einen Durchlauf — es ist aber robuster als der direkte Zugriff ppptools.GetSelected() für Code, der auch bei Intersect mit mehreren Teilen korrekt wäre.
Besonderheiten dieses Beispiels
- Selektions-Reihenfolge —
msoTruefür die erste Form, dannmsoFalsefür alle weiteren. Falsche Reihenfolge führt zu falschen Ergebnissen. - Originale werden gelöscht — nach
ppptools.Union()existierenoRectundoCirclenicht mehr. Nicht mehr verwenden! foreachstatt[1]— bei Union ist das Ergebnis immer eine Form;foreachist trotzdem idiomatischer, weil der Code auch beiIntersectmit mehreren Teilen funktionieren würde.int rgb— hier wirdrgbdirekt alsint(OLE-Integer) gespeichert, da er in derforeach-Schleife mehrfach verwendet wird. Kürzer als jedes MalToOle()aufzurufen.
Zurück: Beispiel 2 — Kreis · Weiter: Beispiel 4 — Loch (Combine)