Aangepaste presentatieshapes in Java
Overzicht
Dit artikel legt uit hoe je presentatieshapes in Aspose.Slides kunt aanpassen door de geometrie van een shape te bewerken via bewerkingspunten en geometrie‑paden. Het laat zien hoe je werkt met GeometryPath en IGeometryPath om bestaande shapes te wijzigen, basisbewerkingsbewerkingen uit te voeren, punten toe te voegen of te verwijderen, en de bijgewerkte geometrie terug toe te passen op een shape.
Het toont bovendien hoe je aangepaste en samengestelde shapes maakt, shapes met afgeronde hoeken bouwt, bepaalt of de geometrie van een shape gesloten is, en converteert tussen GeometryPath en java.awt.Shape voor extra geometrie‑aanpassingsscenario’s.
Een shape wijzigen met bewerkingspunten
Beschouw een vierkant. In PowerPoint kun je met bewerkingspunten:
- de hoek van het vierkant naar binnen of naar buiten verplaatsen
- de kromming van een hoek of punt specificeren
- nieuwe punten aan het vierkant toevoegen
- punten op het vierkant manipuleren, enz.
In wezen kun je de beschreven handelingen op elke shape uitvoeren. Met bewerkingspunten kun je een shape wijzigen of een nieuwe shape maken op basis van een bestaande shape.
Tips voor shape-bewerking

