Keynote書類の現在のスライド(ページ)上に存在する表オブジェクトの重なり合いを検出するAppleScriptです。
前バージョンでは、複数の表オブジェクトが配置されていると、表オブジェクトの位置情報と大きさから生成したNSRect同士の重なりチェックを行なった際に、同じ表同士の重なりチェックも行なっていたので、
複数の表が存在していると、もれなく「重なっている」という警告が出てくるものでした。
本バージョンでは、同じ表同士を重なりチェックしないようにとか、1×3と3×1という「同じオブジェクト同士の重なりチェックを2度行っている」ようなものを排除しています。
今度の順列組み合わせパターン生成ルーチン「retPairPermutationsWithoutSelfCollision」では、これらのパターンを除去しています。
{{1, 2}, {1, 3}, {1, 4}, {1, 5}, {2, 3}, {2, 4}, {2, 5}, {3, 4}, {3, 5}, {4, 5}}
↑余計な組み合わせパターンは生成されなくなりました。
実際に本Scriptを用いて(複数ページ対応板)、121ページ分の表の重なり合わせチェックを行なってみたところ、M1 Mac miniで3.4秒程度です。
本Scriptの完全版を「AppleScript基礎テクニック集(1)〜間接指定」に収録しています。
AppleScript名:現在のスライド上の表オブジェクトの重なり合い(2つ以上対応)を検出 v3.scptd |
— – Created by: Takaaki Naganoya – Created on: 2022/04/03 — – Copyright © 2022 Piyomaru Software, All Rights Reserved — use AppleScript version "2.4" — Yosemite (10.10) or later use framework "Foundation" use scripting additions tell application "Keynote" tell front document set docHeight to height tell current slide set tList to every table if length of tList < 2 then return false –複数の「表」がなかったら衝突は発生していない –表の座標とサイズによりNSRectangleを作成する set bList to {} repeat with i in tList set j to contents of i tell j set {xPos, yPos} to position set aWidth to width set aHeight to height set aRect to makeRect(xPos, yPos, aWidth, aHeight) of me end tell set the end of bList to aRect end repeat –作成したNSRectangleの順列組み合わせペア・パターンを作成して、NSRectangle同士の衝突判定を順次行う set aLen to length of bList set permuList to retPairPermutationsWithoutSelfCollision(aLen) of me set corruptList to {} repeat with i in permuList copy i to {i1, i2} set rectRes to detectRectanglesCollision(item i1 of bList, item i2 of bList) of me if rectRes = true then return true –表同士の衝突が発生している end repeat return false –表同士の衝突は発生していない end tell end tell end tell on makeRect(xPos, yPos, aWidth, aHeight) return current application’s NSMakeRect(xPos, yPos, aWidth, aHeight) end makeRect –NSRect同士の衝突判定 on detectRectanglesCollision(aRect, bRect) set a1Res to (current application’s NSIntersectionRect(aRect, bRect)) as {record, list} set tmpClass to class of a1Res if tmpClass = record then –macOS 10.10, 10.11, 10.12 return not (a1Res = {origin:{x:0.0, y:0.0}, |size|:{width:0.0, height:0.0}}) else if tmpClass = list then –macOS 10.13 or later return not (a1Res = {{0.0, 0.0}, {0.0, 0.0}}) end if end detectRectanglesCollision –1から任意の数までのアイテムで、2個ずつの組み合わせのすべての順列組み合わせパターンを計算して返す –ただし、1×1とか2×2などの同一アイテム同士の掛け合わせを除去するものとする on retPairPermutationsWithoutSelfCollision(aMax) set aList to {} repeat with x from 1 to aMax repeat with xx from 1 to aMax if x is not equal to xx then set tmpItem to {x, xx} set a2List to sort1DNumList(tmpItem, true) of me if {a2List} is not in aList then set the end of aList to a2List end if end if end repeat end repeat return aList end retPairPermutationsWithoutSelfCollision –1D List(数値)をsort / ascOrderがtrueだと昇順ソート、falseだと降順ソート on sort1DNumList(theList as list, aBool as boolean) tell current application’s NSSet to set theSet to setWithArray_(theList) tell current application’s NSSortDescriptor to set theDescriptor to sortDescriptorWithKey_ascending_(missing value, aBool) set sortedList to theSet’s sortedArrayUsingDescriptors:{theDescriptor} return (sortedList) as list end sort1DNumList |