Como iniciar a programação no Adobe Illustrator. Parte um

Quero avisar imediatamente que essa série de postagens não é para programadores experientes, nem mesmo para programadores. Entendo que isso parece extremamente desafiador, dado o tema de TI do recurso, e ainda me permita explicar ... Como público, vejo designers comuns que gostariam de começar a programar no Adobe, mas por algum motivo (por medo de desconhecido, falta de confiança em suas capacidades ou desconhecimento do idioma) não pode dar os primeiros passos nessa direção. Vejo minha tarefa modesta em ajudá-los a entender que "não são os deuses que queimam as panelas" e qualquer pessoa suficientemente motivada pode aprender a escrever o código do programa em funcionamento. É possível que alguns deles sejam tão empolgados com este jogo que eles decidem se tornar desenvolvedores reais. Que código não está brincando?


Este post falará sobre como escrever sua própria ferramenta pequena (script em JavaScript) para criar sua própria ferramenta exclusiva no Adobe Illustrator, que não apenas reduzirá seu tempo, mas também melhorará a interação com este maravilhoso editor de gráficos. Primeiro, vou formular o problema, depois mostrarei o código que o resolve e, depois, explicarei detalhadamente como ele foi criado. Ele não discutirá o básico do Javascript, os recursos do modelo de objeto do Illustrator ou vários editores para escrever / depurar código. Você pode encontrar essas informações, se desejar. O principal, na minha opinião, é o entendimento dos princípios básicos dos programas de redação, que é a ênfase principal deste artigo. Se você está pronto para pular logo acima da cabeça, seja bem-vindo ao corte!


O Adobe Illustrator possui uma ferramenta Máscara de recorte que funciona com máscaras de recorte. A máscara de recorte contém três comandos: Criar, Liberar e Editar máscara. O primeiro cria uma máscara, o segundo - analisa, o terceiro - permite editar. Estamos interessados ​​no segundo comando, que divide o objeto Clipping Mask em um contorno e no conteúdo da máscara. Muitas vezes é necessário não apenas desmontar a máscara, mas também livrar-se do contorno da máscara, deixando apenas o conteúdo. O comando Release Clipping Mask regular não faz isso; portanto, após a aplicação, é necessário executar mais três etapas:


  1. Remover seleção de objetos
  2. Selecionar apenas o contorno da máscara
  3. Remover contorno da máscara

Se você precisar executar essa operação seqüencial com bastante frequência durante o dia, surge a pergunta: é impossível reduzir de alguma forma o número dessas ações para obter o mesmo resultado? E o ponto aqui não é preguiça, mas a falta da ferramenta necessária. Agora imagine por um segundo que você tenha essa ferramenta.


Aqui você se distrai brevemente do trabalho e pensa em como seria legal se o arsenal do Adobe Illustrator tivesse uma equipe como a Expand Clipping Mask que executou todas essas ações para você. Idéia legal! Você precisa escrever suporte técnico para a Adobe, você pensa. O seguinte pensamento: de repente, eles foram escritos sobre isso muitas vezes? E se algum dia e talvez eles adicionem essa ferramenta, o que é isso para você? Essa equipe é necessária aqui e agora!

E aí chega o momento da verdade - você mesmo pode escrever um roteiro!

Mal disse o que fez!


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

Aqui está um código tão pequeno para ajudar a resolver esse problema. Em vez de várias, já na ordem de ações entediadas, você só precisa fazer uma coisa: executar o script Expandir máscara de recorte. Agora você tem uma ferramenta útil para trabalhar com máscaras, feita pelo mesmo faça você mesmo.


Claro, aqui estou um pouco falso. Primeiro, o roteiro não foi escrito por você e, segundo, não é tão universal quanto gostaríamos. No entanto, se você estiver interessado em saber como ele funciona e, o mais importante, em como aprender a escrever esses programas você mesmo, terei prazer em falar sobre isso em ordem e com comentários detalhados.


