Archive for the 'Keynote 7' Category

2017/07/07 Keynoteの現ページと次ページで場所が被っていても始点座標が異なるオブジェクトの始点座標をそろえる

編集中のKeynote書類で現在のスライドと次のスライド上の指定した種類のオブジェクトの座標情報をスキャンして、「重なっているが原点座標が異なる」ものを検出して原点座標を同じにそろえるAppleScriptです。

2017-07-07-13_06_20.gif

Keynoteで資料を使っていて、(複数ページ間で同じ場所に存在すべき)オブジェクトの位置が微妙にズレていることが気になることがあります。

ただ、いちいち座標情報をひろって手で修正するのは面倒なので、AppleScriptで自動修正させてみました。

重なっているオブジェクト同士であっても、始点座標が同じものは無視します(修正する必要はないので)。

Script実行時にチェック対象の2ページのうち、最初のページを表示していることを想定しています。

オブジェクトの領域の重なり判定は2つだけを想定しています。それ以上の個数のオブジェクトの重なりは無視しています。

KeynoteのAppleScript用語辞書がselection(選択中のオブジェクト)を取得できないという「残念な点」があるので、そこが重ね重ねも残念です。

AppleScript名:Keynoteの現ページと次ページで場所が被っていても始点座標が異なるオブジェクトの始点座標をそろえる
– Created 2017-07-07 by Takaaki Naganoya
– 2017 Piyomaru Software
– v1:オーバーラップしているオブジェクトの個数が2個のみの状況を想定
use AppleScript version “2.4″
use scripting additions
use framework “Foundation”
–http://piyocast.com/as/archives/4718

tell application “Keynote”
  tell front document
    set sNum to slide number of (current slide)
  end tell
end tell

–表示中のページ(slide)と、その次のページ(slide)で、
–指定オブジェクト(shape)の座標情報をリストアップ
set {rect1, obj1} to getObjInfoList(sNum, “shape”) of me –現在のページ(slide)
set {rect2, obj2} to getObjInfoList(sNum + 1, “shape”) of me –現在+1ページ

set hitRect to {} –衝突していつつもイコールではないオブジェクトの座標情報を入れる
set hitObj to {} –衝突しているオブジェクト(最初のページ、次のページ)をペアで入れる

set p1Count to 1

–表示中のページ(slide)と、その次のページ(slide)で、
–重なっていつつも始点座標が異なるオブジェクト(shape)を総当たりでリストアップ
tell application “Keynote”
  tell front document
    repeat with i in rect1
      set j to contents of i
      
      
set p2Count to 1
      
      
repeat with ii in rect2
        set jj to contents of ii
        
        
–指定オブジェクト同士の領域が重なっているかどうかチェック
        
set aRes to detectRectanglesCollision(j, jj) of me
        
–始点座標がイコールかどうかチェック(イコールのものは修正不要)
        
set origRes to (origin of j) = (origin of jj)
        
        
if (aRes = true) and (origRes = false) then
          set the end of hitRect to j
          
set the end of hitObj to {contents of item p1Count of obj1, contents of item p2Count of obj2}
        end if
        
        
set p2Count to p2Count + 1
        
      end repeat
      
      
set p1Count to p1Count + 1
    end repeat
  end tell
end tell

–current slideを2ページ目に変更
set cRes to changeCurrentSlide(sNum + 1) of me

–オーバーラップしていつつも始点座標が異なるアイテムの個数を数える
set tCount to count every item of hitRect

tell application “Keynote”
  tell front document
    tell current slide
      repeat with i from 1 to tCount
        set curPos to contents of item i of hitRect
        
set curOrig to origin of curPos
        
set curOrigX to x of curOrig
        
set curOrigY to y of curOrig
        
        
set curObj to contents of second item of item i of hitObj
        
set position of curObj to {curOrigX, curOrigY}
      end repeat
    end tell
  end tell
end tell

–最前面のKeynote書類の指定スライド(page)上の指定オブジェクトの情報(座標情報、オブジェクト情報)を返す
on getObjInfoList(aPage, objClassStr as string)
  set rectList to {}
  
set objList to {}
  
  
set cRes to changeCurrentSlide(aPage) of me
  
if cRes = false then error “Slide Range Error”
  
  
tell application “Keynote”
    tell front document
      tell current slide
        set aList to every iWork item
        
        
repeat with i in aList
          set aClass to (class of i) as string
          
          
if aClass = objClassStr then
            set aWidth to width of i
            
