Sunum Şekillerini Java’da Özelleştirme
Genel Bakış
Bu makale, Aspose.Slides içinde şekil geometriğini düzenleme noktaları ve geometri yolları aracılığıyla düzenleyerek sunum şekillerini nasıl özelleştireceğinizi açıklar. GeometryPath ve IGeometryPath ile mevcut şekilleri nasıl değiştireceğinizi, temel yol düzenleme işlemlerini nasıl yapacağınızı, nokta ekleme veya kaldırma işlemlerini ve güncellenen geometrinin bir şekle nasıl uygulanacağını gösterir.
Ayrıca özel ve birleşik şekiller oluşturmayı, köşeleri eğimli şekiller inşa etmeyi, bir şekil geometrisinin kapalı olup olmadığını belirlemeyi ve ek geometri özelleştirme senaryoları için GeometryPath ile java.awt.Shape arasında dönüşüm yapmayı da gösterir.
Düzenleme Noktalarıyla Bir Şekli Değiştirme
Bir kareyi düşünün. PowerPoint’te düzenleme noktalarını kullanarak
- karenin köşesini içine ya da dışına hareket ettirebilir,
- bir köşe ya da nokta için eğriliği belirtebilir,
- kareye yeni noktalar ekleyebilir,
- kare üzerindeki noktalarıManipüle edebilirsiniz, vb.
Temelde, bu görevleri herhangi bir şekil üzerinde gerçekleştirebilirsiniz. Düzenleme noktalarını kullanarak bir şekli değiştirebilir ya da mevcut bir şekilden yeni bir şekil oluşturabilirsiniz.
Şekil Düzenleme İpuçları

PowerPoint şekillerini düzenleme noktalarıyla düzenlemeye başlamadan önce şekillerle ilgili şu noktalara dikkat etmek isteyebilirsiniz:
- Bir şekil (veya yolu) kapalı ya da açık olabilir.
- Bir şekil kapalı olduğunda bir başlangıç veya bitiş noktası yoktur. Açık olduğunda ise bir başlangıç ve bir bitiş noktası bulunur.
- Tüm şekiller en az iki, birbirine hatlarla bağlanmış çapa noktasına sahiptir.
- Bir çizgi düz ya da eğimli olabilir. Çapa noktaları çizginin niteliğini belirler.
- Çapa noktaları köşe noktası, düz nokta veya yumuşak nokta olarak bulunur:
- Köşe noktası, iki düz hatın bir açıyla buluştuğu noktadır.
- Yumuşak nokta, iki tutamağın düz bir hat üzerinde bulunduğu ve hat segmentlerinin yumuşak bir eğriyle birleştiği noktadır. Bu durumda tüm tutamaçlar çapa noktasından eşit bir mesafede bulunur.
- Düz nokta, iki tutamağın düz bir hat üzerinde bulunduğu ve hat segmentlerinin bir eğri oluşturmak zorunda olmadığı noktadır. Bu durumda tutamaçların çapa noktasından eşit mesafede olması gerekmez.
- Çapa noktalarını hareket ettirerek veya düzenleyerek (çizgi açılarını değiştirerek) şeklin görünümünü değiştirebilirsiniz.
PowerPoint şekillerini düzenleme noktalarıyla düzenlemek için Aspose.Slides aşağıdaki sınıfları sağlar: GeometryPath sınıfı ve IGeometryPath arayüzü.
- Bir GeometryPath örneği, IGeometryShape nesnesinin geometri yolunu temsil eder.
IGeometryShapeörneğindenGeometryPathalabilmek için IGeometryShape.getGeometryPaths metodunu kullanabilirsiniz.- Bir şeklin
GeometryPathdeğerini ayarlamak için şu metodları kullanın: katı şekiller için IGeometryShape.setGeometryPath ve birleşik şekiller için IGeometryShape.setGeometryPaths. - Segment eklemek için IGeometryPath altında bulunan metodları kullanabilirsiniz.
- IGeometryPath.setStroke ve IGeometryPath.setFillMode metodlarıyla bir geometri yolunun görünümünü ayarlayabilirsiniz.
- IGeometryPath.getPathData metodunu kullanarak bir
GeometryShapenesnesinin geometri yolunu yol segmentleri dizisi olarak alabilirsiniz. - Ek şekil geometri özelleştirme seçeneklerine erişmek için GeometryPath’i java.awt.Shape tipine dönüştürebilirsiniz.
- geometryPathToGraphicsPath ve graphicsPathToGeometryPath metodlarını ( ShapeUtil sınıfından) kullanarak GeometryPath’i java.awt.Shape’e ve tersine dönüştürebilirsiniz.
Basit Düzenleme İşlemleri
Bu Java kodu aşağıdakileri gösterir
Bir yolun sonuna bir çizgi ekleme
public void lineTo(java.awt.geom.Point2D.Float point);
public void lineTo(float x, float y);
Bir yolda belirli bir konuma çizgi ekleme:
public void lineTo(java.awt.geom.Point2D.Float point, long index);
public void lineTo(float x, float y, long index);
Bir yolun sonuna kübik Bezier eğrisi ekleme:
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);
Bir yolda belirli bir konuma kübik Bezier eğrisi ekleme:
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);
Bir yolun sonuna ikisel Bezier eğrisi ekleme:
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);
Bir yolda belirli bir konuma ikisel Bezier eğrisi ekleme:
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);
Verilen bir yay ekleme:
public void arcTo(float width, float heigth, float startAngle, float sweepAngle);
Bir yolun mevcut figürünü kapatma:
public void closeFigure();
Sonraki nokta konumunu ayarlama:
public void moveTo(java.awt.geom.Point2D.Float point);
public void moveTo(float x, float y);
Belirli bir indeksteki yol segmentini kaldırma:
public void removeAt(int index);
Bir Şekle Özel Noktalar Ekleme
- GeometryShape sınıfının bir örneğini oluşturun ve ShapeType.Rectangle tipini ayarlayın.
- Şekilden bir GeometryPath örneği alın.
- Yol üzerindeki iki üst noktası arasına yeni bir nokta ekleyin.
- Yol üzerindeki iki alt nokta arasına yeni bir nokta ekleyin.
- Yolu şekle uygulayın.
Bu Java kodu, bir şekle özel noktalar eklemeyi gösterir:
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();
}

