文章目录
1.算法程序
- 1.算法程序
- 2.作者答疑
illustrator是矢量编辑软件,画板是绘制处理的重要容器,在印刷方面的一个重要功能就是标注尺寸,开发一个尺寸标注功能,以下功能仅用于学习交流,请勿用于非法用途,源代码如下所示:
if (app.documents.length > 0) {
var doc = activeDocument;
var selectedItems = parseInt(doc.selection.length, 10) || 0;
var setUnits = true;
var defaultUnits = $.getenv("Specify_defaultUnits") ? convertToBoolean($.getenv("Specify_defaultUnits")) : setUnits;
var setFontSize = 10;
var defaultFontSize = $.getenv("Specify_defaultFontSize") ? convertToUnits($.getenv("Specify_defaultFontSize")).toFixed(3) : setFontSize;
var setRed = 255;
var defaultColorRed = $.getenv("Specify_defaultColorRed") ? $.getenv("Specify_defaultColorRed") : setRed;
var setGreen = 0;
var defaultColorGreen = $.getenv("Specify_defaultColorGreen") ? $.getenv("Specify_defaultColorGreen") : setGreen;
var setBlue = 0;
var defaultColorBlue = $.getenv("Specify_defaultColorBlue") ? $.getenv("Specify_defaultColorBlue") : setBlue;
var setDecimals = 2;
var defaultDecimals = $.getenv("Specify_defaultDecimals") ? $.getenv("Specify_defaultDecimals") : setDecimals;
var specifyDialogBox = new Window("dialog", "尺寸标注");
specifyDialogBox.alignChildren = "left";
dimensionPanel = specifyDialogBox.add("panel", undefined, "选择需标注的位置");
dimensionPanel.orientation = "column";
dimensionPanel.alignment = "left";
dimensionPanel.margins = [20, 10, 35, 10];
dimensionGroup = dimensionPanel.add("group");
dimensionGroup.orientation = "row";
topCheckbox = dimensionGroup.add("checkbox", undefined, "上").helpTip = "标注对象的上边.";
topCheckbox.value = false;
rightCheckbox = dimensionGroup.add("checkbox", undefined, "右").helpTip = "标注对象的右边.";
rightCheckbox.value = false;
bottomCheckbox = dimensionGroup.add("checkbox", undefined, "下").helpTip = "标注对象的下边.";
bottomCheckbox.value = false;
leftCheckbox = dimensionGroup.add("checkbox", undefined, "左").helpTip = "标注对象的左边.";
leftCheckbox.value = false;
selectAllGroup = dimensionPanel.add("group");
selectAllGroup.orientation = "row";
selectAllCheckbox = selectAllGroup.add("checkbox", undefined, "标注四边").helpTip = "标注对象的四边.";
selectAllCheckbox.value = false;
selectAllCheckbox.onClick = function() {
if (selectAllCheckbox.value) {
topCheckbox.value = true;
topCheckbox.enabled = false;
rightCheckbox.value = true;
rightCheckbox.enabled = false;
bottomCheckbox.value = true;
bottomCheckbox.enabled = false;
leftCheckbox.value = true;
leftCheckbox.enabled = false;
} else {
topCheckbox.value = false;
topCheckbox.enabled = true;
rightCheckbox.value = false;
rightCheckbox.enabled = true;
bottomCheckbox.value = false;
bottomCheckbox.enabled = true;
leftCheckbox.value = false;
leftCheckbox.enabled = true;
}
};
optionsPanel = specifyDialogBox.add("panel", undefined, "选项");
optionsPanel.orientation = "column";
optionsPanel.margins = 10;
optionsPanel.alignChildren = "left";
units = optionsPanel.add("checkbox", undefined, "标注时标上单位标签").helpTip = "选中时,将标签旁边插入\n输出尺寸.\n例: 220 mm";
units.value = defaultUnits;
if (selectedItems == 2) {
between = optionsPanel.add("checkbox", undefined, "对象间隔间尺寸").helpTip = "选中时,对象间隔的距离\n所选尺寸的2个对象.";
between.value = false;
}
fontGroup = optionsPanel.add("group");
fontGroup.orientation = "row";
fontLabel = fontGroup.add("statictext", undefined, "字体大小:");
fontSizeInput = fontGroup.add("edittext", undefined, defaultFontSize).helpTip = "输入尺寸标签所需的字体大小.\n默认: " + setFontSize;
fontUnitsLabelText = "";
switch (doc.rulerUnits) {
case RulerUnits.Picas:
fontUnitsLabelText = "pc";
break;
case RulerUnits.Inches:
fontUnitsLabelText = "in";
break;
case RulerUnits.Millimeters:
fontUnitsLabelText = "mm";
break;
case RulerUnits.Centimeters:
fontUnitsLabelText = "cm";
break;
case RulerUnits.Pixels:
fontUnitsLabelText = "px";
break;
default:
fontUnitsLabelText = "pt";
}
fontUnitsLabel = fontGroup.add("statictext", undefined, fontUnitsLabelText);
fontSizeInput.characters = 5;
fontSizeInput.onActivate = function() {
restoreDefaultsButton.enabled = true;
};
colorGroup = optionsPanel.add("group");
colorGroup.orientation = "row";
colorLabel = colorGroup.add("statictext", undefined, "标签颜色 (RGB):");
colorInputRed = colorGroup.add("edittext", undefined, defaultColorRed).helpTip = "输入要用于尺寸标签的RGB红色值.\n默认: " + setRed;
colorInputRed.characters = 3;
colorInputGreen = colorGroup.add("edittext", undefined, defaultColorGreen).helpTip = "输入用于尺寸标签的RGB绿色颜色值.\n默认: " + setGreen;
colorInputGreen.characters = 3;
colorInputBlue = colorGroup.add("edittext", undefined, defaultColorBlue).helpTip = "输入要用于尺寸标签的RGB蓝色颜色值.\n默认: " + setBlue;
colorInputBlue.characters = 3;
colorInputRed.onActivate = function() {
restoreDefaultsButton.enabled = true;
};
colorInputGreen.onActivate = function() {
restoreDefaultsButton.enabled = true;
};
colorInputBlue.onActivate = function() {
restoreDefaultsButton.enabled = true;
};
decimalPlacesGroup = optionsPanel.add("group");
decimalPlacesGroup.orientation = "row";
decimalPlacesLabel = decimalPlacesGroup.add("statictext", undefined, "显示小数点:");
decimalPlacesInput = decimalPlacesGroup.add("edittext", undefined, defaultDecimals).helpTip = "输入所需的数量的小数点后\n显示在标签的尺寸.\n默认: " + setDecimals;
decimalPlacesInput.characters = 4;
decimalPlacesInput.onActivate = function() {
restoreDefaultsButton.enabled = true;
};
infoText = optionsPanel.add("statictext", undefined, "尺寸标注");
infoText.margins = 0;
infoText.enabled = false;
infoText = optionsPanel.add("statictext", undefined, "广州知了软件有限公司");
infoText.margins = 0;
infoText.enabled = false;
infoText = optionsPanel.add("statictext", undefined, "18928899728");
infoText.margins = 0;
infoText.enabled = false;
restoreDefaultsButton = optionsPanel.add("button", undefined, "恢复默认值");
restoreDefaultsButton.alignment = "left";
restoreDefaultsButton.enabled = setFontSize != defaultFontSize || setRed != defaultColorRed || setGreen != defaultColorGreen || setBlue != defaultColorBlue || setDecimals != defaultDecimals ? true : false;
restoreDefaultsButton.onClick = function() {
restoreDefaults();
};
function restoreDefaults() {
units.value = setUnits;
fontSizeInput.text = setFontSize;
colorInputRed.text = setRed;
colorInputGreen.text = setGreen;
colorInputBlue.text = setBlue;
decimalPlacesInput.text = setDecimals;
restoreDefaultsButton.enabled = false;
$.setenv("Specify_defaultUnits", "");
$.setenv("Specify_defaultFontSize", "");
$.setenv("Specify_defaultColorRed", "");
$.setenv("Specify_defaultColorGreen", "");
$.setenv("Specify_defaultColorBlue", "");
$.setenv("Specify_defaultDecimals", "");
}
buttonGroup = specifyDialogBox.add("group");
buttonGroup.orientation = "row";
buttonGroup.alignment = "right";
buttonGroup.margins = [0, 0, 0, 0];
cancelButton = buttonGroup.add("button", undefined, "关闭");
cancelButton.size = [50, 30];
cancelButton.onClick = function() {
specifyDialogBox.close();
};
specifyButton = buttonGroup.add("button", undefined, "标注对象");
specifyButton.size = [160, 30];
specifyDialogBox.defaultElement = specifyButton;
specifyButton.onClick = function() {
startSpec();
};
try {
var specsLayer = doc.layers.SPECS;
} catch (err) {
var specsLayer = doc.layers.add();
specsLayer.name = "标注";
}
var color = new RGBColor();
var gap = 4;
var size = 6;
function startSpec() {
var objectsToSpec = new Array();
for (var index = doc.selection.length - 1; index >= 0; index--) {
objectsToSpec[index] = doc.selection[index];
}
var top = topCheckbox.value;
var left = leftCheckbox.value;
var right = rightCheckbox.value;
var bottom = bottomCheckbox.value;
fontSizeInput.active = false;
var validFontSize = /^[0-9]{1,3}(\.[0-9]{1,3})?$/.test(fontSizeInput.text);
var validRedColor = /^[0-9]{1,3}$/.test(colorInputRed.text);
var validGreenColor = /^[0-9]{1,3}$/.test(colorInputGreen.text);
var validBlueColor = /^[0-9]{1,3}$/.test(colorInputBlue.text);
if (validRedColor && validGreenColor && validBlueColor) {
color.red = colorInputRed.text;
color.green = colorInputGreen.text;
color.blue = colorInputBlue.text;
$.setenv("Specify_defaultColorRed", color.red);
$.setenv("Specify_defaultColorGreen", color.green);
$.setenv("Specify_defaultColorBlue", color.blue);
}
var validDecimalPlaces = /^[0-4]{1}$/.test(decimalPlacesInput.text);
if (validDecimalPlaces) {
decimals = decimalPlacesInput.text;
$.setenv("Specify_defaultDecimals", decimals);
}
if (selectedItems a[2]) {
bound[0] = a[2];
bound[2] = b[0];
} else {
bound[0] = b[0];
bound[2] = a[2];
}
} else {
if (a[0] >= b[0]) {
if (a[0] > b[2]) {
bound[0] = b[2];
bound[2] = a[0];
} else {
bound[0] = a[0];
bound[2] = b[2];
}
}
}
bound[1] = Math.max(a[1], b[1]);
bound[3] = Math.min(a[3], b[3]);
} else {
if (b[3] > a[3]) {
if (b[3] > a[1]) {
bound[3] = a[1];
bound[1] = b[3];
} else {
bound[3] = b[3];
bound[1] = a[1];
}
} else {
if (a[3] >= b[3]) {
if (a[3] > b[1]) {
bound[3] = b[1];
bound[1] = a[3];
} else {
bound[3] = a[3];
bound[1] = b[1];
}
}
}
bound[0] = Math.min(a[0], b[0]);
bound[2] = Math.max(a[2], b[2]);
}
specSingle(bound, where);
}
function specLabel(val, x, y, color) {
var t = doc.textFrames.add();
if (parseFloat(fontSizeInput.text) > 0) {
labelFontSize = parseFloat(fontSizeInput.text);
} else {
labelFontSize = defaultFontSize;
}
var labelFontInUnits = convertToPoints(labelFontSize);
$.setenv("Specify_defaultFontSize", labelFontInUnits);
t.textRange.characterAttributes.size = labelFontInUnits;
t.textRange.characterAttributes.alignment = StyleRunAlignmentType.center;
t.textRange.characterAttributes.fillColor = color;
var displayUnitsLabel = units.value;
$.setenv("Specify_defaultUnits", displayUnitsLabel);
var v = val;
var unitsLabel = "";
switch (doc.rulerUnits) {
case RulerUnits.Picas:
v = new UnitValue(v, "pt").as("pc");
var vd = v - Math.floor(v);
vd = 12 * vd;
v = Math.floor(v) + "p" + vd.toFixed(decimals);
break;
case RulerUnits.Inches:
v = new UnitValue(v, "pt").as("in");
v = v.toFixed(decimals);
unitsLabel = " in";
break;
case RulerUnits.Millimeters:
v = new UnitValue(v, "pt").as("mm");
v = v.toFixed(decimals);
unitsLabel = " mm";
break;
case RulerUnits.Centimeters:
v = new UnitValue(v, "pt").as("cm");
v = v.toFixed(decimals);
unitsLabel = " cm";
break;
case RulerUnits.Pixels:
v = new UnitValue(v, "pt").as("px");
v = v.toFixed(decimals);
unitsLabel = " px";
break;
default:
v = new UnitValue(v, "pt").as("pt");
v = v.toFixed(decimals);
unitsLabel = " pt";
}
if (displayUnitsLabel) {
t.contents = v + unitsLabel;
} else {
t.contents = v;
}
t.top = y;
t.left = x;
return t;
}
function convertToBoolean(string) {
switch (string.toLowerCase()) {
case "true":
return true;
break;
case "false":
return false;
break;
}
}
function setLineStyle(path, color) {
path.filled = false;
path.stroked = true;
path.strokeColor = color;
path.strokeWidth = 0.5;
return path;
}
function group(layer, items, isDuplicate) {
var gg = layer.groupItems.add();
for (var i = items.length - 1; i >= 0; i--) {
if (items[i] != gg) {
if (isDuplicate) {
newItem = items[i].duplicate(gg, ElementPlacement.PLACEATBEGINNING);
} else {
items[i].move(gg, ElementPlacement.PLACEATBEGINNING);
}
}
}
return gg;
}
function convertToPoints(value) {
switch (doc.rulerUnits) {
case RulerUnits.Picas:
value = new UnitValue(value, "pc").as("pt");
break;
case RulerUnits.Inches:
value = new UnitValue(value, "in").as("pt");
break;
case RulerUnits.Millimeters:
value = new UnitValue(value, "mm").as("pt");
break;
case RulerUnits.Centimeters:
value = new UnitValue(value, "cm").as("pt");
break;
case RulerUnits.Pixels:
value = new UnitValue(value, "px").as("pt");
break;
default:
value = new UnitValue(value, "pt").as("pt");
}
return value;
}
function convertToUnits(value) {
switch (doc.rulerUnits) {
case RulerUnits.Picas:
value = new UnitValue(value, "pt").as("pc");
break;
case RulerUnits.Inches:
value = new UnitValue(value, "pt").as("in");
break;
case RulerUnits.Millimeters:
value = new UnitValue(value, "pt").as("mm");
break;
case RulerUnits.Centimeters:
value = new UnitValue(value, "pt").as("cm");
break;
case RulerUnits.Pixels:
value = new UnitValue(value, "pt").as("px");
break;
default:
value = new UnitValue(value, "pt").as("pt");
}
return value;
}
switch (selectedItems) {
case 0:
beep();
alert("请至少选择1个对象,然后重试.");
break;
default:
specifyDialogBox.show();
break;
}
} else {
alert("没有要指定的对象. \n请打开文档继续.");
}
2.作者答疑
如有疑问,请留言。
提示: 作者知了-联系方式1 提示: 作者知了-联系方式2