指定の広さの空間(Bin)に任意のサイズのブロックの組み合わせを最適化して詰め込むPackingの問題を解くAppleScriptです。
→ 別途、2D Bin PackingのAppleScriptを掲載しています「RectangleBinPackを用いて2D Bin Packを解く」
身の回りのさまざまな用途で利用されている2D/3D Bin Packing。ところが、実際に使ってみたいと思っても、使い勝手のよいプログラムが見当たりません。Cocoa Frameworkになっていて、NSRectをリストで渡すと結果を返してくれるようなものが個人的には理想的ですが、そういう仕様のものはほぼありません(完全にないわけではないものの、使い物にならない、、、)。
そこで、一応自分でも2D Bin Packing処理をAppleScriptで書いたものの、「ぴよまるソフトウェア」内で相談したところ外部公開はしにくい状況。
そうはいっても、2D Bin Packingを利用したあんな用途やこんな用途が山のようにあるので、外部のプログラムを呼び出してみるのがよいだろうかと(ふたたび)考え出したときに、まさかのREST APIで2D/3D Bin Packingの機能を提供しているpackit4meを発見(よく見つかったな)。
Web APIを呼び出して、3D Bin Packingを計算します。よくあるREST APIなので、プログラミングではなく「作業」のレベルで対処できます。
で、3D Bin Packingはいいものの、本命の2D Bin Packingを計算。
Keynote上のオブジェクトから情報を取得して….
packit4meで2D Bin Packを解かせてみると、Web上の3Dプレビュー(↑)はともかく、JSON(↓)で返してくる値が割とむちゃくちゃ。
[{"size": "40 x 30","id": "0","size_1": 40,"size_2": 30,"weight_limit": 3,"curr_weight": 3,"item_count": 3,"items": [{"id": "2","orig_size": "17 x 12","sp_size": "17 x 12","size_1": 17,"size_2": 12,"sp_size_1": 17,"sp_size_2": 12,"x_origin_in_bin": -11.5,"y_origin_in_bin": -9,"weight": 1,"constraints": 0},{"id": "1","orig_size": "7 x 12","sp_size": "7 x 12","size_1": 7,"size_2": 12,"sp_size_1": 7,"sp_size_2": 12,"x_origin_in_bin": 0.5,"y_origin_in_bin": -9,"weight": 1,"constraints": 0},{"id": "3","orig_size": "17 x 3","sp_size": "17 x 3","size_1": 17,"size_2": 3,"sp_size_1": 17,"sp_size_2": 3,"x_origin_in_bin": -11.5,"y_origin_in_bin": -1.5,"weight": 1,"constraints": 0}]}]
座標値にマイナスの値が含まれているなどうまく動いていない印象を受けます(制約条件が違うんだろか?)。
少なくとも、作者は2D Bin PackのJSON出力は検証していないのではないでしょうか、、、、残念!
AppleScript名:POST method REST API_packit4me |
— Created 2019-04-20 by Takaaki Naganoya — 2019 Piyomaru Software use AppleScript version "2.5" use scripting additions use framework "Foundation" property |NSURL| : a reference to current application’s |NSURL| property NSString : a reference to current application’s NSString property NSJSONSerialization : a reference to current application’s NSJSONSerialization property NSUTF8StringEncoding : a reference to current application’s NSUTF8StringEncoding set aBinPack to "bins=0:50:5x5x5&items=0:0:0:1x2x3,0:0:0:1x2x3,0:0:0:1x2x3&binId=0" set aRes to binPackByPackIt4me(aBinPack) of me –> {size_1:5, size_2:5, size_3:5, |id|:"0", weight_limit:50, curr_weight:0, |size|:"5 x 5 x 5", item_count:3, |items|:{{|id|:"0", sp_size_3:3, x_origin_in_bin:-2, orig_size:"1 x 2 x 3", weight:0, sp_size:"1 x 2 x 3", y_origin_in_bin:-1.5, constraints:0, size_3:3, sp_size_1:1, z_origin_in_bin:1, size_2:2, sp_size_2:2, size_1:1}, {|id|:"0", sp_size_3:3, x_origin_in_bin:-1, orig_size:"1 x 2 x 3", weight:0, sp_size:"1 x 2 x 3", y_origin_in_bin:-1.5, constraints:0, size_3:3, sp_size_1:1, z_origin_in_bin:1, size_2:2, sp_size_2:2, size_1:1}, {|id|:"0", sp_size_3:3, x_origin_in_bin:-2, orig_size:"1 x 2 x 3", weight:0, sp_size:"1 x 2 x 3", y_origin_in_bin:0.5, constraints:0, size_3:3, sp_size_1:1, z_origin_in_bin:1, size_2:2, sp_size_2:2, size_1:1}}} on binPackByPackIt4me(aBinPack as string) set tmpData to (do shell script "curl -X POST -H \"Content-Type: application/x-www-form-urlencoded\" -d \"" & aBinPack & "\" http://www.packit4me.com/api/call/raw") set jsonString to NSString’s stringWithString:tmpData set jsonData to jsonString’s dataUsingEncoding:(NSUTF8StringEncoding) set aJsonDict to NSJSONSerialization’s JSONObjectWithData:jsonData options:0 |error|:(missing value) set aRec to aJsonDict as record return aRec end binPackByPackIt4me |