- 精华
- 活跃值
-
- 积分
- 45
- 违规
-
- 印币
-
- 鲜花值
-
- 在线时间
- 小时
累计签到:3 天 连续签到:1 天
|
我编写了一个画板适合对象脚本,想让脚本适合蒙版,哪位大神帮看看,谢谢了!
/*
Artboard To Selection
Copyright 2022 William Campbell
All Rights Reserved
https://www.marspremedia.com/contact
Permission to use, copy, modify, and/or distribute this software
for any purpose with or without fee is hereby granted.
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
(function () {
var defaults = {
margin: 30,
// units: "像素"
// units: "点"
// units: "派克"
// units: "英寸"
units: "毫米"
// units: "厘米"
};
var title = "Artboard To Selection";
if (!/Illustrator/i.test(app.name)) {
alert("Script for Illustrator", title, false);
return;
}
// Script variables.
var doc;
var measurementUnits;
var measurementUnitsShort;
// Reusable UI variables.
var g; // group
var p; // panel
var w; // window
// Permanent UI variables.
var btnCancel;
var btnOk;
var inpMargin;
var listUnits;
// SETUP
measurementUnits = [
"像素",
"点",
"派克",
"英寸",
"毫米",
"厘米"
];
measurementUnitsShort = [
"px",
"pt",
"pc",
"in",
"mm",
"cm"
];
// Script requires open document.
if (!app.documents.length) {
alert("打开文档", title, false);
return;
}
doc = app.activeDocument;
// Need at least one element selected.
if (!doc.selection[0]) {
alert("Select something", title, false);
return;
}
// Script doesn't work in Isolation Mode.
if (doc.layers[0].name == "隔离模式") {
alert("Exit Isolation Mode before running script", title, false);
return;
}
// CREATE USER INTERFACE
w = new Window("dialog", title);
w.alignChildren = "fill";
// Panel.
p = w.add("panel");
p.alignChildren = "left";
g = p.add("group");
g.add("statictext", undefined, "出血:");
inpMargin = g.add("edittext");
inpMargin.preferredSize.width = 50;
listUnits = g.add("dropdownlist", undefined, measurementUnits);
listUnits.preferredSize.width = 100;
// Action Buttons.
g = w.add("group");
g.alignment = "center";
btnCancel = g.add("button", undefined, "取消");
btnOk = g.add("button", undefined, "确定");
// Panel Copyright.
p = w.add("panel");
p.add("statictext", undefined, "Copyright 2022 William Campbell");
// SET UI VALUES
inpMargin.text = defaults.margin;
listUnits.selection = listUnits.find(defaults.units) || 0;
listUnits.priorIndex = listUnits.selection.index;
// UI ELEMENT EVENT HANDLERS
inpMargin.onChange = function () {
validateFloat(this);
};
listUnits.onChange = function () {
var index;
var mu1;
var mu2;
var convert = function (uiEdit) {
if (/,/.test(uiEdit.text)) {
// Has comma: appears decimal comma.
// Replace comma with point, then restore comma.
uiEdit.text = String(parseFloat(UnitValue(Number(uiEdit.text.replace(",", ".")), mu1).as(mu2).toFixed(4))).replace(".", ",");
} else {
// Default: decimal point.
uiEdit.text = String(parseFloat(UnitValue(Number(uiEdit.text), mu1).as(mu2).toFixed(4)));
}
};
index = this.selection.index;
if (index != this.priorIndex) {
// Units have changed.
mu1 = measurementUnitsShort[this.priorIndex];
mu2 = measurementUnitsShort[index];
convert(inpMargin);
}
this.priorIndex = index;
};
btnOk.onClick = function () {
w.close(1);
};
btnCancel.onClick = function () {
w.close(0);
};
// DISPLAY THE DIALOG
if (w.show() == 1) {
try {
process();
} catch (e) {
alert("An error has occurred.\nLine " + e.line + ": " + e.message, title, true);
}
}
//====================================================================
// END PROGRAM EXECUTION, BEGIN FUNCTIONS
//====================================================================
function process() {
var artboard;
var docScaleFactor;
var padding;
var vb;
docScaleFactor = doc.scaleFactor || 1;
padding = valueAsPoints(inpMargin, listUnits) / docScaleFactor;
// Get the bounds of the selected items considering masks
vb = getBoundsWithMask(doc.selection);
artboard = doc.artboards[doc.artboards.getActiveArtboardIndex()];
artboard.artboardRect = [
vb[0] - padding,
vb[1] + padding,
vb[2] + padding,
vb[3] - padding
];
}
function validateFloat(uiEdit) {
var s;
var v;
// Remove non-digits.
s = uiEdit.text.replace(/[^0-9.]/g, "");
if (s != uiEdit.text) {
alert("Numeric input only.\nNon-numeric characters removed.", " ", false);
}
// No more than one decimal point.
s = s.replace(/\.{2,}/g, ".");
v = parseFloat(s) || 0;
uiEdit.text = v.toString();
}
function valueAsPoints(uiEdit, uiList) {
var mu;
var v;
mu = measurementUnitsShort[uiList.selection.index];
v = parseFloat(uiEdit.text) || 0;
return UnitValue(v, mu).as("pt");
}
// Function to get the bounds of selected items considering masks
function getBoundsWithMask(selectedItems) {
var allItems = [];
for (var i = 0; i < selectedItems.length; i++) {
var item = selectedItems[i];
if (item.typename === "GroupItem" && item.clipped) {
var groupItems = item.pageItems;
for (var j = 0; j < groupItems.length; j++) {
allItems.push(groupItems[j]);
}
} else {
allItems.push(item);
}
}
// Initialize bounds
var minX = Infinity;
var minY = Infinity;
var maxX = -Infinity;
var maxY = -Infinity;
// Calculate bounds
for (var k = 0; k < allItems.length; k++) {
var bounds = allItems[k].geometricBounds;
minX = Math.min(minX, bounds[0]);
minY = Math.min(minY, bounds[1]);
maxX = Math.max(maxX, bounds[2]);
maxY = Math.max(maxY, bounds[3]);
}
return [minX, minY, maxX, maxY];
}
})();
|
 组图打开中,请稍候......
|