矩形座標(NSRect)同士の衝突判定を行うAppleScriptのmacOS 10.13以降対応改修版です。
macOS 10.13以降への対応を行う際に注意すべきなのは、NSRectやboundsを取得するScriptが異なる結果を返してこないか、確認を行うことです。
set bRect to current application's NSMakeRect(20, 90, 50, 120) --> {origin:{x:20.0, y:90.0}, |size|:{width:50.0, height:120.0}} --> {{20.0, 90.0}, {50.0, 120.0}}--10.13, 10.14, 10.15, 11.0
その中でも矩形同士の衝突(重なり)判定はとくに書き換えが必要な箇所です。
実際に、Adobe Illustratorのデータ上で複数製品のデータが並んで掲載されているケースで、製品ごとに別のマスキングレイヤー上に色違いの矩形を配置することで、その矩形エリア内のIllustratorオブジェクトを特定する処理を行ったときに、本ルーチンを使用していたため(macOS 10.13/14対応のために)書き換えが必要になりました。
macOS 10.13/14対応のための、
{{0.0, 0.0}, {0.0, 0.0}}
の部分が一番重要なポイントです。これが、
{{0, 0}, {0, 0}}
だとうまく動作しません。ここ、ちょっとだけハマりました。
2019/05/10 追記
初版では、NSRectがrecordで返ってくるか(macOS 10.10, 10.11, 10.12)、listで返ってくるか(macOS 10.13, 10.14)をOSのバージョンで判定していました。これは実際のところ間違いではないのですが、OSのバグなのか仕様の公式な変更なのか不明なため、たとえばNSNotFoundの定義値が間違っていたバグなどはmacOS 10.13.1で修正されるなど、マイナーバージョンアップで仕様が変わるケースも観測されています。そのため、OSバージョンを見て判定することは将来的に危険であると判断し、データの型を判定する方法に書き換えました(書き捨てレベルのルーチンなので、型判定を行う書き方もよくしています)。
AppleScript名:矩形座標同士の衝突判定(共通部分の検出) v3b |
— Created 2017-03-06 by Takaaki Naganoya — Modified 2019-05-10 by Takaaki Naganoya — 2019 Piyomaru Software use AppleScript version "2.4" use scripting additions use framework "Foundation" set a1Rect to {origin:{x:10, y:10}, |size|:{width:100, height:100}} set b1Rect to {origin:{x:30, y:30}, |size|:{width:100, height:100}} set a1Res to detectRectanglesCollision(a1Rect, b1Rect) of me –> true –> true–macOS 10.13, 10.14 set a4Rect to {origin:{x:0, y:20}, |size|:{width:100, height:10}} set b4Rect to {origin:{x:1000, y:10000}, |size|:{width:50, height:100}} set a2Res to detectRectanglesCollision(a4Rect, b4Rect) of me –> false –> false–macOS 10.13, 10.14 set a3Rect to {origin:{x:30, y:30}, |size|:{width:50, height:50}} set b3Rect to {origin:{x:10, y:10}, |size|:{width:100, height:100}} set a3Res to detectRectanglesCollision(a3Rect, b3Rect) of me –> true –> true–macOS 10.13, 10.14 set a4Rect to {origin:{x:0, y:20}, |size|:{width:100, height:10}} set b4Rect to {origin:{x:10, y:10}, |size|:{width:50, height:100}} set a4Res to detectRectanglesCollision(a4Rect, b4Rect) of me –> true –> true–macOS 10.13, 10.14 return {a1Res, a2Res, a3Res, a4Res} –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 |
2019年に書いた価値あるAppleScript – AppleScriptの穴 says:
[…] ■2019/5 矩形座標同士の衝突判定(共通部分の検出) v3b GET method REST API v4.3 このあたりは順調に機能を積み上げて到達した処理です。地道に機能を積み上げて、もう少しで別のレベルに行 […]