Archive for the 'QCView' Category

2015/11/03 QuartzComposerを任意のパラメータで表示

QuartzComposerのCompositionを任意のパラメータでレンダリングして表示するAppleScriptです。

Appleのサンプルコードに、QuartzComposerでグラフ表示するもの(QuartzComposerChart)があり、ScriptとComposerの組み合わせについては以前から注目していました。

qcchart_resized.png

Xcode上のCocoa AppleScriptアプリケーションでは同様にCompositionを呼び出して表示できることは(未確認ながら)、可能と思っていましたが・・・Script Editor上のAppleScriptから呼び出して表示することは、自分の知り得るかぎり誰も実現していませんでした。

chart_as_resized.png
▲本ScriptからQuartzComposerのCompositionをパラメータ指定しつつ表示したところ。データにはとくに意味はありません

もともとのAppleのサンプルプロジェクト「QuartzComposerChart」の中身を分析してAppleScriptに置き換え、Compositionで作られたグラフのパラメータをいろいろいじくってみました。

comp1.png

params.png

Scriptのバンドル内に収めたQTZファイル(Composition)を参照しているため、QTZファイルを含んだAppleScriptバンドルを以下からダウンロードできるようにしておきました。興味のある方はお試しください(掲載リストから「★Click Here to Open This Script」をクリックしてScript Editorに転送しただけでは、グラフは表示されません)。

–> Download script bundle including Composition

AppleScript名:QuartzComoserでグラフ表示てすと
– Created 2015-11-03 by Takaaki Naganoya
– 2015 Piyomaru Software
use AppleScript version “2.4″
use scripting additions
use framework “Foundation”
use framework “Quartz”
use framework “AppKit”

set chartData to current application’s NSMutableArray’s alloc()’s init()
chartData’s addObject:(current application’s NSMutableDictionary’s dictionaryWithObjectsAndKeys_(“練馬区”, “label”, 3, “value”, missing value))
chartData’s addObject:(current application’s NSMutableDictionary’s dictionaryWithObjectsAndKeys_(“青梅市”, “label”, 1, “value”, missing value))
chartData’s addObject:(current application’s NSMutableDictionary’s dictionaryWithObjectsAndKeys_(“中野区”, “label”, 2, “value”, missing value))

try
  set aPath to path to resource “Chart.qtz”
on error
  return
end try

set qtPath to current application’s NSString’s stringWithString:(POSIX path of aPath)

set aView to current application’s QCView’s alloc()’s init()
set qtRes to (aView’s loadCompositionFromFile:qtPath)

aView’s setValue:chartData forInputKey:“Data”
aView’s setValue:(current application’s NSNumber’s numberWithFloat:(0.5)) forInputKey:“Scale”
aView’s setValue:(current application’s NSNumber’s numberWithFloat:(0.1)) forInputKey:“Spacing”
aView’s startRendering() –レンダリング開始

set maXFrameRate to aView’s maxRenderingFrameRate()

set aWin to (my makeWinWithView(aView, 800, 800, “Composition Test”))

repeat with i from 1 to 10
  (aView’s setValue:(current application’s NSNumber’s numberWithFloat:(i / 10)) forInputKey:“Scale”)
  
delay 0.1
end repeat

repeat with i from 10 to 1 by -1
  (aView’s setValue:(current application’s NSNumber’s numberWithFloat:(i / 10)) forInputKey:“Scale”)
  
delay 0.1
end repeat

my closeWin:aWin
aView’s stopRendering() –レンダリング停止

–make Window for Input
on makeWinWithView(aView, aWinWidth, aWinHeight, aTitle)
  set aScreen to current application’s NSScreen’s mainScreen()
  
set aFrame to {{0, 0}, {aWinWidth, aWinHeight}}
  
set aBacking to current application’s NSTitledWindowMask –NSBorderlessWindowMask
  
set aDefer to current application’s NSBackingStoreBuffered
  
  
– Window
  
set aWin to current application’s NSWindow’s alloc()
  (
aWin’s initWithContentRect:aFrame styleMask:aBacking backing:aDefer defer:false screen:aScreen)
  
aWin’s setBackgroundColor:(current application’s NSColor’s whiteColor())
  
  
aWin’s setTitle:aTitle
  
aWin’s setDelegate:me
  
aWin’s setDisplaysWhenScreenProfileChanges:true
  
aWin’s setHasShadow:true
  
aWin’s setIgnoresMouseEvents:false
  
aWin’s setLevel:(current application’s NSNormalWindowLevel)
  
aWin’s setOpaque:false
  
aWin’s setReleasedWhenClosed:true
  
aWin’s |center|()
  
aWin’s makeKeyAndOrderFront:(me)
  
  
– Set Custom View
  
aWin’s setContentView:aView
  
  
return aWin
  
end makeWinWithView

–close win
on closeWin:aWindow
  delay 5
  
repeat with n from 10 to 1 by -1
    (aWindow’s setAlphaValue:n / 10)
    
delay 0.02
  end repeat
  
aWindow’s |close|()
end closeWin:

★Click Here to Open This Script