مدیریت اتصالگرها در ارائهها در .NET
مقدمه
یک اتصالگر پاورپوینت یک خط خاص است که دو شکل را به هم متصل یا لینک میکند و حتی زمانی که آنها در یک اسلاید جابجا یا موقعیتشان تغییر میکند، به شکلها چسبیده میماند.
اتصالگرها معمولاً به نقطههای اتصال (نقطههای سبز) متصل میشوند که به طور پیشفرض بر تمام شکلها وجود دارند. نقطههای اتصال زمانی ظاهر میشوند که نشانگر به آنها نزدیک شود.
نقاط تنظیم (نقطههای نارنجی) که فقط در برخی اتصالگرها وجود دارند، برای تغییر موقعیت و شکل اتصالگرها استفاده میشوند.
انواع اتصالگرها
در پاورپوینت میتوانید از اتصالگرهای مستقیم، زاویهدار (elbow) و منحنی استفاده کنید.
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 |
اتصال اشکال با استفاده از اتصالگرها
- یک نمونه از کلاس Presentation ایجاد کنید.
- مرجع یک اسلاید را از طریق ایندکس آن دریافت کنید.
- دو AutoShape را به اسلاید اضافه کنید با استفاده از متد
AddAutoShapeکه توسط شیءShapesدر دسترس است. - یک اتصالگر را با استفاده از متد
AddConnectorکه توسط شیءShapesدر دسترس است، با تعریف نوع اتصالگر اضافه کنید. - اشکال را با استفاده از اتصالگر متصل کنید.
- متد
Rerouteرا صدا بزنید تا کوتاهترین مسیر اتصال اعمال شود. - ارائه را ذخیره کنید.
این کد C# نشان میدهد چگونه یک اتصالگر (یک اتصالگر خمیده) بین دو شکل (یک بیضی و یک مستطیل) اضافه کنید:
// یک نمونه از کلاس Presentation که نمایانگر یک فایل 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 را تغییر دهد.
مشخص کردن نقطه اتصال
اگر میخواهید یک اتصالگر دو شکل را با استفاده از نقاط خاصی در اشکال متصل کند، باید نقاط اتصال مورد نظر خود را به این شکل مشخص کنید:
- یک نمونه از کلاس Presentation ایجاد کنید.
- مرجع یک اسلاید را از طریق ایندکس آن دریافت کنید.
- دو AutoShape را به اسلاید اضافه کنید با استفاده از متد
AddAutoShapeکه توسط شیءShapesدر دسترس است. - یک اتصالگر را با استفاده از متد
AddConnectorکه توسط شیءShapesدر دسترس است، با تعریف نوع اتصالگر اضافه کنید. - اشکال را با استفاده از اتصالگر متصل کنید.
- نقاط اتصال مورد نظر خود را روی اشکال تنظیم کنید.
- ارائه را ذخیره کنید.
// یک نمونه از کلاس Presentation ایجاد میکند که نمایانگر یک فایل 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;
موارد پیچیده
برای انجام تنظیمات پیچیدهتر، باید این موارد را در نظر بگیرید:
- نقطه قابل تنظیم یک اتصالگر به شدت به فرمولی که موقعیت آن را محاسبه و تعیین میکند مرتبط است. بنابراین تغییر مکان نقطه ممکن است شکل اتصالگر را تغییر دهد.
- نقاط تنظیم یک اتصالگر در یک آرایه بهصورت ترتیب سختگیرانهای تعریف میشوند. نقاط تنظیم از نقطه شروع اتصالگر تا انتهای آن شمارهگذاری میشوند.
- مقادیر نقاط تنظیم درصد عرض/ارتفاع شکل اتصالگر را نشان میدهند.
- شکل توسط نقاط شروع و پایان اتصالگر ضرب در ۱۰۰۰ محدود میشود.
- نقطه اول، نقطه دوم و نقطه سوم به ترتیب درصد از عرض، درصد از ارتفاع و دوباره درصد از عرض را تعریف میکنند.
- برای محاسباتی که مختصات نقاط تنظیم یک اتصالگر را تعیین میکنند، باید چرخش اتصالگر و انعکاس آن را در نظر بگیرید. نکته این است که زاویه چرخش تمام اتصالگرهای نشاندادهشده در زیر انواع اتصالگرها صفر است.
مورد 1
یک مورد را در نظر بگیرید که در آن دو شیء قاب متن از طریق یک اتصالگر به هم متصل هستند:

// یک نمونه از کلاس Presentation ایجاد میکند که نمایانگر یک فایل 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];
تنظیم
میتوانیم مقادیر نقاط تنظیم اتصالگر را با افزایش درصد عرض و ارتفاع متناظر به ترتیب ۲۰٪ و ۲۰۰٪ تغییر دهیم:
// مقادیر نقاط تنظیم را تغییر میدهد
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 برای 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;
در مورد ما، زاویه چرخش شیء ۹۰ درجه است و اتصالگر به صورت عمودی نمایش داده میشود، بنابراین این کد مربوطه است:
// مختصات اتصالگر را ذخیره میکند
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 دریافت کنید یا حتی مقادیر نقاط تنظیم اتصالگر را بر اساس مختصات خاص اسلاید تنظیم کنید.
یافتن زاویه خطوط اتصالگر
- یک نمونه از کلاس Presentation ایجاد کنید.
- مرجع یک اسلاید را از طریق ایندکس آن دریافت کنید.
- دسترسی به شکل خط اتصالگر.
- از عرض و ارتفاع خط، ارتفاع و عرض فریم شکل برای محاسبه زاویه استفاده کنید.
این کد 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;
}
پرسشهای متداول
چگونه میتوانم تشخیص دهم که یک اتصالگر میتواند به یک شکل خاص «چسبانده» شود؟
بررسی کنید که شکل نقاط اتصال را در دسترس قرار میدهد. اگر هیچکدام وجود نداشته باشند یا شمارنده صفر باشد، چسباندن امکانپذیر نیست؛ در این صورت از نقاط انتهایی آزاد استفاده کنید و آنها را بهصورت دستی موقعیتدهی کنید. منطقی است قبل از الصاق، شمار نقاط اتصال را بررسی کنید.
اگر یکی از اشکال متصلشده را حذف کنم، چه اتفاقی برای اتصالگر میافتد؟
سرهای آن جدا میشوند؛ اتصالگر به عنوان یک خط عادی با شروع/پایان آزاد بر روی اسلاید باقی میماند. میتوانید آن را حذف کنید یا ارتباطات را دوباره اختصاص دهید و در صورت نیاز، بازتنظیم کنید.
آیا اتصالگرها هنگام کپی یک اسلاید به ارائه دیگری حفظ میشوند؟
عموماً بله، بهشرطی که اشکال هدف نیز کپی شوند. اگر اسلاید بدون اشکال متصلشده به فایل دیگری اضافه شود، سرها آزاد میشوند و باید دوباره متصل شوند.









