Archive for the 'InDesign CS3' Category

2013/03/13 各テキストフレームの衝突ペアを作成

InDesign CS3(CS3以降であればtellブロックのアプリ名の書き換えのみでOK)のドキュメント上に存在するテキストフレームのうち、重なっているもののペアリスト(衝突リスト)を作成するものです。

indn1.png

こんなふうに(↑)テキストフレームが重なり合いつつ配置されている状態で、それでいて完全に内包関係が成立していたりはしなかったりする状況において、各テキストフレームが重なっている状況を2つの要素がペアになったリストで表現します。

先の図(↑)のような場合の実行結果は、

–> {{1, 2}, {3, 4}, {4, 5}}

のようになります。

テキストフレーム同士の重なり合い(衝突)の検出は……矩形Aと矩形Bの重なり合いの検出を考えた場合に(↓)、

indn2.png

矩形Aの座標の中に、矩形Bの各頂点座標が「含まれる」かどうかを判定すればよいので、条件文だけで判定可能です。

判定ロジック自体はInDesign以外のアプリケーションに対しても同様に利用できますが、矩形(テキストフレーム)の座標を求めたときに、InDesign特有の変態仕様で座標をY1, X1, Y2, X2の順で返してくることに合わせているため、座標値をY1,X1,Y2,X2のセットで扱っています。この点に気をつければ、他のアプリ用に変更することは難しくありません。

スクリプト名:各テキストフレームの衝突ペアを作成
–CS3〜CS6あたりまでアプリ名を書き換えれば動くはず
tell application “Adobe InDesign CS3″
  tell active document
    –テキストフレームを取得する
    
set aList to every text frame
    
    
–全テキストフレームのgeometric bounds=(Y1,X1,Y2,X2)を取得する    
    
set gList to {}
    
repeat with i in aList
      set the end of gList to geometric bounds of i
    end repeat
    
  end tell
end tell

–各テキストフレームの衝突ペアを作成
set gRes to collisionCheckByGeometricBounds(gList) of me
–> {{1, 2}, {3, 4}, {4, 5}}

–Geometric Boundsに着目して、衝突しているアイテムのペア(2つ)を返す
–ただし、3つ以上の衝突が発生しているケースは想定していない
on collisionCheckByGeometricBounds(gList)
  
  
set colList to {} –衝突検出したもののアイテム番号を追加
  
set colPairList to {} –衝突検出したアイテム番号のペアリストを追加
  
  
–チェック対象(1)を順次ループしてチェック
  
set itemCount to 1
  
repeat with ii in gList
    
    
–(1)に対していずれかの頂点座標が含まれているかどうか、チェックを総当たりで行う
    
set itemCount2 to 1
    
repeat with i in gList
      
      
–同じアイテム同士で衝突検出しても無意味なので、そのケースを除外する
      
if itemCount is not equal to itemCount2 then
        
        
–すでに、衝突検出したアイテム番号のリストに入っているものは処理から除外する
        
if itemCount2 is not in colList then
          set {y1, x1, y2, x2} to i
          
set posList to {{y1, x1}, {y1, x2}, {y2, x1}, {y2, x2}} –各頂点座標のリスト
          
          
set aRes to retIncludedPoint(ii, posList) of me –指定矩形内に、各頂点座標が入っているかどうかを判定する
          
          
–指定矩形内に、いずれかの頂点座標が入っていた(含まれていた)場合の処理
          
if aRes is not equal to {} then
            set the end of colPairList to {itemCount, itemCount2}
            
            
–同じペアが順番が入れ替わった状態で複数回検出されることを防ぐ({2,3}, {3,2}}など)
            
set the end of colList to itemCount2
            
set the end of colList to itemCount
          end if
          
        end if
      end if
      
      
set itemCount2 to itemCount2 + 1
    end repeat
    
    
set itemCount to itemCount + 1
  end repeat
  
  
return colPairList
  
end collisionCheckByGeometricBounds

–指定矩形内に含まれる座標をリストで返す
on retIncludedPoint(rangeList, posList)
  
  
set includedList to {}
  
  
set y1 to item 1 of rangeList
  
set x1 to item 2 of rangeList
  
set y2 to item 3 of rangeList
  
set x2 to item 4 of rangeList
  
  
repeat with i in posList
    
    
set targY1 to item 1 of i
    
set targX1 to item 2 of i
    
    
if (x1 targX1) and (x2 targX1) and (y1 targY1) and (y2 targY1) then
      set the end of includedList to (contents of i)
    end if
    
  end repeat
  
  
return includedList
  
end retIncludedPoint

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

2012/03/07 InDesign CS3で指定のオプジェクトを、JPEG書き出ししてiPhoneへ

InDesign CS3上で指定したオブジェクトをJPEG書き出ししてiPhoneに転送するAppleScriptです。