set aHeight to height of i
            
set {aPosX, aPosY} to position of i
            
set aRect to {origin:{x:aPosX, y:aPosY}, |size|:{|width|:aWidth, |height|:aHeight}}
            
            
set the end of rectList to aRect
            
set the end of objList to i
          end if
        end repeat
      end tell
    end tell
  end tell
  
  
return {rectList, objList}
end getObjInfoList

–NSRect同士の衝突判定
on detectRectanglesCollision(aRect, bRect)
  set a1Res to current application’s NSIntersectionRect(aRect, bRect)
  
return not (a1Res = {origin:{x:0.0, y:0.0}, |size|:{width:0.0, height:0.0}})
end detectRectanglesCollision

–表示中のスライド(ページ)を変更する
on changeCurrentSlide(targPageNum as integer)
  try
    tell application “Keynote”
      tell front document
        set sCount to count every slide
        
if targPageNum < 1 then return false –under check
        
if sCount < targPageNum then return false –over check
        
set current slide to slide targPageNum
        
return true
      end tell
    end tell
  on error
    return false
  end try
end changeCurrentSlide

★Click Here to Open This Script 

2017/06/29 Keynote Control 2冊同時刊行

Piyomaru Softwareによる電子書籍、AppleScriptえほんシリーズの続刊を2冊同時に販売開始しました(お試し版もご用意しました)。

いきなり難しくならない「ホップ」「ステップ」「ジャンプ」の3段階難易度設定。
difficulty_resized.png

どこからどこまでが1行かを明示的に示す行番号表示などで、わかりやすく説明しています。

linenumbers.png

「Keynote Control 1」(47ページ)と「Keynote Control 2」(45ページ)です。BOOTH.pmにて委託販売しており、BOOTH上での価格は両方とも1,000円です。

同時に、既刊の「iTunes Control」についてもBOOTH上での販売価格を1,000円に改定しています。

ぜひお買い求めください。

keynote_control1_cover_resized.png

keynote_control2_cover_resized.png

2017/03/28 Keynote/Pages/Numbersがアップデート

Keynote/Pages/Numbersがアップデートし、それぞれKeynote 7.1、Pages 6.1、Numbers 4.1になりました(要macOS 10.12)。

■Keynote 7.1.0
–AppleScript用語辞書の変更点
・current slideがread only属性ではなくなった
・image formatで指定できる値が変更された
small / medium / large –> 60p / 540p / 720p / 1080p / 2160p / native size
・movie formatで指定できる値が変更された
small / medium / large –> 360p / 540p / 720p / 1080p / 2160p / native size
–機能上の変更点
・PDF書き出しをmacOS 10.12.4上で行えるようになった(権限エラーが出なくなった)

■Pages 6.1.0
–AppleScript用語辞書の変更点
・exportコマンドで指定できるフォーマットとして「formatted text」が追加された(RTF?)
–機能上の変更点
・PDF書き出しをmacOS 10.12.4上で行えるようになった(権限エラーが出なくなった)

2017/01/10 Keynote書類の画像書き出しテスト

Keynote書類をデスクトップに画像書き出し(PNG形式)するAppleScriptです。動作確認はmacOS 10.12.3beta+Keynote 7.0.5で行っています。

macOS 10.12.x+Keynote 7.0.5ではSandbox化の影響を受けてexportコマンドがうまく動作していないようで、そのままPDF書き出しを実行するとError 6に遭遇しました。これを回避するために、PDF書き出し前にPDFと同名の空のファイルを作るとよいことがわかりました。

sandboxed_export.png

AppleScriptからKeynoteに書類の画像書き出しを行うとError 6に遭遇するのはPDF書き出しと事情は変わりません。何らかの対策を行う必要があります。

画像書き出しは指定の場所にフォルダが作成されて、さらにその中にスライド画像が連番つきで書き出されます。1つのPDFができるPDF書き出しとは若干動作が異なるわけです。

試行錯誤したところ、書き出しフォルダと同じ名前のフォルダを、画像書き出し前にあらかじめ作っておけばエラーを回避できることがわかりました。

同様に、macOS 10.12上ではSandbox化されたアプリケーション上でのexportコマンドの挙動に問題があることが報告されており、ここで示したようなやり方で回避できているようです。具体的には、Mailの添付ファイルの書き出しがこれでSandbox由来のエラーを回避できた事例が報告されています。

