Невозможно вызвать исполняемый файл из файла extendscript .jsx

Я намерен создать сценарий для Adobe Illustrator, который вызывает скомпилированный исполняемый файл C, который я написал, с некоторыми входными параметрами.

Исполняемый файл C (названный «crowd-generator») сгенерирует и вернет массив координат x, y на основе входных параметров.

Насколько я могу судить из исследований, которые я провел до сих пор, я должен быть в состоянии выполнить такой код (пока игнорируя входные параметры):

#include crowd/crowd-generator

var script_file = new File('crowd/crowd-generator');
var result = script_file.execute();

Однако все это, кажется, делает это, чтобы открыть мой исполняемый файл в ExtendScript, а затем сказать мне, что в нем есть синтаксические ошибки, которых определенно нет. Я думаю, возможно, он пытается запустить его как файл .jsx.

Одна вещь, которую я пробовал, — дать «crowd-generator» расширение файла .app или .exe. Единственная разница заключается в том, что при попытке запустить мой скрипт я получаю диалоговое окно с вопросом, на каком языке находится исполняемый файл... тогда это все равно выдает мне синтаксическую ошибку, что бы я ни выбрал.

Что происходит не так? Есть ли способ запустить этот исполняемый файл из файла .jsx в Adobe Illustrator?


person Martha    schedule 19.04.2017    source источник
comment
Вы на Windows или на macOS?   -  person fabianmoronzirfas    schedule 20.04.2017
comment
Привет! я использую ОСХ   -  person Martha    schedule 21.04.2017


Ответы (3)


Что означает эта строка?:

  #include crowd/crowd-generator

На самом деле вы пытаетесь включить исполняемый код в файл jsx, это ошибка.

person emax    schedule 20.04.2017

К сожалению, в Illustrator нет хороших функций, таких как InDesigns app.doScript или After Effects system.callSystem.

Один из способов выполнить команду в macOS — создать файл терминов.

/* global $, app, File */
/**
 * Read about termfiles
 * http://docstore.mik.ua/orelly/unix3/mac/ch01_03.htm
 * 1.3.1.1. .term files
 */

var termfile = new File(File($.fileName).parent.fsName + '/command.term');
var command = 'cd ' + File($.fileName).parent.fsName + ' ; ls';
termfile.open('w');

termfile.writeln(
    '<?xml version="1.0" encoding="UTF-8"?>\n' +
        '<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN"' +
            '"http://www.apple.com/DTDs/PropertyList-1.0.dtd">\n' +
            '<plist version="1.0">\n' +
                '<dict>\n' +
                    '<key>WindowSettings</key>\n' +
                '<array>\n' +
                ' <dict>\n' +
                '<key>CustomTitle</key>\n' +
                '<string>My first termfile</string>\n' +
                '<key>ExecutionString</key>\n' +
                '<string>' + command + '</string>\n' +
                '</dict>\n' +
                '</array>\n' +
                '</dict>\n' +
            '</plist>\n');

termfile.close();
termfile.execute();

Другой способ — создать командный файл. Это всего лишь сценарий оболочки, который вы делаете исполняемым chmod +x myScript.command, а затем также вызываете его с помощью команды execute.

  • Создайте файл myScript.command с простой командой, ls достаточно для тестирования.

Это должно выглядеть так:

#!/bin/bash
ls
  • Откройте терминал и перейдите в папку, где находится скрипт.
  • Сделайте его исполняемым, запустив chmod +x myScript.command
  • Создайте сценарий, который выполняет его рядом с ним.

Это должно быть его содержание:

var commandFile = File(File($.fileName).parent.fsName + '/myScript.command');
commandFile.execute();

Выполните его из Illustrator.


Проблема будет заключаться в том, чтобы получить возвращаемые значения.

person fabianmoronzirfas    schedule 22.04.2017

После публикации этого вопроса я добился некоторого прогресса и решил опубликовать свой ответ.

Есть 2 проблемы с моим кодом.

Во-первых, как правильно указал emax в своем ответе, я по ошибке пытался включить исполняемый файл со строкой:

#include crowd/crowd-generator

После удаления этой строки код все еще не работал - я понял после того, как немного понял, что это потому, что объекту ExtendScript FILE требуется абсолютный путь к файлу, а не относительный.

источник

Итак, мой исправленный код выглядит примерно так:

var script_file = new File('/Applications/Adobe Illustrator CC 2015.3/Presets.localized/en_GB/Scripts/crowd/crowd-generator');
var result = script_file.execute();

Теперь мне просто нужно выяснить, как сделать этот исполняемый вызов с аргументами и вернуть результат.

person Martha    schedule 24.04.2017
comment
О передаче аргументов и получении возвращаемого значения вы можете прочитать здесь stackoverflow.com/questions/42863672/ - person emax; 24.04.2017
comment
@emax Спасибо, очень полезно. Я думаю, что решил пойти другим путем с этим проектом сейчас по другим причинам, но это отличное знание, и его на удивление трудно найти в Интернете. - person Martha; 25.04.2017