1

Adobe Illustrator でオブジェクトに制限を加える方法はありますか?

複数のオブジェクトを POI に配置したいと考えています。オブジェクト自体は常に POI を見る必要があります。さらに、POI が移動すると、オブジェクトの向きが更新されます。

Adobe Illustrator でこのタイプのロジックを定義する方法はありますか?

ご協力いただきありがとうございます!1月

4

1 に答える 1

3

そのためのスクリプトを作成できます。

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

Look At POI.jsx のような名前で適切な場所 ( ) に保存すると、[ファイル] > [スクリプト] > [Look At POIILLUSTRATOR_INSTALL_DIR/Presets/LOCALE/Scripts ] からアクセスできるようになります。

これを使用するには、少なくとも 2 つのオブジェクトを選択し、いずれかがPOI名前に含まれていることを確認してください。

ここに簡単なプレビューがあります: イラストレーターのプレビュー

三角形は記号であることに注意してください。これにより、微調整が必​​要な場合に、グローバルに回転を簡単に調整できます ([シンボル] パネルで確認できます)。別の方法は、スクリプトの角度にオフセットを追加することですが、これは十分に柔軟に感じます:)

スクリプト化されていないバージョンでは、Symbol Spinner Toolを使用している可能性がありますが、処理が遅く、正確ではありません。

シンボル スピナー ツール

于 2013-04-11T13:55:35.393 に答える