- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
虽然我设法放置了一个功能脚本来一起更改所选图层的字典语言,但这还不是我所需要的。
我目前正在检索我选择的图层的索引,使用它们来获取图层名称——这是有问题的部分——然后根据在我显示的自定义对话框。
层名称的使用是一个非常不成熟的解决方案,我需要精确度,我需要能够根据层 ID 或索引更改语言。不仅我的脚本容易出现名称冲突,而且我不知道那些选定的层将位于文档的根目录还是在 5 个组堆栈中。
这是我当前的代码:
主要功能
function main() {
// Create window with language selection and retrieve selected value
var lang = createWindow();
// Retrieve selected layers
var selectedLayers = getSelectedLayersIdx();
// Look at each entry and change language when possible
for(var a in selectedLayers){
try {
setLangByIndex(Number( selectedLayers[a]), lang );
} catch(err) { }
}
}
(createWindow 返回一个 lang 值,跳过那个)
迈克得到 Idx
function getSelectedLayersIdx(){
var selectedLayers = new Array;
var ref = new ActionReference();
ref.putEnumerated( charIDToTypeID('Dcmn'), charIDToTypeID('Ordn'), charIDToTypeID('Trgt') );
var desc = executeActionGet(ref);
if( desc.hasKey( stringIDToTypeID( 'targetLayers' ) ) ) {
desc = desc.getList( stringIDToTypeID( 'targetLayers' ));
var c = desc.count
var selectedLayers = new Array();
for(var i=0;i<c;i++) {
try{
activeDocument.backgroundLayer;
selectedLayers.push( desc.getReference( i ).getIndex() );
} catch(e) {
selectedLayers.push( desc.getReference( i ).getIndex()+1 );
}
}
} else {
var ref = new ActionReference();
ref.putProperty( charIDToTypeID('Prpr') , charIDToTypeID( 'ItmI' ));
ref.putEnumerated( charIDToTypeID('Lyr '), charIDToTypeID('Ordn'), charIDToTypeID('Trgt') );
try {
activeDocument.backgroundLayer;
selectedLayers.push( executeActionGet(ref).getInteger(charIDToTypeID( 'ItmI' ))-1);
} catch(e) {
selectedLayers.push( executeActionGet(ref).getInteger(charIDToTypeID( 'ItmI' )));
}
}
return selectedLayers;
}
设置语言的函数
function setLangByIndex(idx, lang){
ref = new ActionReference();
ref.putProperty( charIDToTypeID("Prpr") , charIDToTypeID( "Nm " ));
ref.putIndex( charIDToTypeID( "Lyr " ), idx );
var name = executeActionGet(ref).getString(charIDToTypeID( "Nm " ));
var el = activeDocument.layers.getByName( name );
// Temp quick block; MUST UPDATE IN CASE OF NEW LANGUAGES
if (lang == 'pt_br' )
el.textItem.language = Language.BRAZILLIANPORTUGUESE;
else if (lang == 'en_us' )
el.textItem.language = Language.ENGLISHUSA;
else
el.textItem.language = Language.ENGLISHUK;
}
我尝试过的低效解决方法:
最佳答案
在我注意到一些与段落样式相关的恼人故障(您可以将其定义为 PS 上的文本的默认样式,而不是 JS 对象)之后,我放弃了顽固并停止避免通过索引数组进行新循环完成后重新选择图层。
/*
* Based in Mike Hale's "getSelectedLayersIdx" script and Adobe's Scripting Listener dump.
Based the panel on Davide Barranca's code: http://www.davidebarranca.com/2012/10/scriptui-window-in-photoshop-palette-vs-dialog/
Useful Resources:
Photoshop char list: http://www.pcpix.com/Photoshop/char.htm
ActionDescriptor methods: http://jongware.mit.edu/pscs5js_html/psjscs5/pc_ActionDescriptor.html
TextItem methods: http://jongware.mit.edu/pscs5js_html/psjscs5/pc_TextItem.html
You can fish for language codes here: http://wingp.googlecode.com/svn/photogp/photoshopapi/photoshop/PIStringTerminology.h
*/
/* ______________________________ SCRIPT ______________________________ */
var scriptAlert = "Language Change says";
// MUST UPDATE IF YOU WANT TO CHANGE THE AVAILABLE LANGUAGES
// The available languages, as { text displayed on dialog window : codename }. See notes above for more language codes
var langs = {};
langs['Português (Brasil)'] = 'brazilianPortugueseLanguage';
langs['English (UK)'] = 'ukenglishLanguage';
langs['English (USA)'] = 'englishLanguage';
if(app.documents.length>0){ // the script will be executed only if an active document exists.
var imgName = activeDocument.name;
var extreme= imgName.substr(imgName.length - 5, 5);
var dot = extreme.lastIndexOf(".");
if(dot == -1) { // Checks if the active document was saved or not.
alert("Please, save your document!", scriptAlert, false);
} else {
main(); // if the active document was saved, go ahead!
}
}
function createWindow() { // Creates a panel asking for input
var isDone, win, windowResource, radio_group, cancel, rb, i;
//sentinel variable
isDone = false;
cancel = false;
// Build dialog radio buttons
i = 0;
for( var k in langs ) {
if( i==0 )
rb = "rb"+i+": RadioButton { text: '"+k+"', value: 1 }, \ ";
else
rb += "rb"+i+": RadioButton { text: '"+k+"' }, \ ";
i++;
}
windowResource = "palette { \
orientation: 'column', \
alignChildren: ['fill', 'top'], \
preferredSize:[300, 130], \
text: 'Change Spell Check Language', \
margins:15, \
\
optPanel: Panel { \
orientation: 'row', \
alignChildren: 'left', \
margins:15, \
text: ' Select the desired dictionary language for the select text ', \ "+ rb + " \
} \
\
bottomGroup: Group{ \
cancelButton: Button { text: 'Cancel', properties:{name:'cancel'}, size: [120,24], alignment:['right', 'center'] }, \
applyButton: Button { text: 'Ok', properties:{name:'ok'}, size: [120,24], alignment:['right', 'center'], active: true }, \
}\
}";
win = new Window(windowResource);
radio_group = win.optPanel; // set group
// Match options with language
function selected_rbutton (rbuttons)
{
for (var i = 0; i < rbuttons.children.length; i++)
if (rbuttons.children[i].value == true)
return langs[rbuttons.children[i].text];
}
win.bottomGroup.cancelButton.onClick = function() {
win.close();
return cancel = true;
};
// Button listeners
win.bottomGroup.applyButton.onClick = function() {
return isDone = true;
};
// don't forget this one!
win.onClose = function() {
return cancel = true;
};
win.addEventListener("keydown", function (k)
{
if (k.keyName == 'Enter')
return isDone = true;
});
win.show();
while (isDone === false) {
try {
app.refresh();
} catch(err) { // Esc cancels without errors
return false;
}
}
return cancel ? false : selected_rbutton (radio_group); // return value, or false if cancelled
}
function getSelectedLayersIdx(){ // Gets array of indexes of selected layers
var selectedLayers = new Array;
var ref = new ActionReference();
ref.putEnumerated( charIDToTypeID('Dcmn'), charIDToTypeID('Ordn'), charIDToTypeID('Trgt') );
var desc = executeActionGet(ref);
if( desc.hasKey( stringIDToTypeID( 'targetLayers' ) ) ) {
desc = desc.getList( stringIDToTypeID( 'targetLayers' ));
var c = desc.count
var selectedLayers = new Array();
for(var i=0;i<c;i++) {
try{
activeDocument.backgroundLayer;
selectedLayers.push( desc.getReference( i ).getIndex() );
} catch(e) {
selectedLayers.push( desc.getReference( i ).getIndex()+1 );
}
}
} else {
var ref = new ActionReference();
ref.putProperty( charIDToTypeID('Prpr') , charIDToTypeID( 'ItmI' ));
ref.putEnumerated( charIDToTypeID('Lyr '), charIDToTypeID('Ordn'), charIDToTypeID('Trgt') );
try {
activeDocument.backgroundLayer;
selectedLayers.push( executeActionGet(ref).getInteger(charIDToTypeID( 'ItmI' ))-1);
} catch(e) {
selectedLayers.push( executeActionGet(ref).getInteger(charIDToTypeID( 'ItmI' )));
}
}
return selectedLayers;
}
function selectLayerByIndex( selectedLayers, add ){ // Selects layers by index. If fed an array + true add, selects them, otherwise provide a single value so it selects a single layer
if (typeof(add)==='undefined') add = false;
if ( add ) // If Add it's an array
for(var a in selectedLayers){
var desc = new ActionDescriptor();
var ref = new ActionReference();
ref.putIndex( charIDToTypeID( "Lyr " ), Number(selectedLayers[a]) );
desc.putReference( charIDToTypeID( "null" ), ref );
desc.putEnumerated( stringIDToTypeID( "selectionModifier" ), stringIDToTypeID( "selectionModifierType" ), stringIDToTypeID( "addToSelection" ) );
var idMkVs = charIDToTypeID( "MkVs" );
desc.putBoolean( charIDToTypeID( "MkVs" ), false );
executeAction( charIDToTypeID( "slct" ), desc, DialogModes.NO );
}
else // Else I just need to make this layer active, it's a number
{
var desc = new ActionDescriptor();
var ref = new ActionReference();
var idLyr = charIDToTypeID( "Lyr " );
ref.putIndex( charIDToTypeID( "Lyr " ), selectedLayers );
desc.putReference( charIDToTypeID( "null" ), ref );
desc.putBoolean( charIDToTypeID( "MkVs" ), false );
executeAction( charIDToTypeID( "slct" ), desc, DialogModes.NO );
}
}
function setLangByIndex( idx, lang ){ // Sets the dictionary language for a text layer based on its index
// Make layer active
selectLayerByIndex( idx );
// And do tiny override
var textObj = new ActionDescriptor();
var target = new ActionReference();
target.putProperty( charIDToTypeID( "Prpr" ), charIDToTypeID( "TxtS" ) ); // desired property: text style
target.putEnumerated( charIDToTypeID( "TxLr" ), charIDToTypeID( "Ordn" ), charIDToTypeID( "Trgt" ) ); // the active layer
textObj.putReference( charIDToTypeID( "null" ), target );
var textStyle = new ActionDescriptor();
textStyle.putInteger( stringIDToTypeID( "textOverrideFeatureName" ), 808466225 );
textStyle.putInteger( stringIDToTypeID( "typeStyleOperationType" ), 3 );
textStyle.putEnumerated( stringIDToTypeID( "textLanguage" ), stringIDToTypeID( "textLanguage" ), stringIDToTypeID( lang ) );
textObj.putObject( charIDToTypeID( "T " ), charIDToTypeID( "TxtS" ), textStyle ); // to (end); text style, desc.
executeAction( charIDToTypeID( "setd" ), textObj, DialogModes.NO ); // execute
}
////////////////////////////////////
// Main function
function main() {
// Create window with language selection and retrieve selected value
var lang = createWindow();
if ( !lang ) // If cancelled please stop
return;
// Retrieve selected layers
var selectedLayers = getSelectedLayersIdx();
// Look at each entry and change language when possible; otherwise skip to next item
for(var k in selectedLayers){
try {
setLangByIndex(Number(selectedLayers[k]), lang);
} catch(err) {
continue;
}
}
selectLayerByIndex( selectedLayers, true );
}
关于javascript - 使用 photoshop 脚本更改选定的文本图层语言,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30632255/
我有十二个指向不同类别的链接。作为用户定位的一种方式,我想强调用户现在所在的类别( - 按钮)。 如何在 CSS 中实现这一点?我读到了 selected和 active ,但我还没能让它发挥作用。
我想通过单击按钮来获取选择框中的所有选项值(选定/未选定)。我怎样才能做到这一点? 最佳答案 我认为这是使用 Traversing/map 的好机会方法: var valuesArray = $("#
我正在尝试构建一个计算器,其中包含两个数字的两个 TextView 字段。我弄清楚了如何使用“应用程序内”数字键盘输入顶部数字 Operand 1 [textView] 的数字(我知道使用 EditT
我有一个简单的 jQuery $("span.value"),它选择包含文本的节点。此文本保证为整数。如何计算所有选定节点文本的总和,并将总和放入另一个节点? 3 4 5 ? 最佳答案 你可以这样做:
我从同一台服务器上托管的一堆数据库中备份了 mysql 数据库 db1。现在只需要备份具有访问 db1 权限的选定用户,以便我可以在 db1 还原之前将这些特权用户还原到我的新服务器。 最佳答案 St
我有一个 ListView 。我想添加一个动画,如果我选择一个列表项,它将被删除,并且该项目下方的其余项目将通过向上滑动动画向上移动。我已经通过获取其子位置使用线性布局完成了此操作,但我无法理解如何向
我不明白如何使用 Python 解析来自 Outlook 的突出显示(选定)邮件? 我有这个代码,但它适用于上一封邮件。 import win32com.client outlook = win32c
在 Xcode 6 中,您现在可以为选项卡项目的选中和未选中状态设置图标。请参阅下图中的说明: 和 唯一的问题是 SELECTED 状态的图像不显示。它只是显示空白。还有其他人有这个问题吗?请看下面的
在我的数据模型中,我有一个实体组和另一个GroupMember实体。一个Group包含一个或多个GroupMembers,但一个GroupMember只能同时位于一个Group中。到目前为止没有问题,
Android Button 在不同状态(正常、按下、选中、禁用)之间移动时会更改其可绘制背景。背景切换是即时的。是否可以使其平滑(动画)? 最佳答案 是的,这是可能的。您只需为按钮添加 addAni
我使用 emacs 来查看和编辑代码和其他文本文件。我想知道是否有一种方法可以向前或向后搜索当前缓冲区中标记的文本。类似于我在记事本或写字板中可以执行的操作。就像我可以在缓冲区中标记一些文本并执行 C
如何根据状态(选定、禁用)设置自定义选择类?如何根据状态选择(选定、禁用)在自定义下拉列表中设置类?照做了,但什么也没发生。请看我的例子................................
我正在尝试检查下拉菜单中是否存在特定文本值,如果存在,我想将其属性设置为selected。 我成功编写了一个 if 语句来检查文本是否存在: var country = usr.location; i
对于我的应用程序,我想让用户能够在回收器 View 中调整 TextView 项目的文本大小(通过捏缩放或 SeekBar)。默认值应为系统设置中选择的文本大小。最小值应为系统设置中的“非常小”,最大
我正在尝试创建一个 ListBoxItem 模板,该模板在选择时将带有圆角边框。我得到了这个 xaml,它在选择时不起作用:
我正在寻找检索焦点元素的 HTML。查看 webdriver.io 文档,方法 .getActiveElement() 应该可以解决这个问题。但是,我的 IDE (WebStorm) 显示错误,指出它
我创建了一个圆,在我的 onDraw() 方法中围绕圆绘制了一条字符串和一条线(箭头)。 public class Circle extends Activity { public class
对于生产应用程序,我们希望在 Windows 窗体应用程序的 ElementHost 内显示 DatePicker,但我们遇到了 SelectedDate 和 CurrentDate 不可读的问题,因
好的,我在此处和 Google 上的许多网站上搜索了此问题的结果,但找不到针对我的问题的确切解决方案。 我有一个 sql 提取姓名和办公室。所以事情是这样的: $sql = "SELECT m
选中单元格时如何改变灰色? 最佳答案 当用户点击选中的行 (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSInd
我是一名优秀的程序员,十分优秀!