Csatlakozók kezelése prezentációkban Python nyelven

Áttekintés

A csatlakozó egy vonal, amely két alakzathoz maradhat csatlakoztatva, amikor bármelyik alakzat mozog. Végpontjai csatlakozási helyekhez kapcsolódnak, amelyeket a PowerPoint zöld pontok jelölnek. Néhány görbített és íves csatlakozó továbbá beállítási pontokat jelenít meg, narancssárga pontokként, amelyek az egyes csatlakozó szegmensek pozícióját szabályozzák.

Az Aspose.Slides a csatlakozókat az IConnector interfészen keresztül képviseli. Létrehozhatja őket, csatlakoztathatja a végpontjaikat alakzatokhoz, kiválaszthatja a csatlakozási helyeket, átirányíthatja őket, és módosíthatja a beállítási pontokkal rendelkező csatlakozók geometriáját.

Csatlakozótípusok

A ShapeType felsorolás lineáris, hajlított és íves csatlakozók előbeállításait tartalmazza. Az alábbi táblázat a rendelkezésre álló csatlakozógeometriákat és az egyes előbeállítások által meghatározott beállítási pontok számát mutatja.

Csatlakozó Kép Beállítási pontok száma
ShapeType.LINE shapetype-lineconnector 0
ShapeType.STRAIGHT_CONNECTOR1 shapetype-straightconnector1 0
ShapeType.BENT_CONNECTOR2 shapetype-bent-connector2 0
ShapeType.BENT_CONNECTOR3 shapetype-bentconnector3 1
ShapeType.BENT_CONNECTOR4 shapetype-bentconnector4 2
ShapeType.BENT_CONNECTOR5 shapetype-bentconnector5 3
ShapeType.CURVED_CONNECTOR2 shapetype-curvedconnector2 0
ShapeType.CURVED_CONNECTOR3 shapetype-curvedconnector3 1
ShapeType.CURVED_CONNECTOR4 shapetype-curvedconnector4 2
ShapeType.CURVED_CONNECTOR5 shapetype.curvedconnector5 3

A beállítási pontok száma és jelentése a kiválasztott csatlakozó előbeállítás része. Ne feltételezze, hogy két különböző csatlakozótípus ugyanazt a gyűjteményszerkezetet mutatja.

Két alakzat összekapcsolása

Használja az IShapeCollection.add_connector metódust csatlakozó hozzáadásához, és állítsa be a start_shape_connected_to és end_shape_connected_to tulajdonságokat. Miután mindkét végpont csatlakozik, az IConnector.reroute rövid útvonalat választ a két alakzat között.

Az alábbi példa egy ellipszist és egy téglalapot kapcsol össze egy hajlított csatlakozóval:

import aspose.slides as slides

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

    ellipse = slide.shapes.add_auto_shape(slides.ShapeType.ELLIPSE, 40, 80, 120, 80)
    rectangle = slide.shapes.add_auto_shape(slides.ShapeType.RECTANGLE, 320, 240, 140, 80)
    connector = slide.shapes.add_connector(slides.ShapeType.BENT_CONNECTOR2, 0, 0, 10, 10)

    connector.start_shape_connected_to = ellipse
    connector.end_shape_connected_to = rectangle
    connector.reroute()

    presentation.save("connected-shapes.pptx", slides.export.SaveFormat.PPTX)

Csatlakozási hely kiválasztása

Minden csatlakoztatható alakzat a connection_site_count segítségével jelenti a helyek számát. Érvényesítse a kívánt, nullával kezdődő helyindexet, mielőtt azt a csatlakozó végéhez rendeli; a helyek száma alakzatgeometriától függ.

Ez a példa akkor csatlakoztatja a csatlakozót az ellipszis egy adott helyéhez, ha az a hely létezik:

import aspose.slides as slides

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

    ellipse = slide.shapes.add_auto_shape(slides.ShapeType.ELLIPSE, 40, 80, 120, 80)
    rectangle = slide.shapes.add_auto_shape(slides.ShapeType.RECTANGLE, 320, 240, 140, 80)
    connector = slide.shapes.add_connector(slides.ShapeType.BENT_CONNECTOR3, 0, 0, 10, 10)

    connector.start_shape_connected_to = ellipse
    connector.end_shape_connected_to = rectangle

    preferred_site_index = 2
    if preferred_site_index < ellipse.connection_site_count:
        connector.start_shape_connection_site_index = preferred_site_index
    else:
        print(f"The ellipse has only {ellipse.connection_site_count} connection sites.")

    presentation.save("specific-connection-site.pptx", slides.export.SaveFormat.PPTX)

Csatlakozó pontjának módosítása

A beállítási pontokkal rendelkező csatlakozók ezeket a IGeometryShape.adjustments segítségével teszik elérhetővé. Vizsgálja meg minden IAdjustValue esetén a type tulajdonságot, mielőtt módosítaná a raw_value értéket. Általános alakzatmanipulációhoz lásd a Shape Manipulation oldalt.

A csatlakozó beállítások száma, sorrendje, jelentése és érvényes értéktartománya az adott csatlakozó előbeállítástól függ. A type tulajdonság csak olvasható, míg a beállítási érték írható. A csak olvasható name tulajdonság további azonosítást biztosít, ha a csatlakozó több, ugyanazzal a szemantikai típussal rendelkező beállítást tartalmaz.

Útvonal akadály elkerülésével

A következő elrendezésben egy ShapeType.BENT_CONNECTOR5 csatlakozó két alakzat között áthalad egy harmadik alakzaton:

connector-obstruction

Ez a kód hozza létre az akadályba ütköző csatlakozót:

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

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

    slide.shapes.add_auto_shape(slides.ShapeType.RECTANGLE, 300, 150, 150, 75)
    source_shape = slide.shapes.add_auto_shape(slides.ShapeType.RECTANGLE, 500, 400, 100, 50)
    target_shape = 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 = source_shape
    connector.end_shape_connected_to = target_shape
    connector.start_shape_connection_site_index = 2

    presentation.save("connector-obstruction.pptx", slides.export.SaveFormat.PPTX)

A függőleges hajlítás mozgatása megváltoztatja az útvonalat, így a csatlakozó kikerüli az akadályt:

connector-obstruction-fixed

Ahelyett, hogy feltételezné, hogy az 1 index mindig a függőleges hajlítást jelenti, ez a példa a ShapeAdjustmentType.CONNECTOR_BEND_POSITION_Y elemet keresi, és csak akkor módosítja, ha a várt szemantikai típus jelen van:

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

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

    slide.shapes.add_auto_shape(slides.ShapeType.RECTANGLE, 300, 150, 150, 75)
    source_shape = slide.shapes.add_auto_shape(slides.ShapeType.RECTANGLE, 500, 400, 100, 50)
    target_shape = 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 = source_shape
    connector.end_shape_connected_to = target_shape
    connector.start_shape_connection_site_index = 2

    vertical_bend = None
    for adjustment_index in range(len(connector.adjustments)):
        adjustment = connector.adjustments[adjustment_index]
        print(f"{adjustment.name}: {adjustment.type}, raw value = {adjustment.raw_value}")
        if adjustment.type == slides.ShapeAdjustmentType.CONNECTOR_BEND_POSITION_Y:
            vertical_bend = adjustment
            break

    if vertical_bend is None:
        print("The connector does not expose a vertical bend adjustment.")
    else:
        vertical_bend.raw_value = 60000
        presentation.save("connector-obstruction-fixed.pptx", slides.export.SaveFormat.PPTX)

Egy ShapeType.BENT_CONNECTOR5 két ShapeAdjustmentType.CONNECTOR_BEND_POSITION_X és egy ShapeAdjustmentType.CONNECTOR_BEND_POSITION_Y beállítással rendelkezik. Ha a szükséges típus többször is előfordul, vizsgálja meg a name értéket és az adott előbeállítás ismert geometriáját, mielőtt kiválasztana egyet. Ha egy beállítás a ShapeAdjustmentType.CUSTOM típust adja vissza, tekintse jelentését és tartományát az előbeállítás specifikusnak, és ne módosítsa, amíg a szerződés nem ismert.

A beállítási értékek összekapcsolása a csatlakozó geometriával

