// MontaFoto.jsx // description: "Script to arrange photo, caption and photo author based in selected frames." // author: "José Antonio Meira da Rocha" // email: joseantoniorocha@gmail.com // // An InDesign CS2 script. /////////////////////////////////////////////////////////////////// // Variáveis que PODEM SER MODIFICADAS conforme projeto gráfico // /////////////////////////////////////////////////////////////////// var myCreditHeight = 5; // Altura dos créditos em milímetros var myCaptionHeight = 10; // Altura da legenda em milímetros var myGutter = 5 ; // Valeta, entrecolunas em milímetros var myPhotoStyleName = "Foto"; // Nome dos estilo do quadro de foto var myCaptionStyleName = "Legenda"; // Nome do estilo de quadro de legenda var myCreditStyleName = "Crédito da foto"; // nome do estilo do quadro de crédito de foto var myPhotoWrapTop = 0 // text wrap = zero para fotos abaixo de títulos ////////////////////////////////////////////// // Variáveis que NÃO PRECISAM ser modificadas // ////////////////////////////////////////////// var myObjectList = new Array; var myPhotoBounds = new Array; var myPhotoTop = 0; // Limites iniciais do frame da foto var myPhotoLeft = 0; var myPhotoBottom = "20mm"; var myPhotoRight = "20mm"; var myCredit; var caption; ////////////////////////////////////////////////////////////////// // Monta uma lista filtrando objetos que não sejam de conteúdo // ////////////////////////////////////////////////////////////////// if(app.documents.length != 0){ if(app.selection.length != 0){ for(myCounter = 0; myCounter < app.selection.length; myCounter++){ switch(app.selection[myCounter].constructor.name){ case "Oval": case "Polygon": case "Rectangle": case "TextFrame": myObjectList.push(app.selection[myCounter]); // Obs: os últimos objetos selecionados ficam em primeiro na lista break; } } if(myObjectList.length < 4){ //Se até 3 objetos foram selecionados myArrangePhoto(myObjectList); // Executa as ações } else { alert("Selecione até três quadros." + "\n\n" + "1. O primeiro será o quadro da foto." + "\n" + "2. O segundo será da legenda." + "\n" + "3. O terceiro será do crédito do fotógrafo."); } } else { alert("Selecione dois ou três quadros e rode este script novamente."); } } else { alert("Abra um documento, antes."); } ///////////////////////////////////////////////// /// Guarda as medida e vai executar o comando // ///////////////////////////////////////////////// function myArrangePhoto(myObjectList){ // Guarda medidas var myOldXUnits = app.activeDocument.viewPreferences.horizontalMeasurementUnits; var myOldYUnits = app.activeDocument.viewPreferences.verticalMeasurementUnits; app.activeDocument.viewPreferences.horizontalMeasurementUnits = MeasurementUnits.millimeters; app.activeDocument.viewPreferences.verticalMeasurementUnits = MeasurementUnits.millimeters; // Organiza frames myArrangeFrames(myObjectList); // Restaura medidas app.activeDocument.viewPreferences.horizontalMeasurementUnits = myOldXUnits; app.activeDocument.viewPreferences.verticalMeasurementUnits = myOldYUnits; } //////////////////////////////////////////////// // Manipula os três frames que compõe a foto // //////////////////////////////////////////////// function myArrangeFrames(myObjectList){ var enunciado = "Você quer editar a legenda e crédito?" ; // var conteudo = "Sim" ; // var titulo = "Editar legenda" ; // myEditCaption=confirm(enunciado,conteudo,titulo); // Arranja o frame da Foto myArrangePhotoFrame(myObjectList,myEditCaption); // Termina sem fazer nada se não houver três quadros. if(myObjectList.length < 2) return ; // Reformata quadro de legendas myArrangeCaptionFrame(myObjectList,myEditCaption); // Termina sem fazer nada se não houver três quadros if(myObjectList.length < 3) return ; // Reformata quadro de crédito de foto myArrangeCreditFrame(myObjectList,myEditCaption); } /////////////////////////////////////////// // Cria estilo do quadro, se não existir // // Devolve um objectStyle /////////////////////////////////////////// function myCreateFrameStyle(myStyleName){ var myObjectStyle = app.activeDocument.objectStyles.item(myStyleName); // Testa se o estilo de frame existe (gera erro se não existe). try { var myName = myObjectStyle.name; } catch (myError){ // Tratamento do erro: //O objeto não existe. Então, é criado. myObjectStyle = app.activeDocument.objectStyles.add({name:myStyleName}); } return myObjectStyle; // REtorna um objeto de estilo para ser aplicado ao objeto } /////////////////////////////////////////// // Cria estilo de parágrafo, se não existir /////////////////////////////////////////// function myCreateParagraphStyle(myStyleName){ var myParagraphStyle = app.activeDocument.paragraphStyles.item(myStyleName); // Testa se o estilo de parágrafo existe (gera erro se não existe). try { var myName = myParagraphStyle.name; } catch (myError){ // Tratamento do erro: //O estilo não existe. Então, é criado com o nome passado à função. myParagraphStyle = app.activeDocument.paragraphStyles.add({name:myStyleName}); } } ///////////////////////////////////////// // Pega medidas do Quadro da foto // // bounds: [top, left, bottom, right] // ///////////////////////////////////////// function myArrangePhotoFrame(myObjectList){ // pega o índice da foto (sempre o último, já que foi selecionada primeiro). var indice = myObjectList.length - 1; var myPhoto = myObjectList[indice]; // Norteia o objeto antes de aplicar os novos limites no frame. myPhoto.rotate(0) ; // Pega limites do objeto // .geometricBounds: matriz que guarda os limites do frame da foto. myPhotoBounds = myPhoto.geometricBounds; // Pega limites individuais myPhotoTop = myPhotoBounds[0]; // ... do topo myPhotoLeft = myPhotoBounds[1]; // ... da esquerda myPhotoBottom = myPhotoBounds[2]; // ... de baixo myPhotoRight = myPhotoBounds[3]; // ... da direita ////////////////////////////////////// // Habilita o afasta-texto (text wrap) ////////////////////////////////////// myPhoto.textWrapPreferences.textWrapType = TextWrapTypes.boundingBoxTextWrap; //////////////////////////////////////// // Define distâncias pra afastar o texto //////////////////////////////////////// myPhoto.textWrapPreferences.textWrapOffset = [myPhotoWrapTop, myGutter, myCaptionHeight, myGutter]; ///////////////////////////////////// // Se houver texto no frame, apaga-o. ///////////////////////////////////// if ( (myPhoto.constructor.name == "TextFrame") && (myPhoto.texts[0]!="") ) { try { myPhoto.texts[0].remove(); } catch (e){} } //////////////////////////////////// // Muda o tipo de frame para gráfico //////////////////////////////////// try { myPhoto.contentType = ContentType.graphicType; } catch(e) { } // Configura estilo do objeto. // myPhotoStyleName pode ser redefinido pelo usuário no início do script. myObjectStyle = myCreateFrameStyle(myPhotoStyleName); // Aplica estilo no objeto. // .applyObjectStyle: método que aplica estilo ao objeto. myPhoto.applyObjectStyle(myObjectStyle, true); } ///////////////////////////////////// // Define medidas da Legenda da foto // bounds: [top, left, bottom, right] ///////////////////////////////////// function myArrangeCaptionFrame(myObjectList,myEditCaption){ // Pega o índice do quadro de legenda. // O segundo objeto selecionado será a legenda da foto. var indice = myObjectList.length - 2; var myCaption = myObjectList[indice]; // Define os limites da legenda. // myCaptionHeight é definido pelo usuário no início deste script. var myCaptionTop = myPhotoBottom ; var myCaptionLeft = myPhotoLeft ; var myCaptionBottom = myPhotoBottom + myCaptionHeight; var myCaptionRight = myPhotoRight ; // Norteia o objeto antes de aplicar os novos limites no frame. myCaption.rotate(0) ; var myCaptionBounds = [myCaptionTop, myCaptionLeft, myCaptionBottom, myCaptionRight] ; myCaption.geometricBounds = myCaptionBounds ; myCaption.contentType = ContentType.textType; // Para evitar erros de "object does not suport textFramePrefs". // não sei porque, é preciso criar uma cópia do objeto, // senão dá erro de "object does not contains property or method". // Apenas mudar o tipo não é suficiente para criar todas as propriedades var myNewCaption = myCaption.duplicate(); myCaption.remove(); // Deleta o frame velho. var myCap = myNewCaption.contents; /////////////////////////////// // Se escolheu editar a legenda if (myEditCaption){ var enunciado = "EDITE esta LEGENDA e escolha OK"+"\n"+"Ou DEIXE COMO ESTÁ e escolha CANCEL"; var conteudo = myNewCaption.contents; var titulo = "Editar LEGENDA"; var res = prompt(enunciado,conteudo,titulo); if (res != null) myNewCaption.contents = res; } //////////////////////////////////// // Ignora afastador de texto. // Legenda ignora o text wrap // para poder aparecer perto da foto //////////////////////////////////// myNewCaption.textFramePreferences.ignoreWrap = true ; ///////////////////////////////////////////////////////// // Desabilita o afasta-texto (text wrap) para este quadro ///////////////////////////////////////////////////////// myNewCaption.textWrapPreferences.textWrapType = TextWrapTypes.boundingBoxTextWrap; //////////////////////////////////////// // Define distâncias pra afastar o texto //////////////////////////////////////// myNewCaption.textWrapPreferences.textWrapOffset = [0, 0, 0, 0]; // .myCaptionStyleName é definido pelo usuário no início do script. myCaptionStyle = myCreateParagraphStyle(myCaptionStyleName); myObjectStyle = myCreateFrameStyle(myCaptionStyleName); myNewCaption.applyObjectStyle(myObjectStyle, true); } //////////////////////////////////// // Define medidas do crédito da foto // bounds: [top, left, bottom, right //////////////////////////////////// function myArrangeCreditFrame(myObjectList,myEditCredit){ // Posição superior do crédito. var myCreditTop = myPhotoBottom ; // myCreditHeight: altura do crédito, modificada pelo usuário no início do script. var myCreditBottom = myPhotoBottom + myCreditHeight ; // Largura do quadro dos créditos é altura da fotos. var myCreditWidth = myPhotoBottom - myPhotoTop ; // Posição direita do crédito. var myCreditRight = myPhotoRight + myCreditWidth ; // Posição esquerda do crédito. var myCreditLeft = myPhotoRight ; // Posiciona no canto inferior direito da foto var myCreditBounds = [myCreditTop, myCreditLeft, myCreditBottom, myCreditRight]; // Pega o objeto na matriz de objeto. // O último objeto selecionado é o primeiro da matriz (LIFO), de índice zero. indice = myObjectList.length - 3; var myCredit = myObjectList[indice]; myCredit.rotate(0, [myCreditLeft, myCreditTop]) ; // Norteia o objeto antes de aplicar os novos limites no frame. myCredit.geometricBounds = myCreditBounds; // Aplica os novos limites (o novo tamanho do frame). myCredit.rotate(90, [myCreditLeft, myCreditTop]) ; // Rotaciona 90 graus anti-horário pra deixar o credito na direita da foto, de baixo pra cima. myCredit.contentType = ContentType.textType; // Define o conteúdo como tipo Text. // Para evitar erros de "object does not suport textFramePrefs", // não sei porque, é preciso criar uma cópia do objeto, // senão dá erro de "object does not contains propertie or method ". // Um objeto novo tem todos os atributos e métidos, e objeto transformado não tem. var myNewCredit = myCredit.duplicate(); myCredit.remove(); var myCred = myNewCredit.contents; /////////////////////////////// // Se escolheu editar a legenda /////////////////////////////// if (myEditCaption){ var enunciado = "EDITE este CRÉDITO e escolha OK"+"\n"+"Ou DEIXE COMO ESTÁ e escolha CANCEL."; var conteudo = myNewCredit.contents; var titulo = "Editar CRÉDITO"; var res=prompt(enunciado,conteudo,titulo); if (res != null) myNewCredit.contents=res; } ///////////////////////////// // Ignora afastador de texto. ///////////////////////////// myNewCredit.textFramePreferences.ignoreWrap = true ; ///////////////////////////////////////// // Desabilita o afasta-texto (text wrap), ///////////////////////////////////////// myNewCredit.textWrapPreferences.textWrapType = TextWrapTypes.boundingBoxTextWrap; //////////////////////////////////////// // Define distâncias pra afastar o texto //////////////////////////////////////// myNewCredit.textWrapPreferences.textWrapOffset = [0, 0, 0, 0]; myCreditStyle = myCreateParagraphStyle(myCreditStyleName); myObjectStyle = myCreateFrameStyle(myCreditStyleName); myNewCredit.applyObjectStyle(myObjectStyle, true); }