شكل مخصص

تغيير شكل باستخدام نقاط التحرير

تخيل مربعًا. في PowerPoint، باستخدام نقاط التحرير، يمكنك

  • تحريك زاوية المربع إلى الداخل أو الخارج
  • تحديد الانحناء لزاوية أو نقطة
  • إضافة نقاط جديدة إلى المربع
  • معالجة النقاط على المربع، إلخ.

بشكل عام، يمكنك تنفيذ المهام الموصوفة على أي شكل. باستخدام نقاط التحرير، يمكنك تغيير شكل أو إنشاء شكل جديد من شكل موجود.

نصائح تحرير الأشكال

overview_image

قبل الشروع في تحرير أشكال PowerPoint عبر نقاط التحرير، قد ترغب في مراعاة هذه النقاط حول الأشكال:

  • يمكن أن يكون الشكل (أو مساره) مغلقًا أو مفتوحًا.
  • عندما يكون الشكل مغلقًا، لا يوجد له نقطة بداية أو نهاية. عندما يكون الشكل مفتوحًا، يكون له بداية ونهاية.
  • جميع الأشكال تتكون من نقطتي تثبيت على الأقل مرتبطة ببعضها عبر خطوط
  • الخط إما مستقيم أو منحني. تحدد نقاط التثبيت طبيعة الخط.
  • نقاط التثبيت وجودها كنقاط زاوية، أو نقاط مستقيمة، أو نقاط ناعمة:
    • نقطة الزاوية هي نقطة يلتقي فيها خطان مستقيران بزاوية.
    • نقطة ناعمة هي نقطة يوجد فيها مقبضان على خط مستقيم وتلتقي مقاطع الخط في انحناء سلس. في هذه الحالة، تكون جميع المقابض مفصولة عن نقطة التثبيت بمسافة متساوية.
    • نقطة مستقيمة هي نقطة يوجد فيها مقبضان على خط مستقيم وتلتقي مقاطع الخط في انحناء سلس. في هذه الحالة، لا يلزم أن تكون المقابض مفصولة عن نقطة التثبيت بمسافة متساوية.
  • عن طريق تحريك أو تحرير نقاط التثبيت (التي تغير زاوية الخطوط)، يمكنك تعديل مظهر الشكل.

لتحرير أشكال PowerPoint عبر نقاط التحرير، توفر Aspose.Slides فئة GeometryPath وفئة GeometryPath.

عمليات تحرير بسيطة

يظهر لك هذا الشيفرة JavaScript كيفية

إضافة خط إلى نهاية المسار

lineTo(point);
lineTo(x, y);

إضافة خط إلى موضع محدد على المسار:

lineTo(point, index);
lineTo(x, y, index);

إضافة منحنى بيزيه مكعب إلى نهاية المسار:

cubicBezierTo(point1, point2, point3);
cubicBezierTo(x1, y1, x2, y2, x3, y3);

إضافة منحنى بيزيه مكعب إلى الموضع المحدد على المسار:

cubicBezierTo(point1, point2, point3);
cubicBezierTo(x1, y1, x2, y2, x3, y3);

إضافة منحنى بيزيه تربيعي إلى نهاية المسار:

quadraticBezierTo(point1, point2);
quadraticBezierTo(x1, y1, x2, y2);

إضافة منحنى بيزيه تربيعي إلى موضع محدد على المسارع:

quadraticBezierTo(point1, point2, index);
quadraticBezierTo(x1, y1, x2, y2, index);

إلحاق قوس معين إلى مسار:

arcTo(width, heigth, startAngle, sweepAngle);

إغلاق الشكل الحالي للمسار:

closeFigure();

تحديد الموقع للنقطة التالية:

moveTo(point);
moveTo(x, y);

إزالة مقطع المسار عند فهرس معين:

removeAt(index);

إضافة نقاط مخصصة إلى الشكل

  1. إنشاء مثيلة من فئة GeometryShape وضبط النوع إلى ShapeType.Rectangle.
  2. الحصول على مثيلة من فئة GeometryPath من الشكل.
  3. إضافة نقطة جديدة بين النقطتين العلويتين على المسار.
  4. إضافة نقطة جديدة بين النقطتين السُفْلَيتين على المسار.
  5. تطبيق المسار على الشكل.

تظهر لك هذه الشيفرة JavaScript كيفية إضافة نقاط مخصصة إلى شكل:

var pres = new aspose.slides.Presentation();
try {
    var shape = pres.getSlides().get_Item(0).getShapes().addAutoShape(aspose.slides.ShapeType.Rectangle, 100, 100, 200, 100);
    var geometryPath = shape.getGeometryPaths()[0];
    geometryPath.lineTo(100, 50, 1);
    geometryPath.lineTo(100, 50, 4);
    shape.setGeometryPath(geometryPath);
} finally {
    if (pres != null) {
        pres.dispose();
    }
}

