Cara memulai pemrograman di Adobe Illustrator. Bagian satu

Saya ingin segera memperingatkan Anda bahwa rangkaian posting ini bukan untuk programmer berpengalaman, atau bahkan untuk programmer sama sekali. Saya mengerti bahwa ini terdengar sangat menantang, mengingat tema sumber daya IT, dan masih saya jelaskan ... Sebagai penonton, saya melihat desainer biasa yang ingin memulai pemrograman di lingkungan Adobe, tetapi karena beberapa alasan (karena takut akan tidak diketahui, kurangnya kepercayaan pada kemampuan mereka atau kurangnya pengetahuan bahasa) tidak dapat mengambil langkah pertama ke arah ini. Saya melihat tugas sederhana saya dalam membantu mereka memahami bahwa "bukan dewa yang membakar pot" dan setiap orang yang cukup termotivasi dapat belajar menulis kode program kerja. Ada kemungkinan bahwa beberapa dari mereka akan begitu terbawa oleh game ini sehingga mereka memutuskan untuk menjadi pengembang nyata. Kode apa yang tidak bercanda?


Posting ini akan berbicara tentang cara menulis alat kecil Anda sendiri (skrip dalam JavaScript) untuk membuat alat unik Anda sendiri di Adobe Illustrator, yang tidak hanya akan mengurangi waktu Anda, tetapi juga meningkatkan interaksi dengan editor grafis yang luar biasa ini. Pertama, saya akan merumuskan masalah, lalu saya akan menunjukkan kode yang memecahkannya dan, kemudian, saya akan memberi tahu Anda secara rinci tentang bagaimana itu dibuat. Ini tidak akan membahas dasar-dasar Javascript, fitur model objek Illustrator atau berbagai editor untuk menulis / kode debug. Anda dapat menemukan informasi ini sendiri jika Anda mau. Hal utama, menurut saya, adalah pemahaman tentang prinsip-prinsip dasar program penulisan, yang merupakan penekanan utama dalam artikel ini. Jika Anda siap untuk melompat tepat di atas kepala Anda, selamat datang di luka!


Adobe Illustrator memiliki alat Clipping Mask yang berfungsi dengan kliping topeng. Topeng Kliping berisi tiga perintah: Buat, Lepaskan, dan Edit Topeng. Yang pertama membuat topeng, yang kedua - mem-parsing, yang ketiga - memungkinkan Anda untuk mengedit. Kami tertarik pada perintah kedua, yang membagi objek Clipping Mask menjadi kontur dan isi topeng. Sangat sering perlu tidak hanya untuk membongkar topeng, tetapi juga untuk menyingkirkan garis besar topeng, hanya menyisakan isinya. Perintah Release Clipping Mask reguler tidak melakukan ini, jadi setelah menerapkannya, Anda perlu melakukan tiga langkah lagi:


  1. Hapus seleksi dari objek
  2. Pilih garis besar topeng saja
  3. Hapus garis besar topeng

Jika Anda harus melakukan operasi berurutan ini cukup sering pada siang hari, muncul pertanyaan: apakah tidak mungkin untuk mengurangi jumlah tindakan ini untuk mendapatkan hasil yang sama? Dan intinya di sini bukanlah kemalasan sama sekali, tetapi kurangnya alat yang diperlukan. Sekarang bayangkan sejenak bahwa Anda memiliki alat seperti itu.


Di sini Anda secara singkat teralihkan dari pekerjaan dan tenggelam dalam pemikiran tentang betapa asyiknya jika arsenal Adobe Illustrator memiliki tim seperti Expand Clipping Mask yang melakukan semua tindakan ini untuk Anda. Ide keren! Anda perlu menulis dukungan teknis untuk Adobe, menurut Anda. Pikiran berikut: tiba-tiba mereka telah menulis tentang ini berkali-kali? Dan jika suatu hari nanti dan mungkin mereka akan menambahkan alat seperti itu, lalu apa ini untuk Anda? Tim ini diperlukan di sini dan sekarang!

Dan inilah saatnya kebenaran - Anda dapat menulis naskah sendiri!

Tidak lebih cepat dikatakan daripada dilakukan!


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 }; 

Berikut ini adalah kode kecil untuk membantu memecahkan masalah ini. Alih-alih beberapa, sudah dalam urutan tindakan bosan, Anda hanya perlu melakukan satu hal - jalankan skrip Expand Clipping Mask. Sekarang Anda memiliki alat praktis untuk bekerja dengan topeng, dibuat oleh do-it-yourself yang sama.


Tentu saja, di sini saya sedikit tidak jujur. Pertama, skrip itu tidak ditulis oleh Anda, dan kedua - skrip itu tidak seuniversal yang kami inginkan. Namun, jika Anda tertarik pada cara kerjanya, dan yang paling penting, cara belajar bagaimana menulis program semacam itu sendiri, maka saya akan dengan senang hati memberi tahu Anda tentang hal ini dalam rangka dan dengan komentar rinci.