ことのはじまりは、目下開発中のiPhoneアプリ(私はプロジェクト管理やら仕様書書きやらを)で、Welcome画面の表示を行うのに「文字詰めや行送りをいろいろ指定できないと!」という話になったこと。

……そもそも、iPhoneの文字表示部品に、そんな気の利いたものはありません。そこで、InDesignやらIllustrator上で気の済むまで行間や文字間にこだわっていただいて、それをそのまま「画像」として書き出して表示しようではないか、と。

ただし、その指定内容をすぐにiPhoneの実機で見たいという話に。

その場で10分もかけずにInDesign書類上の指定レイヤー(「コンテンツ」)上に存在する指定名称(スクリプトラベル「screen」)のグループをJPEG書き出しして、書き出したJPEG書類をiPhotoにインポートして、iTunesに命令して接続しているすべてのiOSデバイスにシンクロを行うようAppleScriptで指令を出すようにしてみました。

できた瞬間はかなりガッツポーズでしたが、冷静に考えるとInDesignから書き出されるJPEG画像のクオリティが「残念なレベル」です。また、シンクロが終わるまでにちょっと時間がかかるので、実用性がいまひとつ。

結局、Good Reader for iPhoneをインストールして、iTunes経由でGood Readerに対してInDesignから書き出したPDFを渡す、という方法に落ち着きました。本Scriptは何らかの「可能性」を感じさせてくれはしたのですが、結局おクラ入りに。

スクリプト名:InDesign CS3で指定のオプジェクトを、JPEG書き出ししてiPhoneへ
–v1 InDesign CS3から直接JPEG書き出し。画像クオリティが低くて難あり

set dtPath to (path to desktop) as string
set fName to do shell script “date +%Y%m%d%H%M%S”

set fullPath to dtPath & fName & “.jpg”
set fullPathPOSIX to POSIX path of fullPath

tell application “Adobe InDesign CS3″
  tell document 1
    tell layer “コンテンツ”
      set aList to every group whose label is equal to “screen”
    end tell
    
    
set expItem to contents of first item of aList
    
export expItem format JPG to fullPath without with grids
    
  end tell
end tell

–iPhotoに書き出したJPEGファイルをインポートする
tell application “iPhoto”
  import from fullPathPOSIX
end tell

–アップデート可能なiOSデバイスをアップデートする
tell application “iTunes”
  repeat with i in sources
    if (kind of i is iPod) then update i
  end repeat
end tell

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

2011/07/18 InDesign CS3で選択中のオブジェクトの外周部の座標を取得する

InDesign CS3で選択中のオブジェクトの外周部の座標を取得するAppleScriptです。

idcs_range2.jpg

複数のオブジェクトの外周部の座標のみ取得したいという場合、安直にグループ化してその座標(geometric bouds)を取得する方法も考えないではないですが、元に戻すときに何かよくないこと(前後関係が狂うとか)が起こる可能性があるため、「グループ化→座標取得→グループ化解除」の順で処理するのは避けたいところ。

そこで、力ワザでありもののソートルーチンを用いて、ソートだけで取得するように処理してみました。y1とx1は昇順ソート、y2とx2は降順ソートして、それぞれ最初の項目から値を取得しています。

基礎的な属性アクセスしか使っていないため、とくにInDesignのバージョンに依存せずに使用できるはずです(tellブロックのアプリケーション名を書き換えるぐらい)。

スクリプト名:InDesign CS3で選択中のオブジェクトの外周部の座標を取得する
tell application “Adobe InDesign CS3″
  tell active document
    set gList to geometric bounds of selection
    
    
copy gList to y1List
    
copy gList to y2List
    
copy gList to x1List
    
copy gList to x2List
    
    
set y1Res to shellSortListAscending(y1List, 1) of me
    
set x1Res to shellSortListAscending(x1List, 2) of me
    
set y2Res to shellSortListDecending(y2List, 3) of me
    
set x2Res to shellSortListDecending(x2List, 4) of me
    
    
–外周部の座標を取得する
    
–y1, x1は最小のものを取得
    
set y1min to item 1 of item 1 of y1Res
    
set x1min to item 2 of item 1 of x1Res
    
    
–y2, x2は最大のものを取得
    
set y2max to item 3 of item 1 of y2Res
    
set x2max to item 4 of item 1 of x2Res
    
    
return {y1min, x1min, y2max, x2max}
    
–> {64.666666666667, 39.0, 177.0, 202.0}
  end tell
end tell

–シェルソートで入れ子のリストを昇順ソート
on shellSortListAscending(a, keyItem)
  set n to length of a
  
set cols to {1391376, 463792, 198768, 86961, 33936, 13776, 4592, 1968, 861, 336, 112, 48, 21, 7, 3, 1}
  
repeat with h in cols
    if (h (n - 1)) then
      repeat with i from h to (n - 1)
        set v to item (i + 1) of a
        
