【问题标题】:Edit running script and replace an array编辑运行脚本并替换数组
【发布时间】:2022-11-11 22:17:21
【问题描述】:

我正在编写一个应该更新自身的脚本,但我被卡住了。
基本上我必须替换一个包含 RGB 颜色数组的变量(该值在此脚本期间更改)并覆盖 .jsx 文件中的此变量。
为了清楚起见,我举一个例子:

var RGBColor = [0, 0, 0]; //Black RGB color
var RGBColor2 = RGBColor;
// The script runs and change RGBColor2 value to [0.2, 0.55, 0.2]
var UpdateFile = function () { 
    var JSX = File ($.fileName);
    JSX.open ("e");
    JSX.write ((JSX.read ()).replace (RGBColor, RGBColor2));
    JSX.close ();
    }
UpdateFile ();

这是我理论上应该做的,但我不能以任何方式替换变量(我尝试了所有方法,即使使用方法“open(”r”)”,“read”,“close”,“open(”w “)“, “写”)。
有谁知道如何使这个脚本工作或知道如何编写它?


更新

最终脚本将是一个带有六个滑块的 scriptui 面板,三个用于第一种颜色(R、G、B),三个用于第二种颜色。
当按下“应用”按钮时,脚本将不得不替换脚本内的 rgb 变量。
在弄乱了食尸鬼傻瓜的代码后,我决定替换变量而不是数组,因为它看起来更困难。但是我不能覆盖变量。
这是代码:

    var Red1 = 0;
    var Green1 = 0;
    var Blue1 = 0;
    var Red2 = 1;
    var Green2 = 1;
    var Blue2 = 1;
    var FirstColor = [Red1, Green1, Blue1];
    var SecondColor = [Red2, Green2, Blue2];
    var MainPanel = new Window ("dialog", "Pannello1");
    var Text1 = MainPanel.add ("statictext");
    Text1.text = "First color";
    var RSlider1 = MainPanel.add ("slider");
    RSlider1.minvalue = 0;
    RSlider1.maxvalue = 255;
    RSlider1.value = Math.round (FirstColor[0] * 255);
    var RNumber1 = MainPanel.add ("statictext", undefined, RSlider1.value);
    RNumber1.preferredSize.width = 25;
    RNumber1.graphics.foregroundColor = RNumber1.graphics.newPen (RNumber1.graphics.PenType.SOLID_COLOR, [1, 0, 0], 1);
    RNumber1.graphics.disabledForegroundColor = RNumber1.graphics.foregroundColor;
    RNumber1.graphics.font = ScriptUI.newFont (RNumber1.graphics.font.name, "Bold", RNumber1.graphics.font.size);
    var GSlider1 = MainPanel.add ("slider");
    GSlider1.minvalue = 0;
    GSlider1.maxvalue = 255;
    GSlider1.value = Math.round (FirstColor[1] * 255);
    var GNumber1 = MainPanel.add ("statictext", undefined, GSlider1.value);
    GNumber1.preferredSize.width = 25;
    GNumber1.graphics.foregroundColor = GNumber1.graphics.newPen (GNumber1.graphics.PenType.SOLID_COLOR, [0, 1, 0], 1);
    GNumber1.graphics.disabledForegroundColor = GNumber1.graphics.foregroundColor;
    GNumber1.graphics.font = ScriptUI.newFont (GNumber1.graphics.font.name, "Bold", GNumber1.graphics.font.size);
    var BSlider1 = MainPanel.add ("slider");
    BSlider1.minvalue = 0;
    BSlider1.maxvalue = 255;
    BSlider1.value = Math.round (FirstColor[2] * 255);
    var BNumber1 = MainPanel.add ("statictext", undefined, BSlider1.value);
    BNumber1.preferredSize.width = 25;
    BNumber1.graphics.foregroundColor = BNumber1.graphics.newPen (BNumber1.graphics.PenType.SOLID_COLOR, [0, 0, 1], 1);
    BNumber1.graphics.disabledForegroundColor = BNumber1.graphics.foregroundColor;
    BNumber1.graphics.font = ScriptUI.newFont (BNumber1.graphics.font.name, "Bold", BNumber1.graphics.font.size);
    RSlider1.onChanging = GSlider1.onChanging = BSlider1.onChanging = function () {
        RNumber1.text = Math.round (RSlider1.value);
        GNumber1.text = Math.round (GSlider1.value);
        BNumber1.text = Math.round (BSlider1.value);
        Red1 = Math.floor ((Math.round (RSlider1.value) / 255) * 100) / 100;
        Green1 = Math.floor ((Math.round (GSlider1.value) / 255) * 100) / 100;
        Blue1 = Math.floor ((Math.round (BSlider1.value) / 255) * 100) / 100;
        }
    var Text2 = MainPanel.add ("statictext");
    Text2.text = "Second color";
    var RSlider2 = MainPanel.add ("slider");
    RSlider2.minvalue = 0;
    RSlider2.maxvalue = 255;
    RSlider2.value = Math.round (SecondColor[0] * 255);
    var RNumber2 = MainPanel.add ("statictext", undefined, RSlider2.value);
    RNumber2.preferredSize.width = 25;
    RNumber2.graphics.foregroundColor = RNumber2.graphics.newPen (RNumber2.graphics.PenType.SOLID_COLOR, [1, 0, 0], 1);
    RNumber2.graphics.disabledForegroundColor = RNumber2.graphics.foregroundColor;
    RNumber2.graphics.font = ScriptUI.newFont (RNumber2.graphics.font.name, "Bold", RNumber2.graphics.font.size);
    var GSlider2 = MainPanel.add ("slider");
    GSlider2.minvalue = 0;
    GSlider2.maxvalue = 255;
    GSlider2.value = Math.round (SecondColor[1] * 255);
    var GNumber2 = MainPanel.add ("statictext", undefined, GSlider2.value);
    GNumber2.preferredSize.width = 25;
    GNumber2.graphics.foregroundColor = GNumber2.graphics.newPen (GNumber2.graphics.PenType.SOLID_COLOR, [0, 1, 0], 1);
    GNumber2.graphics.disabledForegroundColor = GNumber2.graphics.foregroundColor;
    GNumber2.graphics.font = ScriptUI.newFont (GNumber2.graphics.font.name, "Bold", GNumber2.graphics.font.size);
    var BSlider2 = MainPanel.add ("slider");
    BSlider2.minvalue = 0;
    BSlider2.maxvalue = 255;
    BSlider2.value = Math.round (SecondColor[2] * 255);
    var BNumber2 = MainPanel.add ("statictext", undefined, BSlider2.value);
    BNumber2.preferredSize.width = 25;
    BNumber2.graphics.foregroundColor = BNumber2.graphics.newPen (BNumber2.graphics.PenType.SOLID_COLOR, [0, 0, 1], 1);
    BNumber2.graphics.disabledForegroundColor = BNumber2.graphics.foregroundColor;
    BNumber2.graphics.font = ScriptUI.newFont (BNumber2.graphics.font.name, "Bold", BNumber2.graphics.font.size);
    RSlider2.onChanging = GSlider2.onChanging = BSlider2.onChanging = function () {
        RNumber2.text = Math.round (RSlider2.value);
        GNumber2.text = Math.round (GSlider2.value);
        BNumber2.text = Math.round (BSlider2.value);
        Red2 = Math.floor ((Math.round (RSlider2.value) / 255) * 100) / 100;
        Green2 = Math.floor ((Math.round (GSlider2.value) / 255) * 100) / 100;
        Blue2 = Math.floor ((Math.round (BSlider2.value) / 255) * 100) / 100;
        }
    var Apply = MainPanel.add ("button", undefined, "Apply changes");
    Apply.onClick = function () {
        var JSX = File ($.fileName);
        JSX.open ("r");
        var JSXXX = JSX.read ();
        JSX.close ();
        JSX.open ("w");
//  This part is not clear to me. What should I replace the colors with?
        JSXXX = JSXXX.replace (Red1, FirstColor [0]);
        JSXXX = JSXXX.replace (Green1, FirstColor [1]);
        JSXXX = JSXXX.replace (Blue1, FirstColor [2]);
        JSXXX = JSXXX.replace (Red2, SecondColor [0]);
        JSXXX = JSXXX.replace (Green2, SecondColor [1]);
        JSXXX = JSXXX.replace (Blue2, SecondColor [2]);
        JSX.write(JSXXX);
        JSX.close ();
        MainPanel.close ();
        }
    alert ("Color 1 : " + Red1 + " - " + Green1 + " - " + Blue1);
    alert ("Color 2 : " + Red2 + " - " + Green2 + " - " + Blue2);
    MainPanel.show ();

