سفارشیسازی اشکال ارائه در .NET
بررسی کلی
این مقاله نحوهٔ سفارشیسازی اشکال ارائه در Aspose.Slides را از طریق ویرایش هندسهٔ شکل با استفاده از نقاط و مسیرهای هندسی توضیح میدهد. نشان میدهد چگونه با GeometryPath و IGeometryPath میتوان اشکال موجود را تغییر داد، عملیات پایهٔ ویرایش مسیر را انجام داد، نقاط را اضافه یا حذف کرد و هندسهٔ بهروز شده را به شکل اعمال کرد.
همچنین نشان میدهد چگونه اشکال سفارشی و ترکیبی ایجاد شود، اشکال با گوشههای خمیده ساخته شود، تشخیص داده شود که آیا هندسهٔ یک شکل بسته است یا خیر، و بین GeometryPath و GraphicsPath برای سناریوهای سفارشیسازی هندسهٔ بیشتر تبدیل انجام شود.
تغییر شکل با استفاده از نقاط ویرایش
یک مربع را در نظر بگیرید. در PowerPoint، با استفاده از نقاط ویرایش میتوانید
- گوشهٔ مربع را به سمت داخل یا خارج حرکت دهید
- انحنای یک گوشه یا نقطه را مشخص کنید
- نقاط جدیدی به مربع اضافه کنید
- نقاط روی مربع را دستکاری کنید و …
بهطور کلی میتوانید این کارها را بر روی هر شکلی انجام دهید. با استفاده از نقاط ویرایش میتوانید یک شکل را تغییر داده یا شکل جدیدی از شکل موجود بسازید.
نکات ویرایش شکل

قبل از شروع به ویرایش اشکال PowerPoint از طریق نقاط ویرایش، ممکن است بخواهید به نکات زیر دربارهٔ اشکال توجه کنید:
- یک شکل (یا مسیر آن) میتواند بسته یا باز باشد.
- تمام اشکال حداقل از ۲ نقطهٔ لنگر تشکیل شدهاند که توسط خطوط به یکدیگر متصل میشوند.
- یک خط میتواند مستقیم یا منحنی باشد. نقاط لنگر ماهیت خط را تعیین میکنند.
- نقاط لنگر به صورت نقاط گوشهای، مستقیم یا صاف وجود دارند:
- نقطهٔ گوشهای نقطهای است که در آن دو خط مستقیم با یک زاویه به هم میرسند.
- نقطهٔ صاف نقطهای است که در آن دو دستهدار (handle) در یک خط مستقیم قرار دارند و بخشهای خط بهصورت منحنی نرم به هم میپیوندند. در این حالت تمام دستهها فاصلهٔ مساوی از نقطهٔ لنگر دارند.
- نقطهٔ مستقیم نقطهای است که در آن دو دستهدار در یک خط مستقیم قرار دارند و بخشهای خط بهصورت منحنی به هم میپیوندند. در این حالت دستهها نیاز به داشتن فاصلهٔ مساوی از نقطهٔ لنگر ندارند.
- با جابهجایی یا ویرایش نقاط لنگر (که زاویهٔ خطوط را تغییر میدهد) میتوانید ظاهر شکل را تغییر دهید.
برای ویرایش اشکال PowerPoint از طریق نقاط ویرایش، Aspose.Slides کلاس GeometryPath و رابط IGeometryPath را فراهم میکند.
- یک نمونهٔ GeometryPath مسیر هندسی شیء IGeometryShape را نشان میدهد.
- برای دریافت
GeometryPathاز نمونهٔIGeometryShapeمیتوانید از متد IGeometryShape.GetGeometryPaths استفاده کنید. - برای تنظیم
GeometryPathبرای یک شکل میتوانید این متدها را به کار ببرید: IGeometryShape.SetGeometryPath برای اشکال جامد و IGeometryShape.SetGeometryPaths برای اشکال ترکیبی. - برای افزودن بخشها میتوانید از متدهای موجود در IGeometryPath استفاده کنید.
- با استفاده از ویژگیهای IGeometryPath.Stroke و IGeometryPath.FillMode میتوانید ظاهر مسیر هندسی را تنظیم کنید.
- با استفاده از ویژگی IGeometryPath.PathData میتوانید مسیر هندسی یک
GeometryShapeرا بهصورت آرایهای از بخشهای مسیر بازیابی کنید. - برای دسترسی به گزینههای سفارشیسازی بیشتر هندسهٔ شکل میتوانید GeometryPath را به GraphicsPath تبدیل کنید.
- از متدهای GeometryPathToGraphicsPath و GraphicsPathToGeometryPath (در کلاس ShapeUtil) برای تبدیل دوباره و جلو بهیاد داشته باشید.
عملیات سادهٔ ویرایش
این کد C# نشان میدهد چگونه
یک خط به انتهای مسیر اضافه کنید
void LineTo(PointF point);
void LineTo(float x, float y);
یک خط به موقعیتی مشخص در مسیر اضافه کنید:
void LineTo(PointF point, uint index);
void LineTo(float x, float y, uint index);
یک منحنی Bezier مکعبی به انتهای مسیر اضافه کنید:
void CubicBezierTo(PointF point1, PointF point2, PointF point3);
void CubicBezierTo(float x1, float y1, float x2, float y2, float x3, float y3);
یک منحنی Bezier مکعبی به موقعیت مشخصی در مسیر اضافه کنید:
void CubicBezierTo(PointF point1, PointF point2, PointF point3, uint index);
void CubicBezierTo(float x1, float y1, float x2, float y2, float x3, float y3, uint index);
یک منحنی Bezier درجهٔ دو به انتهای مسیر اضافه کنید:
void QuadraticBezierTo(PointF point1, PointF point2);
void QuadraticBezierTo(float x1, float y1, float x2, float y2);
یک منحنی Bezier درجهٔ دو به موقعیت مشخصی در مسیر اضافه کنید:
void QuadraticBezierTo(PointF point1, PointF point2, uint index);
void QuadraticBezierTo(float x1, float y1, float x2, float y2, uint index);
یک قوس دادهشده را به مسیر اضافه کنید:
void ArcTo(float width, float heigth, float startAngle, float sweepAngle);
شکل جاری مسیر را ببندید:
void CloseFigure();
موقعیت نقطهٔ بعدی را تعیین کنید:
void MoveTo(PointF point);
void MoveTo(float x, float y);
بخش مسیر را در ایندکس مشخص حذف کنید:
void RemoveAt(int index);
افزودن نقاط سفارشی به یک شکل
- نمونهای از کلاس GeometryShape بسازید و نوع ShapeType.Rectangle را تنظیم کنید.
- نمونهای از کلاس GeometryPath را از شکل دریافت کنید.
- نقطهٔ جدیدی بین دو نقطهٔ بالایی مسیر اضافه کنید.
- نقطهٔ جدیدی بین دو نقطهٔ پایینی مسیر اضافه کنید.
- مسیر را به شکل اعمال کنید.
این کد C# نشان میدهد چگونه نقاط سفارشی را به یک شکل اضافه کنید:
using (Presentation pres = new Presentation())
{
GeometryShape shape = pres.Slides[0].Shapes.AddAutoShape(ShapeType.Rectangle, 100, 100, 200, 100) as GeometryShape;
IGeometryPath geometryPath = shape.GetGeometryPaths()[0];
geometryPath.LineTo(100, 50, 1);
geometryPath.LineTo(100, 50, 4);
shape.SetGeometryPath(geometryPath);
}