set j to i
        
repeat while (j h) and ((contents of item keyItem of item (j - h + 1) of a) > (item keyItem of v))
          set (item (j + 1) of a) to (item (j - h + 1) of a)
          
set j to j - h
        end repeat
        
set item (j + 1) of a to v
      end repeat
    end if
  end repeat
  
return a
end shellSortListAscending

–シェルソートで入れ子のリストを降順ソート
on shellSortListDecending(a, keyItem)
  set n to length of a
  
set cols to {1391376, 463792, 198768, 86961, 33936, 13776, 4592, 1968, 861, 336, 112, 48, 21, 7, 3, 1}
  
repeat with h in cols
    if (h (n - 1)) then
      repeat with i from h to (n - 1)
        set v to item (i + 1) of a
        
set j to i
        
repeat while (j h) and ((contents of item keyItem of item (j - h + 1) of a) < (item keyItem of v))
          set (item (j + 1) of a) to (item (j - h + 1) of a)
          
set j to j - h
        end repeat
        
set item (j + 1) of a to v
      end repeat
    end if
  end repeat
  
return a
end shellSortListDecending

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

2011/07/18 InDesign CS3で指定座標内に存在しているラインオブジェクトを抽出する

InDesign CS3で、指定座標内に重なっているラインオブジェクトを抽出するAppleScriptです。

とりあえず……画像を選択して本AppleScriptを実行すると、画像に重なっているラインオブジェクトを取り出してくれます。

引き出し線とその先の解説文字も含めて、プログラムの自動判別でひとかたまりに扱ってしまおうという目論見の課程で作られた試作品です。

画像を中心とした引き出し線+解説のテキストが入っているテキストフレームまでを1つの塊として認識して、外周部の座標を計算して、別途書き出しておいた画像をトリミングするという……図鑑などのやたらと画像点数が多いデータで「画像+解説部分」をひとまとめに取り出すためのプログラムに仕立て上げる予定(1日ぐらいでできそう)。

手作業部分をイレギュラーなものだけに限定できるので、圧倒的な効率化が実現できます。

idcs3_range.jpg

InDesign CS3用といっていますが、とくにそれほどバージョン依存しているわけではありません。書き換えもおそろしく簡単でしょう。

スクリプト名:InDesign CS3で指定座標内に存在しているラインオブジェクトを抽出する
tell application “Adobe InDesign CS3″
  tell document 1
    set aSel to first item of selection
    
set imgBounds to geometric bounds of aSel
    
    
set glList to every graphic line
    
set gvList to geometric bounds of every graphic line
    
    
set aRes to corruptRange_Y1X1Y2X2_retByID(imgBounds, gvList) of me
    
    
set selList to {}
    
repeat with i in aRes
      set the end of selList to item i of glList
    end repeat
    
    
  end tell
end tell

selList
–> {graphic line id 363 of page id 238 of spread id 233 of document “testdata.indd” of application “Adobe InDesign CS3″, graphic line id 267 of page id 238 of spread id 233 of document “testdata.indd” of application “Adobe InDesign CS3″, graphic line id 266 of page id 238 of spread id 233 of document “testdata.indd” of application “Adobe InDesign CS3″}

–指定矩形内に重なるデータをアイテム番号で返す
on corruptRange_Y1X1Y2X2_retByID(rangeList, targetList)
  set includedList to {}
  
  
set aCount to 1
  
  
set y1 to item 1 of rangeList
  
set x1 to item 2 of rangeList
  
set y2 to item 3 of rangeList
  
set x2 to item 4 of rangeList
  
  
repeat with i in targetList
    set targY1 to item 1 of i
    
set targX1 to item 2 of i
    
set targY2 to item 3 of i
    
set targX2 to item 4 of i
    
    
    
if ((x1 < targX1) and (targX1 < x2) and (y1 < targY1) and (targY1 < y2)) then
      set the end of includedList to aCount
    else if ((x1 < targX2) and (targX2 < x2) and (y1 < targY2) and (targY2 < y2)) then
      set the end of includedList to aCount
    end if
    
    
set aCount to aCount + 1
    
  end repeat
  
  
return includedList
end corruptRange_Y1X1Y2X2_retByID

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

2011/04/03 InDesign CS3でBookを作成するテスト

InDesign CS3で複数の書類をまとめた「Book」を作成するAppleScriptです。

別途、ノンブルを振っておく必要があるようです(作ったけど)。

スクリプト名:InDesign CS3でBookを作成するテスト
set myFileList to {}

set myFolder to choose folder

tell application “Finder”
  tell folder myFolder
    try
      –普通のケース
      
set fList to (every file whose name ends with “.indd”) as alias list
    on error
      –多分、ファイルが1つしか存在しなかったケース
      
set f2List to (every file whose name ends with “.indd”)
      