该对话框将包含在最终脚本中,并将用于更改对话框本身的颜色。

【问题讨论】:

  • 您是否正在尝试更改正在运行的脚本中的 RGB 值???
  • 是的,但是这个例子不是很清楚,所以我会更新这个问题。

标签: javascript adobe-indesign adobe-illustrator extendscript photoshop-script


【解决方案1】:

不太确定你在追求什么(见上面的注释)。但是,这将加载到第二个 jsx 文件中并更改其值。只是与它正在运行的不一样。

您的脚本失败,因为您没有更新 RGB 值

var RGBColor2 = RGBColor;

其次,我不确定为什么,但是字符串替换不起作用。但是,正则表达式将替换文本。

var RGBColor = [0, 0, 0]; //Black RGB color
var RGBColor2 = [0.2, 0.55, 0.2];

// The script runs and change RGBColor2 value to [0.2, 0.55, 0.2]
var UpdateFile = function () 
{ 
    var myFile = "C:\temp\my_temp.jsx"
    var JSX = File (myFile);
    JSX.open ("e"); //replaces contents
    var r = JSX.read ();
    var regEx = new RegExp(/[0, 0, 0]/gmi);
    r = r.replace(regEx, RGBColor2);
    JSX.write(r);
    JSX.close ();
}

UpdateFile ();

【讨论】:

  • 在这一点上,我认为“RGBColor”可能是一个保留字。 RegExp 的问题是第一次更改后该值不会是 0,0,0,因此它不会多次工作。我试图在 scriptui 对话框中使用 RGBColor2 值作为 RGBColor 的占位符,因此当对 RGBColor 进行更改时,脚本不会发生冲突。这个例子仍然很糟糕,所以我会更新这个问题。
  • 使用 Action Manager 代码可能有一种解决方法。试试Photoshop Ecosystem