Para começar, qualquer script (script / programa / código JavaScript) consiste em vários blocos principais de código: declarações (inicialização) de variáveis, verificações básicas (condições) e, digamos, o “mecanismo de programa” - código que implementa as principais funções funcionais script. Obviamente, essa divisão é muito arbitrária, pois a parte funcional também possui verificações, mas o princípio estrutural é esse. Naturalmente, quanto maior o programa, mais difícil será dividi-lo em blocos semelhantes. Mas no nosso caso, é possível. As linhas 8 a 16 são o mecanismo de script, as linhas restantes são declarações variáveis ​​e várias verificações básicas com seu processamento. Se você contar, o número de linhas no bloco de verificação é maior que o número de linhas no bloco de funções. Essas verificações são realmente importantes?


Por que precisamos de cheques?


Programadores sérios me entenderão e será útil para os desenvolvedores iniciantes descobrirem sobre isso. São necessárias verificações para garantir o funcionamento normal da parte funcional do programa. Se você não os escrever, qualquer erro durante a execução do script causará uma falha de software. E isso não é bom.


Obviamente, os camaradas sérios mencionados acima usam o construto try / catch para tais propósitos, mas decidi que o if / else usual seria um construto lacônico e mais compreensível. Especialmente para escritores iniciantes.


Vamos examinar em detalhes o que essas linhas fazem. A primeira linha é responsável pelo fato de que, mesmo que o script não seja executado no Adobe Illustrator, ele será executado nele. Portanto, se você executar o script no Illustrator, essa linha poderá ser omitida.


 #target illustrator 

Em seguida, verifica documentos abertos no Adobe Illustrator no momento em que o script é executado. Essas linhas devem ser lidas da seguinte forma: se ( if ) no aplicativo ( app ) o número de documentos ( documents.length ) for maior que zero (> 0), o código contido em {...} deverá ser executado. Caso contrário (caso else ), exiba a mensagem ( alert ) 'Sem documentos abertos!' e complete o script.


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

O seguinte bloco de código verifica a seleção no documento.


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

Note-se que, nos exemplos anteriores, usamos nomes reservados (como app ou documents ), então aqui usamos a variável sel, que nós mesmos determinamos nas linhas 3 e 4,


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

onde doc é o link para o documento ativo do Illustrator e sel é o link para o (s) objeto (s) selecionado (s) no documento ativo.


Uma referência (ou referência) é um ponteiro para um objeto específico. É claro que estou ciente de que a palavra russa completamente inofensiva "ponteiro" é capaz de introduzir no estupor qualquer pessoa que não esteja familiarizada com OOP (programação orientada a objetos). Mas tome uma palavra, nem tudo é tão complicado quanto parece. Os links são armazenados em variáveis ​​e são usados ​​para acessar objetos. Na variável doc , salvamos (atribuímos um valor usando o operador de atribuição = ) um ponteiro ao documento ativo (activeDocument) do aplicativo (aplicativo) e na variável sel salvamos o ponteiro para a seleção no documento ativo (activeDocument) do aplicativo (aplicativo). Apenas para evitar escrever app.activeDocument novamente, usamos a variável doc , que já contém esse código. É por isso que o link será parecido com sel = doc.selection . Espero ter explicado claramente.

Portanto, nessa condição, if (sel.length > 0) é verificado se há objetos selecionados no documento ativo e, se não, a mensagem é exibida: 'Nenhum objeto selecionado!'


As linhas a seguir verificam a veracidade, desculpe pelo trocadilho, duas condições ao mesmo tempo. O primeiro que o objeto selecionado é um grupo ( GroupItem ) e (&&) o segundo que esse grupo é realmente uma máscara de recorte (a propriedade clipped desse objeto é true ).


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

Aqui precisamos de uma pequena explicação.


