2013-04-11 2 views
1

Есть ли способ установить ограничения на объекты в Adobe Illustrator?Настройка ограничений в Adobe Illustrator

Я хочу разместить несколько объектов в POI. Объекты должны всегда смотреть на POI. Кроме того, ориентация объектов должна обновляться, когда объект POI перемещается.

Есть ли способ определить этот тип логики в Adobe Illustrator?

Благодарим за помощь! Jan

ответ

1

Вы можете написать сценарий для этого.

Одна из проблем заключается в том, как определить, какой из объектов является правильным.

В качестве быстрого хакерского решения следует использовать соглашение об именах: скажем, объект POI содержит символы «POI» в его имени.

После того, как вы получили объект POI, это просто вопрос использования atan2, чтобы получить от любого другого объекта к POI:

var dx = POI.x - obj.x; 
var dy = POI.y - obj.y; 
var angle = atan2(dy,dx); 

Вот быстрый сценарий:

/* 
*  Rotates a bunch of selected items towards a chosen target 
*  
*  Usage: select at least 2 objects and mark the "look at" target by having POI in the name of the item 
*/ 
#target illustrator 

var d = app.activeDocument;//current document 
var s = d.selection;//current selection 
var hasDocCoords = app.coordinateSystem == CoordinateSystem.DOCUMENTCOORDINATESYSTEM; 

var poi = getPOI(s);//get an object that contains 'poi'/'POI' in the name 
if(s.length > 1 && poi != undefined){//if there are at least 2 objects and one's a POI 
    var lookAt = getPos(poi);//get the position to look at 
    for(var i = 0 ; i < s.length; i++){//for each object 
     if(s[i] != poi){//that isn't the poi 
      var pos = getPos(s[i]);//get the position 
      //get the angle using atan2 and the difference vector between the two positions(current object and poi) 
      var angle = Math.atan2(pos[1]-lookAt[1],pos[0]-lookAt[0]); 
      //check if there's a rotation applied, if so, remove it first 
      if(s[i].tags.length > 0){ 
       if(s[i].tags[0].name == "BBAccumRotation"){ 
        s[i].rotate(s[i].tags[0].value* -57.2957795);//reverse rotate 
        s[i].tags[0].remove(); 
       } 
      } 
      //if it doesn't have a rotation tag, add one so it can be removed when the script is reapplied 
      if(s[i].tags.length == 0){ 
       var t = s[i].tags.add(); 
       t.name = "BBAccumRotation"; 
       t.value = angle; 
      } 
      s[i].rotate(angle * 57.2957795);//finally convert radians to degrees and apply the rotation 
     } 
    } 
    app.redraw(); 
} 
function getPOI(s){//find POI in selection 
    for(var i = 0 ; i < s.length; i++) 
     if (s[i].name.toUpperCase().indexOf("POI") >= 0) return s[i]; 
} 
function getPos(o){ 
    var pos = hasDocCoords ? d.convertCoordinate (o.position, CoordinateSystem.DOCUMENTCOORDINATESYSTEM, CoordinateSystem.ARTBOARDCOORDINATESYSTEM) : o.position; 
    pos[0] += o.width;//offset to centre of object 
    pos[1] -= o.height; 
    return pos; 
} 

You может сохранить его как-то вроде Look at POI.jsx в нужном месте (ILLUSTRATOR_INSTALL_DIR/Presets/LOCALE/Scripts), чтобы он стал доступен через Файл> Скрипты> Посмотрите на POI

Чтобы использовать его, выберите не менее 2 объектов, убедитесь, что в нем есть POI.

Вот быстрый просмотр: Illustrator preview

Заметим, что треугольники являются символами. Это упрощает настройку вращения (как вы можете видеть на панели «Символы») в глобальном масштабе, если это необходимо для настройки. Другой способ заключается в добавлении смещения к углу в сценарии, но это чувствует себя достаточно гибкой :)

Беспоставочной сценарий версия может с помощью Symbol Spinner Tool, но это медленный и не очень точный процесс:

symbol spinner tool