Görbített csatlakozók esetén a beállítási értékek felhasználhatók az egyes szegmensek pozíciójának becslésére. Ezek a számítások az adott csatlakozó előbeállításhoz kötöttek:

  • ShapeType.BENT_CONNECTOR4 általában egy ShapeAdjustmentType.CONNECTOR_BEND_POSITION_X és egy ShapeAdjustmentType.CONNECTOR_BEND_POSITION_Y beállítást tesz elérhetővé.
  • Ezeknél a hajlítási pozícióknál a raw_value / 100000 adja a csatlakozó keret szélességének vagy magasságának a példákban használt hányadát.
  • Egy csatlakozó keret elforgatható vagy tükrözhető, ezért a keretkoordinátákat át kell alakítani, mielőtt összehasonlítanák a diavetítés koordinátáival.

Az alábbi példák először a type segítségével azonosítják a beállításokat, és nem tekintik a gyűjteményindexeket hordozható azonosítóknak.

Nem forgatott csatlakozó

A kezdeti elrendezés két szöveges alakzatot tartalmaz, amelyet egy ShapeType.BENT_CONNECTOR4 kapcsol össze:

connector-shape-complex

Ez a példa megvizsgálja a csatlakozót, és lekéri a vízszintes és függőleges hajlítási beállításokat:

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

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

    source_shape = slide.shapes.add_auto_shape(slides.ShapeType.RECTANGLE, 100, 100, 60, 25)
    source_shape.text_frame.text = "From"
    target_shape = slide.shapes.add_auto_shape(slides.ShapeType.RECTANGLE, 500, 100, 60, 25)
    target_shape.text_frame.text = "To"
    connector = slide.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.crimson
    connector.line_format.width = 3
    connector.start_shape_connected_to = source_shape
    connector.start_shape_connection_site_index = 3
    connector.end_shape_connected_to = target_shape
    connector.end_shape_connection_site_index = 2

    for adjustment_index in range(len(connector.adjustments)):
        adjustment = connector.adjustments[adjustment_index]
        print(f"{adjustment.name}: {adjustment.type}, raw value = {adjustment.raw_value}")

A két hajlítást egyidejűleg módosítani szeretnénk; először keresse meg a várt típust, majd csak akkor módosítsa az értékeket, ha mindkettőt megtalálta:

import aspose.slides as slides

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

    source_shape = slide.shapes.add_auto_shape(slides.ShapeType.RECTANGLE, 100, 100, 60, 25)
    target_shape = slide.shapes.add_auto_shape(slides.ShapeType.RECTANGLE, 500, 100, 60, 25)
    connector = slide.shapes.add_connector(slides.ShapeType.BENT_CONNECTOR4, 20, 20, 400, 300)
    connector.start_shape_connected_to = source_shape
    connector.start_shape_connection_site_index = 3
    connector.end_shape_connected_to = target_shape
    connector.end_shape_connection_site_index = 2

    horizontal_bend = None
    vertical_bend = None
    for adjustment_index in range(len(connector.adjustments)):
        adjustment = connector.adjustments[adjustment_index]
        if adjustment.type == slides.ShapeAdjustmentType.CONNECTOR_BEND_POSITION_X:
            horizontal_bend = adjustment
        elif adjustment.type == slides.ShapeAdjustmentType.CONNECTOR_BEND_POSITION_Y:
            vertical_bend = adjustment

    if horizontal_bend is None or vertical_bend is None:
        print("The connector does not expose the expected bend adjustments.")
    else:
        horizontal_bend.raw_value += 20000
        vertical_bend.raw_value += 200000
        presentation.save("connector-adjusted.pptx", slides.export.SaveFormat.PPTX)

Az eredmény egy olyan csatlakozó, amelynek vízszintes és függőleges szegmensei elmozdultak:

connector-adjusted-1

Miután a szemantikai típusok ismertek, értékeik átalakíthatók csatlakozó‑keret koordinátákká. Ez a példa egy vékony téglalapot rajzol a két hajlítási beállítás által vezérelt függőleges szegmens fölé:

import aspose.slides as slides

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

    source_shape = slide.shapes.add_auto_shape(slides.ShapeType.RECTANGLE, 100, 100, 60, 25)
    target_shape = slide.shapes.add_auto_shape(slides.ShapeType.RECTANGLE, 500, 100, 60, 25)
    connector = slide.shapes.add_connector(slides.ShapeType.BENT_CONNECTOR4, 20, 20, 400, 300)
    connector.start_shape_connected_to = source_shape
    connector.start_shape_connection_site_index = 3
    connector.end_shape_connected_to = target_shape
    connector.end_shape_connection_site_index = 2

    horizontal_bend = None
    vertical_bend = None
    for adjustment_index in range(len(connector.adjustments)):
        adjustment = connector.adjustments[adjustment_index]
        if adjustment.type == slides.ShapeAdjustmentType.CONNECTOR_BEND_POSITION_X:
            horizontal_bend = adjustment
        elif adjustment.type == slides.ShapeAdjustmentType.CONNECTOR_BEND_POSITION_Y:
            vertical_bend = adjustment

    if horizontal_bend is None or vertical_bend is None:
        print("The connector does not expose the expected bend adjustments.")
    else:
        x = connector.x + connector.width * horizontal_bend.raw_value / 100000
        y = connector.y
        height = connector.height * vertical_bend.raw_value / 100000
        slide.shapes.add_auto_shape(slides.ShapeType.RECTANGLE, x, y, 1, height)
        presentation.save("connector-segment-guide.pptx", slides.export.SaveFormat.PPTX)

A segédalakzat jelöli a kiszámított szegmenst:

connector-adjusted-2

Forgatott vagy tükrözött csatlakozó

Ha ugyanaz a csatlakozó geometria függőlegesen van orientálva, akkor a frame, flip_h és flip_v értékek befolyásolják a csatlakozó‑keret koordináták slide‑koordinátává történő átalakítását.

Ez a példa létrehozza és módosítja a függőlegesen orientált csatlakozót:

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

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

    source_shape = slide.shapes.add_auto_shape(slides.ShapeType.RECTANGLE, 100, 100, 60, 25)
    source_shape.text_frame.text = "From"
    target_shape = slide.shapes.add_auto_shape(slides.ShapeType.RECTANGLE, 100, 400, 60, 25)
    target_shape.text_frame.text = "To 1"
    connector = slide.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
    connector.start_shape_connected_to = source_shape
    connector.start_shape_connection_site_index = 2
    connector.end_shape_connected_to = target_shape
    connector.end_shape_connection_site_index = 3

    for adjustment_index in range(len(connector.adjustments)):
        adjustment = connector.adjustments[adjustment_index]
        if adjustment.type == slides.ShapeAdjustmentType.CONNECTOR_BEND_POSITION_X:
            adjustment.raw_value += 20000
        elif adjustment.type == slides.ShapeAdjustmentType.CONNECTOR_BEND_POSITION_Y:
            adjustment.raw_value += 200000

    presentation.save("vertical-connector-adjusted.pptx", slides.export.SaveFormat.PPTX)

Az módosított csatlakozó függőlegesen jelenik meg az alakzatok között:

connector-adjusted-3

Tetszőleges forgásszög alpha esetén egy csatlakozó‑keret pont (x, y) elforgatása a kerpközép (x0, y0) körül:

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

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