Voordat je begint met het bewerken van PowerPoint‑shapes via bewerkingspunten, wil je wellicht de volgende zaken over shapes in overweging nemen:
- Een shape (of het pad ervan) kan gesloten of open zijn.
- Wanneer een shape gesloten is, heeft het geen start‑ of eindpunt. Wanneer een shape open is, heeft het een begin‑ en eindpunt.
- Alle shapes bestaan uit minstens 2 ankerpunten die met elkaar verbonden zijn door lijnen.
- Een lijn is recht of gebogen. Ankerpunten bepalen de aard van de lijn.
- Ankerpunten bestaan als hoekpunten, rechte punten of soepele punten:
- Een hoekpunt is een punt waar 2 rechte lijnen in een hoek samenkomen.
- Een soepel punt is een punt waar 2 handvatten in een rechte lijn liggen en de segmenten van de lijn in een vloeiende kromme samenkomen. In dit geval staan alle handvatten op gelijke afstand van het ankerpunt.
- Een recht punt is een punt waar 2 handvatten in een rechte lijn liggen en de lijnsegmenten in een vloeiende kromme samenkomen. In dit geval hoeven de handvatten niet op gelijke afstand van het ankerpunt te staan.
- Door ankerpunten te verplaatsen of te bewerken (wat de hoek van lijnen verandert), kun je de vorm van een shape aanpassen.
Om PowerPoint‑shapes via bewerkingspunten te bewerken, biedt Aspose.Slides de klasse GeometryPath en de interface IGeometryPath.
- Een GeometryPath instantie vertegenwoordigt een geometrie‑pad van het IGeometryShape object.
- Om de
GeometryPathuit deIGeometryShape‑instantie op te halen, kun je de methode IGeometryShape.getGeometryPaths gebruiken. - Om de
GeometryPathvoor een shape in te stellen, kun je deze methoden gebruiken: IGeometryShape.setGeometryPath voor solide shapes en IGeometryShape.setGeometryPaths voor samengestelde shapes. - Om segmenten toe te voegen, kun je de methoden onder IGeometryPath gebruiken.
- Met behulp van de methoden IGeometryPath.setStroke en IGeometryPath.setFillMode kun je het uiterlijk van een geometrie‑pad instellen.
- Met behulp van de methode IGeometryPath.getPathData kun je het geometrie‑pad van een
GeometryShapeophalen als een array van padsegmenten. - Om extra opties voor shape‑geometrie‑aanpassing te benaderen, kun je GeometryPath converteren naar java.awt.Shape.
- Gebruik de methoden geometryPathToGraphicsPath en graphicsPathToGeometryPath (van de klasse ShapeUtil) om GeometryPath heen en weer te converteren naar java.awt.Shape.
Eenvoudige bewerkingsbewerkingen
Deze Java‑code laat zien hoe je
Een lijn toevoegen aan het einde van een pad
public void lineTo(java.awt.geom.Point2D.Float point);
public void lineTo(float x, float y);
Een lijn toevoegen op een opgegeven positie op een pad:
public void lineTo(java.awt.geom.Point2D.Float point, long index);
public void lineTo(float x, float y, long index);
Een kubieke Bézier‑curve toevoegen aan het einde van een pad:
public void cubicBezierTo(java.awt.geom.Point2D.Float point1, java.awt.geom.Point2D.Float point2, java.awt.geom.Point2D.Float point3);
public void cubicBezierTo(float x1, float y1, float x2, float y2, float x3, float y3);
Een kubieke Bézier‑curve toevoegen op de opgegeven positie op een pad:
public void cubicBezierTo(java.awt.geom.Point2D.Float point1, java.awt.geom.Point2D.Float point2, java.awt.geom.Point2D.Float point3, long index);
public void cubicBezierTo(float x1, float y1, float x2, float y2, float x3, float y3, long index);
Een kwadratische Bézier‑curve toevoegen aan het einde van een pad:
public void quadraticBezierTo(java.awt.geom.Point2D.Float point1, java.awt.geom.Point2D.Float point2);
public void quadraticBezierTo(float x1, float y1, float x2, float y2);
Een kwadratische Bézier‑curve toevoegen op een opgegeven positie op een pad:
public void quadraticBezierTo(java.awt.geom.Point2D.Float point1, java.awt.geom.Point2D.Float point2, long index);
public void quadraticBezierTo(float x1, float y1, float x2, float y2, long index);
Een gegeven boog toevoegen aan een pad:
public void arcTo(float width, float heigth, float startAngle, float sweepAngle);
De huidige figuur sluiten van een pad:
public void closeFigure();
De positie voor het volgende punt instellen:
public void moveTo(java.awt.geom.Point2D.Float point);
public void moveTo(float x, float y);
Het pad‑segment verwijderen op een opgegeven index:
public void removeAt(int index);
Aangepaste punten aan een shape toevoegen
- Maak een instantie van de klasse GeometryShape aan en stel het type ShapeType.Rectangle in.
- Haal een instantie van de klasse GeometryPath op van de shape.
- Voeg een nieuw punt toe tussen de twee bovenste punten op het pad.
- Voeg een nieuw punt toe tussen de twee onderste punten op het pad.
- Pas het pad toe op de shape.
Deze Java‑code laat zien hoe je aangepaste punten aan een shape toevoegt:
Presentation pres = new Presentation();
try {
GeometryShape shape = (GeometryShape) pres.getSlides().get_Item(0).
getShapes().addAutoShape(ShapeType.Rectangle, 100, 100, 200, 100);
IGeometryPath geometryPath = shape.getGeometryPaths()[0];
geometryPath.lineTo(100, 50, 1);
geometryPath.lineTo(100, 50, 4);
shape.setGeometryPath(geometryPath);
} finally {
if (pres != null) pres.dispose();
}

Punten van een shape verwijderen
- Maak een instantie van de klasse GeometryShape aan en stel het type ShapeType.Heart in.
- Haal een instantie van de klasse GeometryPath op van de shape.
- Verwijder het segment van het pad.
- Pas het pad toe op de shape.
Deze Java‑code laat zien hoe je punten van een shape verwijdert:
Presentation pres = new Presentation();
try {
GeometryShape shape = (GeometryShape) pres.getSlides().get_Item(0).
getShapes().addAutoShape(ShapeType.Heart, 100, 100, 300, 300);
IGeometryPath path = shape.getGeometryPaths()[0];
path.removeAt(2);
shape.setGeometryPath(path);
} finally {
if (pres != null) pres.dispose();
}

