Zarządzanie łącznikami w prezentacjach przy użyciu PHP
Wprowadzenie
Łącznik PowerPoint to specjalna linia, która łączy dwa kształty i pozostaje przy nich przytwierdzona nawet po ich przeniesieniu lub przemieszczeniu na danym slajdzie.
Łączniki są zazwyczaj podłączane do punktów połączeń (zielonych kropek), które domyślnie istnieją na wszystkich kształtach. Punkty połączeń pojawiają się, gdy kursor zbliży się do nich.
Punkty regulacji (pomarańczowe kropki), które występują tylko w niektórych łącznikach, służą do modyfikowania pozycji i kształtów łączników.
Typy łączników
W PowerPoint możesz używać łączników prostych, łokciowych (z kątem) i zakrzywionych.
Aspose.Slides udostępnia następujące łączniki:
| Łącznik | Obraz | Liczba punktów regulacji |
|---|---|---|
ShapeType::Line |
![]() |
0 |
ShapeType::StraightConnector1 |
![]() |
0 |
ShapeType::BentConnector2 |
![]() |
0 |
ShapeType::BentConnector3 |
![]() |
1 |
ShapeType::BentConnector4 |
![]() |
2 |
ShapeType::BentConnector5 |
![]() |
3 |
ShapeType::CurvedConnector2 |
![]() |
0 |
ShapeType::CurvedConnector3 |
![]() |
1 |
ShapeType::CurvedConnector4 |
![]() |
2 |
ShapeType::CurvedConnector5 |
![]() |
3 |
Łączenie kształtów przy użyciu łączników
- Utwórz instancję klasy Presentation.
- Uzyskaj odwołanie do slajdu poprzez jego indeks.
- Dodaj dwa AutoShape do slajdu, używając metody
addAutoShapeudostępnionej przez obiektShapes. - Dodaj łącznik za pomocą metody
addConnectorudostępnionej przez obiektShapes, określając typ łącznika. - Połącz kształty przy użyciu łącznika.
- Wywołaj metodę
reroute, aby zastosować najkrótszą ścieżkę połączenia. - Zapisz prezentację.
Ten kod PHP pokazuje, jak dodać łącznik (łamany łącznik) między dwoma kształtami (elipsą i prostokątem):
// Tworzy instancję klasy prezentacji reprezentującej plik PPTX
$pres = new Presentation();
try {
# Uzyskuje dostęp do kolekcji kształtów dla określonego slajdu
$shapes = $pres->getSlides()->get_Item(0)->getShapes();
# Dodaje autokształt Elipsa
$ellipse = $shapes->addAutoShape(ShapeType::Ellipse, 0, 100, 100, 100);
# Dodaje autokształt Prostokąt
$rectangle = $shapes->addAutoShape(ShapeType::Rectangle, 100, 300, 100, 100);
# Dodaje kształt łącznika do kolekcji kształtów slajdu
$connector = $shapes->addConnector(ShapeType::BentConnector2, 0, 0, 10, 10);
# Łączy kształty przy użyciu łącznika
$connector->setStartShapeConnectedTo($ellipse);
$connector->setEndShapeConnectedTo($rectangle);
# Wywołuje metodę reroute, która ustawia automatyczną najkrótszą ścieżkę pomiędzy kształtami
$connector->reroute();
# Zapisuje prezentację
$pres->save("output.pptx", SaveFormat::Pptx);
} finally {
if (!java_is_null($pres)) $pres.dispose();
}
NOTE
MetodaConnector.reroute przekierowuje łącznik i wymusza, aby przyjął najkrótszą możliwą ścieżkę między kształtami. Aby osiągnąć ten cel, metoda może zmienić punkty setStartShapeConnectionSiteIndex i setEndShapeConnectionSiteIndex.
Określenie punktu połączenia
Jeśli chcesz, aby łącznik połączył dwa kształty za pomocą konkretnych punktów na tych kształtach, musisz określić preferowane punkty połączenia w następujący sposób:
- Utwórz instancję klasy Presentation.
- Uzyskaj odwołanie do slajdu poprzez jego indeks.
- Dodaj dwa AutoShape do slajdu, używając metody
addAutoShapeudostępnionej przez obiektShapes. - Dodaj łącznik za pomocą metody
addConnectorudostępnionej przez obiektShapes, określając typ łącznika. - Połącz kształty przy użyciu łącznika.
- Ustaw preferowane punkty połączenia na kształtach.
- Zapisz prezentację.
Ten kod PHP demonstruje operację, w której określony jest preferowany punkt połączenia:
# Tworzy instancję klasy prezentacji reprezentującej plik PPTX
$pres = new Presentation();
try {
# Uzyskuje dostęp do kolekcji kształtów dla określonego slajdu
$shapes = $pres->getSlides()->get_Item(0)->getShapes();
# Dodaje autokształt Elipsa
$ellipse = $shapes->addAutoShape(ShapeType::Ellipse, 0, 100, 100, 100);
# Dodaje autokształt Prostokąt
$rectangle = $shapes->addAutoShape(ShapeType::Rectangle, 100, 300, 100, 100);
# Dodaje kształt łącznika do kolekcji kształtów slajdu
$connector = $shapes->addConnector(ShapeType::BentConnector2, 0, 0, 10, 10);
# Łączy kształty przy użyciu łącznika
$connector->setStartShapeConnectedTo($ellipse);
$connector->setEndShapeConnectedTo($rectangle);
# Ustawia preferowany indeks punktu połączenia na kształcie Elipsa
$wantedIndex = 6;
# Sprawdza, czy preferowany indeks jest mniejszy niż maksymalna liczba indeksów punktów połączeń
if ($ellipse->getConnectionSiteCount() > $wantedIndex) {
# Ustawia preferowany punkt połączenia na autokształcie Elipsa
$connector->setStartShapeConnectionSiteIndex($wantedIndex);
}
# Zapisuje prezentację
$pres->save("output.pptx", SaveFormat::Pptx);
} finally {
if (!java_is_null($pres)) {
$pres->dispose();
}
}
Regulacja punktu łącznika
Możesz regulować istniejący łącznik przy użyciu jego punktów regulacji. Tylko łączniki posiadające punkty regulacji mogą być w ten sposób modyfikowane. Zobacz tabelę pod Typy łączników.
Prosty przypadek
Rozważ przypadek, w którym łącznik między dwoma kształtami (A i B) przechodzi przez trzeci kształt (C):

