Verbindungselemente in Präsentationen in Java verwalten

Übersicht

Ein Verbindungselement ist eine Linie, die an zwei Formen befestigt bleiben kann, wenn sich eine der Formen bewegt. Seine Enden werden an Verbindungsstellen befestigt, die in PowerPoint durch grüne Punkte dargestellt werden. Einige gebogene und gekrümmte Verbindungselemente besitzen außerdem Anpassungspunkte, die durch orange Punkte angezeigt werden und die Position einzelner Segmente des Verbindungselements steuern.

Aspose.Slides repräsentiert Verbindungselemente über das IConnector‑Interface. Sie können Verbindungselemente erstellen, deren Enden an Formen anhängen, Verbindungsstellen auswählen, sie umleiten und die Geometrie von Verbindungselementen mit Anpassungspunkten ändern.

Verbindungstypen

Die ShapeType‑Klasse enthält Voreinstellungen für gerade, geknickte und gekrümmte Verbindungselemente. Die folgende Tabelle zeigt die verfügbaren Geometrien und die Anzahl der Anpassungspunkte, die jede Voreinstellung definiert.

Verbindungselement Bild Anzahl der Anpassungspunkte
ShapeType.Line shapetype-lineconnector 0
ShapeType.StraightConnector1 shapetype-straightconnector1 0
ShapeType.BentConnector2 shapetype-bent-connector2 0
ShapeType.BentConnector3 shapetype-bentconnector3 1
ShapeType.BentConnector4 shapetype-bentconnector4 2
ShapeType.BentConnector5 shapetype-bentconnector5 3
ShapeType.CurvedConnector2 shapetype-curvedconnector2 0
ShapeType.CurvedConnector3 shapetype-curvedconnector3 1
ShapeType.CurvedConnector4 shapetype-curvedconnector4 2
ShapeType.CurvedConnector5 shapetype.curvedconnector5 3

Die Anzahl und Bedeutung der Anpassungspunkte sind Teil der jeweiligen Voreinstellung. Gehen Sie nicht davon aus, dass zwei unterschiedliche Verbindungstypen dieselbe Layout‑Struktur der Sammlung besitzen.

Zwei Formen verbinden

Verwenden Sie IShapeCollection.addConnector, um ein Verbindungselement hinzuzufügen, und verwenden Sie IConnector.setStartShapeConnectedTo sowie IConnector.setEndShapeConnectedTo, um seine Enden zu verbinden. Nachdem beide Enden befestigt sind, wählt IConnector.reroute eine kurze Route zwischen den Formen.

Das folgende Beispiel verbindet eine Ellipse und ein Rechteck mit einem geknickten Verbindungselement:

import com.aspose.slides.*;

Presentation presentation = new Presentation();
try {
    ISlide slide = presentation.getSlides().get_Item(0);

    IAutoShape ellipse = slide.getShapes().addAutoShape(ShapeType.Ellipse, 40, 80, 120, 80);
    IAutoShape rectangle = slide.getShapes().addAutoShape(ShapeType.Rectangle, 320, 240, 140, 80);
    IConnector connector = slide.getShapes().addConnector(ShapeType.BentConnector2, 0, 0, 10, 10);

    connector.setStartShapeConnectedTo(ellipse);
    connector.setEndShapeConnectedTo(rectangle);
    connector.reroute();

    presentation.save("connected-shapes.pptx", SaveFormat.Pptx);
} finally {
    presentation.dispose();
}

Verbindungsstelle auswählen

Jede verbindbare Form gibt ihre Anzahl von Verbindungsstellen über IShape.getConnectionSiteCount zurück. Validieren Sie einen bevorzugten nullbasierten Stellen‑Index, bevor Sie ihn einem Verbindungselement‑Ende zuweisen; die Anzahl variiert je nach Formgeometrie.

Dieses Beispiel befestigt das Verbindungselement an einer bestimmten Stelle der Ellipse, sofern diese existiert:

import com.aspose.slides.*;