Az alábbi kód kezeli a példában használt 90‑fokos orientációt, és piros segédvonallal jelöli a megfelelő csatlakozó szegmenst:

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

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

    source_shape = slide.shapes.add_auto_shape(slides.ShapeType.RECTANGLE, 100, 100, 60, 25)
    target_shape = slide.shapes.add_auto_shape(slides.ShapeType.RECTANGLE, 100, 400, 60, 25)
    connector = slide.shapes.add_connector(slides.ShapeType.BENT_CONNECTOR4, 20, 20, 400, 300)
    connector.start_shape_connected_to = source_shape
    connector.start_shape_connection_site_index = 2
    connector.end_shape_connected_to = target_shape
    connector.end_shape_connection_site_index = 3

    horizontal_bend = None
    vertical_bend = None
    for adjustment_index in range(len(connector.adjustments)):
        adjustment = connector.adjustments[adjustment_index]
        if adjustment.type == slides.ShapeAdjustmentType.CONNECTOR_BEND_POSITION_X:
            horizontal_bend = adjustment
        elif adjustment.type == slides.ShapeAdjustmentType.CONNECTOR_BEND_POSITION_Y:
            vertical_bend = adjustment

    if horizontal_bend is None or vertical_bend is None:
        print("The connector does not expose the expected bend adjustments.")
    else:
        horizontal_bend.raw_value += 20000
        vertical_bend.raw_value += 200000

        x = connector.x
        y = connector.y
        if connector.frame.flip_h == slides.NullableBool.TRUE:
            x += connector.width
        if connector.frame.flip_v == slides.NullableBool.TRUE:
            y += connector.height

        x += connector.width * horizontal_bend.raw_value / 100000
        rotated_x = connector.frame.center_x - y + connector.frame.center_y
        rotated_y = x - connector.frame.center_x + connector.frame.center_y
        segment_width = connector.height * vertical_bend.raw_value / 100000
        guide = slide.shapes.add_auto_shape(slides.ShapeType.RECTANGLE, rotated_x, rotated_y, segment_width, 1)
        guide.line_format.fill_format.fill_type = slides.FillType.SOLID
        guide.line_format.fill_format.solid_fill_color.color = draw.Color.red

        presentation.save("rotated-connector-segment-guide.pptx", slides.export.SaveFormat.PPTX)

A piros segédvonal a koordináta‑átalakítás után jelzi a kiszámított szegmenst:

connector-adjusted-4

Ezek a képletek a példákban használt előbeállításokat írják le, nem egy univerzális csatlakozómodellt. Érvényesítse a beállítási típusokat, a keret orientációját és az értéktartományokat, mielőtt ugyanazt a számítást más előbeállításra alkalmazná.

Csatlakozó irányszögének meghatározása

Egy egyenes csatlakozó irányát a szélesség és magasság, valamint a vízszintes és függőleges tükrözések figyelembevételével számíthatjuk ki. Az alábbi példa a pozitív vízszintes tengelytől óramutató járásával megegyező szöget adja meg slide‑koordinátákban:

import math
import aspose.slides as slides

with slides.Presentation() as presentation:
    slide = presentation.slides[0]
    connector = slide.shapes.add_connector(slides.ShapeType.STRAIGHT_CONNECTOR1, 100, 100, 200, 100)

    flip_h = connector.frame.flip_h == slides.NullableBool.TRUE
    flip_v = connector.frame.flip_v == slides.NullableBool.TRUE
    delta_x = connector.width * (-1 if flip_h else 1)
    delta_y = connector.height * (-1 if flip_v else 1)
    angle = math.atan2(delta_y, delta_x) * 180.0 / math.pi

    if angle < 0:
        angle += 360

    print(f"Connector direction: {angle:.2f} degrees")

FAQ

Hogyan tudom ellenőrizni, hogy egy csatlakozó csatlakozhat-e egy alakzathoz?

Ellenőrizze az alakzat connection_site_count értékét. A pozitív szám azt jelenti, hogy az alakzat csatlakozási helyeket biztosít. Érvényesítse a kiválasztott helyindexet, mielőtt a csatlakozó egyik végéhez rendeli.

Azonosíthatok-e egy csatlakozó beállítást a gyűjteményindex alapján?

Az index csak akkor jelentős, ha ismert a csatlakozó előbeállítása és a gyűjtemény elrendezése. Módosítás előtt ellenőrizze a IAdjustValue.type értéket, és ha ugyanaz a szemantikai típus többször is előfordul, használja a IAdjustValue.name értéket további információként.

Mi történik, ha egy csatlakoztatott alakzatot törlik?

A csatlakozó megfelelő vége leválik. A csatlakozó a dián marad, törölhető, szabad vonalként pozicionálható, vagy újra csatlakoztatható egy másik alakzathoz.

Megmaradnak a csatlakozások, ha egy diát másolnak?

Általában megmaradnak, ha a csatlakoztatott alakzatokkal együtt másolják a diát. Ha egy csatlakozót másolnak anélkül, hogy a célalakzata egyike is másolva lenne, az érintett véget újra csatlakoztatni kell.