إدارة الموصلات في العروض التقديمية باستخدام .NET
موصل PowerPoint هو خط خاص يربط أو يربط بين شكلين مع البقاء ملتصقًا بالشكلين حتى عند تحريكهما أو إعادة وضعهما على الشريحة المحددة.
عادةً ما يتم ربط الموصلات بنقاط الاتصال (النقاط الخضراء) التي توجد على جميع الأشكال بشكل افتراضي. تظهر نقاط الاتصال عندما يقترب المؤشر منها.
نقاط الضبط (النقاط البرتقالية) التي توجد فقط على بعض الموصلات تُستخدم لتعديل موضع وشكل الموصلات.
أنواع الموصلات
في PowerPoint يمكنك استخدام موصلات مستقيمة، زاوية (مرفقة)، ومنحنية.
توفر Aspose.Slides هذه الموصلات:
| موصل | صورة | عدد نقاط الضبط |
|---|---|---|
ShapeType.Line |
![]() |
0 |
ShapeType.StraightConnector1 |
![]() |
0 |
ShapeType.BentConnector2 |
![]() |
0 |
ShapeType.BentConnector3 |
![]() |
1 |
ShapeType.BentConnector4 |
![]() |
2 |
ShapeType.BentConnector5 |
![]() |
3 |
ShapeType.CurvedConnector2 |
![]() |
0 |
ShapeType.CurvedConnector3 |
![]() |
1 |
ShapeType.CurvedConnector4 |
![]() |
2 |
ShapeType.CurvedConnector5 |
![]() |
3 |
ربط الأشكال باستخدام الموصلات
- أنشئ مثيلًا من فئة العرض التقديمي.
- احصل على مرجع الشريحة عبر الفهرس الخاص بها.
- أضف شكلين AutoShape إلى الشريحة باستخدام طريقة
AddAutoShapeالمتاحة عبر كائنShapes. - أضف موصلاً باستخدام طريقة
AddConnectorالمتاحة عبر كائنShapesمع تحديد نوع الموصل. - اربط الأشكال باستخدام الموصل.
- استدعِ طريقة
Rerouteلتطبيق أقصر مسار اتصال. - احفظ العرض التقديمي.
هذا الكود بلغة C# يوضح كيفية إضافة موصل (موصل منحني) بين شكلين (إهليلج ومستطيل):
// ينشئ فئة عرض تقديمي تمثل ملف PPTX
using (Presentation input = new Presentation())
{
// الوصول إلى مجموعة الأشكال لشريحة محددة
IShapeCollection shapes = input.Slides[0].Shapes;
// إضافة شكل أوتوشيب إهليلج
IAutoShape ellipse = shapes.AddAutoShape(ShapeType.Ellipse, 0, 100, 100, 100);
// إضافة شكل أوتوشيب مستطيل
IAutoShape rectangle = shapes.AddAutoShape(ShapeType.Rectangle, 100, 300, 100, 100);
// إضافة شكل موصل إلى مجموعة أشكال الشريحة
IConnector connector = shapes.AddConnector(ShapeType.BentConnector2, 0, 0, 10, 10);
// ربط الأشكال باستخدام الموصل
connector.StartShapeConnectedTo = ellipse;
connector.EndShapeConnectedTo = rectangle;
// استدعاء Reroute الذي يحدد أقصر مسار تلقائي بين الأشكال
connector.Reroute();
// حفظ العرض التقديمي
input.Save("Shapes-connector.pptx", SaveFormat.Pptx);
}
NOTE
طريقةConnector.Reroute تعيد توجيه الموصل وتُجبره على أخذ أقصر مسار ممكن بين الأشكال. لتحقيق ذلك، قد تقوم الطريقة بتغيير نقاط StartShapeConnectionSiteIndex وEndShapeConnectionSiteIndex.
تحديد نقطة اتصال
إذا أردت أن يربط الموصل شكلين باستخدام نقاط معينة على الأشكال، عليك تحديد نقاط الاتصال المفضلة بهذه الطريقة:
- أنشئ مثيلًا من فئة العرض التقديمي.
- احصل على مرجع الشريحة عبر الفهرس الخاص بها.
- أضف شكلين AutoShape إلى الشريحة باستخدام طريقة
AddAutoShapeالمتاحة عبر كائنShapes. - أضف موصلاً باستخدام طريقة
AddConnectorالمتاحة عبر كائنShapesمع تحديد نوع الموصل. - اربط الأشكال باستخدام الموصل.
- عيّن نقاط الاتصال المفضلة على الأشكال.
- احفظ العرض التقديمي.
هذا الكود بلغة C# يوضح عملية تحديد نقطة اتصال مفضلة:
// يَنشئ فئة عرض تقديمي تمثل ملف PPTX
using (Presentation presentation = new Presentation())
{
// الوصول إلى مجموعة الأشكال لشريحة محددة
IShapeCollection shapes = presentation.Slides[0].Shapes;
// إضافة شكل موصل إلى مجموعة أشكال الشريحة
IConnector connector = shapes.AddConnector(ShapeType.BentConnector3, 0, 0, 10, 10);
// إضافة شكل أوتوشيب إهليلج
IAutoShape ellipse = shapes.AddAutoShape(ShapeType.Ellipse, 0, 100, 100, 100);
// إضافة شكل أوتوشيب مستطيل
IAutoShape rectangle = shapes.AddAutoShape(ShapeType.Rectangle, 100, 200, 100, 100);
// ربط الأشكال باستخدام الموصل
connector.StartShapeConnectedTo = ellipse;
connector.EndShapeConnectedTo = rectangle;
// تحديد فهرس نقطة الاتصال المفضلة على شكل الإهليلج
uint wantedIndex = 6;
// التحقق مما إذا كان الفهرس المفضل أقل من عدد مواقع الاتصال الأقصى
if (ellipse.ConnectionSiteCount > wantedIndex)
{
// ضبط نقطة الاتصال المفضلة على شكل الإهليلج
connector.StartShapeConnectionSiteIndex = wantedIndex;
}
// حفظ العرض التقديمي
presentation.Save("Connecting_Shape_on_desired_connection_site_out.pptx", SaveFormat.Pptx);
}
ضبط نقطة الموصل
يمكنك ضبط موصل موجود عبر نقاط الضبط الخاصة به. فقط الموصلات التي تحتوي على نقاط ضبط يمكن تعديلها بهذه الطريقة. انظر الجدول تحت أنواع الموصلات.
حالة بسيطة
تخيل حالة يمر فيها موصل بين شكلين (A و B) عبر شكل ثالث (C):

