شكل مخصص
تغيير شكل باستخدام نقاط التحرير
افترض أن لديك مربعًا. في PowerPoint، باستخدام نقاط التحرير، يمكنك
- تحريك زاوية المربع للداخل أو للخارج
- تحديد انحناء الزاوية أو النقطة
- إضافة نقاط جديدة إلى المربع
- التحكم في النقاط على المربع، إلخ.
أساسًا، يمكنك تنفيذ المهام الموضحة على أي شكل. باستخدام نقاط التحرير، يمكنك تغيير شكل أو إنشاء شكل جديد من شكل موجود.
نصائح لتحرير الأشكال
قبل أن تبدأ بتحرير أشكال PowerPoint من خلال نقاط التحرير، قد ترغب في الأخذ في الاعتبار هذه النقاط حول الأشكال:
- الشكل (أو مساره) يمكن أن يكون مغلقًا أو مفتوحًا.
- عندما يكون الشكل مغلقًا، فإنه يفتقر إلى نقطة بداية أو نهاية. عندما يكون الشكل مفتوحًا، فإنه يحتوي على بداية ونهاية.
- تتكون جميع الأشكال من نقطتين رئيتين على الأقل مرتبطة ببعضها عبر خطوط.
- الخط يمكن أن يكون مستقيمًا أو منحنيًا. تحدد النقاط الرائية طبيعة الخط.
- النقاط الرائية توجد كنقاط زوايا، نقاط مستقيمة، أو نقاط سلسة:
- نقطة الزاوية هي نقطة حيث تنضم خطين مستقيمين بزاوية.
- نقطة سلسة هي نقطة حيث توجد أيادي اثنتان في خط مستقيم وتنضم مقاطع الخط في منحنى سلس. في هذه الحالة، يتم فصل جميع الأيادي عن النقطة الرائية بمسافة متساوية.
- نقطة مستقيمة هي نقطة حيث توجد أيادي اثنتان في خط مستقيم وأن مقاطع ذلك الخط تنضم في منحنى سلس. في هذه الحالة، لا يجب أن تكون الأيادي مفصولة عن النقطة الرائية بمسافة متساوية.
- من خلال تحريك أو تحرير النقاط الرائية (التي تغيّر زوايا الخطوط)، يمكنك تغيير شكل الشكل.
لتحرير أشكال PowerPoint من خلال نقاط التحرير، توفر Aspose.Slides GeometryPath وIGeometryPath الواجهة.
- تمثل مثيل GeometryPath مسارًا هندسيًا للعنصر IGeometryShape.
- لاسترداد
GeometryPath
من مثيلIGeometryShape
، يمكنك استخدام IGeometryShape.getGeometryPaths الطريقة. - لتعيين
GeometryPath
لشكل، يمكنك استخدام هذه الطرق: IGeometryShape.setGeometryPath لـ الأشكال الصلبة و IGeometryShape.setGeometryPaths لـ الأشكال المركبة. - لإضافة مقاطع، يمكنك استخدام الطرق تحت IGeometryPath.
- باستخدام IGeometryPath.setStroke وIGeometryPath.setFillMode الطرق، يمكنك تعيين المظهر لمسار هندسي.
- باستخدام IGeometryPath.getPathData الطريقة، يمكنك استرداد المسار الهندسي لـ
GeometryShape
كمصفوفة من مقاطع المسار. - للوصول إلى خيارات تخصيص الشكل الهندسي الإضافية، يمكنك تحويل GeometryPath إلى java.awt.Shape
- استخدم geometryPathToGraphicsPath وgraphicsPathToGeometryPath الوسائل (من فئة ShapeUtil) لتحويل GeometryPath إلى java.awt.Shape ذهابًا وإيابًا.
عمليات التحرير البسيطة
يوضح لك هذا الكود في Java كيفية
إضافة خط إلى نهاية المسار
public void lineTo(java.awt.geom.Point2D.Float point);
public void lineTo(float x, float y);
إضافة خط إلى موضع محدد على مسار:
public void lineTo(java.awt.geom.Point2D.Float point, long index);
public void lineTo(float x, float y, long index);
إضافة منحنى Bezier مكعب في نهاية مسار:
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);
إضافة منحنى Bezier مكعب إلى موضع محدد على مسار:
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);
إضافة منحنى Bezier رباعي في نهاية مسار:
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);
إضافة منحنى Bezier رباعي إلى موضع محدد على مسار:
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);
إضافة قوس معين إلى مسار:
public void arcTo(float width, float heigth, float startAngle, float sweepAngle);
إغلاق الشكل الحالي لمسار:
public void closeFigure();
تعيين الموضع للنقطة التالية:
public void moveTo(java.awt.geom.Point2D.Float point);
public void moveTo(float x, float y);
إزالة مقطع المسار عند index معين:
public void removeAt(int index);
إضافة نقاط مخصصة إلى الشكل
- أنشئ مثيلًا لفئة GeometryShape واضبط النوع على ShapeType.Rectangle.
- احصل على مثيل لفئة GeometryPath من الشكل.
- أضف نقطة جديدة بين نقطتين علويتين على المسار.
- أضف نقطة جديدة بين نقطتين سفليتين على المسار.
- طبق المسار على الشكل.
يوضح لك هذا الكود في Java كيفية إضافة نقاط مخصصة إلى شكل:
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();
}
إزالة نقاط من الشكل
- أنشئ مثيلًا لفئة GeometryShape واضبط النوع على ShapeType.Heart.
- احصل على مثيل لفئة GeometryPath من الشكل.
- أزل المقطع الخاص بالمسار.
- طبق المسار على الشكل.
يوضح لك هذا الكود في Java كيفية إزالة نقاط من شكل:
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();
}
إنشاء شكل مخصص
- احسب النقاط الخاصة بالشكل.
- أنشئ مثيلًا لفئة GeometryPath.
- املأ المسار بالنقاط.
- أنشئ مثيلًا لفئة GeometryShape.
- طبق المسار على الشكل.
يوضح لك هذا الكود في Java كيفية إنشاء شكل مخصص:
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();
}
إنشاء شكل مخصص مركب
- أنشئ مثيلًا لفئة GeometryShape.
- أنشئ المثيل الأول لفئة GeometryPath.
- أنشئ المثيل الثاني لفئة GeometryPath.
- طبق المسارات على الشكل.
يوضح لك هذا الكود في Java كيفية إنشاء شكل مخصص مركب:
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();
}
إنشاء شكل مخصص بزوايا منحنية
يوضح لك هذا الكود في Java كيفية إنشاء شكل مخصص بزوايا منحنية (إلى الداخل):
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();
}
تحويل GeometryPath إلى java.awt.Shape
- أنشئ مثيلًا لفئة GeometryShape.
- أنشئ مثيلًا لفئة java.awt.Shape.
- قم بتحويل مثيل java.awt.Shape إلى مثيل GeometryPath باستخدام ShapeUtil.
- طبق المسارات على الشكل.
يوضح لك هذا الكود في Java—تنفيذ الخطوات السابقة—عملية تحويل GeometryPath إلى GraphicsPath:
Presentation pres = new Presentation();
try {
// إنشاء الشكل الجديد
GeometryShape shape = (GeometryShape)pres.getSlides().get_Item(0).
getShapes().addAutoShape(ShapeType.Rectangle, 100, 100, 300, 100);
// الحصول على المسار الهندسي من الشكل
IGeometryPath originalPath = shape.getGeometryPaths()[0];
originalPath.setFillMode(PathFillModeType.None);
// إنشاء مسار رسومي جديد مع النص
Shape graphicsPath;
Font font = new java.awt.Font("Arial", Font.PLAIN, 40);
String text = "نص في الشكل";
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();
}
// تحويل المسار الرسومي إلى مسار هندسي
IGeometryPath textPath = ShapeUtil.graphicsPathToGeometryPath(graphicsPath);
textPath.setFillMode(PathFillModeType.Normal);
// تعيين مجموعة من المسار الهندسي الجديد والمسار الهندسي الأصلي إلى الشكل
shape.setGeometryPaths(new IGeometryPath[] { originalPath, textPath });
} finally {
if (pres != null) pres.dispose();
}