Untuk memulainya, skrip apa pun (skrip / program / kode JavaScript) terdiri dari beberapa blok kode utama: deklarasi (inisialisasi) variabel, pemeriksaan dasar (kondisi) dan, katakanlah, "mesin program" - kode yang mengimplementasikan fungsi kerja utama naskah Tentu saja, pembagian ini sangat sewenang-wenang, karena bagian fungsional juga memiliki pemeriksaan, tetapi prinsip strukturalnya adalah ini. Secara alami, semakin besar program, semakin sulit untuk membaginya ke dalam blok yang sama. Tetapi dalam kasus kami, itu mungkin. Baris 8 hingga 16 adalah mesin skrip, baris yang tersisa adalah deklarasi variabel dan berbagai pemeriksaan dasar dengan pemrosesan mereka. Jika Anda menghitung, ternyata jumlah baris di blok periksa lebih besar dari jumlah baris di blok fungsi. Apakah cek ini sangat penting?


Mengapa kita perlu cek?


Pemrogram yang serius akan mengerti saya, dan akan berguna bagi pengembang pemula untuk mengetahuinya. Diperlukan pemeriksaan untuk memastikan fungsi normal dari bagian fungsional program. Jika Anda tidak menulisnya, maka kesalahan apa pun selama eksekusi skrip akan menyebabkan kegagalan perangkat lunak. Dan ini tidak baik.


Tentu saja, kawan-kawan serius yang disebutkan di atas menggunakan coba / tangkap konstruk untuk tujuan seperti itu, tetapi saya memutuskan bahwa yang biasa / tadinya adalah konstruk yang singkat dan lebih dimengerti. Khusus untuk penulis skrip pemula.


Mari kita teliti apa yang dilakukan garis-garis ini. Baris pertama bertanggung jawab atas fakta bahwa meskipun skrip tidak dijalankan dari Adobe Illustrator, itu akan dieksekusi di dalamnya. Dengan demikian, jika Anda menjalankan skrip dari Illustrator, baris ini dapat dihilangkan.


 #target illustrator 

Selanjutnya, ia memeriksa dokumen terbuka di Adobe Illustrator pada saat skrip dijalankan. Baris-baris ini harus dibaca sebagai berikut: jika ( if ) dalam aplikasi ( app ) jumlah dokumen ( documents.length ) lebih besar dari nol (> 0), maka kode yang terlampir dalam {...} harus dieksekusi. Jika tidak ( else ), tampilkan pesan ( alert ) 'Tidak ada dokumen terbuka!' dan lengkapi skripnya.


 if (app.documents.length > 0) { ... ... } else { alert ('  !'); }; 

Blok kode berikut memeriksa pemilihan dalam dokumen.


  if (sel.length > 0) { ... ... } else { alert ('  !'); }; 

Perlu dicatat bahwa jika dalam contoh sebelumnya kita menggunakan nama yang dicadangkan (seperti app atau documents ), maka di sini kita menggunakan variabel sel, yang kita tentukan sendiri dalam baris 3 dan 4,


  var doc = app.activeDocument; var sel = doc.selection; 

di mana doc adalah tautan ke dokumen Illustrator aktif, dan sel adalah tautan ke objek / objek yang dipilih dalam dokumen aktif.


Referensi (atau referensi) adalah penunjuk ke objek tertentu. Tentu saja, saya sangat menyadari bahwa kata "penunjuk" Rusia yang benar-benar tidak berbahaya mampu memperkenalkan kepada orang yang pingsan siapa pun yang tidak terbiasa dengan OOP (pemrograman berorientasi objek). Tapi ambil kata, semuanya tidak serumit kelihatannya. Tautan disimpan dalam variabel dan digunakan untuk mengakses objek. Dalam variabel doc kita menyimpan (menetapkan nilai menggunakan operator penugasan = ) pointer ke dokumen aktif (activeDocument) dari aplikasi (app), dan dalam variabel sel kita menyimpan pointer ke seleksi (seleksi) dalam dokumen aktif (activeDocument) aplikasi (app). Hanya untuk menghindari penulisan app.activeDocument lagi, kami menggunakan variabel doc , yang sudah mengandung kode ini. Itu sebabnya tautan akan terlihat seperti sel = doc.selection . Saya harap saya menjelaskan dengan jelas.

Jadi, dalam kondisi ini, if (sel.length > 0) diperiksa apakah ada objek yang dipilih dalam dokumen aktif, dan jika tidak, pesan tersebut ditampilkan: 'Tidak ada objek yang dipilih!'


Baris berikut memeriksa kebenaran, maaf untuk permainan kata-kata, dua kondisi sekaligus. Yang pertama bahwa objek yang dipilih adalah grup ( GroupItem ) dan (&&) yang kedua bahwa grup ini benar-benar topeng kliping (properti clipped dari objek ini true ).


  if (sel[0].typename == 'GroupItem' && sel[0].clipped == true) { ... ... } else { alert ('   -!'); }; 