Presentation presentation = new Presentation();
try {
    ISlide slide = presentation.getSlides().get_Item(0);

    IAutoShape ellipse = slide.getShapes().addAutoShape(ShapeType.Ellipse, 40, 80, 120, 80);
    IAutoShape rectangle = slide.getShapes().addAutoShape(ShapeType.Rectangle, 320, 240, 140, 80);
    IConnector connector = slide.getShapes().addConnector(ShapeType.BentConnector3, 0, 0, 10, 10);

    connector.setStartShapeConnectedTo(ellipse);
    connector.setEndShapeConnectedTo(rectangle);

    long preferredSiteIndex = 2;
    if (preferredSiteIndex < ellipse.getConnectionSiteCount()) {
        connector.setStartShapeConnectionSiteIndex(preferredSiteIndex);
    } else {
        System.out.println("The ellipse has only " + ellipse.getConnectionSiteCount() + " connection sites.");
    }

    presentation.save("specific-connection-site.pptx", SaveFormat.Pptx);
} finally {
    presentation.dispose();
}

Anpassungspunkt eines Verbindungselements anpassen

Verbindungselemente mit Anpassungspunkten stellen diese über IGeometryShape.getAdjustments bereit. Überprüfen Sie jedes IAdjustValue und dessen getType‑Wert, bevor Sie ihn mit setRawValue ändern. Die allgemeinen Regeln zur Identifizierung von Voreinstellungs‑Formanpassungen sind in Shape Manipulation beschrieben.

Die Anzahl, Reihenfolge, Bedeutung und der zulässige Wertebereich von Verbindungselement‑Anpassungen hängen von der jeweiligen Voreinstellung ab. Der Anpassungstyp ist schreibgeschützt, der Anpassungswert jedoch beschreibbar. Die schreibgeschützte Methode getName liefert zusätzliche Identifikation, wenn ein Verbindungselement mehr als eine Anpassung des gleichen semantischen Typs enthält.

Um ein Hindernis herumführen

Im folgenden Layout verläuft ein BentConnector5 zwischen zwei Formen durch eine dritte Form:

connector-obstruction

Der Code erzeugt das blockierte Verbindungselement:

import com.aspose.slides.*;
import java.awt.Color;

Presentation presentation = new Presentation();
try {
    ISlide slide = presentation.getSlides().get_Item(0);

    slide.getShapes().addAutoShape(ShapeType.Rectangle, 300, 150, 150, 75);
    IAutoShape sourceShape = slide.getShapes().addAutoShape(ShapeType.Rectangle, 500, 400, 100, 50);
    IAutoShape targetShape = slide.getShapes().addAutoShape(ShapeType.Rectangle, 100, 100, 70, 30);
    IConnector connector = slide.getShapes().addConnector(ShapeType.BentConnector5, 20, 20, 400, 300);

    connector.getLineFormat().setEndArrowheadStyle(LineArrowheadStyle.Triangle);
    connector.getLineFormat().getFillFormat().setFillType(FillType.Solid);
    connector.getLineFormat().getFillFormat().getSolidFillColor().setColor(Color.BLACK);
    connector.setStartShapeConnectedTo(sourceShape);
    connector.setEndShapeConnectedTo(targetShape);
    connector.setStartShapeConnectionSiteIndex(2);

    presentation.save("connector-obstruction.pptx", SaveFormat.Pptx);
} finally {
    presentation.dispose();
}

Das Verschieben der vertikalen Krümmung ändert die Route, sodass das Verbindungselement das Hindernis umgeht:

connector-obstruction-fixed

Anstatt anzunehmen, dass der Sammlungs‑Index 1 immer die vertikale Krümmung darstellt, sucht dieses Beispiel nach ConnectorBendPositionY und ändert sie nur, wenn der erwartete semantische Typ vorhanden ist:

import com.aspose.slides.*;
import java.awt.Color;

Presentation presentation = new Presentation();
try {
    ISlide slide = presentation.getSlides().get_Item(0);

    slide.getShapes().addAutoShape(ShapeType.Rectangle, 300, 150, 150, 75);
    IAutoShape sourceShape = slide.getShapes().addAutoShape(ShapeType.Rectangle, 500, 400, 100, 50);
    IAutoShape targetShape = slide.getShapes().addAutoShape(ShapeType.Rectangle, 100, 100, 70, 30);
    IConnector connector = slide.getShapes().addConnector(ShapeType.BentConnector5, 20, 20, 400, 300);

    connector.getLineFormat().setEndArrowheadStyle(LineArrowheadStyle.Triangle);
    connector.getLineFormat().getFillFormat().setFillType(FillType.Solid);
    connector.getLineFormat().getFillFormat().getSolidFillColor().setColor(Color.BLACK);
    connector.setStartShapeConnectedTo(sourceShape);
    connector.setEndShapeConnectedTo(targetShape);
    connector.setStartShapeConnectionSiteIndex(2);

    IAdjustValue verticalBend = null;
    for (int adjustmentIndex = 0; adjustmentIndex < connector.getAdjustments().size(); adjustmentIndex++) {
        IAdjustValue adjustment = connector.getAdjustments().get_Item(adjustmentIndex);
        System.out.println(adjustment.getName() + ": " + adjustment.getType() + ", raw value = " + adjustment.getRawValue());
        if (adjustment.getType() == ShapeAdjustmentType.ConnectorBendPositionY) {
            verticalBend = adjustment;
            break;
        }
    }

    if (verticalBend == null) {
        System.out.println("The connector does not expose a vertical bend adjustment.");
    } else {
        verticalBend.setRawValue(60000);
        presentation.save("connector-obstruction-fixed.pptx", SaveFormat.Pptx);
    }
} finally {
    presentation.dispose();
}

