Photoshop CEP:JSX 对象到 JS
Photoshop CEP: JSX Object to JS
我 运行 遇到了在 Photoshop 中使用 evalScript 将数据从 JSX 发送到 JS 的问题。
在下面的示例中,我尝试将对象 docInfo 中的文档宽度、高度和标尺单位发送回我的 CEP 面板 JS。
问题是,当我解析对象时,它将三个属性全部显示为对象,而我认为它们应该都是字符串。
JS:
function psdInfo() {
csInterface.evalScript("getDocInfo()", function(res) {
if (EvalScript_ErrMessage == res) {
console.error('EvalScript_ErrMessage and res is' + typeof res + ' res is ' + res);
}
else {
var o = JSON.parse(res);
var str = "Object received from JSX:\n";
for (var prop in o) {
str += prop + " [" + typeof o[prop] +" ]: " + o[prop] + ".\n";
}
console.log(str);
}
});
}
JSX:
function getDocInfo()
{
var doc = app.activeDocument,
docWidth = doc.width,
docHeight = doc.height,
originalRulerUnits = app.preferences.rulerUnit;
var docInfo = {
width: docWidth,
height: docHeight,
originalRulerUnits: originalRulerUnits
};
return JSON.stringify(docInfo);
}
我的期望:
Object received from JSX:
width [string ]: '1920 px'.
height [string ]: '1920 px'.
originalRulerUnits [string ]: 'UNITS.PIXELS'.
我得到的:
Object received from JSX:
width [object ]: [object Object].
height [object ]: [object Object].
originalRulerUnits [object ]: [object Object].
我的问题是 - 我做错了什么吗?这些实际上是对象吗?
如果是,我如何获得我想要的信息?我如何 parse/convert 将 JSX 端的对象字符串化,或者我应该在 JS 端这样做?
操作方法的示例非常有用。我正在尝试学习 Adobe CEP 面板。
那些特定于 ExtendScript 定义的 Photoshop 对象:高度和宽度是 UnitValues
(它们同时带有值和单位)并且 rulerUnits 是 Units
,JSON can'没有正确地将它们作为对象从 JSX 传递给 JS。因此,在传递 docInfo
之前,您需要确保已使用 .toString()
方法将它们转换为字符串:
function getDocInfo()
{
var doc = app.activeDocument,
docWidth = doc.width.toString(),
docHeight = doc.height.toString(),
originalRulerUnits = app.preferences.rulerUnits.toString();
var docInfo = {
width: docWidth,
height: docHeight,
originalRulerUnits: originalRulerUnits
};
return JSON.stringify(docInfo);
}
结果:
{"width":"1024 px","height":"1024 px","originalRulerUnits":"Units.PIXELS"}
您可以在 JavaScript Tools Guide pdf 中阅读有关特定对象的更多信息:有 File
、Folder
、SolidColor
和其他。
我 运行 遇到了在 Photoshop 中使用 evalScript 将数据从 JSX 发送到 JS 的问题。
在下面的示例中,我尝试将对象 docInfo 中的文档宽度、高度和标尺单位发送回我的 CEP 面板 JS。
问题是,当我解析对象时,它将三个属性全部显示为对象,而我认为它们应该都是字符串。
JS:
function psdInfo() {
csInterface.evalScript("getDocInfo()", function(res) {
if (EvalScript_ErrMessage == res) {
console.error('EvalScript_ErrMessage and res is' + typeof res + ' res is ' + res);
}
else {
var o = JSON.parse(res);
var str = "Object received from JSX:\n";
for (var prop in o) {
str += prop + " [" + typeof o[prop] +" ]: " + o[prop] + ".\n";
}
console.log(str);
}
});
}
JSX:
function getDocInfo()
{
var doc = app.activeDocument,
docWidth = doc.width,
docHeight = doc.height,
originalRulerUnits = app.preferences.rulerUnit;
var docInfo = {
width: docWidth,
height: docHeight,
originalRulerUnits: originalRulerUnits
};
return JSON.stringify(docInfo);
}
我的期望:
Object received from JSX:
width [string ]: '1920 px'.
height [string ]: '1920 px'.
originalRulerUnits [string ]: 'UNITS.PIXELS'.
我得到的:
Object received from JSX:
width [object ]: [object Object].
height [object ]: [object Object].
originalRulerUnits [object ]: [object Object].
我的问题是 - 我做错了什么吗?这些实际上是对象吗?
如果是,我如何获得我想要的信息?我如何 parse/convert 将 JSX 端的对象字符串化,或者我应该在 JS 端这样做?
操作方法的示例非常有用。我正在尝试学习 Adobe CEP 面板。
那些特定于 ExtendScript 定义的 Photoshop 对象:高度和宽度是 UnitValues
(它们同时带有值和单位)并且 rulerUnits 是 Units
,JSON can'没有正确地将它们作为对象从 JSX 传递给 JS。因此,在传递 docInfo
之前,您需要确保已使用 .toString()
方法将它们转换为字符串:
function getDocInfo()
{
var doc = app.activeDocument,
docWidth = doc.width.toString(),
docHeight = doc.height.toString(),
originalRulerUnits = app.preferences.rulerUnits.toString();
var docInfo = {
width: docWidth,
height: docHeight,
originalRulerUnits: originalRulerUnits
};
return JSON.stringify(docInfo);
}
结果:
{"width":"1024 px","height":"1024 px","originalRulerUnits":"Units.PIXELS"}
您可以在 JavaScript Tools Guide pdf 中阅读有关特定对象的更多信息:有 File
、Folder
、SolidColor
和其他。