Python üzerinden Java ile Sunum Şekillerini Özelleştirme

Genel Bakış

Bu makale, Aspose.Slides içinde sunum şekillerini düzenleme noktaları ve geometri yolları aracılığıyla şekil geometrisini düzenleyerek nasıl özelleştireceğinizi açıklar. Mevcut şekilleri değiştirmek, temel yol düzenleme işlemlerini gerçekleştirmek, nokta eklemek veya kaldırmak ve güncellenen geometriyi bir şekle uygulamak için GeometryPath ile nasıl çalışılacağını gösterir.

Ayrıca, özel ve bileşik şekiller oluşturma, eğri köşeli şekiller inşa etme, bir şekil geometrisinin kapalı olup olmadığını belirleme ve ek geometri özelleştirme senaryoları için GeometryPath ile java.awt.Shape arasında dönüştürme yöntemlerini de gösterir.

Düzenleme Noktaları Kullanarak Bir Şekli Değiştirme

Bir kareyi düşünün. PowerPoint’te düzenleme noktaları kullanarak

  • karenin köşesini içe ya da dışa hareket ettirebilir,
  • bir köşe ya da noktanın kıvrımını belirleyebilir,
  • kareye yeni noktalar ekleyebilir,
  • karenin üzerindeki noktaları manipüle edebilir, vb.

Temelde, bu görevleri herhangi bir şekil üzerinde gerçekleştirebilirsiniz. Düzenleme noktaları sayesinde bir şekli değiştirebilir veya mevcut bir şekilden yeni bir şekil oluşturabilirsiniz.

Şekil Düzenleme İpuçları

overview_image

PowerPoint şekillerini düzenleme noktalarıyla düzenlemeye başlamadan önce, şekillerle ilgili şu noktalara dikkat etmek isteyebilirsiniz:

  • Bir şeklin (veya yolunun) kapalı ya da açık olabilir.
  • Şekil kapalıysa bir başlangıç ya da bitiş noktası yoktur. Açık bir şeklin ise bir başlangıcı ve bir bitişi vardır.
  • Tüm şekiller en az 2 adet birbirine çizgiyle bağlanmış tutma noktasına sahiptir.
  • Bir çizgi düz veya eğri olabilir. Tutma noktaları çizginin doğasını belirler.
  • Tutma noktaları köşe noktası, düz nokta veya yumuşak nokta olarak bulunur:
    • Köşe noktası, iki düz çizginin bir açıyla birleştiği noktadır.
    • Yumuşak nokta, iki tutamağın düz bir hatta bulunduğu ve çizgi segmentlerinin sorunsuz bir eğriyle birleştiği noktadır. Bu durumda tüm tutamaçlar tutma noktasından eşit mesafede bulunur.
    • Düz nokta, iki tutamağın düz bir hatta bulunduğu ancak tutamaçların tutma noktasından eşit mesafede olmak zorunda olmadığı noktadır.
  • Tutma noktalarını (çizgi açılarını değiştiren) hareket ettirerek veya düzenleyerek şeklin görünümünü değiştirebilirsiniz.

PowerPoint şekillerini düzenleme noktalarıyla düzenlemek için Aspose.Slides, GeometryPath sınıfını sağlar.

Basit Düzenleme İşlemleri

Aşağıdaki imzalar temel düzenleme işlemlerini gösterir:

Bir yola bir çizgi ekle:

  • geometry_path.lineTo(point)
  • geometry_path.lineTo(x, y)

Belirli bir konuma bir çizgi ekle:

  • geometry_path.lineTo(point, index)
  • geometry_path.lineTo(x, y, index)

Bir yola bir kübik Bezier eğrisi ekle:

  • geometry_path.cubicBezierTo(point1, point2, point3)
  • geometry_path.cubicBezierTo(x1, y1, x2, y2, x3, y3)

Belirli bir konuma bir kübik Bezier eğrisi ekle:

  • geometry_path.cubicBezierTo(point1, point2, point3, index)
  • geometry_path.cubicBezierTo(x1, y1, x2, y2, x3, y3, index)

Bir yola bir ikinci dereceden Bezier eğrisi ekle:

  • geometry_path.quadraticBezierTo(point1, point2)
  • geometry_path.quadraticBezierTo(x1, y1, x2, y2)

Belirli bir konuma bir ikinci dereceden Bezier eğrisi ekle:

  • geometry_path.quadraticBezierTo(point1, point2, index)
  • geometry_path.quadraticBezierTo(x1, y1, x2, y2, index)

Verilen bir yay ekle:

  • geometry_path.arcTo(width, height, start_angle, sweep_angle)

Mevcut figürü kapat:

  • geometry_path.closeFigure()

Sonraki nokta için konumu ayarla:

  • geometry_path.moveTo(point)
  • geometry_path.moveTo(x, y)