set fList to {}
      
repeat with i in f2List
        set the end of fList to i as alias
      end repeat
    end try
  end tell
end tell

if (count fList) > 0 then
  set myBookFile to choose file name with prompt “Save book file as”
  
  
tell application “Adobe InDesign CS3″
    set myBook to make new book with data {full name:myBookFile}
    
    
repeat with i in fList
      set j to contents of i
      
tell myBook
        make book content with data {full name:j}
      end tell
    end repeat
  end tell
  
else
  display dialog “No InDesign files were found in the selected folder.”
end if

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

2010/09/04 配置されたオブジェクトから取得した座標値を解析して、縦にいくつ並んでいるかを計算

2010/07/31 InDesign CS3で、指定ScriptLabelの中のテキストの、指定行の指定文字以降を行末まで取得

InDesign CS3で、現在オープン中の最前面のドキュメント上の指定のScript Labelがついているtext frame中のテキストで、指定行目の指定文字以降の文字を行末まで取得するAppleScriptです。

「指定文字」が存在しなかった場合には行ごと返します。

id1.jpg

スクリプト名:InDesign CS3で、指定ScriptLabelの中のテキストの、指定行の指定文字以降を行末まで取得
set aRes to getLabeledDataAndPickUp("hiyokoMaker", 2, "/") of me
–> "ボボ・ブラジル"

set aRes to getLabeledDataAndPickUp("hiyokoMaker", 2, "ぴよぴよ") of me
–> "■ひよこの原産地/ボボ・ブラジル"

–指定ScriptLabelの中のテキストの、指定行の指定文字以降を行末まで取得
on getLabeledDataAndPickUp(aScriptLabel, aLineNum, aMarker)
  set aRes to retLabeledData(aScriptLabel) of me
  
set aList to paragraphs of aRes
  
set aLine to contents of item aLineNum of aList
  
set aPos to offset of aMarker in aLine
  
set aText to text (aPos + 1) thru -1 of aLine
  
return aText
end getLabeledDataAndPickUp

–指定のScript Labelのデータ(Contents)を取り出す
on retLabeledData(aScriptLabel)
  tell application "Adobe InDesign CS3"
    tell document 1
      try
        set aObj to every page item whose label is aScriptLabel
        
        
set targObj to first item of aObj
        
set aRes to contents of text 1 of targObj
      on error
        return "<error>"
      end try
    end tell
  end tell
end retLabeledData

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

2010/07/31 現在のドキュメント上のアイテムをすべてグループ解除

InDesign CS3で、現在オープン中の最前面のドキュメント上のオブジェクトをすべてグループ解除するAppleScriptです。

スクリプト名:現在のドキュメント上のアイテムをすべてグループ解除
ungroupAll() of me

on ungroupAll()
  tell application "Adobe InDesign CS3"
    tell document 1
      tell every page
        repeat
          set gList to every group
          
if gList = {} then exit repeat
          
tell every group to ungroup
        end repeat
      end tell
    end tell
  end tell
end ungroupAll

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

2009/11/06 InDesign CS3のuser interaction levelを取得、設定する

InDesign CS3で、エラーレベルの取得および設定を行うAppleScriptです。

InDesignでは、エラー時にどのレベルまで警告するか……というよりは、自動処理時にエラーを無視するために、user interaction levelを設定できます。たいていは、すべてのワーニングを無視する「never interact」に設定。すべての処理が終わったあとで、Script実行前に取得しておいた現在のワーニングレベルに戻す、という処理を行います。

スクリプト名:InDesign CS3のuser interaction levelを取得、設定する
set aRes to retUserInteractionLevel() of me
setUserInteractionLevel(0) of me

–InDesign CS3のuser interaction levelを設定する
on setUserInteractionLevel(aNum)
  if (aNum > -1) and (aNum < 3) then
    try
      using terms from application “Adobe InDesign CS3″
        tell application “Adobe InDesign CS3″
          tell script preference 1
            if aNum = 0 then
              set user interaction level to never interact
            else if aNum = 1 then
              set user interaction level to interact with all
            else if aNum = interact with alerts then
              set user interaction level to interact with all
            end if
          end tell
        end tell
      end using terms from
    end try
  else
    
  end if
end setUserInteractionLevel

–InDesign CS3のuser interaction levelを取得する
on retUserInteractionLevel()
  using terms from application “Adobe InDesign CS3″
    tell application “Adobe InDesign CS3″
      tell script preference 1
        set uRes to user interaction level
        
if uRes = never interact then
          –エラーやワーニングがあっても警告しない
          
return 0
        else if uRes = interact with all then
          –すべてのエラーやワーニングを警告する
          
return 1
        else if uRes = interact with alerts then
          –ワーニングについてのみ表示する
          
return 2
        end if
      end tell
    end tell
  end using terms from
end retUserInteractionLevel

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に