Posting ini merupakan kelanjutan dari bagian pertama , di mana skrip Expand Clipping Mask disajikan dan dijelaskan secara terperinci apa dan bagaimana fungsinya, dan di sepanjang jalan prinsip-prinsip dasar pembuatan program semacam itu secara umum dipertimbangkan. Pada bagian ini, saya akan melanjutkan kisah tentang cara menambahkan fungsionalitas baru ke program untuk mendapatkan "produk jadi" dari "benda kerja". Di sini Anda tidak dapat melakukan tanpa perendaman yang lebih dalam di area subjek, yang merupakan salah satu syarat yang diperlukan untuk membuat produk lengkap. Jadi, mulailah menyelam!
Primitif grafis berikut ini dapat digunakan sebagai garis besar topeng di Adobe Illustrator: garis besar sederhana (Path), garis besar komposit (Jalur Senyawa), bentuk komposit (Bentuk Senyawa), dan objek teks (Teks Titik dan Teks pada Path). Saat ini, skrip hanya berfungsi dengan kontur sederhana, seperti yang dapat dilihat dari kode di bawah ini, di mana PathItem
adalah panggilan ke elemen Path.
var clipGroup = sel[0].pageItems.length; 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; }; };
Sebelum itu, kami mendeklarasikan clipPath
variabel, tetapi tidak memberikan nilai.
var clipPath;
Ini berarti bahwa nilainya belum ditentukan, mis. itu tidak undefined
. Jika sekarang kita memilih topeng yang garis besarnya akan, katakanlah, Jalur Maju dan jalankan skrip, program akan menghasilkan kesalahan pada baris terakhir dari bagian fungsional skrip,
clipPath.remove();
karena kondisi dalam loop tidak akan terpenuhi, variabel clipPath
akan tetap undefined
, dan tidak mungkin untuk menerapkan metode remove()
ke sesuatu yang tidak terdefinisi. Untuk mencegah situasi ini, kami akan melakukan clipPath
berikut - atur ke null
, yang, tidak seperti yang tidak undefined
, sudah merupakan sesuatu yang lebih spesifik yang setidaknya dapat Anda periksa.
Mari kita pikirkan bagaimana menentukan apakah beberapa Compound Path adalah garis besar topeng kita. Ketika saya berkata, "mari kita berpikir," itu berarti saya menyarankan untuk melihat ke dalam dokumentasi dan menemukan properti yang kita butuhkan. Dengan analogi dengan PathItem
kami mencari properti clipping
. Ternyata objek CompoundPathItem
tidak memiliki properti seperti itu, tetapi ada properti pathItems
mana Anda bisa mendapatkan kontur PathItem
sederhana yang memiliki properti clipping
.
Sekarang kita dapat mengubah pikiran / pencarian kita menjadi kode. Pertama-tama, kami clipPath
bahwa clipPath
tidak didefinisikan dalam iterasi sebelumnya, dan kemudian kami menyalin blok kode yang sudah ditulis dan membuat perubahan kecil untuk itu.
if (clipPath == null) { var clipGroup = sel[0].pageItems.length; for (var i = 0; i < clipGroup; i++) { if (sel[0].pageItems[i].typename == 'CompoundPathItem' && sel[0].pageItems[i].pathItems[0].clipping == true) { clipPath = sel[0].pageItems[i]; break; }; }; };
Sebenarnya, perubahan hanya akan mempengaruhi satu baris. Seperti yang kita lihat di sini, 'PathItem' telah berubah menjadi 'CompoundPathItem', dan konstruksi baru telah ditambahkan, 'pathItems [0]', yang dengannya kita merujuk ke elemen path compound.
if (sel[0].pageItems[i].typename == 'CompoundPathItem' && sel[0].pageItems[i].pathItems[0].clipping == true) {
Berikut ini adalah blok fungsional kode yang telah dibuat sejauh ini.
var clipGroup = sel[0].pageItems.length; 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; }; }; if (clipPath == null) { for (var i = 0; i < clipGroup; i++) { if (sel[0].pageItems[i].typename == 'CompoundPathItem' && sel[0].pageItems[i].pathItems[0].clipping == true) { clipPath = sel[0].pageItems[i]; break; }; }; };
"Pasien" berikutnya adalah Bentuk Senyawa. Ini dia menjadi sangat menarik! Dalam dokumentasi kami tidak menemukan objek seperti itu sama sekali. Apa yang harus dilakukan Pertama, mari kita tentukan kelas objek yang dimilikinya. Untuk mengetahuinya, kita akan menulis kode bantu kecil, yang kemudian akan kita buang. Seperti disebutkan di bagian pertama , kami tidak membahas masalah alat yang digunakan untuk menulis / kode debugging. Oleh karena itu, anggap ini adalah file terpisah, yang kemudian pergi ke tempat sampah. Kode tersebut adalah sebagai berikut:
var obj = app.activeDocument.selection[0]; alert(obj.typename);
Di baris pertama, kami membuat tautan ke objek yang dipilih, di baris kedua - kami menampilkan pesan tentang jenisnya. Pilih garis besar topeng di Adobe Illustrator, mis. objek Bentuk Senyawa yang sama dan jalankan skrip. Di kotak pesan, kita melihat bahwa Bentuk Senyawa adalah PluginItem. Kami menyingkirkan kode tambahan, kembali ke dokumentasi lagi, tetapi kami tidak menemukan properti kliping atau pathItems di PluginItem. Secara umum, tidak ada yang akan membantu kita untuk secara tegas menunjukkan bahwa objek ini adalah garis besar topeng. Dari skrip Anda bahkan tidak dapat menentukan jenis plugin itu. Beberapa modul eksternal dan hanya itu!
Itu penyergapan! - Anda berseru dalam hati Anda. Dan otak bekerja dengan tergesa-gesa, berharap untuk menyelesaikan masalah yang tidak dapat diselesaikan. Dan kemudian, setelah melalui semua opsi yang mungkin dan tidak mungkin, Anda mati-matian menekan Del
dan menghapus Bentuk Senyawa yang dibenci. Dan di sini, dari sudut mata Anda pada palet Layers
, Anda perhatikan bahwa setelah tindakan ini, wadah topeng, yang merupakan Clip Group
, menjadi hanya Group
. Apa artinya itu? Dan fakta bahwa properti clipped
dari objek clipped
dari true
menjadi false
. Ini dia, solusi yang mungkin berhasil! Tentu saja, ini pada umumnya, peretasan, tetapi apa bedanya jika menentukan sirkuit yang diinginkan.
Algoritma untuk menentukan kontur topeng yang diwakili oleh objek Bentuk Senyawa kemudian adalah sebagai berikut: kita mengulangi semua objek topeng dan ketika kita menemukan PluginItem, kita menghapusnya dan memeriksa apakah properti clipped
dari wadah topeng telah berubah. Jika itu menjadi false
, maka ini adalah sirkuit kita. Satu-satunya hal agar hack ini berfungsi adalah memperbarui DOM Illustrator setelah menghapus objek, yang dapat dilakukan menggunakan metode app.redraw()
. Maka Anda masih perlu mengingat untuk mengembalikan objek jarak jauh, yang dilakukan oleh metode app.undo()
.
Di bawah ini adalah kode untuk jalur Bentuk Kompon:
if (clipPath == null) { for (var i = 0; i < clipGroup; i++) { if (sel[0].pageItems[i].typename == 'PluginItem') { sel[0].pageItems[i].remove(); app.redraw(); if (sel[0].clipped == false) { app.undo(); clipPath = sel[0].pageItems[i]; break; } else { app.undo(); } }; }; };
Sekarang, dari semua opsi yang mungkin untuk jenis objek yang dapat menjadi garis besar topeng, hanya teks (atau TextFrameItem
, dalam terminologi referensi skrip ilustrator ) TextFrameItem
. Kami beralih ke dokumentasi lagi dan lagi kami tidak menemukan properti clipping
sana. Tapi kali ini, kami tidak lagi terlalu khawatir tentang hal ini dan dengan tenang mengetahui bahwa TextFrameItem
memiliki properti kind
yang menentukan jenis objek teks ( TextType
). Kami menemukan bahwa ada tiga jenis: AREATEXT, POINTTEXT dan PATHTEXT. Tipe pertama tidak menarik bagi kami, karena tidak dapat digunakan sebagai garis besar topeng, dan dua lainnya masih menarik. Tetap hanya menemukan peretasan yang akan membantu kami menentukan sekarang bukan garis besar, tetapi objek teks, yang merupakan garis besar topeng. Dan retasan itu akan menjadi tim, Konversi Ke Jenis Area, yang akan mengubah POINTTEXT menjadi AREATEXT. Seperti dengan Bentuk Senyawa, perubahan implisit ke properti clipped
.
Dengan demikian, kode untuk TextFrameItem tipe POINTTEXT akan menjadi sebagai berikut:
if (clipPath == null) { for (var i = 0; i < clipGroup; i++) { if (sel[0].pageItems[i].typename == 'TextFrame' && sel[0].pageItems[i].kind == 'TextType.POINTTEXT') { sel[0].pageItems[i].convertPointObjectToAreaObject(); app.redraw(); if (sel[0].clipped == false) { app.undo(); clipPath = sel[0].pageItems[i]; break; } else { app.undo(); } }; }; };
Hanya ada TextFrameItem
tipe PATHTEXT yang tersisa. Sayangnya, saat mengonversi PATHTEXT ke AREATEXT, properti clipped
tidak berubah. Tetapi karena ini adalah kandidat terakhir yang memungkinkan untuk judul "garis besar topeng", adalah mungkin untuk menggunakan perilakunya seperti itu. Yaitu, kami memverifikasi bahwa setelah menjalankan perintah Convert To Area Type
, properti clipped
tetap true
. Di bawah ini adalah kode untuk TextFrameItem dari tipe PATHTEXT.
if (clipPath == null) { for (var i = 0; i < clipGroup; i++) { if (sel[0].pageItems[i].typename == 'TextFrame' && sel[0].pageItems[i].kind == 'TextType.PATHTEXT') { sel[0].pageItems[i].convertPointObjectToAreaObject(); app.redraw(); if (sel[0].clipped == true) { clipPath = sel[0].pageItems[i]; break; } else { app.undo(); } }; }; };
Jadi, jika kita mengumpulkan potongan-potongan kode yang ditulis secara berurutan, termasuk blok pemeriksaan, kita akan mendapatkan kode tersebut, yang pelaksanaannya, seperti yang dinyatakan di bagian pertama posting, akan mengimplementasikan tindakan perintah Expand Clipping Mask yang baru di Adobe Illustrator.
#target illustrator if (app.documents.length > 0) { var doc = app.activeDocument; var sel = doc.selection; var clipPath = null; if (sel.length > 0) { if (sel[0].typename == 'GroupItem' && sel[0].clipped == true) { var clipGroup = sel[0].pageItems.length; 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; }; }; if (clipPath == null) { for (var i = 0; i < clipGroup; i++) { if (sel[0].pageItems[i].typename == 'CompoundPathItem' && sel[0].pageItems[i].pathItems[0].clipping == true) { clipPath = sel[0].pageItems[i]; break; }; }; }; if (clipPath == null) { for (var i = 0; i < clipGroup; i++) { if (sel[0].pageItems[i].typename == 'PluginItem') { sel[0].pageItems[i].remove(); app.redraw(); if (sel[0].clipped == false) { app.undo(); clipPath = sel[0].pageItems[i]; break; } else { app.undo(); } }; }; }; if (clipPath == null) { for (var i = 0; i < clipGroup; i++) { if (sel[0].pageItems[i].typename == 'TextFrame' && sel[0].pageItems[i].kind == 'TextType.POINTTEXT') { sel[0].pageItems[i].convertPointObjectToAreaObject(); app.redraw(); if (sel[0].clipped == false) { app.undo(); clipPath = sel[0].pageItems[i]; break; } else { app.undo(); } }; }; }; if (clipPath == null) { for (var i = 0; i < clipGroup; i++) { if (sel[0].pageItems[i].typename == 'TextFrame' && sel[0].pageItems[i].kind == 'TextType.PATHTEXT') { sel[0].pageItems[i].convertPointObjectToAreaObject(); app.redraw(); if (sel[0].clipped == true) { clipPath = sel[0].pageItems[i]; break; } else { app.undo(); } }; }; }; app.executeMenuCommand('releaseMask'); clipPath.remove(); } else { alert (' -!'); }; } else { alert (' !'); }; } else { alert (' !'); };
Di sini Anda dapat mengakhiri. Tidak, titik koma lebih baik.
Saya berharap dengan posting ini saya membantu Anda sedikit lebih dekat dengan tujuan Anda - untuk memulai pemrograman dalam Adobe Illustrator. Terima kasih atas perhatian anda!