حذف نقاط از یک شکل
- نمونهای از کلاس GeometryShape بسازید و نوع ShapeType.Heart را تنظیم کنید.
- نمونهای از کلاس GeometryPath را از شکل دریافت کنید.
- بخش مسیر را حذف کنید.
- مسیر را به شکل اعمال کنید.
این کد C# نشان میدهد چگونه نقاط را از یک شکل حذف کنید:
using (Presentation pres = new Presentation())
{
GeometryShape shape = pres.Slides[0].Shapes.AddAutoShape(ShapeType.Heart, 100, 100, 300, 300) as GeometryShape;
IGeometryPath path = shape.GetGeometryPaths()[0];
path.RemoveAt(2);
shape.SetGeometryPath(path);
}

ایجاد یک شکل سفارشی
- نقاط شکل را محاسبه کنید.
- نمونهای از کلاس GeometryPath بسازید.
- مسیر را با نقاط پر کنید.
- نمونهای از کلاس GeometryShape بسازید.
- مسیر را به شکل اعمال کنید.
این کد C# نشان میدهد چگونه یک شکل سفارشی ایجاد کنید:
List<PointF> points = new List<PointF>();
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 PointF((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 PointF((float)x + R, (float)y + R));
}
GeometryPath starPath = new GeometryPath();
starPath.MoveTo(points[0]);
for (int i = 1; i < points.Count; i++)
{
starPath.LineTo(points[i]);
}
starPath.CloseFigure();
using (Presentation pres = new Presentation())
{
GeometryShape shape = pres.Slides[0].Shapes.AddAutoShape(ShapeType.Rectangle, 100, 100, R * 2, R * 2) as GeometryShape;
shape.SetGeometryPath(starPath);
}