Een aangepaste shape maken
- Bereken de punten voor de shape.
- Maak een instantie van de klasse GeometryPath aan.
- Vul het pad met de punten.
- Maak een instantie van de klasse GeometryShape aan.
- Pas het pad toe op de shape.
Deze Java‑code laat zien hoe je een aangepaste shape maakt:
List<Point2D.Float> points = new ArrayList<Point2D.Float>();
float R = 100, r = 50;
int step = 72;
for (int angle = -90; angle < 270; angle += step)
{
double radians = angle * (Math.PI / 180f);
double x = R * Math.cos(radians);
double y = R * Math.sin(radians);
points.add(new Point2D.Float((float)x + R, (float)y + R));
radians = Math.PI * (angle + step / 2) / 180.0;
x = r * Math.cos(radians);
y = r * Math.sin(radians);
points.add(new Point2D.Float((float)x + R, (float)y + R));
}
GeometryPath starPath = new GeometryPath();
starPath.moveTo(points.get(0));
for (int i = 1; i < points.size(); i++)
{
starPath.lineTo(points.get(i));
}
starPath.closeFigure();
Presentation pres = new Presentation();
try {
GeometryShape shape = (GeometryShape) pres.getSlides().get_Item(0).
getShapes().addAutoShape(ShapeType.Rectangle, 100, 100, R * 2, R * 2);
shape.setGeometryPath(starPath);
} finally {
if (pres != null) pres.dispose();
}

Een samengestelde aangepaste shape maken
- Maak een instantie van de klasse GeometryShape aan.
- Maak een eerste instantie van de klasse GeometryPath aan.
- Maak een tweede instantie van de klasse GeometryPath aan.
- Pas de paden toe op de shape.
Deze Java‑code laat zien hoe je een samengestelde aangepaste shape maakt:
Presentation pres = new Presentation();
try {
GeometryShape shape = (GeometryShape) pres.getSlides().get_Item(0).
getShapes().addAutoShape(ShapeType.Rectangle, 100, 100, 200, 100);
GeometryPath geometryPath0 = new GeometryPath();
geometryPath0.moveTo(0, 0);
geometryPath0.lineTo(shape.getWidth(), 0);
geometryPath0.lineTo(shape.getWidth(), shape.getHeight()/3);
geometryPath0.lineTo(0, shape.getHeight() / 3);
geometryPath0.closeFigure();
GeometryPath geometryPath1 = new GeometryPath();
geometryPath1.moveTo(0, shape.getHeight()/3 * 2);
geometryPath1.lineTo(shape.getWidth(), shape.getHeight() / 3 * 2);
geometryPath1.lineTo(shape.getWidth(), shape.getHeight());
geometryPath1.lineTo(0, shape.getHeight());
geometryPath1.closeFigure();
shape.setGeometryPaths(new GeometryPath[] { geometryPath0, geometryPath1});
} finally {
if (pres != null) pres.dispose();
}

