أريد أن أحذرك فورًا بأن هذه السلسلة من النشرات ليست مخصصة للمبرمجين المحنكين ، أو حتى للمبرمجين على الإطلاق. أتفهم أن هذا الأمر يبدو متحديًا للغاية ، بالنظر إلى موضوع تكنولوجيا المعلومات للمورد ، ولا يزال يسمح لي أن أشرح ... بصفتي جمهورًا ، أرى مصممين عاديين يرغبون في بدء البرمجة في Adobe ، لكن لسبب ما (بسبب الخوف من غير معروف ، عدم الثقة في قدراتهم أو عدم معرفة اللغة) لا يمكن اتخاذ الخطوات الأولى في هذا الاتجاه. أرى مهمتي المتواضعة في مساعدتهم على فهم أنه "ليس الآلهة هم الذين يحرقون الأواني" ويمكن لأي شخص لديه دوافع كافية تعلم كيفية كتابة رمز برنامج العمل. من المحتمل أن يتم تنفيذ بعضها من خلال هذه اللعبة بحيث يقررون أن يصبحوا مطورين حقيقيين. ما هو الرمز لا يمزح؟
سيتحدث هذا المنشور عن كيفية كتابة الأداة الصغيرة الخاصة بك (البرنامج النصي في JavaScript) لإنشاء الأداة الفريدة الخاصة بك في Adobe Illustrator ، والتي لن تقلل من وقتك فحسب ، بل ستعمل أيضًا على تحسين التفاعل مع محرر الرسومات الرائع هذا. أولاً ، سأقوم بصياغة المشكلة ، ثم سأعرض الكود الذي يحلها ، علاوة على ذلك ، سوف أخبرني بالتفصيل عن كيفية إنشائها. لن يناقش أساسيات Javascript أو ميزات طراز كائن Illustrator أو مختلف المحررين لكتابة / تصحيح الأخطاء. يمكنك العثور على هذه المعلومات بنفسك إذا كنت ترغب في ذلك. الشيء الرئيسي ، في رأيي ، هو فهم المبادئ الأساسية لبرامج الكتابة ، والتي هي التركيز الرئيسي في هذه المقالة. إذا كنت مستعدًا للقفز فوق رأسك مباشرةً ، مرحبًا بك في عملية القطع!
يحتوي Adobe Illustrator على أداة قناع القطع التي تعمل مع أقنعة القطع. يحتوي Clipping Mask على ثلاثة أوامر: Make و Release و Edit Mask. الأول يخلق قناعًا ، الثاني - يوزع ، الثالث - يسمح لك بالتحرير. نحن مهتمون بالأمر الثاني ، الذي يقسم كائن Clipping Mask إلى محيط ومحتويات القناع. في كثير من الأحيان يكون من الضروري ليس فقط تفكيك القناع ، ولكن أيضًا للتخلص من الخطوط العريضة للقناع ، مع ترك المحتويات فقط. لا يقوم الأمر Release Clipping Mask العادي بذلك ، لذا بعد تطبيقه ، يجب عليك تنفيذ ثلاث خطوات أخرى:
- إزالة التحديد من الكائنات
- حدد مخطط القناع فقط
- إزالة مخطط القناع
إذا كان عليك القيام بهذه العملية المتسلسلة في كثير من الأحيان خلال اليوم ، فإن السؤال الذي يطرح نفسه هو: هل من المستحيل إلى حد ما تقليل عدد هذه الإجراءات للحصول على نفس النتيجة؟ والنقطة هنا ليست الكسل على الإطلاق ، ولكن عدم وجود الأداة اللازمة. الآن تخيل لثانية واحدة أن لديك مثل هذه الأداة.
هنا تشتت انتباهك لفترة وجيزة عن العمل وتغمر في الأفكار حول مدى روعة الأمر إذا كان لدى ترسانة Adobe Illustrator فريق مثل قناع التوسيع الموسع الذي قام بكل هذه الإجراءات لك. فكرة رائعة! تحتاج إلى كتابة الدعم الفني لبرنامج Adobe ، كما تعتقد. الفكر التالي: فجأة كتبوا عن هذا مرات عديدة؟ وإذا كان يوما ما وربما سيضيفون هذه الأداة ، فما هو هذا بالنسبة لك؟ هناك حاجة لهذا الفريق هنا والآن!
وهنا تأتي لحظة الحقيقة - يمكنك كتابة السيناريو بنفسك!
لم يقل قال من القيام به!
1 #target illustrator 2 if (app.documents.length > 0) { 3 var doc = app.activeDocument; 4 var sel = doc.selection; 5 var clipPath; 6 if (sel.length > 0) { 7 if (sel[0].typename == 'GroupItem' && sel[0].clipped == true) { 8 var clipGroup = sel[0].pageItems.length; 9 for (var i = 0; i < clipGroup; i++) { 10 if (sel[0].pageItems[i].typename == 'PathItem' && sel[0].pageItems[i].clipping == true) { 11 clipPath = sel[0].pageItems[i]; 12 break; 13 }; 14 }; 15 app.executeMenuCommand('releaseMask'); 16 clipPath.remove(); 17 } 18 else { 19 alert (' -!'); 20 }; 21 } 22 else { 23 alert (' !'); 24 }; 25 } 26 else { 27 alert (' !'); 28 };
إليك رمز صغير للمساعدة في حل هذه المشكلة. بدلاً من العديد ، بالفعل بترتيب الإجراءات المملة ، ما عليك سوى فعل شيء واحد - تشغيل البرنامج النصي لتوسيع قناع القطع. الآن لديك أداة مفيدة للتعامل مع الأقنعة ، مصنوعة بنفس الطريقة التي تعمل بها بنفسك.
بالطبع ، أنا هنا مخادع بعض الشيء. أولاً ، البرنامج النصي لم يكتبه لك ، وثانياً - إنه ليس عالميًا كما نود. ومع ذلك ، إذا كنت مهتمًا بالكيفية التي تعمل بها ، والأهم من ذلك ، كيف تتعلم كيفية كتابة مثل هذه البرامج بنفسك ، فسوف يسعدني أن أخبركم بهذا الأمر من خلال التعليقات المفصلة.
بادئ ذي بدء ، يتكون أي برنامج نصي (البرنامج النصي / البرنامج / رمز JavaScript) من عدة كتل رئيسية من التعليمات البرمجية: الإعلانات (التهيئة) للمتغيرات ، والشيكات الأساسية (الشروط) ، و "محرك البرنامج" - على سبيل المثال ، الكود الذي ينفذ وظيفية العمل الرئيسية النصي. بالطبع ، هذا التقسيم تعسفي للغاية ، حيث أن الجزء الوظيفي له أيضًا ضوابط ، لكن المبدأ الهيكلي هو هذا. بطبيعة الحال ، كلما زاد حجم البرنامج ، زاد صعوبة تقسيمه إلى كتل متشابهة. ولكن في حالتنا ، فمن الممكن. الأسطر من 8 إلى 16 هي محرك البرنامج النصي ، أما الأسطر المتبقية فهي عبارة عن تعريفات متباينة وفحوصات أساسية متنوعة مع معالجتها. إذا قمت بالعد ، يتضح أن عدد الخطوط الموجودة في خانة الاختيار أكبر من عدد الخطوط في كتلة الوظيفة. هل هذه الشيكات مهمة حقًا؟
لماذا نحتاج الشيكات؟
سوف يفهمني المبرمجون الجادون ، وسيكون من المفيد أن يبدأ المطورين في معرفة ذلك. هناك حاجة إلى اختبارات للتأكد من الأداء الطبيعي للجزء الوظيفي من البرنامج. إذا لم تكتبها ، فإن أي خطأ أثناء تنفيذ البرنامج النصي سيؤدي إلى فشل البرنامج. وهذا ليس جيد.
بالطبع ، يستخدم الرفاق الجادون المذكورين أعلاه بنية try / catch لهذه الأغراض ، لكنني قررت أن المعتاد إذا كان / وإلا سيكون عبارة عن بناء لاذع وأكثر قابلية للفهم. خاصة بالنسبة لكتاب السيناريو المبتدئين.
دعونا نفحص بالتفصيل ما تفعله هذه الخطوط. السطر الأول مسؤول عن حقيقة أنه حتى إذا لم يتم تشغيل البرنامج النصي من Adobe Illustrator ، فسيتم تنفيذه فيه. وفقًا لذلك ، إذا قمت بتشغيل البرنامج النصي من Illustrator ، يمكن حذف هذا الخط.
#target illustrator
بعد ذلك ، يبحث عن المستندات المفتوحة في Adobe Illustrator وقت تشغيل البرنامج النصي. يجب قراءة هذه الأسطر على النحو التالي: إذا كان ( if
) في التطبيق ( app
) عدد المستندات ( documents.length
) أكبر من الصفر (> 0) ، فيجب تنفيذ التعليمات البرمجية الموجودة في {...}. وإلا ( else
) ، اعرض الرسالة ( alert
) "لا توجد مستندات مفتوحة!" واستكمال البرنامج النصي.
if (app.documents.length > 0) { ... ... } else { alert (' !'); };
يتحقق مقطع التعليمات البرمجية التالي من التحديد في المستند.
if (sel.length > 0) { ... ... } else { alert (' !'); };
تجدر الإشارة إلى أننا إذا استخدمنا في الأمثلة السابقة أسماء محجوزة (مثل app
أو documents
) ، فإننا نستخدم هنا المتغير sel ، الذي حددناه نحن في السطور 3 و 4 ،
var doc = app.activeDocument; var sel = doc.selection;
حيث doc
هو الرابط لمستند Illustrator النشط ، و sel
هو الرابط للكائن / الكائنات المحددة في المستند النشط.
المرجع (أو المرجع) هو مؤشر لكائن معين. بالطبع ، أنا أدرك جيدًا أن الكلمة الروسية غير المؤذية تمامًا "المؤشر" قادرة على إدخال أي شخص غير مطلع على OOP (البرمجة الموجهة للكائنات) في ذهول. ولكن خذ كلمة ، كل شيء ليس معقدًا كما يبدو. يتم تخزين الروابط في المتغيرات وتستخدم للوصول إلى الكائنات. في متغير doc
نقوم بحفظ (تعيين قيمة له باستخدام عامل التعيين =
) مؤشر إلى المستند النشط (activeDocument) للتطبيق (التطبيق) ، وفي متغير sel
نقوم بحفظ المؤشر في التحديد (التحديد) في المستند النشط (activeDocument) للتطبيق (التطبيق). فقط لتجنب كتابة app.activeDocument مرة أخرى ، نستخدم متغير doc
بدلاً من ذلك ، والذي يحتوي بالفعل على هذا الرمز. لهذا السبب سيبدو الارتباط مثل sel = doc.selection
. آمل أن أوضح بوضوح.
وبالتالي ، في هذه الحالة ، if (sel.length > 0)
يتم التحقق مما إذا كانت هناك كائنات محددة في المستند النشط ، وإذا لم يكن الأمر كذلك ، if (sel.length > 0)
عرض الرسالة: "لا توجد كائنات محددة!"
الأسطر التالية تحقق من صحة ، آسف للتورية ، شرطين في وقت واحد. أول ما يكون الكائن المحدد هو مجموعة ( GroupItem
) و (&&) والثاني أن هذه المجموعة عبارة عن قناع لقطة (الخاصية clipped
لهذا الكائن true
).
if (sel[0].typename == 'GroupItem' && sel[0].clipped == true) { ... ... } else { alert (' -!'); };
نحن هنا بحاجة إلى شرح بسيط.
ما هو كائن قناع؟ هذه مجموعة ، لكنها ليست مجموعة عادية. المجموعة العادية هي مجموعة من الكائنات المختلفة التي تخضع ، على سبيل المثال ، للكائن "الرئيسي" أو "الأصل". بالنسبة لكائن القناع ، فهذه مجموعة أيضًا ، ولكن على عكس المجموعة المعتادة ، فهي تتكون من جزأين - الخطوط العريضة للقناع ومحتوياته. لذلك ، لتحديد من البرنامج النصي أنه أمامك مجموعة عادية أو مجموعة قناع ، فإن خاصية clipped
تسمح بذلك. إذا كانت قيمة الخاصية المقطوعة false
(خطأ) ، فهذه مجموعة طبيعية ؛ وإذا كانت true
(صواب) ، فهذه مجموعة قصاصات.
ستلاحظ العقول المستفسرة أنه بدلاً من متغير sel
الذي sel
سابقًا ، يتم استخدام إنشاء sel[0]
. يتم تفسير ذلك من خلال حقيقة أنه من وجهة نظر البرنامج النصي ، يكون التحديد عبارة عن مجموعة (مجموعة) من العناصر ، وليس كائنًا محددًا (حتى لو تم تحديد كائن واحد فقط). وللتحقق من النوع ( typename
) لهذا الكائن لمطابقة نوع عنصر المجموعة المحدد ، يتم استخدام بنية sel[0]
، والتي تشير إلى العنصر [0]
الأول من المجموعة ، وهو ، في حالتنا ، المجموعة المحددة.
نتيجة لذلك ، إذا كان الكائن المحدد عبارة عن مجموعة وقناع ، فسيتم تنفيذ الرمز الإضافي ، وإلا يتم عرض الرسالة: "التحديد ليس كائن قناع!"
مع الشيكات - هذا كل شيء. المضي قدما.
كيف تم إنشاء الكود الرئيسي؟
في هذا الجزء من المقالة ، سأحاول ليس فقط التعليق على كيفية عمل الكود ، ولكن لوصف عملية إنشائه. إن لم يكن العملية برمتها ، ثم على الأقل بعض النقاط الرئيسية. لنبدأ!
في السابق ، تم وصف ثلاثة إجراءات يجب تنفيذها لحل مهمة "تفكيك" قناع القطع مع الإزالة اللاحقة لمخطط القناع. سيتم استكمالها بإجراء آخر (أمر إطلاق) ، تبدأ منه الخوارزمية. سأكررها هنا لتحديث السياق.
- قم بتشغيل الأمر Release Clipping Mask
- إزالة التحديد من الكائنات
- حدد مخطط القناع فقط
- إزالة مخطط القناع
إذا قمت بتطبيق تسلسل الإجراءات هذا وفقًا للقائمة ، فيمكن حل النقطتين الأوليين بسهولة عن طريق استدعاء أسلوب executeMenuCommand()
. لكن بعد ذلك ، عند النقطة الثالثة ، سنواجه مشكلة غير قابلة للحل. كيفية الحصول على رابط لمخطط القناع ، إذا لم يعد هناك قناع بعد الإجراء الأول (Release Clipping Mask) ، ولكن لا يوجد سوى مجموعة من الكائنات المحددة؟ نعم ، وهو من الناحية الهيكلية ليس هو نفسه كما كان قبل إجراء هذه العملية.
بشكل عام ، يشير المنطق إلى أنك تحتاج أولاً إلى إنشاء ارتباط (مرجع) إلى كائن المخطط التفصيلي للقناع. بعد التفكير في ما الذي PathItem
كونتور القناع فريدًا جدًا مقارنة PathItem
العادي ، سنجد خاصية clipping
فئة PathItem
. الآن علينا فقط PathItem
كل كائنات مجموعة القناع في حلقة (for) والعثور على PathItem
مع clipping = true
خاصية clipping = true
. ستكون هذه الدائرة المطلوبة. نتيجة لتنفيذ هذا الرمز ، سوف نحصل على رابط لكائن محيط القناع وحفظه في متغير clipPath
.
for (var i = 0; i < clipGroup; i++) { if (sel[0].pageItems[i].typename == 'PathItem' && sel[0].pageItems[i].clipping == true) { clipPath = sel[0].pageItems[i]; break; }; };
ما التالي؟ دعنا نعود إلى الخوارزمية ونكتب رمز البند 1. هذا الخط ينفذ أمر Release Clipping Mask ، ولكن ليس من خلال واجهة المستخدم ، ولكن من خلال البرنامج النصي. نعم بسيط جدا
app.executeMenuCommand('releaseMask');
نحن نتخطى الخطوتين 2 و 3 (لأن لدينا بالفعل مخطط تفصيلي للقناع ، أو بالأحرى رابط لكائن clipPath) وننتقل مباشرةً إلى الخطوة 4. هنا نسمي طريقة remove()
لكائن clipPath
. هذه الطريقة تزيل الخطوط العريضة للقناع.
clipPath.remove();
هذا كل شيء الآن. شكرا لاهتمامكم!
أتمنى أن تفهم الآن أن بدء البرنامج في Adobe Illustrator ليس بالأمر الصعب كما يبدو للوهلة الأولى.
ملاحظة: بالطبع ، البرنامج النصي الناتج أبعد ما يكون عن المثالية. لا يعمل مع الأقنعة التي يتم تمثيل TextFrame
CompoundShape
أو CompoundShape
أو TextFrame
. اقرأ كيفية تعديل البرنامج النصي بحيث يصبح أداة كاملة بالفعل في الجزء الثاني .