Belirli bir indeksteki yol segmentini kaldır:

  • geometry_path.removeAt(index)

Bir Şekle Özel Noktalar Ekleme

  1. GeometryShape sınıfından bir örnek oluşturun ve ShapeType.Rectangle tipini ayarlayın.
  2. Şekilden bir GeometryPath örneği alın.
  3. Yol üzerindeki iki üst nokta arasına yeni bir nokta ekleyin.
  4. Yol üzerindeki iki alt nokta arasına yeni bir nokta ekleyin.
  5. Yolu şekle uygulayın.

Bu Python kodu, bir şekle özel noktalar eklemenizi gösterir:

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import Presentation, ShapeType

presentation = Presentation()
try:
    shape = presentation.getSlides().get_Item(0).getShapes().addAutoShape(ShapeType.Rectangle, 100, 100, 200, 100)
    geometry_path = shape.getGeometryPaths()[0]
    geometry_path.lineTo(100, 50, 1)
    geometry_path.lineTo(100, 50, 4)
    shape.setGeometryPath(geometry_path)
finally:
    presentation.dispose()

example1_image

Şekilden Noktalar Kaldırma

  1. GeometryShape sınıfından bir örnek oluşturun ve ShapeType.Heart tipini ayarlayın.
  2. Şekilden bir GeometryPath örneği alın.
  3. Yol için segmenti kaldırın.
  4. Yolu şekle uygulayın.

Bu Python kodu, bir şekilden noktaları nasıl kaldıracağınızı gösterir:

import jpime
import asposeslides

if not jpime.isJVMStarted():
    jpime.startJVM()

from asposeslides.api import Presentation, ShapeType

presentation = Presentation()
try:
    shape = presentation.getSlides().get_Item(0).getShapes().addAutoShape(ShapeType.Heart, 100, 100, 300, 300)
    geometry_path = shape.getGeometryPaths()[0]
    geometry_path.removeAt(2)
    shape.setGeometryPath(geometry_path)
finally:
    presentation.dispose()

example2_image

Özel Bir Şekil Oluşturma

  1. Şeklin noktalarını hesaplayın.
  2. Bir GeometryPath örneği oluşturun.
  3. Yolu noktalarla doldurun.
  4. Bir GeometryShape örneği oluşturun.
  5. Yolu şekle uygulayın.

Bu Python kodu, özel bir şekil oluşturmanızı gösterir:

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import Presentation, ShapeType, GeometryPath

import math

points = []
outer_radius = 100
inner_radius = 50
step = 72

for angle in range(-90, 270, step):
    radians = math.radians(angle)
    x = outer_radius * math.cos(radians)
    y = outer_radius * math.sin(radians)
    points.append((x + outer_radius, y + outer_radius))

    radians = math.radians(angle + step / 2)
    x = inner_radius * math.cos(radians)
    y = inner_radius * math.sin(radians)
    points.append((x + outer_radius, y + outer_radius))

star_path = GeometryPath()
star_path.moveTo(*points[0])
for point in points[1:]:
    star_path.lineTo(*point)
star_path.closeFigure()

presentation = Presentation()
try:
    shape = presentation.getSlides().get_Item(0).getShapes().addAutoShape(ShapeType.Rectangle, 100, 100, outer_radius * 2, outer_radius * 2)
    shape.setGeometryPath(star_path)
finally:
    presentation.dispose()

example3_image

Bileşik Özel Şekil Oluşturma

  1. Bir GeometryShape örneği oluşturun.
  2. İlk bir GeometryPath örneği oluşturun.
  3. İkinci bir GeometryPath örneği oluşturun.
  4. Path’leri şekle uygulayın.

Bu Python kodu, bileşik bir özel şekil oluşturmanızı gösterir:

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import Presentation, ShapeType, GeometryPath

presentation = Presentation()
try:
    shape = presentation.getSlides().get_Item(0).getShapes().addAutoShape(ShapeType.Rectangle, 100, 100, 200, 100)

    top_path = GeometryPath()
    top_path.moveTo(0, 0)
    top_path.lineTo(shape.getWidth(), 0)
    top_path.lineTo(shape.getWidth(), shape.getHeight() / 3)
    top_path.lineTo(0, shape.getHeight() / 3)
    top_path.closeFigure()

    bottom_path = GeometryPath()
    bottom_path.moveTo(0, shape.getHeight() / 3 * 2)
    bottom_path.lineTo(shape.getWidth(), shape.getHeight() / 3 * 2)
    bottom_path.lineTo(shape.getWidth(), shape.getHeight())
    bottom_path.lineTo(0, shape.getHeight())
    bottom_path.closeFigure()

    shape.setGeometryPaths([top_path, bottom_path])
finally:
    presentation.dispose()

example4_image

Eğri Köşeli Özel Şekil Oluşturma

Bu Python kodu, içe doğru eğri köşeli bir özel şekil oluşturmanızı gösterir:

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import Presentation, ShapeType, GeometryPath, SaveFormat

