Forma Personalizada
Cambiar una Forma Usando Puntos de Edición
Considera un cuadrado. En PowerPoint, usando puntos de edición, puedes
- mover la esquina del cuadrado hacia adentro o hacia afuera
- especificar la curvatura para una esquina o punto
- agregar nuevos puntos al cuadrado
- manipular puntos en el cuadrado, etc.
Esencialmente, puedes realizar las tareas descritas en cualquier forma. Usando puntos de edición, puedes cambiar una forma o crear una nueva forma a partir de una forma existente.
Consejos para Editar Formas
Antes de comenzar a editar formas de PowerPoint a través de puntos de edición, es posible que desees considerar estos puntos sobre las formas:
- Una forma (o su trayectoria) puede ser cerrada o abierta.
- Cuando una forma está cerrada, carece de un punto de inicio o final. Cuando una forma está abierta, tiene un principio y un fin.
- Todas las formas consisten en al menos 2 puntos de anclaje vinculados entre sí por líneas.
- Una línea es recta o curva. Los puntos de anclaje determinan la naturaleza de la línea.
- Los puntos de anclaje existen como puntos de esquina, puntos rectos o puntos suaves:
- Un punto de esquina es un punto donde 2 líneas rectas se unen en un ángulo.
- Un punto suave es un punto donde 2 manijas existen en una línea recta y los segmentos de la línea se unen en una curva suave. En este caso, todas las manijas están separadas del punto de anclaje por una distancia igual.
- Un punto recto es un punto donde 2 manijas existen en una línea recta y los segmentos de esa línea se unen en una curva suave. En este caso, las manijas no tienen que estar separadas del punto de anclaje por una distancia igual.
- Al mover o editar puntos de anclaje (lo que cambia el ángulo de las líneas), puedes cambiar la apariencia de una forma.
Para editar formas de PowerPoint a través de puntos de edición, Aspose.Slides proporciona la clase GeometryPath y la interfaz IGeometryPath.
- Una instancia de GeometryPath representa una trayectoria de geometría del objeto IGeometryShape.
- Para recuperar el
GeometryPath
de la instanciaIGeometryShape
, puedes usar el método IGeometryShape.getGeometryPaths. - Para establecer el
GeometryPath
para una forma, puedes usar estos métodos: IGeometryShape.setGeometryPath para formas sólidas y IGeometryShape.setGeometryPaths para formas compuestas. - Para agregar segmentos, puedes usar los métodos bajo IGeometryPath.
- Usando los métodos IGeometryPath.setStroke y IGeometryPath.setFillMode, puedes establecer la apariencia de una trayectoria de geometría.
- Usando el método IGeometryPath.getPathData, puedes recuperar la trayectoria de geometría de una
GeometryShape
como un arreglo de segmentos de trayectoria. - Para acceder a opciones adicionales de personalización de geometría de formas, puedes convertir GeometryPath a java.awt.Shape.
- Usa los métodos geometryPathToGraphicsPath y graphicsPathToGeometryPath (de la clase ShapeUtil) para convertir GeometryPath a java.awt.Shape y viceversa.
Operaciones de Edición Simples
Este código Java te muestra cómo
Agregar una línea al final de una trayectoria
public void lineTo(java.awt.geom.Point2D.Float point);
public void lineTo(float x, float y);
Agregar una línea a una posición específica en una trayectoria:
public void lineTo(java.awt.geom.Point2D.Float point, long index);
public void lineTo(float x, float y, long index);
Agregar una curva de Bezier cúbica al final de una trayectoria:
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);
Agregar una curva de Bezier cúbica a la posición especificada en una trayectoria:
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);
Agregar una curva de Bezier cuadrática al final de una trayectoria:
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);
Agregar curva de Bezier cuadrática a una posición especificada en una trayectoria:
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);
Agregar un arco dado a una trayectoria:
public void arcTo(float width, float height, float startAngle, float sweepAngle);
Cerrar la figura actual de una trayectoria:
public void closeFigure();
Establecer la posición para el siguiente punto:
public void moveTo(java.awt.geom.Point2D.Float point);
public void moveTo(float x, float y);
Eliminar el segmento de trayectoria en un índice dado:
public void removeAt(int index);
Agregar Puntos Personalizados a la Forma
- Crea una instancia de la clase GeometryShape y establece el tipo ShapeType.Rectangle.
- Obtén una instancia de la clase GeometryPath de la forma.
- Agrega un nuevo punto entre los dos puntos superiores en la trayectoria.
- Agrega un nuevo punto entre los dos puntos inferiores en la trayectoria.
- Aplica la trayectoria a la forma.
Este código Java te muestra cómo agregar puntos personalizados a una forma:
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();
}
Eliminar Puntos de la Forma
- Crea una instancia de la clase GeometryShape y establece el tipo ShapeType.Heart.
- Obtén una instancia de la clase GeometryPath de la forma.
- Elimina el segmento para la trayectoria.
- Aplica la trayectoria a la forma.
Este código Java te muestra cómo eliminar puntos de una forma:
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();
}
Crear Forma Personalizada
- Calcula los puntos para la forma.
- Crea una instancia de la clase GeometryPath.
- Rellena la trayectoria con los puntos.
- Crea una instancia de la clase GeometryShape.
- Aplica la trayectoria a la forma.
Este código Java te muestra cómo crear una forma personalizada:
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();
}
Crear Forma Personalizada Compuesta
- Crea una instancia de la clase GeometryShape.
- Crea una primera instancia de la clase GeometryPath.
- Crea una segunda instancia de la clase GeometryPath.
- Aplica las trayectorias a la forma.
Este código Java te muestra cómo crear una forma personalizada compuesta:
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();
}
Crear Forma Personalizada con Esquinas Curvadas
Este código Java te muestra cómo crear una forma personalizada con esquinas curvadas (hacia adentro);
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();
}
Convertir GeometryPath a java.awt.Shape
- Crea una instancia de la clase GeometryShape.
- Crea una instancia de la clase java.awt.Shape.
- Convierte la instancia de java.awt.Shape a la instancia de GeometryPath usando ShapeUtil.
- Aplica las trayectorias a la forma.
Este código Java—una implementación de los pasos anteriores—demuestra el proceso de conversión de GeometryPath a GraphicsPath:
Presentation pres = new Presentation();
try {
// Crear nueva forma
GeometryShape shape = (GeometryShape)pres.getSlides().get_Item(0).
getShapes().addAutoShape(ShapeType.Rectangle, 100, 100, 300, 100);
// Obtener trayectoria de geometría de la forma
IGeometryPath originalPath = shape.getGeometryPaths()[0];
originalPath.setFillMode(PathFillModeType.None);
// Crear nueva trayectoria gráfica con texto
Shape graphicsPath;
Font font = new java.awt.Font("Arial", Font.PLAIN, 40);
String text = "Texto en la forma";
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();
}
// Convertir trayectoria gráfica a trayectoria de geometría
IGeometryPath textPath = ShapeUtil.graphicsPathToGeometryPath(graphicsPath);
textPath.setFillMode(PathFillModeType.Normal);
// Establecer la combinación de la nueva trayectoria de geometría y la trayectoria de origen en la forma
shape.setGeometryPaths(new IGeometryPath[] { originalPath, textPath });
} finally {
if (pres != null) pres.dispose();
}