自定义形状
Contents
[
Hide
]
使用编辑点更改形状
考虑一个正方形。在PowerPoint中,通过编辑点,您可以
- 将正方形的角向内或向外移动
- 指定角落或点的曲率
- 向正方形添加新点
- 操作正方形上的点等。
本质上,您可以对任何形状执行上述任务。使用编辑点,您可以更改形状或从现有形状创建新形状。
形状编辑提示
在您开始通过编辑点编辑PowerPoint形状之前,您可能希望考虑以下关于形状的要点:
- 形状(或其路径)可以是闭合的或开放的。
- 当一个形状是闭合的时,它没有起点或终点。当一个形状是开放的时,它有一个开始和结束。
- 所有形状至少由 2 个锚点通过直线连接在一起。
- 一条线可以是直线或曲线。锚点决定了线的性质。
- 锚点可以是角点、直点或平滑点:
- 角点是两个直线在一个角度交汇的点。
- 平滑点是两个手柄以直线存在,并且线段以平滑曲线连接的点。在这种情况下,所有手柄与锚点之间的距离相等。
- 直点是两个手柄以直线存在,并且线段以平滑曲线连接的点。在这种情况下,手柄与锚点之间的距离不必相等。
- 通过移动或编辑锚点(这会改变线的角度),您可以改变形状的外观。
要通过编辑点编辑PowerPoint形状,Aspose.Slides提供了GeometryPath类和IGeometryPath接口。
- 一个 GeometryPath 实例代表 IGeometryShape 对象的几何路径
- 要从
IGeometryShape
实例检索GeometryPath
,您可以使用 IGeometryShape.GetGeometryPaths 方法。 - 要为形状设置
GeometryPath
,您可以使用这些方法:IGeometryShape.SetGeometryPath 用于 固体形状 和 IGeometryShape.SetGeometryPaths 用于 复合形状。 - 为了添加线段,您可以使用 IGeometryPath 下的方法。
- 使用 IGeometryPath.Stroke 和 IGeometryPath.FillMode 属性,您可以设置几何路径的外观。
- 使用 IGeometryPath.PathData 属性,您可以将
GeometryShape
的几何路径作为路径段数组检索。 - 要访问额外的形状几何自定义选项,您可以将 GeometryPath 转换为 GraphicsPath。
- 使用
GeometryPathToGraphicsPath
和GraphicsPathToGeometryPath
方法(来自 ShapeUtil 类)将GeometryPath
与GraphicsPath
相互转换。
简单编辑操作
此Python代码演示了如何
在路径末尾添加一条线:
line_to(point)
line_to(x, y)
在路径指定位置添加一条线:
line_to(point, index)
line_to(x, y, index)
在路径末尾添加一条立方贝塞尔曲线:
cubic_bezier_to(point1, point2, point3)
cubic_bezier_to(x1, y1, x2, y2, x3, y3)
在路径指定位置添加一条立方贝塞尔曲线:
cubic_bezier_to(point1, point2, point3, index)
cubic_bezier_to(x1, y1, x2, y2, x3, y3, index)
在路径末尾添加一条二次贝塞尔曲线:
quadratic_bezier_to(point1, point2)
quadratic_bezier_to(x1, y1, x2, y2)
在路径指定位置添加一条二次贝塞尔曲线:
quadratic_bezier_to(point1, point2, index)
quadratic_bezier_to(x1, y1, x2, y2, index)
将给定弧追加到路径:
arc_to(width, heigth, startAngle, sweepAngle)
关闭当前路径的图形:
close_figure()
设置下一个点的位置:
move_to(point)
move_to(x, y)
删除给定索引处的路径段:
remove_at(index)
向形状添加自定义点
- 创建 GeometryShape 类的实例,并设置 ShapeType.Rectangle
- 从形状获取 GeometryPath 类的实例。
- 在路径的两个顶部点之间添加一个新点。
- 在路径的两个底部点之间添加一个新点。
- 将路径应用于形状。
此Python代码演示了如何向形状添加自定义点:
import aspose.slides as slides
with slides.Presentation() as pres:
shape = pres.slides[0].shapes.add_auto_shape(slides.ShapeType.RECTANGLE, 100, 100, 200, 100)
geometryPath = shape.get_geometry_paths()[0]
geometryPath.line_to(100, 50, 1)
geometryPath.line_to(100, 50, 4)
shape.set_geometry_path(geometryPath)
从形状移除点
- 创建 GeometryShape 类的实例,并设置 ShapeType.Heart 类型。
- 从形状获取 GeometryPath 类的实例。
- 删除路径的线段。
- 将路径应用于形状。
此Python代码演示了如何从形状中移除点:
import aspose.slides as slides
with slides.Presentation() as pres:
shape = pres.slides[0].shapes.add_auto_shape(slides.ShapeType.HEART, 100, 100, 300, 300)
path = shape.get_geometry_paths()[0]
path.remove_at(2)
shape.set_geometry_path(path)
创建自定义形状
- 计算形状的点。
- 创建 GeometryPath 类的实例。
- 用点填充路径。
- 创建 GeometryShape 类的实例。
- 将路径应用于形状。
此Python代码演示了如何创建自定义形状:
import aspose.slides as slides
import aspose.pydrawing as draw
import math
points = []
R = 100
r = 50
step = 72
for angle in range(-90, 270, step):
radians = angle * (math.pi / 180)
x = R * math.cos(radians)
y = R * math.sin(radians)
points.append(draw.PointF(x + R, y + R))
radians = math.pi * (angle + step / 2) / 180.0
x = r * math.cos(radians)
y = r * math.sin(radians)
points.append(draw.PointF(x + R, y + R))
starPath = slides.GeometryPath()
starPath.move_to(points[0])
for i in range(len(points)):
starPath.line_to(points[i])
starPath.close_figure()
with slides.Presentation() as pres:
shape = pres.slides[0].shapes.add_auto_shape(slides.ShapeType.RECTANGLE, 100, 100, R * 2, R * 2)
shape.set_geometry_path(starPath)
创建复合自定义形状
- 创建 GeometryShape 类的实例。
- 创建第一个 GeometryPath 类的实例。
- 创建第二个 GeometryPath 类的实例。
- 将路径应用于形状。
此Python代码演示了如何创建复合自定义形状:
import aspose.slides as slides
import aspose.pydrawing as draw
with slides.Presentation() as pres:
shape = pres.slides[0].shapes.add_auto_shape(slides.ShapeType.RECTANGLE, 100, 100, 200, 100)
geometryPath0 = slides.GeometryPath()
geometryPath0.move_to(0, 0)
geometryPath0.line_to(shape.width, 0)
geometryPath0.line_to(shape.width, shape.height/3)
geometryPath0.line_to(0, shape.height / 3)
geometryPath0.close_figure()
geometryPath1 = slides.GeometryPath()
geometryPath1.move_to(0, shape.height/3 * 2)
geometryPath1.line_to(shape.width, shape.height / 3 * 2)
geometryPath1.line_to(shape.width, shape.height)
geometryPath1.line_to(0, shape.height)
geometryPath1.close_figure()
shape.set_geometry_paths([ geometryPath0, geometryPath1])
创建具有圆角的自定义形状
此Python代码演示了如何创建具有圆角(向内)的自定义形状:
import aspose.slides as slides
import aspose.pydrawing as draw
shapeX = 20
shapeY = 20
shapeWidth = 300
shapeHeight = 200
leftTopSize = 50
rightTopSize = 20
rightBottomSize = 40
leftBottomSize = 10
with slides.Presentation() as presentation:
childShape = presentation.slides[0].shapes.add_auto_shape(
slides.ShapeType.CUSTOM, shapeX, shapeY, shapeWidth, shapeHeight)
geometryPath = slides.GeometryPath()
point1 = draw.PointF(leftTopSize, 0)
point2 = draw.PointF(shapeWidth - rightTopSize, 0)
point3 = draw.PointF(shapeWidth, shapeHeight - rightBottomSize)
point4 = draw.PointF(leftBottomSize, shapeHeight)
point5 = draw.PointF(0, leftTopSize)
geometryPath.move_to(point1)
geometryPath.line_to(point2)
geometryPath.arc_to(rightTopSize, rightTopSize, 180, -90)
geometryPath.line_to(point3)
geometryPath.arc_to(rightBottomSize, rightBottomSize, -90, -90)
geometryPath.line_to(point4)
geometryPath.arc_to(leftBottomSize, leftBottomSize, 0, -90)
geometryPath.line_to(point5)
geometryPath.arc_to(leftTopSize, leftTopSize, 90, -90)
geometryPath.close_figure()
childShape.set_geometry_path(geometryPath)
presentation.save("output.pptx", slides.export.SaveFormat.PPTX)
几何路径到图形路径的转换 (System.Drawing.Drawing2D)
- 创建 GeometryShape 类的实例。
- 创建 System.Drawing.Drawing2D 命名空间的 GrpahicsPath 类的实例。
- 使用 ShapeUtil 将 GraphicsPath 实例转换为 GeometryPath 实例。
- 将路径应用于形状。
此Python代码展示了上述步骤的实现—GeometryPath 到 GraphicsPath 的转换过程:
import aspose.slides as slides
import aspose.pydrawing as draw
with slides.Presentation() as pres:
shape = pres.slides[0].shapes.add_auto_shape(slides.ShapeType.RECTANGLE, 100, 100, 300, 100)
originalPath = shape.get_geometry_paths()[0]
originalPath.fill_mode = slides.PathFillModeType.NONE
gPath = draw.drawing2d.GraphicsPath()
gPath.add_string("Text in shape", draw.FontFamily("Arial"), 1, 40, draw.PointF(10, 10), draw.StringFormat.generic_default)
textPath = slides.util.ShapeUtil.graphics_path_to_geometry_path(gPath)
textPath.fill_mode = slides.PathFillModeType.NORMAL
shape.set_geometry_paths([originalPath, textPath])