Ein BentConnector5 besitzt zwei ConnectorBendPositionX‑Anpassungen und eine ConnectorBendPositionY‑Anpassung. Wenn der benötigte Typ mehrmals vorkommt, prüfen Sie getName und die bekannte Geometrie dieser Voreinstellung, bevor Sie einen auswählen. Gibt eine Anpassung ShapeAdjustmentType.Custom zurück, behandeln Sie ihre Bedeutung und den Wertebereich als presetspezifisch und ändern Sie sie nicht, solange die Vereinbarung nicht bekannt ist.

Bezug von Anpassungswerten zur Geometrie des Verbindungselements

Bei geknickten Verbindungselementen können Anpassungswerte verwendet werden, um die Positionen einzelner Segmente abzuschätzen. Diese Berechnungen sind spezifisch für die jeweilige Voreinstellung:

  • BentConnector4 stellt normalerweise eine ConnectorBendPositionX‑ und eine ConnectorBendPositionY‑Anpassung bereit.
  • Für diese Krümmungspositionen erzeugt das Teilen des von getRawValue zurückgegebenen Werts durch 100000f den Bruchteil der Rahmenbreite bzw. -höhe, der in den folgenden Beispielen verwendet wird.
  • Ein Rahmen eines Verbindungselements kann rotiert oder gespiegelt sein, sodass Rahmenkoordinaten vor dem Vergleich mit Folienkoordinaten transformiert werden müssen.

Die folgenden Beispiele verwenden zunächst getType, um die Anpassungen zu identifizieren. Sie behandeln Sammlungs‑Indizes nicht als portable Kennungen.

Unrotierter Verbindungselement

Das Ausgangs‑Layout enthält zwei Textformen, die durch ein BentConnector4 verbunden sind:

connector-shape-complex

Dieses Beispiel untersucht das Verbindungselement und ermittelt seine horizontalen und vertikalen Krümmungs‑Anpassungen:

import com.aspose.slides.*;
import java.awt.Color;

Presentation presentation = new Presentation();
try {
    ISlide slide = presentation.getSlides().get_Item(0);

    IAutoShape sourceShape = slide.getShapes().addAutoShape(ShapeType.Rectangle, 100, 100, 60, 25);
    sourceShape.getTextFrame().setText("From");
    IAutoShape targetShape = slide.getShapes().addAutoShape(ShapeType.Rectangle, 500, 100, 60, 25);
    targetShape.getTextFrame().setText("To");
    IConnector connector = slide.getShapes().addConnector(ShapeType.BentConnector4, 20, 20, 400, 300);

    connector.getLineFormat().setEndArrowheadStyle(LineArrowheadStyle.Triangle);
    connector.getLineFormat().getFillFormat().setFillType(FillType.Solid);
    connector.getLineFormat().getFillFormat().getSolidFillColor().setColor(Color.RED);
    connector.getLineFormat().setWidth(3);
    connector.setStartShapeConnectedTo(sourceShape);
    connector.setStartShapeConnectionSiteIndex(3);
    connector.setEndShapeConnectedTo(targetShape);
    connector.setEndShapeConnectionSiteIndex(2);

    for (int adjustmentIndex = 0; adjustmentIndex < connector.getAdjustments().size(); adjustmentIndex++) {
        IAdjustValue adjustment = connector.getAdjustments().get_Item(adjustmentIndex);
        System.out.println(adjustment.getName() + ": " + adjustment.getType() + ", raw value = " + adjustment.getRawValue());
    }
} finally {
    presentation.dispose();
}

