Skip to main content
Known Participant
June 29, 2021
Answered

How to determine the name of the active work environment?

  • June 29, 2021
  • 1 reply
  • 3243 views

Hello, I need to write a script that switches 2 working media. For example: if the active working environment has the name "photo", then switch to the working environment "Drawing". Tell me, please, how to determine the name of the active work environment?

This topic has been closed for replies.
Correct answer jazz-y

Это стандартные рабочие среды,они в папке всеравно на латинице,у меня проблема с созданной рабочей средой с названием на кириллице.Т.е и в папке рабочих сред она на кириллице.Но стоит ей дать имя на латинице все работает.

 


Если вам нужно срабатывание на строку, которой нет в файле локализации, то уберите в условии функцию localize и сравнивайте непосредственно с нужным вам названием 

 

 if (currentWorkspaceTitle == 'Монитор') 

 

в случае проблем посмотрите, что пишется в переменную currentWorkspaceTitle в процессе работы скрипта

1 reply

Legend
June 29, 2021

 

#target photoshop
s2t = stringIDToTypeID;

var r = new ActionReference();
r.putProperty(s2t('property'), s2t('menuBarInfo'));
r.putEnumerated(s2t('application'), s2t('ordinal'), s2t('targetEnum'));
var mainMenu = executeActionGet(r).getObjectValue(s2t('menuBarInfo')).getList(s2t('submenu'))

var windowMenu = new ActionDescriptor()
for (var i = 0; i < mainMenu.count; i++) {
    if (mainMenu.getObjectValue(i).getString(s2t('title')) == localize('$$$/Menu/Window')) {
        var windowMenu = mainMenu.getObjectValue(i).getList(s2t('submenu'))
        break;
    }
}

var workspaceMenu = new ActionDescriptor()
for (var i = 0; i < windowMenu.count; i++) {
    if (windowMenu.getObjectValue(i).getString(s2t('title')) == localize('$$$/Menu/Window/ProjectWorkSpace')) {
        workspaceMenu = windowMenu.getObjectValue(i).getList(s2t('submenu'))
        break;
    }
}

for (var i = 0; i < workspaceMenu.count; i++) {
    if (workspaceMenu.getObjectValue(i).getBoolean(s2t('checked'))) {
        alert('current workpace: ' + workspaceMenu.getObjectValue(i).getString(s2t('title')))
    }
}

 

* if you switch the workspace and immediately run the script, it will show that the workspace has not changed (although it is not). Apparently Photoshop does not update the menuBarInfo descriptor until the user re-selects any menu item.

 

 

you can also use event notifications to track when the workspace is switched and save its name for future use (before first run the code, you need save it to a file, since the event listener will start it every time the workspace is changed)

 

#target photoshop
var s2t = stringIDToTypeID,
    t2s = typeIDToStringID,
    UUID = 'bf7064f7-eee2-4ac2-a639-5c3832469b43';

try {
    var target = t2s(arguments[0].getReference(s2t('null')).getDesiredClass())
    if (target == 'workspace') {
        var d = new ActionDescriptor();
        d.putString(s2t('workspace'), arguments[0].getReference(s2t('null')).getName())
        app.putCustomOptions(UUID, d)
    }
} catch (e) {
    app.notifiersEnabled = true
    var f = File($.fileName),
        deleted;
    for (var i = 0; i < app.notifiers.length; i++) {
        var ntf = app.notifiers[i]
        if (ntf.eventFile.name == f.name) { ntf.remove(); i--; deleted = true }
    }

    if (deleted) {
        alert('event listening disabled!')
    } else {
        alert('event listening enabled!')

        app.notifiers.add('slct', f)
        var r = new ActionReference();
        r.putProperty(s2t('property'), s2t('menuBarInfo'));
        r.putEnumerated(s2t('application'), s2t('ordinal'), s2t('targetEnum'));
        var mainMenu = executeActionGet(r).getObjectValue(s2t('menuBarInfo')).getList(s2t('submenu'))

        var windowMenu = new ActionDescriptor()

        for (var i = 0; i < mainMenu.count; i++) {
            if (mainMenu.getObjectValue(i).getString(s2t('title')) == localize('$$$/Menu/Window')) {
                var windowMenu = mainMenu.getObjectValue(i).getList(s2t('submenu'))
                break;
            }
        }

        var workspaceMenu = new ActionDescriptor()
        for (var i = 0; i < windowMenu.count; i++) {
            if (windowMenu.getObjectValue(i).getString(s2t('title')) == localize('$$$/Menu/Window/ProjectWorkSpace')) {
                workspaceMenu = windowMenu.getObjectValue(i).getList(s2t('submenu'))
                break;
            }
        }

        for (var i = 0; i < workspaceMenu.count; i++) {
            if (workspaceMenu.getObjectValue(i).getBoolean(s2t('checked'))) {
                var d = new ActionDescriptor();
                d.putString(s2t('workspace'), workspaceMenu.getObjectValue(i).getString(s2t('title')))
                app.putCustomOptions(UUID, d)
                break;
            }
        }
    }
}

 