Een aangepaste shape met afgeronde hoeken maken
Deze Java‑code laat zien hoe je een aangepaste shape met afgeronde hoeken (naar binnen) maakt:
float shapeX = 20f;
float shapeY = 20f;
float shapeWidth = 300f;
float shapeHeight = 200f;
float leftTopSize = 50f;
float rightTopSize = 20f;
float rightBottomSize = 40f;
float leftBottomSize = 10f;
Presentation pres = new Presentation();
try {
IAutoShape childShape = pres.getSlides().get_Item(0).getShapes().addAutoShape(
ShapeType.Custom, shapeX, shapeY, shapeWidth, shapeHeight);
GeometryPath geometryPath = new GeometryPath();
Point2D.Float point1 = new Point2D.Float(leftTopSize, 0);
Point2D.Float point2 = new Point2D.Float(shapeWidth - rightTopSize, 0);
Point2D.Float point3 = new Point2D.Float(shapeWidth, shapeHeight - rightBottomSize);
Point2D.Float point4 = new Point2D.Float(leftBottomSize, shapeHeight);
Point2D.Float point5 = new Point2D.Float(0, leftTopSize);
geometryPath.moveTo(point1);
geometryPath.lineTo(point2);
geometryPath.arcTo(rightTopSize, rightTopSize, 180, -90);
geometryPath.lineTo(point3);
geometryPath.arcTo(rightBottomSize, rightBottomSize, -90, -90);
geometryPath.lineTo(point4);
geometryPath.arcTo(leftBottomSize, leftBottomSize, 0, -90);
geometryPath.lineTo(point5);
geometryPath.arcTo(leftTopSize, leftTopSize, 90, -90);
geometryPath.closeFigure();
childShape.setGeometryPath(geometryPath);
pres.save("output.pptx", SaveFormat.Pptx);
} finally {
if (pres!= null) pres.dispose();
}
Controleren of een shape‑geometrie gesloten is
Een gesloten shape wordt gedefinieerd als een shape waarvan alle zijden met elkaar verbonden zijn, waardoor één doorlopende grens ontstaat zonder gaten. Zo’n shape kan een eenvoudige geometrische vorm of een complexe aangepaste omtrek zijn. De volgende code‑voorbeeld laat zien hoe je controleert of een shape‑geometrie gesloten is:
boolean isGeometryClosed(IGeometryShape geometryShape)
{
Boolean isClosed = null;
for (IGeometryPath geometryPath : geometryShape.getGeometryPaths()) {
int dataLength = geometryPath.getPathData().length;
if (dataLength == 0)
continue;
IPathSegment lastSegment = geometryPath.getPathData()[dataLength - 1];
isClosed = lastSegment.getPathCommand() == PathCommandType.Close;
if (isClosed == false)
return false;
}
return isClosed == true;
}
GeometryPath naar java.awt.Shape converteren
- Maak een instantie van de klasse GeometryShape aan.
- Maak een instantie van de klasse java.awt.Shape aan.
- Converteer de java.awt.Shape instantie naar de GeometryPath instantie met behulp van ShapeUtil.
- Pas de paden toe op de shape.
Deze Java‑code—een implementatie van de bovenstaande stappen—demonstrates het GeometryPath‑naar‑GraphicsPath‑conversieproces:
Presentation pres = new Presentation();
try {
// Nieuwe shape maken
GeometryShape shape = (GeometryShape)pres.getSlides().get_Item(0).
getShapes().addAutoShape(ShapeType.Rectangle, 100, 100, 300, 100);
// Geometry pad van de shape ophalen
IGeometryPath originalPath = shape.getGeometryPaths()[0];
originalPath.setFillMode(PathFillModeType.None);
// Nieuw graphics pad maken met tekst
Shape graphicsPath;
Font font = new java.awt.Font("Arial", Font.PLAIN, 40);
String text = "Text in shape";
BufferedImage img = new BufferedImage(100, 100, BufferedImage.TYPE_INT_ARGB);
Graphics2D g2 = img.createGraphics();
try
{
GlyphVector glyphVector = font.createGlyphVector(g2.getFontRenderContext(), text);
graphicsPath = glyphVector.getOutline(20f, ((float) -glyphVector.getVisualBounds().getY()) + 10);
}
finally {
g2.dispose();
}
// Graphics pad omzetten naar geometry pad
IGeometryPath textPath = ShapeUtil.graphicsPathToGeometryPath(graphicsPath);
textPath.setFillMode(PathFillModeType.Normal);
// Combinatie van nieuw geometry pad en origineel geometry pad instellen op de shape
shape.setGeometryPaths(new IGeometryPath[] { originalPath, textPath });
} finally {
if (pres != null) pres.dispose();
}

FAQ
Wat gebeurt er met de vulling en de omtrek na het vervangen van de geometrie?
De stijl blijft aan de shape gekoppeld; alleen de contour verandert. De vulling en omtrek worden automatisch toegepast op de nieuwe geometrie.
Hoe roteer ik een aangepaste shape correct samen met de geometrie?
Gebruik de setRotation‑methode van de shape; de geometrie roteert mee met de shape omdat deze gebonden is aan het eigen coördinatensysteem van de shape.
Kan ik een aangepaste shape naar een afbeelding converteren om het resultaat vast te leggen?
Ja. Exporteer het gewenste dia gebied of de shape zelf naar een rasterformaat; dit vereenvoudigt het verdere werken met complexe geometrieën.