Verbinder in Präsentationen mit Python verwalten

Einleitung

Ein PowerPoint‑Verbinder ist eine spezialisierte Linie, die zwei Formen verbindet und angeheftet bleibt, wenn die Formen auf einer Folie verschoben oder neu positioniert werden. Verbinder werden an Verbindungspunkten (grüne Punkte) an Formen befestigt. Verbindungspunkte erscheinen, wenn der Zeiger sich ihnen nähert. Anpassungspunkte (gelbe Punkte), die bei bestimmten Verbindern verfügbar sind, ermöglichen das Ändern von Position und Form eines Verbinders.

Verbindertypen

In PowerPoint können Sie drei Arten von Verbindern verwenden: gerade, Ellenbogen (gekrümmt) und Kurven.

Aspose.Slides unterstützt die folgenden Verbindertypen:

Verbindertyp Bild Anzahl der Anpassungspunkte
ShapeType.LINE Linienverbinder 0
ShapeType.STRAIGHT_CONNECTOR1 Gerader Verbinder 1 0
ShapeType.BENT_CONNECTOR2 Gebogener Verbinder 2 0
ShapeType.BENT_CONNECTOR3 Gebogener Verbinder 3 1
ShapeType.BENT_CONNECTOR4 Gebogener Verbinder 4 2
ShapeType.BENT_CONNECTOR5 Gebogener Verbinder 5 3
ShapeType.CURVED_CONNECTOR2 Kurvenverbinder 2 0
ShapeType.CURVED_CONNECTOR3 Kurvenverbinder 3 1
ShapeType.CURVED_CONNECTOR4 Kurvenverbinder 4 2
ShapeType.CURVED_CONNECTOR5 Kurvenverbinder 5 3

Formen mit Verbindern verbinden

Dieser Abschnitt zeigt, wie man Formen mit Verbindern in Aspose.Slides verknüpft. Sie fügen einer Folie einen Verbinder hinzu und befestigen dessen Anfang und Ende an Ziel­formen. Die Verwendung von Verbindungspunkten stellt sicher, dass der Verbinder an den Formen „geklebt“ bleibt, selbst wenn diese verschoben oder in ihrer Größe verändert werden.

  1. Erstellen Sie eine Instanz der Presentation‑Klasse.
  2. Holen Sie eine Referenz auf die Folie anhand ihres Index.
  3. Fügen Sie der Folie zwei AutoShape‑Objekte mithilfe der vom ShapeCollection‑Objekt bereitgestellten Methode add_auto_shape hinzu.
  4. Fügen Sie einen Verbinder mit der Methode add_connector des ShapeCollection‑Objekts hinzu und geben Sie den Verbindertyp an.
  5. Verbinden Sie die Formen mit dem Verbinder.
  6. Rufen Sie die Methode reroute auf, um den kürzesten Verbindungsweg anzuwenden.
  7. Speichern Sie die Präsentation.

Der folgende Python‑Code zeigt, wie ein gebogener Verbinder zwischen zwei Formen (einer Ellipse und einem Rechteck) hinzugefügt wird:

import aspose.slides as slides

# Instanziieren der Presentation-Klasse, um eine PPTX-Datei zu erstellen.
with slides.Presentation() as presentation:

    # Zugriff auf die Shapes-Sammlung der ersten Folie.
    shapes = presentation.slides[0].shapes

    # Eine Ellipse-AutoShape hinzufügen.
    ellipse = shapes.add_auto_shape(slides.ShapeType.ELLIPSE, 50, 50, 100, 100)

    # Ein Rechteck-AutoShape hinzufügen.
    rectangle = shapes.add_auto_shape(slides.ShapeType.RECTANGLE, 150, 200, 100, 100)

    # Einen Verbinder zur Folie hinzufügen.
    connector = shapes.add_connector(slides.ShapeType.BENT_CONNECTOR2, 0, 0, 10, 10)

    # Die Formen mit dem Verbinder verbinden.
    connector.start_shape_connected_to = ellipse
    connector.end_shape_connected_to = rectangle

    # reroute aufrufen, um den kürzesten Pfad zu setzen.
    connector.reroute()

    # Die Präsentation speichern.
    presentation.save("connected_shapes.pptx", slides.export.SaveFormat.PPTX)

