Spravování konektorů v prezentacích na Androidu
Úvod
Konektor PowerPoint je speciální čára, která spojuje dva tvary a zůstává k tvarům připojená i při jejich přesunu nebo přemístění na konkrétním snímku.
Konektory jsou obvykle připojeny k bodům připojení (zelené tečky), které jsou ve výchozím nastavení na všech tvarech. Body připojení se zobrazí, když se k nim kurzor přiblíží.
Úpravné body (oranžové tečky), které existují jen u některých konektorů, slouží k úpravě polohy a tvaru konektorů.
Typy konektorů
V PowerPointu můžete použít přímé, loketní (úhlové) a zakřivené konektory.
Aspose.Slides poskytuje následující konektory:
| Konektor | Obrázek | Počet úpravných bodů |
|---|---|---|
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 |
Propojte tvary pomocí konektorů
- Vytvořte instanci třídy Presentation.
- Získejte referenci na snímek pomocí jeho indexu.
- Přidejte na snímek dva AutoShape pomocí metody
addAutoShape, kterou poskytuje objektShapes. - Přidejte konektor pomocí metody
addConnector, kterou poskytuje objektShapes, a tím definujte typ konektoru. - Propojte tvary pomocí konektoru.
- Zavolejte metodu
reroutepro použití nejkratší cesty připojení. - Uložte prezentaci.
Tento Java kód ukazuje, jak přidat konektor (zakřivený konektor) mezi dva tvary (elipsu a obdélník):
// Vytvoří instanci třídy prezentace, která představuje soubor PPTX
Presentation pres = new Presentation();
try {
// Přistupuje ke kolekci tvarů pro konkrétní snímek
IShapeCollection shapes = pres.getSlides().get_Item(0).getShapes();
// Přidá autoshape elipsu
IAutoShape ellipse = shapes.addAutoShape(ShapeType.Ellipse, 0, 100, 100, 100);
// Přidá autoshape obdélník
IAutoShape rectangle = shapes.addAutoShape(ShapeType.Rectangle, 100, 300, 100, 100);
// Přidá tvar konektoru do kolekce tvarů snímku
IConnector connector = shapes.addConnector(ShapeType.BentConnector2, 0, 0, 10, 10);
// Propojí tvary pomocí konektoru
connector.setStartShapeConnectedTo(ellipse);
connector.setEndShapeConnectedTo(rectangle);
// Zavolá reroute, který nastaví automatickou nejkratší cestu mezi tvary
connector.reroute();
// Uloží prezentaci
pres.save("output.pptx", SaveFormat.Pptx);
} finally {
if (pres != null) pres.dispose();
}
NOTE
MetodaConnector.reroute přesměruje konektor a donutí jej zvolit nejkratší možnou cestu mezi tvary. Pro dosažení tohoto cíle může metoda změnit body setStartShapeConnectionSiteIndex a setEndShapeConnectionSiteIndex.
Určení bodu připojení
Pokud chcete, aby konektor spojil dva tvary pomocí konkrétních bodů na tvarech, musíte zadat preferované body připojení tímto způsobem:
- Vytvořte instanci třídy Presentation.
- Získejte referenci na snímek pomocí jeho indexu.
- Přidejte na snímek dva AutoShape pomocí metody
addAutoShape, kterou poskytuje objektShapes. - Přidejte konektor pomocí metody
addConnector, kterou poskytuje objektShapes, a tím definujte typ konektoru. - Propojte tvary pomocí konektoru.
- Nastavte své preferované body připojení na tvarech.
- Uložte prezentaci.
Tento Java kód demonstruje operaci, kde je specifikován preferovaný bod připojení:
// Vytvoří instanci třídy prezentace, která představuje soubor PPTX
Presentation pres = new Presentation();
try {
// Přistupuje ke kolekci tvarů pro konkrétní snímek
IShapeCollection shapes = pres.getSlides().get_Item(0).getShapes();
// Přidá autoshape elipsu
IAutoShape ellipse = shapes.addAutoShape(ShapeType.Ellipse, 0, 100, 100, 100);
// Přidá autoshape obdélník
IAutoShape rectangle = shapes.addAutoShape(ShapeType.Rectangle, 100, 300, 100, 100);
// Přidá tvar konektoru do kolekce tvarů snímku
IConnector connector = shapes.addConnector(ShapeType.BentConnector2, 0, 0, 10, 10);
// Propojí tvary pomocí konektoru
connector.setStartShapeConnectedTo(ellipse);
connector.setEndShapeConnectedTo(rectangle);
// Nastaví preferovaný index bodu připojení na tvaru elipsy
int wantedIndex = 6;
// Zkontroluje, zda je preferovaný index menší než maximální počet míst připojení
if (ellipse.getConnectionSiteCount() > wantedIndex)
{
// Nastaví preferovaný bod připojení na autoshape elipsy
connector.setStartShapeConnectionSiteIndex(wantedIndex);
}
// Uloží prezentaci
pres.save("output.pptx", SaveFormat.Pptx);
} finally {
if (pres != null) pres.dispose();
}
Úprava bodu konektoru
Můžete upravit existující konektor pomocí jeho úpravných bodů. Pouze konektory s úpravným body lze tímto způsobem měnit. Viz tabulka pod Typy konektorů.
Jednoduchý případ
Zvažte případ, kdy konektor mezi dvěma tvary (A a B) prochází třetím tvarem (C):