$pres = new Presentation();
try {
$sld = $pres->getSlides()->get_Item(0);
$shape = $sld->getShapes()->addAutoShape(ShapeType::Rectangle, 300, 150, 150, 75);
$shapeFrom = $sld->getShapes()->addAutoShape(ShapeType::Rectangle, 500, 400, 100, 50);
$shapeTo = $sld->getShapes()->addAutoShape(ShapeType::Rectangle, 100, 100, 70, 30);
$connector = $sld->getShapes()->addConnector(ShapeType::BentConnector5, 20, 20, 400, 300);
$connector->getLineFormat()->setEndArrowheadStyle(LineArrowheadStyle->Triangle);
$connector->getLineFormat()->getFillFormat()->setFillType(FillType::Solid);
$connector->getLineFormat()->getFillFormat()->getSolidFillColor()->setColor(java("java.awt.Color")->BLACK);
$connector->setStartShapeConnectedTo($shapeFrom);
$connector->setEndShapeConnectedTo($shapeTo);
$connector->setStartShapeConnectionSiteIndex(2);
} finally {
if (!java_is_null($pres)) {
$pres->dispose();
}
}
Aby uniknąć lub ominąć trzeci kształt, możemy dostosować łącznik, przesuwając jego pionową linię w lewo w następujący sposób:

$adj2 = $connector->getAdjustments()->get_Item(1);
$adj2->setRawValue($adj2->getRawValue() + 10000);
Złożone przypadki
Aby wykonać bardziej skomplikowane regulacje, musisz wziąć pod uwagę następujące kwestie:
- Punkt regulacji łącznika jest ściśle powiązany ze wzorem, który oblicza i określa jego pozycję. Dlatego zmiany położenia punktu mogą zmienić kształt łącznika.
- Punkty regulacji łącznika są definiowane w ścisłej kolejności w tablicy. Punkty regulacji są numerowane od punktu początkowego łącznika do jego końcowego.
- Wartości punktów regulacji odzwierciedlają procent szerokości/wysokości kształtu łącznika.
- Kształt jest ograniczony przez punkty początkowy i końcowy łącznika pomnożone przez 1000.
- Pierwszy punkt, drugi punkt i trzeci punkt określają odpowiednio procent z szerokości, procent z wysokości oraz ponownie procent z szerokości.
- Dla obliczeń określających współrzędne punktów regulacji łącznika musisz uwzględnić rotację łącznika oraz jego odbicie. Uwaga że kąt rotacji wszystkich łączników pokazanych pod Typy łączników wynosi 0.
Przypadek 1
Rozważ przypadek, w którym dwa obiekty ramki tekstowej są połączone za pomocą łącznika:

# Tworzy instancję klasy prezentacji, która reprezentuje plik PPTX
$pres = new Presentation();
try {
# Pobiera pierwszy slajd w prezentacji
$sld = $pres->getSlides()->get_Item(0);
# Dodaje kształty, które zostaną połączone łącznikiem
$shapeFrom = $sld->getShapes()->addAutoShape(ShapeType::Rectangle, 100, 100, 60, 25);
$shapeFrom->getTextFrame()->setText("From");
$shapeTo = $sld->getShapes()->addAutoShape(ShapeType::Rectangle, 500, 100, 60, 25);
$shapeTo->getTextFrame()->setText("To");
# Dodaje łącznik
$connector = $sld->getShapes()->addConnector(ShapeType::BentConnector4, 20, 20, 400, 300);
# Określa kierunek łącznika
$connector->getLineFormat()->setEndArrowheadStyle(LineArrowheadStyle->Triangle);
# Określa kolor łącznika
$connector->getLineFormat()->getFillFormat()->setFillType(FillType::Solid);
$connector->getLineFormat()->getFillFormat()->getSolidFillColor()->setColor(java("java.awt.Color")->RED);
# Określa grubość linii łącznika
$connector->getLineFormat()->setWidth(3);
# Łączy kształty razem przy użyciu łącznika
$connector->setStartShapeConnectedTo($shapeFrom);
$connector->setStartShapeConnectionSiteIndex(3);
$connector->setEndShapeConnectedTo($shapeTo);
$connector->setEndShapeConnectionSiteIndex(2);
# Pobiera punkty regulacji dla łącznika
$adjValue_0 = $connector->getAdjustments()->get_Item(0);
$adjValue_1 = $connector->getAdjustments()->get_Item(1);
} finally {
if (!java_is_null($pres)) {
$pres->dispose();
}
}
Regulacja
Możemy zmienić wartości punktów regulacji łącznika, zwiększając odpowiednio procent szerokości o 20 % oraz wysokości o 200 %:
# Zmienia wartości punktów regulacji
$adjValue_0->setRawValue($adjValue_0->getRawValue() + 20000);
$adjValue_1->setRawValue($adjValue_1->getRawValue() + 200000);
Wynik:

Aby zdefiniować model umożliwiający określenie współrzędnych i kształtu poszczególnych części łącznika, utwórzmy kształt odpowiadający poziomej składowej łącznika w punkcie connector.getAdjustments().get_Item(0):
# Rysuje pionową składową łącznika
$x = $connector->getX() . $connector->getWidth() * $adjValue_0->getRawValue() / 100000;
$y = $connector->getY();
$height = $connector->getHeight() * $adjValue_1->getRawValue() / 100000;
$sld->getShapes()->addAutoShape(ShapeType::Rectangle, $x, $y, 0, $height);
Wynik:

Przypadek 2
W Przypadku 1 przedstawiliśmy prostą operację regulacji łącznika wykorzystującą podstawowe zasady. W typowych sytuacjach musisz wziąć pod uwagę rotację łącznika oraz jego wyświetlanie (ustawiane przez connector.getRotation(), connector.getFrame().getFlipH() i connector.getFrame().getFlipV()). Teraz pokażemy proces.
Najpierw dodajmy nowy obiekt ramki tekstowej (To 1) do slajdu (w celu połączenia) i utwórzmy nowy (zielony) łącznik, który łączy go z już utworzonymi obiektami.
# Tworzy nowy obiekt wiązania
$shapeTo_1 = $sld->getShapes()->addAutoShape(ShapeType::Rectangle, 100, 400, 60, 25);
$shapeTo_1->getTextFrame()->setText("To 1");
# Tworzy nowy łącznik
$connector = $sld->getShapes()->addConnector(ShapeType::BentConnector4, 20, 20, 400, 300);
$connector->getLineFormat()->setEndArrowheadStyle(LineArrowheadStyle->Triangle);
$connector->getLineFormat()->getFillFormat()->setFillType(FillType::Solid);
$connector->getLineFormat()->getFillFormat()->getSolidFillColor()->setColor(java("java.awt.Color")->CYAN);
$connector->getLineFormat()->setWidth(3);
# Łączy obiekty przy użyciu nowo utworzonego łącznika
$connector->setStartShapeConnectedTo($shapeFrom);
$connector->setStartShapeConnectionSiteIndex(2);
$connector->setEndShapeConnectedTo($shapeTo_1);
$connector->setEndShapeConnectionSiteIndex(3);
# Pobiera punkty regulacji łącznika
$adjValue_0 = $connector->getAdjustments()->get_Item(0);
$adjValue_1 = $connector->getAdjustments()->get_Item(1);
# Zmienia wartości punktów regulacji
$adjValue_0->setRawValue($adjValue_0->getRawValue() + 20000);
$adjValue_1->setRawValue($adjValue_1->getRawValue() + 200000);
Wynik:

Po drugie, utwórzmy kształt, który będzie odpowiadał poziomej składowej łącznika przechodzącej przez nowy punkt regulacji connector.getAdjustments().get_Item(0). Zastosujemy wartości z danych łącznika dla connector.getRotation(), connector.getFrame().getFlipH() i connector.getFrame().getFlipV() oraz popularny wzór konwersji współrzędnych dla rotacji wokół danego punktu x0:
X = (x — x0) * cos(alpha) — (y — y0) * sin(alpha) + x0;
Y = (x — x0) * sin(alpha) + (y — y0) * cos(alpha) + y0;
W naszym przypadku kąt rotacji obiektu wynosi 90 stopni, a łącznik jest wyświetlany pionowo, więc odpowiadający kod wygląda następująco:
# Zapisuje współrzędne łącznika
$x = $connector->getX();
$y = $connector->getY();
# Koryguje współrzędne łącznika w razie potrzeby
if ($connector->getFrame()->getFlipH() == NullableBool::True) {
$x += $connector->getWidth();
}
if ($connector->getFrame()->getFlipV() == NullableBool::True) {
$y += $connector->getHeight();
}
# Używa wartości punktu regulacji jako współrzędnej
$x += $connector->getWidth() * $adjValue_0->getRawValue() / 100000;
# Konwertuje współrzędne, ponieważ Sin(90) = 1 i Cos(90) = 0
$xx = $connector->getFrame()->getCenterX() - $y . $connector->getFrame()->getCenterY();
$yy = $x - $connector->getFrame()->getCenterX() . $connector->getFrame()->getCenterY();
# Określa szerokość poziomej składowej przy użyciu wartości drugiego punktu regulacji
$width = $connector->getHeight() * $adjValue_1->getRawValue() / 100000;
$shape = $sld->getShapes()->addAutoShape(ShapeType::Rectangle, $xx, $yy, $width, 0);
$shape->getLineFormat()->getFillFormat()->setFillType(FillType::Solid);
$shape->getLineFormat()->getFillFormat()->getSolidFillColor()->setColor(java("java.awt.Color")->RED);
Wynik:

Zademonstrowaliśmy obliczenia obejmujące proste regulacje oraz skomplikowane punkty regulacji (punkty regulacji z kątami rotacji). Korzystając z zdobytej wiedzy, możesz opracować własny model (lub napisać kod), aby uzyskać obiekt GraphicsPath lub nawet ustawić wartości punktów regulacji łącznika na podstawie konkretnych współrzędnych slajdu.
Znajdowanie kąta linii łącznika
- Utwórz instancję klasy.
- Uzyskaj odwołanie do slajdu poprzez jego indeks.
- Uzyskaj dostęp do kształtu linii łącznika.
- Użyj szerokości i wysokości linii, wysokości ramki kształtu oraz szerokości ramki kształtu do obliczenia kąta.
Ten kod PHP demonstruje operację, w której obliczyliśmy kąt dla kształtu linii łącznika:
$pres = new Presentation("ConnectorLineAngle.pptx");
try {
$slide = $pres->getSlides()->get_Item(0);
for($i = 0; $i < java_values($slide->getShapes()->size()) ; $i++) {
$dir = 0.0;
$shape = $slide->getShapes()->get_Item($i);
if (java_instanceof($shape, new JavaClass("com.aspose.slides.AutoShape"))) {
$ashp = $shape;
if ($ashp->getShapeType() == ShapeType::Line) {
$dir = getDirection($ashp->getWidth(), $ashp->getHeight(), java_values($ashp->getFrame()->getFlipH()) > 0, $ashp->getFrame()->getFlipV() > 0);
}
} else if (java_instanceof($shape, new JavaClass("com.aspose.slides.Connector"))) {
$ashp = $shape;
$dir = getDirection($ashp->getWidth(), $ashp->getHeight(), java_values($ashp->getFrame()->getFlipH()) > 0, java_values($ashp->getFrame()->getFlipV()) > 0);
}
echo($dir);
}
} finally {
if (!java_is_null($pres)) {
$pres->dispose();
}
}
FAQ
Jak mogę sprawdzić, czy łącznik może być „przyklejony” do konkretnego kształtu?
Sprawdź, czy kształt udostępnia punkty połączeń. Jeśli ich nie ma lub liczba wynosi zero, przyklejanie nie jest dostępne; w takim przypadku użyj wolnych końcówek i ustaw je ręcznie. Warto sprawdzić liczbę punktów przed ich przyłączeniem.
Co się stanie z łącznikiem, jeśli usunę jeden z połączonych kształtów?
Jego końce zostaną odłączone; łącznik pozostanie na slajdzie jako zwykła linia z wolnym początkiem/końcem. Możesz go usunąć lub ponownie przypisać połączenia i w razie potrzeby przekierować.
Czy połączenia łącznika są zachowywane przy kopiowaniu slajdu do innej prezentacji?
Zasadniczo tak, pod warunkiem że docelowe kształty również zostaną skopiowane. Jeśli slajd zostanie wstawiony do innego pliku bez połączonych kształtów, końce stają się wolne i będzie trzeba je ponownie podłączyć.









