Illustrator使用该BBAccumRotation
以弧度0.51246700
跟踪对象的旋转。
如果对象设置为BBAccumRotation
:
- 当前旋转 - 弧度 = 旋转值
- 以前旋转过,目前为 0 度 - 弧度 = 0.000000
- 通过拖动手柄旋转
- 通过对象>变换>旋转旋转
- 通过"属性"面板旋转> 旋转
如果对象:BBAccumRotation
- 已通过脚本使用
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);
}
};
提前谢谢你:)
[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();```
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°