example1_image

إزالة نقاط من الشكل

  1. إنشاء مثيلة من فئة GeometryShape وضبط النوع إلى ShapeType.Heart.
  2. الحصول على مثيلة من فئة GeometryPath من الشكل.
  3. إزالة المقطع من المسار.
  4. تطبيق المسار على الشكل.

تُظهر لك هذه الشيفرة JavaScript كيفية إزالة النقاط من الشكل:

var pres = new aspose.slides.Presentation();
try {
    var shape = pres.getSlides().get_Item(0).getShapes().addAutoShape(aspose.slides.ShapeType.Heart, 100, 100, 300, 300);
    var path = shape.getGeometryPaths()[0];
    path.removeAt(2);
    shape.setGeometryPath(path);
} finally {
    if (pres != null) {
        pres.dispose();
    }
}

example2_image

إنشاء شكل مخصص

  1. حساب النقاط للشكل.
  2. إنشاء مثيلة من فئة GeometryPath.
  3. تعبئة المسار بالنقاط.
  4. إنشاء مثيلة من فئة GeometryShape.
  5. تطبيق المسار على الشكل.

تُظهر لك هذه الشيفرة JavaScript كيفية إنشاء شكل مخصص:

var points = java.newInstanceSync("java.util.ArrayList");
var R = 100;
var r = 50;
var step = 72;
for (var angle = -90; angle < 270; angle += step) {
    var radians = angle * (java.getStaticFieldValue("java.lang.Math", "PI") / 180.0);
    var x = R * java.callStaticMethodSync("java.lang.Math", "cos", radians);
    var y = R * java.callStaticMethodSync("java.lang.Math", "sin", radians);
    points.add(java.newInstanceSync("com.aspose.slides.Point2DFloat", java.newFloat(x + R), java.newFloat(y + R)));
    radians = (java.getStaticFieldValue("java.lang.Math", "PI") * (angle + (step / 2))) / 180.0;
    x = r * java.callStaticMethodSync("java.lang.Math", "cos", radians);
    y = r * java.callStaticMethodSync("java.lang.Math", "sin", radians);
    points.add(java.newInstanceSync("com.aspose.slides.Point2DFloat", java.newFloat(x + R), java.newFloat(y + R)));
}
var starPath = new aspose.slides.GeometryPath();
starPath.moveTo(points.get(0));
for (var i = 1; i < points.size(); i++) {
    starPath.lineTo(points.get(i));
}
starPath.closeFigure();
var pres = new aspose.slides.Presentation();
try {
    var shape = pres.getSlides().get_Item(0).getShapes().addAutoShape(aspose.slides.ShapeType.Rectangle, 100, 100, R * 2, R * 2);
    shape.setGeometryPath(starPath);
} finally {
    if (pres != null) {
        pres.dispose();
    }
}

example3_image

إنشاء شكل مكوّن مخصص

  1. إنشاء مثيلة من فئة GeometryShape.
  2. إنشاء المثيلة الأولى من فئة GeometryPath.
  3. إنشاء المثيلة الثانية من فئة GeometryPath.
  4. تطبيق المسارات على الشكل.

تُظهر لك هذه الشيفرة JavaScript كيفية إنشاء شكل مكوّن مخصص:

var pres = new aspose.slides.Presentation();
try {
    var shape = pres.getSlides().get_Item(0).getShapes().addAutoShape(aspose.slides.ShapeType.Rectangle, 100, 100, 200, 100);
    var geometryPath0 = new aspose.slides.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();
    var geometryPath1 = new aspose.slides.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(java.newArray("com.aspose.slides.GeometryPath",[geometryPath0, geometryPath1]));
} finally {
    if (pres != null) {
        pres.dispose();
    }
}

example4_image

إنشاء شكل مخصص بزوايا منحنية

تظهر لك هذه الشيفرة JavaScript كيفية إنشاء شكل مخصص بزوايا منحنية ( إلى الداخل);