ایجاد یک شکل سفارشی ترکیبی
- نمونهای از کلاس GeometryShape بسازید.
- اولین نمونهٔ کلاس GeometryPath را ایجاد کنید.
- دومین نمونهٔ کلاس GeometryPath را ایجاد کنید.
- مسیرها را به شکل اعمال کنید.
این کد C# نشان میدهد چگونه یک شکل سفارشی ترکیبی ایجاد کنید:
using (Presentation pres = new Presentation())
{
GeometryShape shape = pres.Slides[0].Shapes.AddAutoShape(ShapeType.Rectangle, 100, 100, 200, 100) as GeometryShape;
GeometryPath geometryPath0 = new GeometryPath();
geometryPath0.MoveTo(0, 0);
geometryPath0.LineTo(shape.Width, 0);
geometryPath0.LineTo(shape.Width, shape.Height/3);
geometryPath0.LineTo(0, shape.Height / 3);
geometryPath0.CloseFigure();
GeometryPath geometryPath1 = new GeometryPath();
geometryPath1.MoveTo(0, shape.Height/3 * 2);
geometryPath1.LineTo(shape.Width, shape.Height / 3 * 2);
geometryPath1.LineTo(shape.Width, shape.Height);
geometryPath1.LineTo(0, shape.Height);
geometryPath1.CloseFigure();
shape.SetGeometryPaths(new GeometryPath[] { geometryPath0, geometryPath1});
}

ایجاد یک شکل سفارشی با گوشههای خمیده
این کد C# نشان میدهد چگونه یک شکل سفارشی با گوشههای خمیده (به سمت داخل) ایجاد کنید:
var shapeX = 20f;
var shapeY = 20f;
var shapeWidth = 300f;
var shapeHeight = 200f;
var leftTopSize = 50f;
var rightTopSize = 20f;
var rightBottomSize = 40f;
var leftBottomSize = 10f;
using (var presentation = new Presentation())
{
var childShape = presentation.Slides[0].Shapes.AddAutoShape(
ShapeType.Custom, shapeX, shapeY, shapeWidth, shapeHeight);
var geometryPath = new GeometryPath();
var point1 = new PointF(leftTopSize, 0);
var point2 = new PointF(shapeWidth - rightTopSize, 0);
var point3 = new PointF(shapeWidth, shapeHeight - rightBottomSize);
var point4 = new PointF(leftBottomSize, shapeHeight);
var point5 = new PointF(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);
presentation.Save("output.pptx", SaveFormat.Pptx);
}
تشخیص اینکه آیا هندسهٔ یک شکل بسته است
یک شکل بسته بهعنوان شکلی تعریف میشود که تمام اضلاع آن بههم متصل باشند و یک مرز واحد بدون شکاف داشته باشد. چنین شکلی میتواند یک فرم هندسی ساده یا یک طرح سفارشی پیچیده باشد. مثال کد زیر نشان میدهد چگونه بررسی شود که آیا هندسهٔ یک شکل بسته است یا خیر:
bool IsGeometryClosed(IGeometryShape geometryShape)
{
bool? isClosed = null;
foreach (var geometryPath in geometryShape.GetGeometryPaths())
{
var dataLength = geometryPath.PathData.Length;
if (dataLength == 0)
continue;
var lastSegment = geometryPath.PathData[dataLength - 1];
isClosed = lastSegment.PathCommand == PathCommandType.Close;
if (isClosed == false)
return false;
}
return isClosed == true;
}
تبدیل GeometryPath به GraphicsPath (System.Drawing.Drawing2D)
- نمونهای از کلاس GeometryShape بسازید.
- نمونهای از کلاس GraphicsPath در فضای نام System.Drawing.Drawing2D ایجاد کنید.
- نمونهٔ GraphicsPath را به نمونهٔ GeometryPath با استفاده از ShapeUtil تبدیل کنید.
- مسیرها را به شکل اعمال کنید.
این کد C#—یک پیادهسازی از مراحل فوق—فرآیند تبدیل GeometryPath به GraphicsPath را نشان میدهد:
using (Presentation pres = new Presentation())
{
GeometryShape shape = pres.Slides[0].Shapes.AddAutoShape(ShapeType.Rectangle, 100, 100, 300, 100) as GeometryShape;
IGeometryPath originalPath = shape.GetGeometryPaths()[0];
originalPath.FillMode = PathFillModeType.None;
GraphicsPath gPath = new GraphicsPath();
gPath.AddString("Text in shape", new FontFamily("Arial"), 1, 40, new PointF(10, 10), StringFormat.GenericDefault);
IGeometryPath textPath = ShapeUtil.GraphicsPathToGeometryPath(gPath);
textPath.FillMode = PathFillModeType.Normal;
shape.SetGeometryPaths(new[] {originalPath, textPath}) ;
}

سؤالات متداول
بعد از جایگزینی هندسه، پر رنگ و حاشیه چه میشوند؟
استایل همراه با شکل میماند؛ فقط کانتور تغییر میکند. پر رنگ و حاشیه بهصورت خودکار به هندسهٔ جدید اعمال میشوند.
چگونه میتوان شکل سفارشی را بهدرستی همراه با هندسهاش چرخاند؟
از ویژگی rotation شکل استفاده کنید؛ هندسه بهدلیل ارتباط با سامانهٔ مختصات شکل، با آن میچرخد.
آیا میتوانم یک شکل سفارشی را به تصویر تبدیل کنم تا «قفل» شود؟
بله. ناحیهٔ مورد نیاز اسلاید یا خود شکل را به فرمت رستری صادر کنید؛ این کار کار با هندسههای سنگین را ساده میکند.