Verbindungspunkte angeben

Dieser Abschnitt erklärt, wie man einen Verbinder an einem bestimmten Verbindungspunkt einer Form in Aspose.Slides befestigt. Durch das gezielte Ansteuern von Verbindungspunkten können Sie die Leitung und Anordnung des Verbinders steuern und saubere, vorhersehbare Diagramme in Ihren Präsentationen erzeugen.

  1. Erstellen Sie eine Instanz der Presentation‑Klasse.
  2. Holen Sie eine Referenz auf die Folie anhand ihres Index.
  3. Fügen Sie der Folie zwei AutoShape‑Objekte mithilfe der vom ShapeCollection‑Objekt bereitgestellten Methode add_auto_shape hinzu.
  4. Fügen Sie einen Verbinder mit der Methode add_connector des ShapeCollection‑Objekts hinzu und geben Sie den Verbindertyp an.
  5. Verbinden Sie die Formen mit dem Verbinder.
  6. Setzen Sie Ihre bevorzugten Verbindungspunkte an den Formen.
  7. Speichern Sie die Präsentation.

Der folgende Python‑Code demonstriert, wie ein bevorzugter Verbindungspunkt festgelegt wird:

import aspose.slides as slides

# Instanziieren der Presentation-Klasse, um eine PPTX-Datei zu erstellen.
with slides.Presentation() as presentation:

    # Zugriff auf die Shapes-Sammlung der ersten Folie.
    shapes = presentation.slides[0].shapes

    # Eine Ellipse-AutoShape hinzufügen.
    ellipse = shapes.add_auto_shape(slides.ShapeType.ELLIPSE, 50, 50, 100, 100)

    # Eine Rechteck-AutoShape hinzufügen.
    rectangle = shapes.add_auto_shape(slides.ShapeType.RECTANGLE, 150, 200, 100, 100)

    # Einen Verbinder zur Shape-Sammlung der Folie hinzufügen.
    connector = shapes.add_connector(slides.ShapeType.BENT_CONNECTOR3, 0, 0, 10, 10)

    # Die Formen mit dem Verbinder verbinden.
    connector.start_shape_connected_to = ellipse
    connector.end_shape_connected_to = rectangle

    # Den bevorzugten Verbindungsseitenindex auf der Ellipse festlegen.
    site_index = 6

    # Prüfen, ob der bevorzugte Index innerhalb der verfügbaren Seitenanzahl liegt.
    if  ellipse.connection_site_count > site_index:
        # Den bevorzugten Verbindungsseitenindex auf der Ellipse-AutoShape zuweisen.
        connector.start_shape_connection_site_index = site_index

    # Die Präsentation speichern.
    presentation.save("connection_points.pptx", slides.export.SaveFormat.PPTX)

Verbindungspunkte anpassen

Sie können Verbinder über deren Anpassungspunkte modifizieren. Nur Verbinder, die Anpassungspunkte bereitstellen, können auf diese Weise bearbeitet werden. Einzelheiten dazu, welche Verbinder Anpassungen unterstützen, finden Sie in der Tabelle unter Verbindertypen.

Einfacher Fall

Betrachten Sie den Fall, dass ein Verbinder zwischen zwei Formen (A und B) eine dritte Form (C) schneidet:

Verbinderbehinderung

Codebeispiel:

import aspose.slides as slides
import aspose.pydrawing as draw

with slides.Presentation() as presentation:
    slide = presentation.slides[0]

    shape = slide.shapes.add_auto_shape(slides.ShapeType.RECTANGLE, 300, 150, 150, 75)
    shape_from = slide.shapes.add_auto_shape(slides.ShapeType.RECTANGLE, 500, 400, 100, 50)
    shape_to = slide.shapes.add_auto_shape(slides.ShapeType.RECTANGLE, 100, 100, 70, 30)
    
    connector = slide.shapes.add_connector(slides.ShapeType.BENT_CONNECTOR5, 20, 20, 400, 300)
    
    connector.line_format.end_arrowhead_style = slides.LineArrowheadStyle.TRIANGLE
    connector.line_format.fill_format.fill_type = slides.FillType.SOLID
    connector.line_format.fill_format.solid_fill_color.color = draw.Color.black
    
    connector.start_shape_connected_to = shape_from
    connector.end_shape_connected_to = shape_to
    connector.start_shape_connection_site_index = 2