var shapeX = 20.0;
var shapeY = 20.0;
var shapeWidth = 300.0;
var shapeHeight = 200.0;
var leftTopSize = 50.0;
var rightTopSize = 20.0;
var rightBottomSize = 40.0;
var leftBottomSize = 10.0;
var pres = new aspose.slides.Presentation();
try {
    var childShape = pres.getSlides().get_Item(0).getShapes().addAutoShape(aspose.slides.ShapeType.Custom, shapeX, shapeY, shapeWidth, shapeHeight);
    var geometryPath = new aspose.slides.GeometryPath();
    var point1 = java.newInstanceSync("com.aspose.slides.Point2DFloat", leftTopSize, 0);
    var point2 = java.newInstanceSync("com.aspose.slides.Point2DFloat", shapeWidth - rightTopSize, 0);
    var point3 = java.newInstanceSync("com.aspose.slides.Point2DFloat", shapeWidth, shapeHeight - rightBottomSize);
    var point4 = java.newInstanceSync("com.aspose.slides.Point2DFloat", leftBottomSize, shapeHeight);
    var point5 = java.newInstanceSync("com.aspose.slides.Point2DFloat", 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", aspose.slides.SaveFormat.Pptx);
} finally {
    if (pres != null) {
        pres.dispose();
    }
}

اكتشاف ما إذا كانت هندسة الشكل مغلقة

يُعرّف الشكل المغلق بأنه الشكل الذي تتصل جميع جوانبه، مكوّناً حدًا واحدًا دون فراغات. يمكن أن يكون هذا الشكل شكلًا هندسيًا بسيطًا أو مخططًا مخصصًا معقدًا. يوضح المثال البرمجي التالي كيفية التحقق مما إذا كانت هندسة الشكل مغلقة:

function isGeometryClosed(geometryShape) 
{
    let isClosed = null;

    geometryShape.getGeometryPaths().forEach(geometryPath => {
        const pathData = geometryPath.getPathData();
        const dataLength = pathData.length;

        if (dataLength === 0) return;

        const lastSegment = pathData[dataLength - 1];
        isClosed = lastSegment.getPathCommand() === aspose.slides.PathCommandType.Close;

        if (!isClosed) return false;
    });

    return isClosed === true;
}

تحويل GeometryPath إلى java.awt.Shape

  1. إنشاء مثيلة من فئة GeometryShape.
  2. إنشاء مثيلة من فئة java.awt.Shape.
  3. تحويل مثيلة java.awt.Shape إلى مثيلة GeometryPath باستخدام ShapeUtil.
  4. تطبيق المسارات على الشكل.

تُظهر لك هذه الشيفرة JavaScript — تنفيذ للخطوات أعلاه — عملية تحويل GeometryPath إلى GraphicsPath:

var pres = new aspose.slides.Presentation();
try {
    // إنشاء شكل جديد
    var shape = pres.getSlides().get_Item(0).getShapes().addAutoShape(aspose.slides.ShapeType.Rectangle, 100, 100, 300, 100);
    // الحصول على مسار الهندسة للشكل
    var originalPath = shape.getGeometryPaths()[0];
    originalPath.setFillMode(aspose.slides.PathFillModeType.None);
    // إنشاء مسار رسومي جديد مع النص
    var graphicsPath;
    var font = java.newInstanceSync("java.awt.Font", "Arial", java.getStaticFieldValue("java.awt.Font", "PLAIN"), 40);
    var text = "Text in shape";
    var img = java.newInstanceSync("BufferedImage", 100, 100, java.getStaticFieldValue("BufferedImage", "TYPE_INT_ARGB"));
    var g2 = img.createGraphics();
    try {
        var glyphVector = font.createGlyphVector(g2.getFontRenderContext(), text);
        graphicsPath = glyphVector.getOutline(20.0, -glyphVector.getVisualBounds().getY() + 10);
    } finally {
        g2.dispose();
    }
    // تحويل المسار الرسومي إلى مسار هندسي
    var textPath = aspose.slides.ShapeUtil.graphicsPathToGeometryPath(graphicsPath);
    textPath.setFillMode(aspose.slides.PathFillModeType.Normal);
    // تعيين دمج مسار الهندسة الجديد مع مسار الهندسة الأصلي إلى الشكل
    shape.setGeometryPaths(java.newArray("com.aspose.slides.IGeometryPath", [originalPath, textPath]));
} finally {
    if (pres != null) {
        pres.dispose();
    }
}

example5_image

الأسئلة المتكررة

ماذا سيحدث للملء والحدود بعد استبدال الهندسة؟

يبقى النمط مع الشكل؛ يتغير فقط الحدود. يتم تطبيق الملء والحدود تلقائيًا على الهندسة الجديدة.

كيف أقوم بتدوير شكل مخصص مع هندسته بشكل صحيح؟

استخدم طريقة setRotation الخاصة بالشكل؛ تدور الهندسة مع الشكل لأنها مرتبطة بنظام إحداثيات الشكل نفسه.

هل يمكنني تحويل الشكل المخصص إلى صورة لتثبيت النتيجة؟

نعم. صدّر المنطقة المطلوبة من الـشريحة أو الـشكل نفسه إلى تنسيق نقطي؛ هذا يبسط العمل اللاحق مع الهندسات الكبيرة.