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 la Edición de 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 de fin. Cuando una forma está abierta, tiene un inicio y un final.
- 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 línea recta y los segmentos de 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 línea recta y los segmentos de línea 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 GeometryPath instancia representa una trayectoria geométrica del objeto IGeometryShape.
- Para recuperar el
GeometryPath
de la instanciaIGeometryShape
, puedes usar el método IGeometryShape.getGeometryPaths. - Para establecer el
GeometryPath
de 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 de IGeometryPath.
- Usando los métodos IGeometryPath.setStroke y IGeometryPath.setFillMode, puedes establecer la apariencia de una trayectoria geométrica.
- Usando el método IGeometryPath.getPathData, puedes recuperar la trayectoria geométrica de un
GeometryShape
como un array 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 geometryPathToGraphicsPath y graphicsPathToGeometryPath métodos (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 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 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 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 una curva 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);
Adjuntar un arco dado a una trayectoria:
public void arcTo(float width, float heigth, 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 de 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 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 Curvas
Este código Java te muestra cómo crear una forma personalizada con esquinas curvas (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 java.awt.Shape a la instancia 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 la trayectoria geométrica 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 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 geométrica
IGeometryPath textPath = ShapeUtil.graphicsPathToGeometryPath(graphicsPath);
textPath.setFillMode(PathFillModeType.Normal);
// Establecer combinación de nueva trayectoria geométrica y trayectoria geométrica original a la forma
shape.setGeometryPaths(new IGeometryPath[] { originalPath, textPath });
} finally {
if (pres != null) pres.dispose();
}