Um beide Krümmungen zu ändern, finden Sie jeden erwarteten Typ und passen die Werte erst an, nachdem beide gefunden wurden:

import com.aspose.slides.*;

Presentation presentation = new Presentation();
try {
    ISlide slide = presentation.getSlides().get_Item(0);

    IAutoShape sourceShape = slide.getShapes().addAutoShape(ShapeType.Rectangle, 100, 100, 60, 25);
    IAutoShape targetShape = slide.getShapes().addAutoShape(ShapeType.Rectangle, 500, 100, 60, 25);
    IConnector connector = slide.getShapes().addConnector(ShapeType.BentConnector4, 20, 20, 400, 300);
    connector.setStartShapeConnectedTo(sourceShape);
    connector.setStartShapeConnectionSiteIndex(3);
    connector.setEndShapeConnectedTo(targetShape);
    connector.setEndShapeConnectionSiteIndex(2);

    IAdjustValue horizontalBend = null;
    IAdjustValue verticalBend = null;
    for (int adjustmentIndex = 0; adjustmentIndex < connector.getAdjustments().size(); adjustmentIndex++) {
        IAdjustValue adjustment = connector.getAdjustments().get_Item(adjustmentIndex);
        if (adjustment.getType() == ShapeAdjustmentType.ConnectorBendPositionX) {
            horizontalBend = adjustment;
        } else if (adjustment.getType() == ShapeAdjustmentType.ConnectorBendPositionY) {
            verticalBend = adjustment;
        }
    }

    if (horizontalBend == null || verticalBend == null) {
        System.out.println("The connector does not expose the expected bend adjustments.");
    } else {
        horizontalBend.setRawValue(horizontalBend.getRawValue() + 20000);
        verticalBend.setRawValue(verticalBend.getRawValue() + 200000);
        presentation.save("connector-adjusted.pptx", SaveFormat.Pptx);
    }
} finally {
    presentation.dispose();
}

Das Ergebnis ist ein Verbindungselement, dessen horizontale und vertikale Segmente verschoben wurden:

connector-adjusted-1

Sobald die semantischen Typen bekannt sind, können deren Werte in Rahmen‑Koordinaten umgerechnet werden. Dieses Beispiel zeichnet ein dünnes Rechteck über das vertikale Segment, das von den beiden Krümmungs‑Anpassungen gesteuert wird:

import com.aspose.slides.*;

Presentation presentation = new Presentation();
try {
    ISlide slide = presentation.getSlides().get_Item(0);

    IAutoShape sourceShape = slide.getShapes().addAutoShape(ShapeType.Rectangle, 100, 100, 60, 25);
    IAutoShape targetShape = slide.getShapes().addAutoShape(ShapeType.Rectangle, 500, 100, 60, 25);
    IConnector connector = slide.getShapes().addConnector(ShapeType.BentConnector4, 20, 20, 400, 300);
    connector.setStartShapeConnectedTo(sourceShape);
    connector.setStartShapeConnectionSiteIndex(3);
    connector.setEndShapeConnectedTo(targetShape);
    connector.setEndShapeConnectionSiteIndex(2);

    IAdjustValue horizontalBend = null;
    IAdjustValue verticalBend = null;
    for (int adjustmentIndex = 0; adjustmentIndex < connector.getAdjustments().size(); adjustmentIndex++) {
        IAdjustValue adjustment = connector.getAdjustments().get_Item(adjustmentIndex);
        if (adjustment.getType() == ShapeAdjustmentType.ConnectorBendPositionX) {
            horizontalBend = adjustment;
        } else if (adjustment.getType() == ShapeAdjustmentType.ConnectorBendPositionY) {
            verticalBend = adjustment;
        }
    }

    if (horizontalBend == null || verticalBend == null) {
        System.out.println("The connector does not expose the expected bend adjustments.");
    } else {
        float x = connector.getX() + connector.getWidth() * horizontalBend.getRawValue() / 100000f;
        float y = connector.getY();
        float height = connector.getHeight() * verticalBend.getRawValue() / 100000f;
        slide.getShapes().addAutoShape(ShapeType.Rectangle, x, y, 1, height);
        presentation.save("connector-segment-guide.pptx", SaveFormat.Pptx);
    }
} finally {
    presentation.dispose();
}

Das Hilfs‑Formobjekt markiert das berechnete Segment:

connector-adjusted-2

Gedrehter oder gespiegelter Verbindungselement

Wenn dieselbe Geometrie vertikal ausgerichtet ist, beeinflussen die Werte von IShape.getFrame, ShapeFrame.getFlipH und ShapeFrame.getFlipV die Umrechnung von Rahmen‑ zu Folienkoordinaten.

Dieses Beispiel erzeugt und passt das vertikal ausgerichtete Verbindungselement an:

import com.aspose.slides.*;
import java.awt.Color;

Presentation presentation = new Presentation();
try {
    ISlide slide = presentation.getSlides().get_Item(0);

    IAutoShape sourceShape = slide.getShapes().addAutoShape(ShapeType.Rectangle, 100, 100, 60, 25);
    sourceShape.getTextFrame().setText("From");
    IAutoShape targetShape = slide.getShapes().addAutoShape(ShapeType.Rectangle, 100, 400, 60, 25);
    targetShape.getTextFrame().setText("To 1");
    IConnector connector = slide.getShapes().addConnector(ShapeType.BentConnector4, 20, 20, 400, 300);

    connector.getLineFormat().setEndArrowheadStyle(LineArrowheadStyle.Triangle);
    connector.getLineFormat().getFillFormat().setFillType(FillType.Solid);
    connector.getLineFormat().getFillFormat().getSolidFillColor().setColor(new Color(102, 205, 170));
    connector.getLineFormat().setWidth(3);
    connector.setStartShapeConnectedTo(sourceShape);
    connector.setStartShapeConnectionSiteIndex(2);
    connector.setEndShapeConnectedTo(targetShape);
    connector.setEndShapeConnectionSiteIndex(3);

    for (int adjustmentIndex = 0; adjustmentIndex < connector.getAdjustments().size(); adjustmentIndex++) {
        IAdjustValue adjustment = connector.getAdjustments().get_Item(adjustmentIndex);
        if (adjustment.getType() == ShapeAdjustmentType.ConnectorBendPositionX) {
            adjustment.setRawValue(adjustment.getRawValue() + 20000);
        } else if (adjustment.getType() == ShapeAdjustmentType.ConnectorBendPositionY) {
            adjustment.setRawValue(adjustment.getRawValue() + 200000);
        }
    }

    presentation.save("vertical-connector-adjusted.pptx", SaveFormat.Pptx);
} finally {
    presentation.dispose();
}

Das angepasste Verbindungselement erscheint vertikal zwischen den Formen:

connector-adjusted-3

Für einen beliebigen Rotationswinkel alpha wird ein Rahmen‑Punkt (x, y) um das Rahmen‑Mittelpunkt (x0, y0) rotiert:

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

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

Der nachfolgende Code behandelt die 90‑Grad‑Ausrichtung, die in diesem Beispiel verwendet wird, und zeichnet eine rote Führungslinie über das entsprechende Verbindungselement‑Segment:

import com.aspose.slides.*;
import java.awt.Color;

Presentation presentation = new Presentation();
try {
    ISlide slide = presentation.getSlides().get_Item(0);

    IAutoShape sourceShape = slide.getShapes().addAutoShape(ShapeType.Rectangle, 100, 100, 60, 25);
    IAutoShape targetShape = slide.getShapes().addAutoShape(ShapeType.Rectangle, 100, 400, 60, 25);
    IConnector connector = slide.getShapes().addConnector(ShapeType.BentConnector4, 20, 20, 400, 300);
    connector.setStartShapeConnectedTo(sourceShape);
    connector.setStartShapeConnectionSiteIndex(2);
    connector.setEndShapeConnectedTo(targetShape);
    connector.setEndShapeConnectionSiteIndex(3);

    IAdjustValue horizontalBend = null;
    IAdjustValue verticalBend = null;
    for (int adjustmentIndex = 0; adjustmentIndex < connector.getAdjustments().size(); adjustmentIndex++) {
        IAdjustValue adjustment = connector.getAdjustments().get_Item(adjustmentIndex);
        if (adjustment.getType() == ShapeAdjustmentType.ConnectorBendPositionX) {
            horizontalBend = adjustment;
        } else if (adjustment.getType() == ShapeAdjustmentType.ConnectorBendPositionY) {
            verticalBend = adjustment;
        }
    }

    if (horizontalBend == null || verticalBend == null) {
        System.out.println("The connector does not expose the expected bend adjustments.");
    } else {
        horizontalBend.setRawValue(horizontalBend.getRawValue() + 20000);
        verticalBend.setRawValue(verticalBend.getRawValue() + 200000);

        float x = connector.getX();
        float y = connector.getY();
        if (connector.getFrame().getFlipH() == NullableBool.True) {
            x += connector.getWidth();
        }
        if (connector.getFrame().getFlipV() == NullableBool.True) {
            y += connector.getHeight();
        }

        x += connector.getWidth() * horizontalBend.getRawValue() / 100000f;
        float rotatedX = connector.getFrame().getCenterX() - y + connector.getFrame().getCenterY();
        float rotatedY = x - connector.getFrame().getCenterX() + connector.getFrame().getCenterY();
        float segmentWidth = connector.getHeight() * verticalBend.getRawValue() / 100000f;
        IAutoShape guide = slide.getShapes().addAutoShape(ShapeType.Rectangle, rotatedX, rotatedY, segmentWidth, 1);
        guide.getLineFormat().getFillFormat().setFillType(FillType.Solid);
        guide.getLineFormat().getFillFormat().getSolidFillColor().setColor(Color.RED);

        presentation.save("rotated-connector-segment-guide.pptx", SaveFormat.Pptx);
    }
} finally {
    presentation.dispose();
}