Um die dritte Form zu umgehen, passen Sie den Verbinder an, indem Sie dessen vertikalen Abschnitt nach links verschieben:

Behobene Verbinderbehinderung

    adjustment2 = connector.adjustments[1]
    adjustment2.raw_value += 10000

Komplexe Fälle

Für fortgeschrittene Anpassungen betrachten Sie Folgendes:

  • Der anpassbare Punkt eines Verbinders wird durch eine Formel bestimmt, die seine Position festlegt. Das Ändern dieses Punktes kann die Gesamtform des Verbinders verändern.
  • Die Anpassungspunkte eines Verbinders werden in einem streng geordneten Array gespeichert, das von Anfang bis Ende des Verbinders nummeriert ist.
  • Die Werte der Anpassungspunkte stellen Prozentsätze der Breite/Höhe der Verbinder­form dar.
    • Die Form ist durch die Anfangs‑ und Endpunkte des Verbinders begrenzt und wird mit 1000 skaliert.
    • Der erste, zweite und dritte Anpassungspunkt stehen für: Prozentsatz der Breite, Prozentsatz der Höhe und erneut Prozentsatz der Breite.
  • Beim Berechnen der Koordinaten der Anpassungspunkte sind die Rotation und Spiegelung des Verbinders zu berücksichtigen. Hinweis: Für alle unter Connector Types aufgeführten Verbinder beträgt der Rotationswinkel 0.

Case 1

Betrachten Sie den Fall, dass zwei Textfeld‑Objekte mit einem Verbinder verknüpft sind:

Verknüpfte Formen

Codebeispiel:

import aspose.slides as slides
import aspose.pydrawing as draw

# Instanziieren der Presentation-Klasse, um eine PPTX-Datei zu erstellen.
with slides.Presentation() as presentation:

    # Erste Folie abrufen.
    slide = presentation.slides[0]

    # Erste Folie abrufen.
    shape_from = slide.shapes.add_auto_shape(slides.ShapeType.RECTANGLE, 100, 100, 60, 25)
    shape_from.text_frame.text = "From"
    shape_to = slide.shapes.add_auto_shape(slides.ShapeType.RECTANGLE, 500, 100, 60, 25)
    shape_to.text_frame.text = "To"

    # Einen Verbinder hinzufügen.
    connector = slide.shapes.add_connector(slides.ShapeType.BENT_CONNECTOR4, 20, 20, 400, 300)
    # Richtung des Verbinders festlegen.
    connector.line_format.end_arrowhead_style = slides.LineArrowheadStyle.TRIANGLE
    # Farbe des Verbinders festlegen.
    connector.line_format.fill_format.fill_type = slides.FillType.SOLID
    connector.line_format.fill_format.solid_fill_color.color = draw.Color.crimson
    # Linienstärke des Verbinders festlegen.
    connector.line_format.width = 3

    # Formen mit dem Verbinder verknüpfen.
    connector.start_shape_connected_to = shape_from
    connector.start_shape_connection_site_index = 3
    connector.end_shape_connected_to = shape_to
    connector.end_shape_connection_site_index = 2

    # Anpassungspunkte des Verbinders abrufen.
    adjustment_0 = connector.adjustments[0]
    adjustment_1 = connector.adjustments[1]

Anpassung

Ändern Sie die Werte der Anpassungspunkte des Verbinders, indem Sie den Prozentwert der Breite um 20 % und den Prozentwert der Höhe um 200 % erhöhen:

    # Werte der Anpassungspunkte ändern.
    adjustment_0.raw_value += 20000
    adjustment_1.raw_value += 200000

Das Ergebnis:

Verbinderanpassung 1

Um ein Modell zu definieren, das uns ermöglicht, die Koordinaten und die Form der Verbindersegmente zu bestimmen, erstellen Sie eine Form, die dem vertikalen Bauteil des Verbinders bei connector.adjustments[0] entspricht:

    # Zeichnen des vertikalen Bestandteils des Verbinders.
    x = connector.x + connector.width * adjustment_0.raw_value / 100000
    y = connector.y
    height = connector.height * adjustment_1.raw_value / 100000

    slide.shapes.add_auto_shape(slides.ShapeType.RECTANGLE, x, y, 0, height)

Das Ergebnis:

Verbinderanpassung 2

Case 2

In Case 1 haben wir eine einfache Verbinderanpassung anhand grundlegender Prinzipien demonstriert. In typischen Szenarien müssen Sie die Rotation des Verbinders und seine Anzeigeeinstellungen (gesteuert durch connector.rotation, connector.frame.flip_h und connector.frame.flip_v) berücksichtigen. So funktioniert der Prozess.

Zuerst fügen Sie der Folie ein neues Textfeld‑Objekt (To 1) für die Verbindung hinzu und erstellen einen neuen grünen Verbinder, der es mit den bestehenden Objekten verbindet.

    # Erstelle ein neues Zielobjekt.
    shape_to_1 = sld.shapes.add_auto_shape(slides.ShapeType.RECTANGLE, 100, 400, 60, 25)
    shape_to_1.text_frame.text = "To 1"

    # Erstelle einen neuen Verbinder.
    connector = sld.shapes.add_connector(slides.ShapeType.BENT_CONNECTOR4, 20, 20, 400, 300)
    connector.line_format.end_arrowhead_style = slides.LineArrowheadStyle.TRIANGLE
    connector.line_format.fill_format.fill_type = slides.FillType.SOLID
    connector.line_format.fill_format.solid_fill_color.color = draw.Color.medium_aquamarine
    connector.line_format.width = 3

    # Verbinde die Objekte mit dem neu erstellten Verbinder.
    connector.start_shape_connected_to = shapeFrom
    connector.start_shape_connection_site_index = 2
    connector.end_shape_connected_to = shape_to_1
    connector.end_shape_connection_site_index = 3

    # Abrufen der Anpassungspunkte des Verbinders.
    adjustment_0 = connector.adjustments[0]
    adjustment_1 = connector.adjustments[1]
    
    # Werte der Anpassungspunkte ändern.
    adjustment_0.raw_value += 20000
    adjustment_1.raw_value += 200000

Das Ergebnis:

Verbinderanpassung 3

Als Nächstes erstellen Sie eine Form, die dem horizontalen Abschnitt des Verbinders entspricht, der durch den neuen Anpassungspunkt connector.adjustments[0] verläuft. Verwenden Sie die Werte aus connector.rotation, connector.frame.flip_h und connector.frame.flip_v und wenden Sie die Standard‑Formel zur Koordinatentransformation bei Rotation um einen gegebenen Punkt x0 an:

X = (x — x0) * cos(alpha) — (y — y0) * sin(alpha) + x0;

Y = (x — x0) * sin(alpha) + (y — y0) * cos(alpha) + y0;

In unserem Fall beträgt der Rotationswinkel des Objekts 90 Grad und der Verbinder wird vertikal dargestellt, sodass der entsprechende Code lautet:

    # Speichere die Koordinaten des Verbinders.
    x = connector.x
    y = connector.y
    
    # Korrigiere die Koordinaten des Verbinders, falls er gespiegelt ist.
    if connector.frame.flip_h == 1:
        x += connector.width
    if connector.frame.flip_v == 1:
        y += connector.height

    # Verwende den Wert des Anpassungspunkts als Koordinate.
    x += connector.width * adjValue_0.raw_value / 100000
    
    # Konvertiere die Koordinaten, weil sin(90°) = 1 und cos(90°) = 0 ist.
    xx = connector.frame.center_x - y + connector.frame.center_y
    yy = x - connector.frame.center_x + connector.frame.center_y

    # Bestimme die Breite des horizontalen Segments mithilfe des Wertes des zweiten Anpassungspunkts.
    width = connector.height * adjValue_1.raw_value / 100000
    shape = sld.shapes.add_auto_shape(slides.ShapeType.RECTANGLE, xx, yy, width, 0)
    shape.line_format.fill_format.fill_type = slides.FillType.SOLID
    shape.line_format.fill_format.solid_fill_color.color = draw.Color.red