In this case, you can get the name of the current workspace at any time (while event listener enabled) using the code:

 

var s2t = stringIDToTypeID,
    UUID = 'bf7064f7-eee2-4ac2-a639-5c3832469b43';
try {var d = app.getCustomOptions (UUID)} catch (e) {}
if (d) alert ('current workspace: ' + d.getString (s2t('workspace')))

 

Known Participant
June 30, 2021

Hello, thanks, I did not understand how to organize it a little. In turning on the script listener, it then issues 

 a notification that the listener is not available.

Legend
July 3, 2021

А расскажите ,пожалуйста,подробнее про ваши отслеживания действий на слои.Например,если активен слой кривые или создается такой слой,то к ,примеру ,надо запустить какую-то рабочую среду.Или где можно посмотреть списки имен событий,чтобы их правильно вписать ?


В варианте с уведмлениями я не учел, что уведомление выдает name меню, а не title (они отличаются наличием амперсанда), поэтому и не работало.

 

 

 

#target photoshop
s2t = stringIDToTypeID;

var r = new ActionReference();
r.putProperty(s2t('property'), s2t('menuBarInfo'));
r.putEnumerated(s2t('application'), s2t('ordinal'), s2t('targetEnum'));
var mainMenu = executeActionGet(r).getObjectValue(s2t('menuBarInfo')).getList(s2t('submenu'))

var windowMenu = new ActionDescriptor(),
    windowTitle = localize('$$$/Menu/Window').replace(/\&/, '');
for (var i = 0; i < mainMenu.count; i++) {
    if (mainMenu.getObjectValue(i).getString(s2t('title')).replace(/\&/, '') == windowTitle) {
        var windowMenu = mainMenu.getObjectValue(i).getList(s2t('submenu'))
        break;
    }
}

var workspaceMenu = new ActionDescriptor(),
    workspaceTitle = localize('$$$/Menu/Window/ProjectWorkSpace').replace(/\&/, '');
for (var i = 0; i < windowMenu.count; i++) {
    if (windowMenu.getObjectValue(i).getString(s2t('title')).replace(/\&/, '') == workspaceTitle) {
        workspaceMenu = windowMenu.getObjectValue(i).getList(s2t('submenu'))
        break;
    }
}

var reset = localize("$$$/Menu/WorkSpace/Reset=&Reset ^0").replace(/[(\&)( \^0$)]/g, '');
for (var i = 0; i < workspaceMenu.count; i++) {
    if (workspaceMenu.getObjectValue(i).getString(s2t('title')).replace(/\&/, '').indexOf(reset) != -1) {
        var currentWorkspaceTitle = workspaceMenu.getObjectValue(i).getString(s2t('title')).replace(/\&/, '').replace(RegExp(reset + ' '), '')

        if (currentWorkspaceTitle == localize('$$$/FileName/Presets/WorkSpaces/Photography').replace(/\&/, '')){
            // call function for photography workspace here
        }else if (currentWorkspaceTitle == localize('$$$/FileName/Presets/WorkSpaces/Painting').replace(/\&/, '')) {
            // call function for painting workspace here
        }
        break;
    }
}

 

 

Свой скрипт скину вам в личку, напишу как с его помощью выполнить такой сценарий (он предназначен только для выбора инструментов, но позволяет задейстовать экшены для любых других действий).

 

Информацию о событии можно получить множеством способов -  либо установив script listener и разбирать код который он выводит, либо вручную установив нотификатор на 'All ' (т.е. app.notifiers.add('All ', путь ко скрипту) и разбирать полученный дескриптор в самом скрипте (можете посмотреть тему Script Events Listener), также можно изучить код Script Events Manager.jsx, который есть в стандартных скриптах фотошопа, либо скачать SDK - там есть файл PITerminology.h, котором отдельно выделены имена событий.