Bir Şekilden Noktaları Kaldırma
- GeometryShape sınıfının bir örneğini oluşturun ve ShapeType.Heart tipini ayarlayın.
- Şekilden bir GeometryPath örneği alın.
- Yol için segmenti kaldırın.
- Yolu şekle uygulayın.
Bu Java kodu, bir şekilden noktaları kaldırmayı gösterir:
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();
}

Özel Bir Şekil Oluşturma
- Şeklin noktalarını hesaplayın.
- Bir GeometryPath örneği oluşturun.
- Yolu noktalara doldurun.
- Bir GeometryShape örneği oluşturun.
- Yolu şekle uygulayın.
Bu Java kodu, özel bir şekil oluşturmayı gösterir:
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();
}

Birleşik Özel Şekil Oluşturma
- Bir GeometryShape örneği oluşturun.
- İlk bir GeometryPath örneği oluşturun.
- İkinci bir GeometryPath örneği oluşturun.
- Yolları şekle uygulayın.
Bu Java kodu, birleşik bir özel şekil oluşturmayı gösterir:
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();
}

Eğimli Köşeli Özel Şekil Oluşturma
Bu Java kodu, eğimli köşelere (içeriye doğru) sahip bir özel şekil oluşturmayı gösterir:
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();
}
Bir Şekil Geometrisinin Kapalı Olup Olmadığını Öğrenme
Kapalı bir şekil, tüm kenarlarının birbirine bağlandığı ve boşluk bırakmadan tek bir sınır oluşturduğu şekil olarak tanımlanır. Bu şekil basit bir geometrik form ya da karmaşık bir özel kontur olabilir. Aşağıdaki kod örneği, bir şekil geometrisinin kapalı olup olmadığını kontrol etmeyi gösterir:
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’i java.awt.Shape’a Dönüştürme
- Bir GeometryShape örneği oluşturun.
- Bir java.awt.Shape örneği oluşturun.
- ShapeUtil kullanarak java.awt.Shape örneğini GeometryPath örneğine dönüştürün.
- Yolları şekle uygulayın.
Yukarıdaki adımları gerçekleştiren bu Java kodu, GeometryPath’i GraphicsPath’a dönüştürme sürecini gösterir:
Presentation pres = new Presentation();
try {
// Yeni şekil oluştur
GeometryShape shape = (GeometryShape)pres.getSlides().get_Item(0).
getShapes().addAutoShape(ShapeType.Rectangle, 100, 100, 300, 100);
// Şeklin geometri yolunu al
IGeometryPath originalPath = shape.getGeometryPaths()[0];
originalPath.setFillMode(PathFillModeType.None);
// Metin ile yeni grafik yolu oluştur
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();
}
// Grafik yolunu geometri yoluna dönüştür
IGeometryPath textPath = ShapeUtil.graphicsPathToGeometryPath(graphicsPath);
textPath.setFillMode(PathFillModeType.Normal);
// Yeni geometri yolu ve orijinal geometri yolunun birleşimini şekle ayarla
shape.setGeometryPaths(new IGeometryPath[] { originalPath, textPath });
} finally {
if (pres != null) pres.dispose();
}

SSS
Geometriyi değiştirdikten sonra dolgu ve kenarlık ne olur?
Stil şekille kalır; sadece kontur değişir. Dolgu ve kenarlık yeni geometrinin üzerine otomatik olarak uygulanır.
Özel şekli ve geometrisini aynı anda doğru şekilde nasıl döndürürüm?
Şeklin setRotation metodunu kullanın; geometri şeklin kendi koordinat sistemine bağlı olduğu için şekilyle birlikte döner.
Özel şekli bir görsele dönüştürüp sonucu “kilitleyebilir” miyim?
Evet. Gerekli slide alanını ya da shape kendisini raster bir formata dışa aktarın; bu, ağır geometrilerle çalışmayı kolaylaştırır.