API Ruby для Google SketchUp имеет функцию open_file
, но я не могу найти функцию close_file
. Так как мне нужно обрабатывать много файлов в пакетном режиме, я хочу закрыть каждый файл, прежде чем переходить к следующему, в противном случае программа вылетит из-за нехватки памяти.
Как лучше всего программно закрыть файлы SketchUp?
Я использую Mac OS X и хочу использовать функции AppleScript, чтобы сигнализировать о закрытии окна.
EDIT
Я рассматриваю несколько подходов, которые до сих пор оказались бесплодными.
- Использование приложения Ruby Gem, как описано в этот вопрос . Проблема в том, что Я не могу заставить SketchUp распознавать мои установленные драгоценные камни .
Аналогичным образом я пытаюсь использовать osascript (программа bash, которая выполняет сценарии AppleScripts из оболочки), чтобы закрыть окно. То есть я вызываю оболочку из окна консоли SketchUp Ruby, используя одно из следующих действий:
% x [osascript -e 'говорит приложению "SketchUp" закрыть окно 1']
% x [osascript -e 'говорит приложению "SketchUp" закрыть окно 1' &]
% x [osascript -e 'сообщает приложению "SketchUp", чтобы оно закрывало каждое окно "]
% x [osascript -e 'говорит приложению "SketchUp" закрыть каждое окно "&]
Всякий раз, когда я пробую этот второй подход, SketchUp просто зависает. Однако когда я выполняю любую этих команд из IRB или непосредственно из приглашения Bash вне SketchUp, я получаю желаемое поведение: окно модели закрывается (кстати, окно консоли Ruby остается открытым, что штраф).
Иметь главный скрипт, который запускает подчиненный скрипт для обработки каждой модели. Подчиненный будет работать в программе Google SketchUp, пока мастер ждет. Когда ведомое устройство заканчивается, оно сигнализирует мастеру, и мастер закрывает файл SketchUp. Чтобы сделать это межпроцессное взаимодействие, я попытался использовать drb . Однако, когда я пытаюсь потребовать drb
в SketchUp, я получаю следующее сообщение:
Ошибка: LoadError: (eval): 5: в 'require': такой файл не загружается - drb
РЕДАКТИРОВАТЬ 2
Постоянно работающий отдельный процесс, который закрывает окна Google Sketchup с помощью AppleScript при получении сигнала, является неуклюжим по ряду причин. Во-первых, некрасиво иметь отдельный процесс, посвященный закрытию окон Sketchup. Во-вторых, единственный эффективный способ связи с внешним сценарием - создание файлов, что является расточительным, а доступ к диску может замедлять работу.
Однако наиболее серьезная проблема заключается в том, что Sketchup медленно реагирует на команды AppleScript. У меня в Sketchup запущен довольно требовательный к вычислениям сценарий, и он, похоже, лишает ответа AppleScript, что означает, что время ожидания osascript истекло до закрытия окон. Sketchup реагирует на AppleScript только тогда, когда в Sketchup появляется диалоговое окно, которое приостанавливает выполнение моего сценария с интенсивными вычислениями.
РЕДАКТИРОВАТЬ 3
Я изменил свою функцию close_file
, чтобы приостановить выполнение скрипта, отображая диалоговое окно. По сути, это возвращает текущий поток и позволяет потоку, который отвечает на команды AppleScript, выполнить:
def close_file()
f = '/temp/mutex.txt' # for finer control, use different mutex for each window you want closed
File.new(f, 'w').close
result = UI.messagebox "Click OK when window has closed."
end
Тогда отдельный скрипт ruby, который закрывает окна через AppleScript, дополнительно должен будет нажать «ОК» в диалоговом окне. AppleScript, чтобы сделать это:
tell application "System Events"
tell process "SketchUp"
set frontmost to true
keystroke return
end tell
end tell
Эта модификация является улучшением. Он исправляет «наиболее серьезную проблему», упомянутую в EDIT 2, но другие проблемы остаются.