Presentation pres = new Presentation();
try {
ISlide sld = pres.getSlides().get_Item(0);
IShape shape = sld.getShapes().addAutoShape(ShapeType.Rectangle, 300, 150, 150, 75);
IShape shapeFrom = sld.getShapes().addAutoShape(ShapeType.Rectangle, 500, 400, 100, 50);
IShape shapeTo = sld.getShapes().addAutoShape(ShapeType.Rectangle, 100, 100, 70, 30);
IConnector 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(Color.BLACK);
connector.setStartShapeConnectedTo(shapeFrom);
connector.setEndShapeConnectedTo(shapeTo);
connector.setStartShapeConnectionSiteIndex(2);
} finally {
if (pres != null) pres.dispose();
}
Abychom třetí tvar obešli nebo obcházeli, můžeme konektor upravit tak, že posuneme jeho vertikální čáru doleva:

IAdjustValue adj2 = connector.getAdjustments().get_Item(1);
adj2.setRawValue(adj2.getRawValue() + 10000);
Složitější případy
Pro provedení složitějších úprav musíte brát v úvahu následující:
- Nastavitelný bod konektoru je úzce spojen s formulí, která vypočítává a určuje jeho polohu. Změna umístění bodu může změnit tvar konektoru.
- Úpravné body konektoru jsou v poli definovány v přísném pořadí. Úpravné body jsou číslovány od počátečního bodu konektoru po koncový.
- Hodnoty úpravných bodů vyjadřují procenta šířky/výšky tvaru konektoru.
- Tvar je omezený startovním a koncovým bodem konektoru vynásobeným 1000.
- První bod, druhý bod a třetí bod definují procento ze šířky, procento z výšky a opět procento ze šířky.
- Pro výpočty, které určují souřadnice úpravných bodů konektoru, musíte vzít v úvahu rotaci konektoru a jeho odražení. Poznámka, že úhel rotace všech konektorů uvedených pod Typy konektorů je 0.
Případ 1
Zvažte případ, kdy jsou dva objekty textového rámce propojeny konektorem:

// Vytvoří instanci třídy prezentace, která představuje soubor PPTX
Presentation pres = new Presentation();
try {
// Získá první snímek v prezentaci
ISlide sld = pres.getSlides().get_Item(0);
// Přidá tvary, které budou propojeny pomocí konektoru
IAutoShape shapeFrom = sld.getShapes().addAutoShape(ShapeType.Rectangle, 100, 100, 60, 25);
shapeFrom.getTextFrame().setText("From");
IAutoShape shapeTo = sld.getShapes().addAutoShape(ShapeType.Rectangle, 500, 100, 60, 25);
shapeTo.getTextFrame().setText("To");
// Přidá konektor
IConnector connector = sld.getShapes().addConnector(ShapeType.BentConnector4, 20, 20, 400, 300);
// Určuje směr konektoru
connector.getLineFormat().setEndArrowheadStyle(LineArrowheadStyle.Triangle);
// Určuje barvu konektoru
connector.getLineFormat().getFillFormat().setFillType(FillType.Solid);
connector.getLineFormat().getFillFormat().getSolidFillColor().setColor(Color.RED);
// Určuje tloušťku čáry konektoru
connector.getLineFormat().setWidth(3);
// Propojí tvary pomocí konektoru
connector.setStartShapeConnectedTo(shapeFrom);
connector.setStartShapeConnectionSiteIndex(3);
connector.setEndShapeConnectedTo(shapeTo);
connector.setEndShapeConnectionSiteIndex(2);
// Získá úpravné body konektoru
IAdjustValue adjValue_0 = connector.getAdjustments().get_Item(0);
IAdjustValue adjValue_1 = connector.getAdjustments().get_Item(1);
} finally {
if (pres != null) pres.dispose();
}
Úprava
Můžeme změnit hodnoty úpravných bodů konektoru zvýšením odpovídajících procent ze šířky a výšky o 20 % a 200 % respektive:
// Změní hodnoty úpravných bodů
adjValue_0.setRawValue(adjValue_0.getRawValue() + 20000);
adjValue_1.setRawValue(adjValue_1.getRawValue() + 200000);
Výsledek:

Abychom definovali model, který nám umožní určit souřadnice a tvar jednotlivých částí konektoru, vytvořme tvar, který odpovídá horizontální složce konektoru v bodě connector.getAdjustments().get_Item(0):
// Vykreslí svislou komponentu konektoru
float x = connector.getX() + connector.getWidth() * adjValue_0.getRawValue() / 100000;
float y = connector.getY();
float height = connector.getHeight() * adjValue_1.getRawValue() / 100000;
sld.getShapes().addAutoShape( ShapeType .Rectangle, x, y, 0, height);
Výsledek:

Případ 2
V případě 1 jsme demonstrovali jednoduchou operaci úpravy konektoru pomocí základních principů. V běžných situacích musíte vzít v úvahu rotaci konektoru a jeho zobrazení (které jsou nastaveny pomocí connector.getRotation(), connector.getFrame().getFlipH() a connector.getFrame().getFlipV()). Nyní ukážeme celý postup.
Nejprve přidejme nový objekt textového rámce (To 1) na snímek (pro účely připojení) a vytvořme nový (zelený) konektor, který ho spojí s již vytvořenými objekty.
// Vytvoří nový objekt vazby
IAutoShape shapeTo_1 = sld.getShapes().addAutoShape(ShapeType.Rectangle, 100, 400, 60, 25);
shapeTo_1.getTextFrame().setText("To 1");
// Vytvoří nový konektor
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(Color.CYAN);
connector.getLineFormat().setWidth(3);
// Propojí objekty pomocí nově vytvořeného konektoru
connector.setStartShapeConnectedTo(shapeFrom);
connector.setStartShapeConnectionSiteIndex(2);
connector.setEndShapeConnectedTo(shapeTo_1);
connector.setEndShapeConnectionSiteIndex(3);
// Získá úpravné body konektoru
adjValue_0 = connector.getAdjustments().get_Item(0);
adjValue_1 = connector.getAdjustments().get_Item(1);
// Změní hodnoty úpravných bodů
adjValue_0.setRawValue(adjValue_0.getRawValue() + 20000);
adjValue_1.setRawValue(adjValue_1.getRawValue() + 200000);
Výsledek:

Druhá část: vytvořme tvar, který bude odpovídat horizontální složce konektoru procházející úpravným bodem nového konektoru connector.getAdjustments().get_Item(0). Použijeme hodnoty z dat konektoru pro connector.getRotation(), connector.getFrame().getFlipH() a connector.getFrame().getFlipV() a aplikujeme běžný převodový vzorec pro rotaci kolem daného bodu x0:
X = (x — x0) * cos(alpha) — (y — y0) * sin(alpha) + x0; Y = (x — x0) * sin(alpha) + (y — y0) * cos(alpha) + y0;
V našem případě je úhel rotace objektu 90 stupňů a konektor je zobrazen vertikálně, takže zde je odpovídající kód:
// Uloží souřadnice konektoru
x = connector.getX();
y = connector.getY();
// Opraví souřadnice konektoru v případě, že se objeví
if (connector.getFrame().getFlipH() == NullableBool.True)
{
x += connector.getWidth();
}
if (connector.getFrame().getFlipV() == NullableBool.True)
{
y += connector.getHeight();
}
// Přijme hodnotu úpravného bodu jako souřadnici
x += connector.getWidth() * adjValue_0.getRawValue() / 100000;
// Převádí souřadnice, protože Sin(90) = 1 a Cos(90) = 0
float xx = connector.getFrame().getCenterX() - y + connector.getFrame().getCenterY();
float yy = x - connector.getFrame().getCenterX() + connector.getFrame().getCenterY();
// Určuje šířku horizontální komponenty pomocí hodnoty druhého úpravného bodu
float width = connector.getHeight() * adjValue_1.getRawValue() / 100000;
IAutoShape shape = sld.getShapes().addAutoShape(ShapeType.Rectangle, xx, yy, width, 0);
shape.getLineFormat().getFillFormat().setFillType(FillType.Solid);
shape.getLineFormat().getFillFormat().getSolidFillColor().setColor(Color.RED);
Výsledek:

Ukázali jsme výpočty zahrnující jednoduché úpravy i složité úpravy (úpravy s úhly rotace). S využitím získaných znalostí můžete vytvořit vlastní model (nebo napsat kód) pro získání objektu GraphicsPath nebo dokonce nastavit hodnoty úpravných bodů konektoru na základě konkrétních souřadnic snímku.
Zjištění úhlu čar konektoru
- Vytvořte instanci třídy.
- Získejte referenci na snímek pomocí jeho indexu.
- Získejte přístup k tvaru čáry konektoru.
- Použijte šířku a výšku čáry, výšku a šířku rámce tvaru k výpočtu úhlu.
Tento Java kód demonstruje operaci, při které jsme vypočítali úhel pro tvar čáry konektoru:
Presentation pres = new Presentation("ConnectorLineAngle.pptx");
try {
Slide slide = (Slide)pres.getSlides().get_Item(0);
for (int i = 0; i < slide.getShapes().size(); i++)
{
double dir = 0.0;
Shape shape = (Shape)slide.getShapes().get_Item(i);
if (shape instanceof AutoShape)
{
AutoShape ashp = (AutoShape)shape;
if (ashp.getShapeType() == ShapeType.Line)
{
dir = getDirection(ashp.getWidth(), ashp.getHeight(),
ashp.getFrame().getFlipH() > 0, ashp.getFrame().getFlipV() > 0);
}
}
else if (shape instanceof Connector)
{
Connector ashp = (Connector)shape;
dir = getDirection(ashp.getWidth(), ashp.getHeight(),
ashp.getFrame().getFlipH() > 0, ashp.getFrame().getFlipV() > 0);
}
System.out.println(dir);
}
} finally {
if (pres != null) pres.dispose();
}
public static double getDirection(float w, float h, boolean flipH, boolean flipV)
{
float endLineX = w * (flipH ? -1 : 1);
float endLineY = h * (flipV ? -1 : 1);
float endYAxisX = 0;
float endYAxisY = h;
double angle = (Math.atan2(endYAxisY, endYAxisX) - Math.atan2(endLineY, endLineX));
if (angle < 0) angle += 2 * Math.PI;
return angle * 180.0 / Math.PI;
}
FAQ
Jak zjistit, zda lze konektor „přilepit“ k určitému tvaru?
Zkontrolujte, že tvar poskytuje connection sites. Pokud žádné nejsou nebo je jejich počet nula, přilepení není k dispozici; v tom případě použijte volné koncové body a umístěte je ručně. Je rozumné před připojením zkontrolovat počet míst.
Co se stane s konektorem, pokud smažu jeden z propojených tvarů?
Jeho konce se odpojí; konektor zůstane na snímku jako běžná čára s volnými začátkem/koncem. Můžete jej buď smazat, nebo znovu přiřadit spojení a případně reroute.
Zůstávají vazby konektoru zachovány při kopírování snímku do jiné prezentace?
Obecně ano, pokud jsou také zkopírovány cílové tvary. Pokud je snímek vložen do jiného souboru bez propojených tvarů, konce se stanou volnými a budete je muset znovu připojit.









