2011-02-13 5 views
1

Ruby API to Google SketchUp의 기능은 open_file이지만, close_file 기능을 찾을 수 없습니다. 많은 파일을 일괄 처리해야하기 때문에 다음 파일로 넘어 가기 전에 각 파일을 닫고 싶습니다. 그렇지 않으면 프로그램이 메모리 소모로 인해 충돌합니다.Google SketchUp 닫기 파일

SketchUp 파일을 프로그래밍 방식으로 닫는 가장 좋은 방법은 무엇입니까?

Mac OS X을 사용하고 있으며 AppleScript 기능을 사용하여 창을 닫을 신호를 보내고 있습니다.

편집

은 지금까지 열매를 맺지 증명 몇 가지 방법을 고려하고있다.

  1. this question에 설명 된대로 appscript Ruby gem을 사용합니다. 여기서 문제는 I cannot get SketchUp to recognize my installed gems입니다.
  2. 유사한 비슷한 맥락에서 나는 창을 닫기 위해 osascript (셸에서 AppleScripts를 실행하는 bash 프로그램)을 사용하려고합니다.

    % X [osascript -e '응용 프로그램 "스케치"창 1을 닫에게']

    퍼센트 X [osascript : 그건 내가 다음 중 하나를 사용하여 스케치의 루비 콘솔 창에서 쉘에게 전화입니다 -e "어플리케이션"스케치 "윈도우 (1)를 닫는에게 '&]

    퍼센트 X [osascript -e] 어플리케이션"스케치 "모든 윈도우를 닫에게'

    % X [-e '애플리케이션에게 osascript 모든 창을 닫으려면 "SketchUp"&]

    이 두 번째 방법을 시도 할 때마다 SketchUp이 고정됩니다. 그러나 이 명령을 IRB에서 실행하거나 SketchUp 외부의 Bash 프롬프트에서 직접 실행하면 원하는 동작이 나타납니다. 모델 창이 닫히고 (우연히도 Ruby 콘솔 창이 열린 상태로 유지됩니다.)

  3. 각 모델을 처리하기 위해 슬레이브 스크립트를 시작하는 마스터 스크립트가 있어야합니다. 슬레이브는 마스터가 대기하는 동안 Google SketchUp 프로그램 내에서 실행됩니다. 슬레이브가 완료되면 마스터에 신호를 보내고 마스터는 SketchUp 파일을 닫습니다. 이 프로세스 간 통신을 수행하기 위해 drb을 사용해 보았습니다. 지속적으로 신호 때이 애플 스크립트를 사용하여 구글 스케치 업 창을 닫 실행하는 별도의 프로세스를 갖는

Error: LoadError: (eval):5:in 'require': no such file to load -- drb

편집 2

: 나는 SketchUp을 내 drb을 필요로 할 때 그러나, 다음과 같은 메시지가 뜹니다 여러 가지 이유로 서투른입니다. 첫째, Sketchup 창을 닫을 때 별도의 프로세스를 사용해야하는 것은 바람직하지 않습니다. 둘째, 외부 스크립트와 통신하는 유일한 효과적인 방법은 파일을 만드는 것입니다.이 방법은 낭비적이고 디스크 액세스가 속도를 저하시킬 수 있습니다.

그러나 가장 심각한 문제는 Sketchup이 AppleScript 명령에 응답하는 속도가 느리다는 것입니다.꽤 계산 집약적 인 스크립트가 Sketchup에서 실행 중이며 AppleScript 응답이 굶주린 것처럼 보입니다. 즉, Windows가 닫히기 전에 oscript가 시간 초과됩니다. Sketchup은 Sketchup에 계산 중심의 스크립트 실행을 일시 중지하는 대화 상자 프롬프트가있을 때만 AppleScript에 응답합니다.

EDIT 3

내가 대화 상자를 표시하여 스크립트의 실행을 일시 중지 내 close_file 기능을 수정했습니다. 이것은 본질적으로 현재의 thread를 산출하고 애플 스크립트 실행 명령에 응답하는 스레드 수 :

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 

그런 다음 추가해야합니다 AppleScript를 통해 창을 닫 별도의 루비 스크립트 대화 상자에서 "확인"을 클릭합니다. AppleScript는 다음과 같습니다 :

tell application "System Events" 
    tell process "SketchUp" 
     set frontmost to true 
     keystroke return 
    end tell 
end tell 

이 수정은 개선 된 기능입니다. EDIT 2에서 언급 한 "가장 심각한 문제"를 수정하지만 다른 문제는 남아 있습니다.

답변

0

하나의 해결 방법은 신호가있을 때 AppleScript를 사용하여 Google Sketchup 창을 닫는 별도의 프로세스를 계속 실행하는 것입니다. 여기에 설명 된 방법은 파일을 사용하여 프로세스 간 통신을 수행합니다 (drb는 작동하지 않는 것 같습니다).

먼저 Sketchup supports AppleScripting을 확인해야합니다. 지금

$ defaults write /Applications/Google\ SketchUp\ 8/SketchUp.app/Contents/Info NSAppleScriptEnabled -bool YES 

을 스케치 업 창을 닫습니다 별도의 파일을 생성 이렇게하려면 (다른 스케치 업 버전에 대한 적절한 대체 등으로) 명령 프롬프트에서 다음을 실행합니다. 다음은 내 closer.rb 파일입니다.

#!/usr/bin/ruby 

## closer.rb ## 

def wait(f) 
    while !File::exists?(f) 
    end 
    File.delete(f) 
end 

def signal(f) 
    File.new(f, 'w').close 
end 

while true 
    wait('~/temp/mutex.txt') 
    msg = %x[osascript -e 'tell application "SketchUp" to close every window'] 
    signal('~/temp/conf.txt') 
end 

셸에서이 스크립트를 실행하십시오. 파일 ~/temp/mutex.txt이 작성 될 때까지 대기합니다. 파일이 만들어지면 osascript (본질적으로 AppleScript)을 실행하여 Sketchup의 모든 창을 닫은 다음 ~/temp/conf.txt 파일을 만들어 창을 닫았다는 신호를 보냅니다.

def wait(f) 
    while !File::exists?(f) 
    end 
    File.delete(f) 
end 

def signal(f) 
    File.new(f, 'w').close 
end 

def close_file 
    signal('~/temp/mutex.txt') 
    wait('~/temp/conf.txt') 
end 

close_file이 가까이 스크립트를 신호 후 파일까지 폐쇄 된 것을 확인을 기다립니다 : 여기

은 가까이 스크립트를 신호 (당신의 스케치 업 플러그인에 배치 할 수 있습니다) 클라이언트 코드 돌아 오는 중. 이제 Sketchup에서 파일을 닫을 수 있습니다.

0

AppleScript 및/또는 Automator를 사용하여 SketchUp을 많이 사용하실 수 있습니다.

tell application "SketchUp" 
activate 
tell application "System Events" 
    delay 1.0 --close window, adjust delay to suit 
    --key code 13 using command down -- Press ⌘W or you can use 
    keystroke "w" using command down 
end tell 

말에게

나는, SU를 죽이고, 폐쇄, 콘솔에 붙여 열고 새에 대한 상태 표시 줄 항목의 번호가 등

그들은 SU 바로 가기 키를 유발 작은 파일이야 , 'Ruby Console'또는 플러그인의 일부로 외부에서 사용할 수 있습니다.

어떤 일종의 '일괄 변환'을 시도하고 계신지 확실하지 않지만 저는 Automator를 사용하여 이전 버전의 V5, V6, v7 파일을 v8로 변환했습니다. 그 중 100 개가 이고, 열면 '저장'이 파일을 최신 버전 (원하는 버전)으로 변환한다는 경고 메시지가 표시됩니다.

프로그래밍 방식으로이 "확인"을 클릭하는 것은 까다로운 작업입니다.

Automator는 자체적으로 매우 제한적이지만 워크 플로에 applescript를 추가 할 수 있으며 사용하는 경우 '기록 기능'을 사용하여 수행해야 할 작업을 보여줍니다.

그런 다음 'Script Editor'에 해당 코드를 복사/붙여 넣기하고 'dowithTimeout'비트를 제거하고 지연이있는 워크 플로로 다시 복사하여 실행되도록 할 수 있습니다.

큰 파일을 수용하기 위해 지연을 가지고 놀아야했지만 95 % 이상의 성공률을 보였습니다. [모두를 선택할 수있는 성공, 오른쪽 클릭, 아이콘 만들기 및 미리보기]

불행히도 저는 워크 플로우를 비우고 싶지만 보길 원한다면 다시 만들 수 있습니다. 루비 콘솔 system("osascript -e 'tell application \"suoff\"' -e 'activate' -e 'end tell'") 와 응용 프로그램 폴더에 Automator.app 안쪽이 스크립트에서

+0

AppleScript 편집기를 사용하여 스크립트를'/ temp/closeWindow.scpt'라는 파일에 저장했습니다. 그런 다음 Sketchup과 Sketchup에서'% x [osascript /temp/closeWindow.scpt]'를 실행 해 보았습니다. Sketchup의 루비 콘솔에서 창을 닫는 AppleScript를 실행할 수있는 버전은 무엇입니까? – dsg

0

성공 ...

on run 
    -- Make sure SU is foremost, don't click on anything else either 
    tell application "System Events" 
    tell process "SketchUp" 
     set frontmost to true 
     -- gives a message if you try to select when SU's not running 
     delay 0.2 
     tell application "SketchUp" to quit saving no 
     -- no dialog box etc... 
     delay 0.1 

    end tell 
    end tell 
    end run 

문제가, SU는 안티 자폭 루비를 가지고입니다 광산 링크 된 파일 그 자체를 차단하기위한 모든 노력을 중단합니다.

그래서 당신은

이 조합은 SU8.1와 10.5.8에서 작동 ... 묻어해야합니다.

SketchUcation [개발자] 포럼을 방문한 경우 Mac/AppleScript 테스터에 대한 전화를 남겼습니다 ... 그 이후로 앱을 다시 작성했지만 오후에 PM으로 보내면 내가 일하고있어 모든 비트 ..

존 뭔가를 스케치를 강제로 외부 애플 스크립트를 사용에 중요한 제한이 있습니다

+0

이것은 유망한 것으로 들립니다. 개발자 포럼 게시물에 대한 링크를 게시 할 수 있습니까? – dsg

+0

희망 작품 - [link] (http://forums.sketchucation.com/viewtopic.php?f=180&t=35023&p=308823#p308823) – driven

2

. 메뉴 스크립트가 실행되는 동안 SketchUp은 사용자 입력을받지 않습니다.

자동화 된 렌더링 솔루션을 설정하려고 시도했습니다. WebDialog를 여는 메뉴 항목을 추가하여 서버에서 다운로드 할 모델 목록을 가져 왔습니다. 그런 다음 목록을 단계별로 실행하고 cURL을 사용하여 각 모델을 다운로드합니다. 다운로드가 끝나면 모델을로드하고 렌더링 한 다음 다시 cURL을 사용하여 이미지를 업로드하고 다음 모델로 이동합니다.

필자가 원했던 것은 각 모델이 렌더링 된 후 (위의 "뮤텍스"파일 솔루션 사용) AppleScript를 활성화하고 모델 창을 닫는 것입니다. 불행하게도, 메뉴 스크립트가 계속 실행 중이기 때문에 SketchUp은 AppleScript가 지시 한 것에 응답하지 않습니다. 모든 모델이 처리되고 메뉴 스크립트가 종료되면 AppleScript가 마침내 실행됩니다.

AppleScript에 대한 모든 호출이 대기열에 올려졌지만 그렇게되지 않으면 그렇게 나쁘지 않을 것입니다. 마지막 두 개만 존중합니다 (이 번호는 AppleScript 로의 호출이 메뉴 스크립트가 끝났을 때의 상대적인 타이밍에 따라 다를 수 있습니다).

내 제한 사항으로 인해 루비 코드에서 mutex wait() 함수를 사용할 수 없었습니다.AppleScript는 실행할 수 없기 때문에 "완료되었습니다"뮤텍스 파일을 만들지 않았기 때문에 Ruby의 wait() 함수는 계속 진행할 수있는 신호를 얻지 못했습니다. 그 결과 AppleScript와 SketchUp 사이에 교착 상태가 발생하여 SketchUp이 정지되었습니다 (사실, 실제로는 wait() 함수에서 매우 단단한 루프에만 고정되어 있습니다).

이 문제에 접근 할 때 AppleScript는 모든 처리가 완료되었을 때 호출 할 수있는 정리 도구라고 생각하십시오.