O que é um objeto de máscara? Este é um grupo, mas não um grupo comum. Um grupo regular é uma coleção de objetos diferentes subordinados, por exemplo, ao objeto "principal" ou "pai". Quanto ao objeto da máscara, este também é um grupo, mas diferente do usual, ele consiste em duas partes - o contorno da máscara e seu conteúdo. Portanto, para determinar a partir do script que na sua frente existe um grupo regular ou um grupo de máscaras, sua propriedade clipped permite isso. Se o valor da propriedade cortada for false (falso), então este é um grupo normal; se true (verdadeiro), esse é um grupo de recorte.

Mentes investigadoras perceberão que, em vez da variável sel que definimos anteriormente, o construto sel[0] é usado. Isso é explicado pelo fato de que, do ponto de vista do script, uma seleção é uma coleção (coleção) de elementos e não um objeto específico (mesmo que apenas um objeto seja selecionado). E para verificar o tipo ( typename ) desse objeto para corresponder ao tipo do elemento de coleção selecionado, é usada a construção sel[0] , que se refere ao primeiro [0] elemento da coleção, que é, no nosso caso, o grupo selecionado.


Como resultado, se o objeto selecionado for um grupo e uma máscara, o código adicional será executado; caso contrário, a mensagem será exibida: 'Seleção não é um objeto de máscara!'


Com cheques - é isso. Vá em frente.


Como foi criado o código principal?


Nesta parte do artigo, tentarei não apenas comentar como o código funciona, mas também descrever o processo de sua criação. Se não todo o processo, pelo menos alguns pontos-chave. Vamos começar!


Anteriormente, foram descritas três etapas que devem ser executadas para resolver a tarefa de “desmontar” a Máscara de Recorte e depois remover o contorno da máscara. Eles serão complementados com outra ação (comando Release), a partir da qual nosso algoritmo começará. Vou repeti-los aqui para atualizar o contexto.


  1. Execute o comando Release Clipping Mask
  2. Remover seleção de objetos
  3. Selecionar apenas o contorno da máscara
  4. Remover contorno da máscara

Se você implementar essa sequência de ações estritamente de acordo com a lista, os dois primeiros pontos poderão ser facilmente resolvidos chamando o método executeMenuCommand() . Mas então, no terceiro ponto, enfrentaremos um problema insolúvel. Como obter um link para o contorno da máscara, se após a primeira ação (Liberar máscara de recorte) não houver mais máscara, mas houver apenas um conjunto de objetos selecionados? Sim, e ele não é estruturalmente o mesmo de antes de executar esta operação.


Em geral, a lógica sugere que primeiro você precise criar um link (referência) para o objeto de estrutura de tópicos da máscara. Depois de pensar sobre o que PathItem contorno PathItem máscara tão exclusivo em comparação com o contorno regular, encontraremos a propriedade de clipping da classe PathItem . Agora, basta PathItem sobre todos os objetos do grupo de máscaras no loop (for) e encontrar o PathItem com a propriedade clipping = true . Este será o circuito desejado. Como resultado da execução desse código, obteremos um link para o objeto de contorno da máscara e o salvaremos na variável 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; }; }; 

O que vem a seguir? Vamos voltar ao algoritmo e escrever o código para o item 1. Essa linha executa o comando Release Clipping Mask, mas não através da interface do usuário, mas a partir do script. Sim, tão simples!


  app.executeMenuCommand('releaseMask'); 

Ignoramos as etapas 2 e 3 (porque já temos um esboço da máscara, ou melhor, um link para o objeto clipPath) e vamos diretamente para a etapa 4. Aqui chamamos o método remove() do objeto clipPath . Este método remove o contorno da máscara.


  clipPath.remove(); 

Por enquanto é tudo. Obrigado pela atenção!


Espero que agora você entenda que começar a programar no Adobe Illustrator não é tão difícil quanto parece à primeira vista.


PS É claro que o script resultante está longe de ser o ideal. Ele não funciona com máscaras cujos contornos são representados pelos TextFrame CompoundPath , CompoundShape ou TextFrame . Leia como modificar o script para que ele se torne uma ferramenta verdadeiramente completa na segunda parte .

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


All Articles