SmartObjectレイヤーの名前と、配置されたSmartObjectの4頂点の座標を一括出力するスクリプト
一晩寝て、ちょっと調べたら解決策があったので、もう一つ記事投稿しておきます
//SmartObjectの4頂点の座標を返す function GetSmartObjectCorner() { try { var r = new ActionReference(); r.putEnumerated( charIDToTypeID( "Lyr " ), charIDToTypeID( "Ordn" ), charIDToTypeID( "Trgt" ) ); var d; try { d = executeActionGet(r); } catch (e) { alert(e); return; } try { d = d.getObjectValue(stringIDToTypeID("smartObjectMore")); } catch (e) { alert(e); return; } try { d = d.getList(stringIDToTypeID("nonAffineTransform")); } catch (e) { alert(e); return; } var ret = [[d.getDouble(0),d.getDouble(1)], [d.getDouble(2),d.getDouble(3)], [d.getDouble(4),d.getDouble(5)], [d.getDouble(6),d.getDouble(7)]]; return ret; } catch (e) { alert(e); } } //レイヤーを探す //LayerSetだったら再帰で探す function FindLayer( rootLayer, condition ) { var artLayers = []; var layers = rootLayer.layers; var length = layers.length; for ( var i = 0 ; i < length ; ++i ) { var layer = layers[i]; if ( layer.typename == "ArtLayer" ) { if ( condition( layer ) ) { artLayers.push(layer); } } else if ( layer.typename == "LayerSet" ) { artLayers = artLayers.concat( FindLayer(layer, condition) ); } } return artLayers; } //全てのArtLayerを取得したいときのCondition function FindAlways( artLayer ) { return true; } //全てのArtLayerを取得したいときのCondition function FindSmartObject( artLayer ) { return artLayer.kind == LayerKind.SMARTOBJECT; } //文字列(** px)となっているboundsをparseしてIntで返す function GetIntBounds( artLayer ) { var intBounds = []; intBounds.push( parseInt(artLayer.bounds[0]) ); intBounds.push( parseInt(artLayer.bounds[1]) ); intBounds.push( parseInt(artLayer.bounds[2]) ); intBounds.push( parseInt(artLayer.bounds[3]) ); return intBounds; } function WriteLineSmartObjectCorner( f, artLayer ) { app.activeDocument.activeLayer = artLayer; f.write(artLayer.name+","); var corner = GetSmartObjectCorner(); f.write(corner[0]+","+corner[1]+","+corner[2]+","+corner[3]); f.write("\n"); } //処理メイン function Main() { var activeDocument = app.activeDocument; if ( activeDocument == null ) { return; } //初期設定 var keepActiveLayer = activeDocument.activeLayer; var keepUnit = preferences.rulerUnits; preferences.rulerUnits = Units.PIXELS;//pixelユニットとする //ドキュメント名 var documentName = activeDocument.name; var findLayers = FindLayer(activeDocument, FindSmartObject); var length = findLayers.length; if ( length == 0 ) { preferences.rulerUnits = keepUnit; activeDocument.activeLayer = keepActiveLayer; alert("目的のレイヤーを発見できませんでした。"); return; } var txtFile = File.openDialog("矩形情報Textファイルを出力します", "*.txt"); if ( txtFile == null ) { preferences.rulerUnits = keepUnit; activeDocument.activeLayer = keepActiveLayer; return; } var f = new File(txtFile); f.open('w'); for ( var i = 0 ; i < length ; ++i ) { WriteLineSmartObjectCorner(f, findLayers[i]); } f.close(); //戻す preferences.rulerUnits = keepUnit; activeDocument.activeLayer = keepActiveLayer; //完了ダイアログ表示 alert("出力が完了しました"); } Main();
SmartObjectのScaleにも対応されているようなので、とりあえずこれで目的は達成されました。
これでアーティストに座標を聞きに行く手間が解消されるかな。
↓参考サイト
forums.adobe.com