Di sini kita perlu sedikit penjelasan.


Apa itu objek topeng? Ini adalah grup, tetapi bukan grup biasa. Grup reguler adalah kumpulan objek yang berbeda yang berada di bawah, katakanlah, objek "utama" atau "induk". Adapun objek topeng, ini juga merupakan kelompok, tetapi tidak seperti yang biasa, itu terdiri dari dua bagian - garis besar topeng dan isinya. Jadi, untuk menentukan dari skrip yang di depan Anda adalah grup biasa atau grup mask, properti clipped memungkinkan. Jika nilai properti terpotong false (false), maka ini adalah grup normal, jika true (benar), maka ini adalah grup kliping.

Pikiran yang bertanya akan melihat bahwa alih-alih variabel sel yang kita definisikan sebelumnya, konstruk sel[0] digunakan. Ini dijelaskan oleh fakta bahwa, dari sudut pandang skrip, seleksi adalah kumpulan (kumpulan) elemen, dan bukan objek spesifik (bahkan jika hanya satu objek yang dipilih). Dan untuk memeriksa tipe (ketik nama) dari objek ini untuk mencocokkan jenis elemen koleksi yang dipilih, konstruksi sel[0] digunakan, yang mengacu pada elemen [0] pertama dari koleksi, yaitu, dalam kasus kami, grup yang dipilih.


Akibatnya, jika objek yang dipilih adalah grup dan juga mask, maka kode selanjutnya dieksekusi, jika tidak pesan akan ditampilkan: 'Pemilihan bukan objek mask!'


Dengan cek - itu saja. Silakan.


Bagaimana kode utama dibuat?


Pada bagian artikel ini, saya akan mencoba tidak hanya mengomentari bagaimana kode bekerja, tetapi untuk menggambarkan proses pembuatannya. Jika tidak seluruh proses, maka setidaknya beberapa poin kunci. Ayo mulai!


Sebelumnya, tiga tindakan dijelaskan yang harus dilakukan untuk menyelesaikan tugas "membongkar" Masker Kliping dengan penghapusan berikutnya garis topeng. Mereka akan dilengkapi dengan tindakan lain (perintah Release), dari mana algoritma kami akan dimulai. Saya akan mengulanginya di sini untuk menyegarkan konteksnya.


  1. Jalankan perintah Release Clipping Mask
  2. Hapus seleksi dari objek
  3. Pilih garis besar topeng saja
  4. Hapus garis besar topeng

Jika Anda menerapkan urutan tindakan ini secara ketat sesuai dengan daftar, maka dua poin pertama dapat dengan mudah dipecahkan dengan memanggil metode executeMenuCommand() . Tapi kemudian, pada poin ketiga, kita akan menghadapi masalah yang tak terselesaikan. Bagaimana cara mendapatkan tautan ke garis besar topeng, jika setelah tindakan pertama (Lepaskan Kliping Topeng) tidak ada topeng lagi, tetapi hanya ada satu set objek yang dipilih? Ya, dan dia secara struktural tidak sama dengan sebelum melakukan operasi ini.


Secara umum, logika menyarankan bahwa pertama-tama Anda perlu membuat tautan (referensi) ke objek kerangka topeng. Setelah berpikir tentang apa yang PathItem kontur topeng sangat unik dibandingkan dengan kontur biasa, kita akan menemukan properti clipping dari kelas PathItem . Sekarang kita hanya perlu PathItem semua objek kelompok topeng di (untuk) loop dan menemukan PathItem dengan clipping = true properti. Ini akan menjadi sirkuit yang diinginkan. Sebagai hasil dari eksekusi kode ini, kita akan mendapatkan tautan ke objek kontur mask dan menyimpannya dalam variabel 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; }; }; 

Apa selanjutnya Mari kita kembali ke algoritma dan menulis kode untuk item 1. Baris ini mengeksekusi perintah Release Clipping Mask, tetapi tidak melalui antarmuka pengguna, tetapi dari skrip. Ya, sangat sederhana!


  app.executeMenuCommand('releaseMask'); 

Kita melewatkan langkah 2 dan 3 (karena kita sudah memiliki garis besar topeng, atau lebih tepatnya tautan ke objek clipPath) dan langsung menuju langkah 4. Di sini kita memanggil metode remove() dari objek clipPath . Metode ini menghilangkan garis besar topeng.


  clipPath.remove(); 

Itu saja untuk saat ini. Terima kasih atas perhatian anda!


Saya harap Anda sekarang mengerti bahwa memulai program di Adobe Illustrator tidak sesulit kelihatannya pada pandangan pertama.


PS Tentu saja, skrip yang dihasilkan jauh dari ideal. Itu tidak bekerja dengan topeng yang garis besarnya diwakili oleh objek CompoundPath , CompoundShape atau TextFrame . Baca cara memodifikasi skrip sehingga menjadi alat yang benar-benar lengkap di bagian kedua .

Source: https://habr.com/ru/post/id452586/


All Articles