一方で、Microsoft Word 2016/Excel 2016においてAppleScriptからExportを行わせたときに上記の回避策ではSandbox由来のエラーを回避できず、海外のScripter連中と回避策を相談しているところです。

Appleにはフィードバック済みですが、かなり問題のある動作に見えます。

AppleScript名:Keynote書類の画像書き出しテスト
– Created 2017-01-10 by Takaaki Naganoya
– 2017 Piyomaru Software
use AppleScript version “2.4″
use scripting additions
use framework “Foundation”
–http://piyocast.com/as/archives/4384

tell application “Keynote”
  if (count every document) = 0 then error “There is no Keynote Document”
  
set aDoc to document 1
end tell
set kRes to exportImagesFromKeynote(aDoc) of me

on exportImagesFromKeynote(aDoc)
  tell application “Keynote”
    set aPath to file of aDoc
  end tell
  
  
set tmpPath to (path to desktop) as string
  
set curPath to (current application’s NSString’s stringWithString:(POSIX path of aPath))’s lastPathComponent()’s stringByDeletingPathExtension()
  
set outPath to (tmpPath & curPath)
  
  
–This preliminary process may be no use if macOS or Keynote fixed in the future
  
do shell script “mkdir “ & quoted form of POSIX path of outPath –To Avoid “Error 6″ (Keynote 7.0.5+macOS 10.12.2/3)
  
–This preliminary process may be no use if macOS or Keynote fixed in the future
  
  
tell application “Keynote”
    set anOpt to {class:export options, compression factor:1.0, image format:PNG, export style:IndividualSlides, all stages:false, skipped slides:true}
    
export document 1 to file outPath as slide images with properties anOpt
  end tell
  
  
return (outPath as alias)
end exportImagesFromKeynote

★Click Here to Open This Script 

2017/01/09 Keynote書類をデスクトップにPDFで出力する

Keynote書類をデスクトップにPDFで出力するAppleScriptです。動作確認はKeynote v7.0.5で行いました(初回掲載分からアップデート)。

Keynoteから出力したPDFに対し、Keynote書類の構造を確認しつつ、階層構造つきのTOC(しおり)を付加するAppleScriptを作成したときに作ったものです(KeynoteでPDF書き出ししただけでは、階層構造つきのTOCなんて気のきいたものはついてきませんので)。

keynote_leveled_toc.png

exportコマンドによる出力先のフォルダに、当初temporary items folderを指定してみたのですが、ユーザー権限がないと言われて書き込めませんでした。Keynoteはサンドボックス化されたアプリケーションなので、ホームディスレクトリの下のどこかを一時作業フォルダとして使うように運用を変更する必要があることでしょう(temporary items folderの存在意義が、、、、)。

【重要! 生死に関わるレベル】

macOS 10.12.3beta上で、exportコマンド実行時にエラー(Error 6)になることがあり、原因 を調査したところ、すでにexport先に同名のファイルが存在する場合にはエラーにならないことがわかりました。Sandbox化の影響を受け、Keynote自体がファイルを書き出せない状態にあったようなので、shellのtouchコマンドで書き出すPDFと同名の(空っぽの)ファイルをあらかじめ作成しておいてからexportコマンドを実行したところうまく行きました。

AppleScript名:Keynote書類をデスクトップにPDFで出力する v1.1
– Created 2017-01-09 by Takaaki Naganoya
– 2017 Piyomaru Software
use AppleScript version “2.4″
use scripting additions
use framework “Foundation”
–http://piyocast.com/as/archives/4380

tell application “Keynote”
  set dCount to count every document
end tell

if dCount = 0 then
  display dialog “オープン中のKeynote書類はありません” with icon 0 with title “No Document Error”
  
return
end if

tell application “Keynote”
  set aPath to file of document 1
end tell

–Keynote書類のファイル名だけを取り出し、拡張子を外し、別の拡張子(.pdf)を追加する
set curPath to (current application’s NSString’s stringWithString:(POSIX path of aPath))’s lastPathComponent()’s stringByDeletingPathExtension()’s stringByAppendingString:“.pdf”

set tmpPath to (path to desktop) as string
set outPath to tmpPath & (curPath as string)

do shell script “touch “ & quoted form of POSIX path of outPath

tell application “Keynote”
  set anOpt to {class:export options, export style:IndividualSlides, all stages:false, skipped slides:true, PDF image quality:Best}
  
export document 1 to file outPath as PDF with properties anOpt
end tell

★Click Here to Open This Script