الكود:
Presentation pres = new Presentation();
ISlide sld = pres.Slides[0];
IShape shape = sld.Shapes.AddAutoShape(ShapeType.Rectangle, 300, 150, 150, 75);
IShape shapeFrom = sld.Shapes.AddAutoShape(ShapeType.Rectangle, 500, 400, 100, 50);
IShape shapeTo = sld.Shapes.AddAutoShape(ShapeType.Rectangle, 100, 100, 70, 30);
IConnector connector = sld.Shapes.AddConnector(ShapeType.BentConnector5, 20, 20, 400, 300);
connector.LineFormat.EndArrowheadStyle = LineArrowheadStyle.Triangle;
connector.LineFormat.FillFormat.FillType = FillType.Solid;
connector.LineFormat.FillFormat.SolidFillColor.Color = Color.Black;
connector.StartShapeConnectedTo = shapeFrom;
connector.EndShapeConnectedTo = shapeTo;
connector.StartShapeConnectionSiteIndex = 2;
لتجنب أو تجاوز الشكل الثالث، يمكننا ضبط الموصل بنقل خطه العمودي إلى اليسار هكذا:

IAdjustValue adj2 = connector.Adjustments[1];
adj2.RawValue += 10000;
حالات معقدة
لإجراء تعديلات أكثر تعقيدًا، يجب مراعاة ما يلي:
- نقطة الضبط للموصل مرتبطة ارتباطًا وثيقًا بصيغة تحسب وتحدد موقعها. لذلك قد تغير تغيير موقع النقطة شكل الموصل.
- نقاط الضبط للموصل معرفة بترتيب صارم في مصفوفة. تُرقم نقاط الضبط من نقطة بدء الموصل إلى نهايته.
- قيم نقاط الضبط تعكس النسبة المئوية لعرض/ارتفاع شكل الموصل.
- الشكل محدود بنقطة بدء الموصل ونقطة نهايته مضروبة في 1000.
- النقطة الأولى، الثانية، والثالثة تمثل النسبة من العرض، النسبة من الارتفاع، والنسبة من العرض مرة أخرى على التوالي.
- عند حساب إحداثيات نقاط ضبط الموصل، يجب أخذ دوران الموصل وانعكاسه في الاعتبار. ملاحظة أن زاوية الدوران لجميع الموصلات المعروضة تحت أنواع الموصلات هي 0.
الحالة 1
تخيل حالة يتم فيها ربط كائنين من إطارات النص معًا عبر موصل:

الكود:
// ينشئ فئة عرض تقديمي تمثل ملف PPTX
Presentation pres = new Presentation();
// يحصل على الشريحة الأولى في العرض التقديمي
ISlide sld = pres.Slides[0];
// يضيف أشكالًا سيتم ربطها معًا عبر موصل
IAutoShape shapeFrom = sld.Shapes.AddAutoShape(ShapeType.Rectangle, 100, 100, 60, 25);
shapeFrom.TextFrame.Text = "From";
IAutoShape shapeTo = sld.Shapes.AddAutoShape(ShapeType.Rectangle, 500, 100, 60, 25);
shapeTo.TextFrame.Text = "To";
// يضيف موصلًا
IConnector connector = sld.Shapes.AddConnector(ShapeType.BentConnector4, 20, 20, 400, 300);
// يحدد اتجاه الموصل
connector.LineFormat.EndArrowheadStyle = LineArrowheadStyle.Triangle;
// يحدد لون الموصل
connector.LineFormat.FillFormat.FillType = FillType.Solid;
connector.LineFormat.FillFormat.SolidFillColor.Color = Color.Crimson;
// يحدد سماكة خط الموصل
connector.LineFormat.Width = 3;
// يرتبط الأشكال معًا باستخدام الموصل
connector.StartShapeConnectedTo = shapeFrom;
connector.StartShapeConnectionSiteIndex = 3;
connector.EndShapeConnectedTo = shapeTo;
connector.EndShapeConnectionSiteIndex = 2;
// يحصل على نقاط الضبط للموصل
IAdjustValue adjValue_0 = connector.Adjustments[0];
IAdjustValue adjValue_1 = connector.Adjustments[1];
الضبط
يمكننا تغيير قيم نقاط ضبط الموصل بزيادة النسبة المئوية للعرض والارتفاع المقابلة بـ20% و200% على التوالي:
// يغيّر قيم نقاط الضبط
adjValue_0.RawValue += 20000;
adjValue_1.RawValue += 200000;
النتيجة:

لتعريف نموذج يسمح لنا بتحديد إحداثيات وشكل الأجزاء الفردية للموصل، لننشئ شكلاً يتطابق مع المكوّن الأفقي للموصل عند النقطة connector.Adjustments[0]:
// ارسم المكوّن العمودي للموصل
float x = connector.X + connector.Width * adjValue_0.RawValue / 100000;
float y = connector.Y;
float height = connector.Height * adjValue_1.RawValue / 100000;
sld.Shapes.AddAutoShape( ShapeType .Rectangle, x, y, 0, height);
النتيجة:

الحالة 2
في الحالة 1، عرضنا عملية ضبط موصل بسيط باستخدام مبادئ أساسية. في الحالات العادية، يجب أخذ دوران الموصل وعرضه (المحدّدين بـ connector.Rotation، connector.Frame.FlipH، وconnector.Frame.FlipV) في الاعتبار. سنوضح الآن العملية.
أولاً، أضف كائن إطار نص جديد (To 1) إلى الشريحة (لأغراض الاتصال) وأنشئ موصلاً (أخضر) يربطه بالكائنات التي أنشأناها مسبقًا.
// ينشئ كائن ربط جديد
IAutoShape shapeTo_1 = sld.Shapes.AddAutoShape(ShapeType.Rectangle, 100, 400, 60, 25);
shapeTo_1.TextFrame.Text = "To 1";
// ينشئ موصلًا جديدًا
connector = sld.Shapes.AddConnector(ShapeType.BentConnector4, 20, 20, 400, 300);
connector.LineFormat.EndArrowheadStyle = LineArrowheadStyle.Triangle;
connector.LineFormat.FillFormat.FillType = FillType.Solid;
connector.LineFormat.FillFormat.SolidFillColor.Color = Color.MediumAquamarine;
connector.LineFormat.Width = 3;
// يربط الكائنات باستخدام الموصل الذي تم إنشاؤه حديثًا
connector.StartShapeConnectedTo = shapeFrom;
connector.StartShapeConnectionSiteIndex = 2;
connector.EndShapeConnectedTo = shapeTo_1;
connector.EndShapeConnectionSiteIndex = 3;
// يحصل على نقاط الضبط للموصل
adjValue_0 = connector.Adjustments[0];
adjValue_1 = connector.Adjustments[1];
// يغيّر قيم نقاط الضبط
adjValue_0.RawValue += 20000;
adjValue_1.RawValue += 200000;
النتيجة:

ثانيًا، أنشئ شكلاً سيتطابق مع المكوّن الأفقي للموصل الذي يمر عبر نقطة الضبط الجديدة connector.Adjustments[0]. سنستخدم القيم من بيانات الموصل لـ connector.Rotation، connector.Frame.FlipH، وconnector.Frame.FlipV ونطبق صيغة تحويل الإحداثيات الشهيرة للدوران حول نقطة معينة x0:
X = (x — x0) * cos(alpha) — (y — y0) * sin(alpha) + x0;
Y = (x — x0) * sin(alpha) + (y — y0) * cos(alpha) + y0;
في حالتنا، زاوية دوران الكائن هي 90 درجة والموصل معروض عموديًا، لذا يكون الكود المقابل:
// يحفظ إحداثيات الموصل
x = connector.X;
y = connector.Y;
// يصحح إحداثيات الموصل إذا ظهر
if (connector.Frame.FlipH == NullableBool.True)
{
x += connector.Width;
}
if (connector.Frame.FlipV == NullableBool.True)
{
y += connector.Height;
}
// يُدخل قيمة نقطة الضبط كإحداثي
x += connector.Width * adjValue_0.RawValue / 100000;
// يحول الإحداثيات لأن Sin(90) = 1 و Cos(90) = 0
float xx = connector.Frame.CenterX - y + connector.Frame.CenterY;
float yy = x - connector.Frame.CenterX + connector.Frame.CenterY;
// يحدد عرض المكوّن الأفقي باستخدام قيمة نقطة الضبط الثانية
float width = connector.Height * adjValue_1.RawValue / 100000;
IAutoShape shape = sld.Shapes.AddAutoShape(ShapeType.Rectangle, xx, yy, width, 0);
shape.LineFormat.FillFormat.FillType = FillType.Solid;
shape.LineFormat.FillFormat.SolidFillColor.Color = Color.Red;
النتيجة:

لقد عرضنا حسابات تشمل ضبطًا بسيطًا ونقاط ضبط معقدة (نقاط ضبط مع زوايا دوران). باستخدام المعرفة التي اكتسبتها، يمكنك تطوير نموذجك الخاص (أو كتابة كود) للحصول على كائن GraphicsPath أو حتى ضبط قيم نقطة ضبط الموصل بناءً على إحداثيات شريحة محددة.
إيجاد زاوية خطوط الموصل
- أنشئ مثيلًا من فئة العرض التقديمي.
- احصل على مرجع الشريحة عبر الفهرس الخاص بها.
- وصول إلى شكل خط الموصل.
- استخدم عرض الخط، ارتفاعه، ارتفاع إطار الشكل، وعرض إطار الشكل لحساب الزاوية.
هذا الكود بلغة C# يوضح عملية حساب زاوية شكل خط الموصل:
public static void Run()
{
Presentation pres = new Presentation("ConnectorLineAngle.pptx");
Slide slide = (Slide)pres.Slides[0];
Shape shape;
for (int i = 0; i < slide.Shapes.Count; i++)
{
double dir = 0.0;
shape = (Shape)slide.Shapes[i];
if (shape is AutoShape)
{
AutoShape ashp = (AutoShape)shape;
if (ashp.ShapeType == ShapeType.Line)
{
dir = getDirection(ashp.Width, ashp.Height, Convert.ToBoolean(ashp.Frame.FlipH), Convert.ToBoolean(ashp.Frame.FlipV));
}
}
else if (shape is Connector)
{
Connector ashp = (Connector)shape;
dir = getDirection(ashp.Width, ashp.Height, Convert.ToBoolean(ashp.Frame.FlipH), Convert.ToBoolean(ashp.Frame.FlipV));
}
Console.WriteLine(dir);
}
}
public static double getDirection(float w, float h, bool flipH, bool flipV)
{
float endLineX = w * (flipH ? -1 : 1);
float endLineY = h * (flipV ? -1 : 1);
float endYAxisX = 0;
float endYAxisY = h;
double angle = (Math.Atan2(endYAxisY, endYAxisX) - Math.Atan2(endLineY, endLineX));
if (angle < 0) angle += 2 * Math.PI;
return angle * 180.0 / Math.PI;
}
الأسئلة المتكررة
كيف يمكنني معرفة ما إذا كان يمكن “لصق” موصل على شكل معين؟
تأكد من أن الشكل يُظهر مواقع الاتصال. إذا لم يكن هناك أي موقع أو كان العدد صفرًا، فإن اللصق غير متاح؛ في هذه الحالة استخدم نقاط النهاية الحرة وضعها يدويًا. من المنطقي فحص عدد المواقع قبل الإرفاق.
ماذا يحدث للموصل إذا حذفت أحد الأشكال المرتبطة؟
ستنفصل نهاياته؛ يبقى الموصل على الشريحة كخط عادي بنقطة بداية/نهاية حرة. يمكنك إما حذفه أو إعادة تعيين الاتصالات، وإذا لزم الأمر، استخدم Reroute.
هل يتم الحفاظ على ارتباطات الموصل عند نسخ شريحة إلى عرض تقديمي آخر؟
عادةً نعم، بشرط أن تُنسخ الأشكال المستهدفة أيضًا. إذا تم إدراج الشريحة في ملف آخر دون الأشكال المرتبطة، تصبح النهايات حرة وستحتاج إلى إرفاقها مرة أخرى.