shape_x = 20
shape_y = 20
shape_width = 300
shape_height = 200

left_top_size = 50
right_top_size = 20
right_bottom_size = 40
left_bottom_size = 10

presentation = Presentation()
try:
    shape = presentation.getSlides().get_Item(0).getShapes().addAutoShape(ShapeType.Custom, shape_x, shape_y, shape_width, shape_height)
    geometry_path = GeometryPath()
    geometry_path.moveTo(left_top_size, 0)
    geometry_path.lineTo(shape_width - right_top_size, 0)
    geometry_path.arcTo(right_top_size, right_top_size, 180, -90)
    geometry_path.lineTo(shape_width, shape_height - right_bottom_size)
    geometry_path.arcTo(right_bottom_size, right_bottom_size, -90, -90)
    geometry_path.lineTo(left_bottom_size, shape_height)
    geometry_path.arcTo(left_bottom_size, left_bottom_size, 0, -90)
    geometry_path.lineTo(0, left_top_size)
    geometry_path.arcTo(left_top_size, left_top_size, 90, -90)
    geometry_path.closeFigure()
    shape.setGeometryPath(geometry_path)
    presentation.save("output.pptx", SaveFormat.Pptx)
finally:
    presentation.dispose()

Bir Şekil Geometrisinin Kapalı Olup Olmadığını Öğrenme

Kapalı bir şekil, tüm kenarlarının birleştiği 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ı nasıl kontrol edeceğinizi gösterir:

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import PathCommandType

def is_geometry_closed(geometry_shape):
    is_closed = False
    for geometry_path in geometry_shape.getGeometryPaths():
        path_data = geometry_path.getPathData()
        if len(path_data) == 0:
            continue
        last_segment = path_data[-1]
        is_closed = last_segment.getPathCommand() == PathCommandType.Close
        if not is_closed:
            return False
    return is_closed

GeometryPath’ı java.awt.Shape’ye Dönüştürme

  1. Bir GeometryShape örneği oluşturun.
  2. Bir java.awt.Shape örneği oluşturun.
  3. java.awt.Shape örneğini, PathIterator üzerinden yürüyerek ve her segmenti yolda yeniden oynatarak GeometryPath örneğine dönüştürün.
  4. Path’leri şekle uygulayın.

Bu Python kodu, bir grafik yolunu geometri yoluna dönüştürmek için yukarıdaki adımları uygular:

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import Presentation, ShapeType, GeometryPath, PathFillModeType

from java.awt import Font
from java.awt.geom import PathIterator
from java.awt.image import BufferedImage

presentation = Presentation()
try:
    # Yeni bir şekil oluştur.
    shape = presentation.getSlides().get_Item(0).getShapes().addAutoShape(ShapeType.Rectangle, 100, 100, 300, 100)

    # Şeklin geometri yolunu alın.
    original_path = shape.getGeometryPaths()[0]
    original_path.setFillMode(PathFillModeType.None_)

    # Metinle yeni bir grafik yolu oluştur.
    font = Font("Arial", Font.PLAIN, 40)
    text = "Text in shape"
    image = BufferedImage(100, 100, BufferedImage.TYPE_INT_ARGB)
    graphics = image.createGraphics()
    try:
        glyph_vector = font.createGlyphVector(graphics.getFontRenderContext(), text)
        graphics_path = glyph_vector.getOutline(20.0, -glyph_vector.getVisualBounds().getY() + 10)
    finally:
        graphics.dispose()

    # Grafik yolunu geometri yoluna dönüştür.
    text_path = GeometryPath()
    path_iterator = graphics_path.getPathIterator(None)
    points = jpype.JArray(jpype.JFloat)(6)
    while not path_iterator.isDone():
        segment_type = path_iterator.currentSegment(points)
        if segment_type == PathIterator.SEG_MOVETO:
            text_path.moveTo(points[0], points[1])
        elif segment_type == PathIterator.SEG_LINETO:
            text_path.lineTo(points[0], points[1])
        elif segment_type == PathIterator.SEG_QUADTO:
            text_path.quadraticBezierTo(points[0], points[1], points[2], points[3])
        elif segment_type == PathIterator.SEG_CUBICTO:
            text_path.cubicBezierTo(points[0], points[1], points[2], points[3], points[4], points[5])
        elif segment_type == PathIterator.SEG_CLOSE:
            text_path.closeFigure()
        path_iterator.next()
    text_path.setFillMode(PathFillModeType.Normal)

    # Metin yolunu orijinal geometri yolu ile birlikte uygula.
    shape.setGeometryPaths([original_path, text_path])
finally:
    presentation.dispose()

example5_image

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 otomatik olarak yeni geometriye uygulanır.

Özel şekli ve geometrisini nasıl doğru şekilde 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örüntüye 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.