You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Adobe Illustrator Extendscript脚本问题:单独运行正常,UI按钮调用失效

解决Illustrator ExtendScript工具在ScriptUI按钮调用时失效的问题

嘿,我之前也踩过ScriptUI和Illustrator ExtendScript交互的坑!你的问题核心原因几乎可以确定是ScriptUI回调的上下文问题:单独运行脚本时,代码直接在Illustrator的主上下文执行,selection能正确获取当前文档的选中对象;但通过ScriptUI按钮触发时,回调函数的上下文绑定到了UI组件上,直接调用全局selection会拿不到正确的选中项(甚至返回空)。

快速修复方案

只需要把全局的selection替换为明确指定当前活动文档的选中对象,就能解决90%的这类问题:

修改后的完整脚本示例

function proofTool() {
    // 明确获取当前活动文档,避免上下文混乱
    var doc = app.activeDocument;
    var items = doc.selection;
    
    if (items.length != 2) {
        alert("请先选中并编组作品,再选中名为'Guide'的参考对象后运行此脚本。");
    } else {
        // 分配选中对象(补全你原本的逻辑)
        var targetGroup, guideObj;
        // 区分组和Guide对象的逻辑,可根据需求调整
        for (var i = 0; i < items.length; i++) {
            if (items[i].typename === "GroupItem") {
                targetGroup = items[i];
            } else if (items[i].name === "Guide") {
                guideObj = items[i];
            }
        }
        
        // 执行对齐和按比例缩放的逻辑(示例)
        if (targetGroup && guideObj) {
            // 对齐逻辑:匹配Guide的位置
            targetGroup.left = guideObj.left;
            targetGroup.top = guideObj.top;
            
            // 按比例缩放:根据Guide尺寸调整组(保持等比例)
            var scaleX = guideObj.width / targetGroup.width;
            var scaleY = guideObj.height / targetGroup.height;
            var scaleFactor = Math.min(scaleX, scaleY);
            targetGroup.resize(scaleFactor * 100, scaleFactor * 100, true, true, true, true, 1, Transformation.DOCUMENTORIGIN);
        } else {
            alert("请确保选中一个编组对象和名为'Guide'的参考对象!");
        }
    }
}

// ScriptUI按钮调用示例(确保回调正确触发核心函数)
var win = new Window("dialog", "对齐缩放工具");
win.add("button", undefined, "执行对齐缩放").onClick = function() {
    proofTool();
    win.close();
};
win.show();

关键修改点

  • var items = selection;改成var doc = app.activeDocument; var items = doc.selection;,明确指定从当前活动文档获取选中项,避免ScriptUI上下文干扰
  • 增加了选中对象的类型/名称判断逻辑(可根据你的实际需求调整)
  • ScriptUI按钮的回调直接调用独立的proofTool()函数,确保核心逻辑在Illustrator的文档上下文执行

额外注意事项

  • 如果脚本涉及复杂文档操作,建议在核心函数开头都先缓存app.activeDocument,避免多次调用可能的上下文切换问题
  • 测试时确保Illustrator有打开的文档,避免app.activeDocument抛出错误

内容的提问来源于stack exchange,提问作者Derek Glissman

火山引擎 最新活动