Das Ergebnis:

Verbinderanpassung 4

Wir haben Berechnungen sowohl für einfache als auch für komplexere Anpassungspunkte (bei denen Rotation berücksichtigt wird) demonstriert. Mit diesem Wissen können Sie Ihr eigenes Modell entwickeln – oder Code schreiben – um ein GraphicsPath‑Objekt zu erhalten oder sogar die Werte der Anpassungspunkte eines Verbinders basierend auf konkreten Folienkoordinaten zu setzen.

Verbindungs­liniewinkel ermitteln

Verwenden Sie das untenstehende Beispiel, um den Winkel von Verbindungs­linien auf einer Folie mit Aspose.Slides zu bestimmen. Sie lernen, wie Sie die Endpunkte eines Verbinders auslesen und seine Ausrichtung berechnen, um Pfeile, Beschriftungen und andere Formen exakt auszurichten.

  1. Erstellen Sie eine Instanz der Presentation‑Klasse.
  2. Holen Sie eine Referenz auf die Folie anhand des Index.
  3. Greifen Sie auf die Form des Verbindungs­linien‑Objekts zu.
  4. Verwenden Sie die Breite und Höhe der Linie sowie die Breite und Höhe des Formrahmens, um den Winkel zu berechnen.

Der folgende Python‑Code demonstriert, wie der Winkel für ein Verbinder‑Linien‑Objekt berechnet wird:

import aspose.slides as slides
import math

def get_direction(w, h, flip_h, flip_v):
    end_line_x = w * (-1 if flip_h else 1)
    end_line_y = h * (-1 if flip_v else 1)
    end_y_axis_x = 0
    end_y_axis_y = h
    angle = math.atan2(end_y_axis_y, end_y_axis_x) - math.atan2(end_line_y, end_line_x)
    if (angle < 0):
         angle += 2 * math.pi
    return angle * 180.0 / math.pi

with slides.Presentation("connector_line_angle.pptx") as presentation:
    slide = presentation.slides[0]
    for shape_index in range(len(slide.shapes)):
        direction = 0.0
        shape = slide.shapes[shape_index]
        if type(shape) is slides.AutoShape and shape.shape_type == slides.ShapeType.LINE:
            direction = get_direction(shape.width, shape.height, shape.frame.flip_h, shape.frame.flip_v)
        elif type(shape) is slides.Connector:
            direction = get_direction(shape.width, shape.height, shape.frame.flip_h, shape.frame.flip_v)
        print(direction)

FAQ

Wie erkenne ich, ob ein Verbinder an einer bestimmten Form “geklebt” werden kann?

Prüfen Sie, ob die Form connection sites bereitstellt. Gibt es keine oder ist die Anzahl 0, ist ein Kleben nicht möglich; in diesem Fall verwenden Sie freie Endpunkte und positionieren sie manuell. Es ist ratsam, die Anzahl der Sites vor dem Anfügen zu prüfen.

Was passiert mit einem Verbinder, wenn ich eine der verbundenen Formen lösche?

Die Enden werden gelöst; der Verbinder bleibt als gewöhnliche Linie mit freien Anfangs‑/Endpunkten auf der Folie erhalten. Sie können ihn entweder löschen oder die Verbindungen neu zuweisen und, falls nötig, reroute verwenden.

Werden Verbinder‑Beziehungen beim Kopieren einer Folie in eine andere Präsentation erhalten?

Im Allgemeinen ja, vorausgesetzt, die Ziel­formen werden ebenfalls kopiert. Wird die Folie in eine andere Datei eingefügt, ohne die verbundenen Formen, werden die Enden frei und Sie müssen sie erneut anfügen.