【问题标题】:`rotate()` does not set `BBAccumRotation`?`rotate()` 没有设置 `BBAccumRotation`?
【发布时间】:2020-09-08 13:39:21
【问题描述】:

Illustrator 使用BBAccumRotation 以弧度跟踪对象的旋转0.51246700。

BBAccumRotation IS 设置 if 对象:

  • 当前已旋转 - 弧度 = 旋转值
  • 之前已旋转,当前为 0 度 - 弧度 = 0.000000
  • 通过拖动手柄旋转
  • 通过对象 > 变换 > 旋转进行旋转
  • 通过属性面板旋转 > 旋转

BBAccumRotation IS NOT 如果对象设置:

  • 通过使用rotate() 的脚本旋转
  • 通过实时效果旋转 > 扭曲和变换 > 变换 > 旋转
  • 使用实时效果旋转并展开

问题是,有没有一种本地/烘焙方式让rotate() 设置BBAccumRotation?

虽然可以将BBAccumRotation 标签添加到对象,但它会像任何自定义标签一样被处理 - Illustrator 在其旋转标签上无法识别它,因此它不会反映在“属性”面板等位置.

我知道我可以使用自定义标签来跟踪 rotate() 正在做什么 - 我宁愿不去那里。

似乎rotate() 应该设置为BBAccumRotation,我希望有一些我不知道的东西。

如果您有兴趣亲眼看看,这里有一些测试脚本:

检查对象的标签:

if (app.documents.length == 0 ) {
    alert('Open a document to run this script.');
} else if (app.activeDocument.selection.length != 1)  {
    alert('Select 1 object to run this script.');
} else {
    TagAlert();
}


function TagAlert() {

    var iDoc = app.activeDocument;
    var aObj = iDoc.selection;
    var nObj = aObj.length;

    for ( i = 0; i < nObj; i++ ) {

        var obj = selection[0];
        var aTags = obj.tags;
        var nTags = aTags.length;

        if (nTags == 0) {

            alert('No tags.')

        } else {

            for ( i = 0; i < nObj; i++ ) {

                var obj = aObj[0];
                var aTags = obj.tags;
                var nTags = aTags.length;

                for ( i = 0; i < nTags; i++ ) {
                    tagName = aTags[i].name;
                    tagVal = aTags[i].value;
                    alert(tagName + ' ' + tagVal);
                }
            } // for

        } // if
    } // for

}; // TagAlert

将对象旋转 30 度:

if (app.documents.length == 0 ) {
    alert('Open a document to run this script.');
} else if (app.activeDocument.selection.length != 1)  {
    alert('Select 1 and only 1 object to run this script.');
} else {
    RotateObject();
}

function RotateObject() {

    var iDoc = app.activeDocument;
    var aObj = iDoc.selection;
    var nObj = aObj.length;

    for(i = 0; i < nObj; i++) { 
        aObj[i].rotate(30);
    }

};

提前谢谢你:)

【问题讨论】:

    标签: rotation adobe-illustrator extendscript object-tag


    【解决方案1】:

    [Tags].add() 方法返回一个 Tag 对象,当重命名该对象以匹配内置标签(例如,'BBAccumRotation')时,illustrator 可以正常识别,例如在属性面板中。

    以下代码使用.rotate() 将第一个选定对象旋转-22 度,然后相应地旋转边界框。请注意,[Tags].value 必须从字符串转换为数字。另请注意,此功能似乎没有记录在案。

    #target illustrator
    
    // convert back to radians
    function deg2Rad( n ) {
        return n * ( Math.PI / 180 );
    }
    function rotateBBox( layer, degrees ) {
        // `tag` will revert to an exiting BBAccumRotation tag if it exists
        // if it doesn't exit, it is created
        var tag = null;
        var i;
        for ( i = 0; i < layer.tags.length; i++ ) {
            if ( layer.tags[i].name === 'BBAccumRotation' ) {
                tag = layer.tags[i];
            }
            i += 1;
        }
        if ( !tag ) {
            tag = layer.tags.add();
            tag.name = 'BBAccumRotation';
        }
        if ( tag.value ) {
            // tag.value must be converted from a String
            tag.value = Number( tag.value ) + deg2Rad( degrees );
        } else {
            tag.value = deg2Rad( degrees );
        }
    }
    function main() {
        var doc = app.activeDocument;
        var angle, sel;
        if ( doc.selection.length < 1 ) {
            alert( 'At least one (1) layer must be selected.' );
            return 1;
        } else {
            doc = app.activeDocument;
            sel = doc.selection[0];
            angle = -22;
            sel.rotate( angle );
            rotateBBox( sel, angle );
        }
    }
    main();```
    

    【讨论】:

      【解决方案2】:
      function rotate(item, degrees) {
          var angle = 0;
          try {
              angle = parseFloat(item.tags["BBAccumRotation"].value);
          } catch(e) {
              var tag   = item.tags.add();
              tag.name  = "BBAccumRotation";
              tag.value = 0;
          }
          item.tags["BBAccumRotation"].value = angle + degrees*Math.PI/180;
          item.rotate(degrees);
      }
      
      var item = app.activeDocument.selection[0]; // no tag
      
      rotate(item, 15);  // BBAccumRotation 15°
      rotate(item, 15);  // BBAccumRotation 30°
      rotate(item, -25); // BBAccumRotation 5°
      

      【讨论】:

        猜你喜欢
        • 2014-01-18
        • 2018-01-30
        • 1970-01-01
        • 1970-01-01
        • 2016-07-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多