Die rote Führungslinie markiert das berechnete Segment nach der Koordinatentransformation:

connector-adjusted-4

Diese Formeln beschreiben die in den Beispielen genutzten Voreinstellungen, nicht ein universelles Modell für Verbindungselemente. Validieren Sie die Anpassungstypen, die Rahmen­orientierung und die Wertebereiche, bevor Sie dieselbe Berechnung auf eine andere Voreinstellung anwenden.

Winkel der Verbindungselement‑Richtung ermitteln

Der Richtungswinkel eines geraden Verbindungselements lässt sich aus Breite und Höhe berechnen, wobei horizontale und vertikale Spiegelungen berücksichtigt werden. Das folgende Beispiel gibt den im Uhrzeigersinn gemessenen Winkel zur positiven Horizontalachse in Folienkoordinaten aus:

import com.aspose.slides.*;

Presentation presentation = new Presentation();
try {
    ISlide slide = presentation.getSlides().get_Item(0);
    IConnector connector = slide.getShapes().addConnector(ShapeType.StraightConnector1, 100, 100, 200, 100);

    boolean flipH = connector.getFrame().getFlipH() == NullableBool.True;
    boolean flipV = connector.getFrame().getFlipV() == NullableBool.True;
    float deltaX = connector.getWidth() * (flipH ? -1 : 1);
    float deltaY = connector.getHeight() * (flipV ? -1 : 1);
    double angle = Math.atan2(deltaY, deltaX) * 180.0 / Math.PI;

    if (angle < 0) {
        angle += 360;
    }

    System.out.printf("Connector direction: %.2f degrees%n", angle);
} finally {
    presentation.dispose();
}

FAQ

Wie kann ich feststellen, ob ein Verbindungselement an einer Form befestigt werden kann?

Prüfen Sie den Wert von getConnectionSiteCount. Ein positiver Wert bedeutet, dass die Form Verbindungsstellen bereitstellt. Validieren Sie den ausgewählten Stellen‑Index, bevor Sie ihn einem Verbindungselement‑Ende zuweisen.

Kann ich eine Verbindungselement‑Anpassung über ihren Sammlungs‑Index identifizieren?

Ein Index ist nur für eine bekannte Voreinstellung und das zugehörige Layout sinnvoll. Prüfen Sie IAdjustValue.getType bevor Sie einen Wert ändern, und nutzen Sie IAdjustValue.getName als zusätzliche Information, wenn derselbe semantische Typ mehrfach vorkommt.

Was passiert, wenn eine verbundene Form gelöscht wird?

Das entsprechende Ende des Verbindungselements wird getrennt. Das Verbindungselement verbleibt auf der Folie und kann gelöscht, als freie Linie positioniert oder an eine andere Form angebunden werden.

Bleiben die Bindungen von Verbindungselementen erhalten, wenn eine Folie kopiert wird?

Die Bindungen bleiben in der Regel erhalten, wenn die verbundenen Formen zusammen mit der Folie kopiert werden. Wird ein Verbindungselement ohne eine seiner Ziel‑Formen kopiert, muss das betroffene Ende erneut befestigt werden.