category name  »  page title date

レイヤーをいじる

イラストレーターを開く」の GetAiDoc() で、指定されたイラストレーターのファイルを開いて、アプリケーション・オブジェクト AiDoc を取得することができました。このオブジェクトを利用すると、VBA からイラストレーターを操作したり、その状態を取得したりすることができます。
とりあえず、レイヤーをいじってみました。
その前提として、パブリックなオブジェクト AiDoc を取得しておく必要があります。これは、GetAiDoc(aiFilePath) でよいのですが、ファイル・パスを手入力するのもなんですので、ファイル選択ダイアログを使った SelectAiFile() を用意しました(エラー処理などははしょっていますので、実装する際には気を付けてください)。

標準モジュール     SelectAiFile()

'----- AiDoc の取得
Public AiDoc As Object

Public Function SelectAiFile()
Dim filePath
      filePath = fileSelect("Illustratorファイル", "*.ai")
      SelectAiFile = GetAiDoc(filePath)
End Function

'----- ファイル選択ダイアログ
Private Function fileSelect(fileType, filterStr)
      With Application.FileDialog(msoFileDialogFilePicker)
            .Filters.clear
            .Filters.Add fileType, filterStr, 1
            .Title = "[" & fileType & "] を選択してください"
            .AllowMultiSelect = False
            .InitialFileName = ThisWorkbook.Path
            If Not .Show Then Exit Function
            fileSelect = .SelectedItems(1)
      End With
End Function

レイヤーを表示したり隠したり

さて、これで AiDoc を読み込むことができました。AiDoc のプロパティはわんさかありますが、その中に Layers というのがあって、これがレイヤーのコレクションになっています。オブジェクト・ブラウザーで覗いてみると、そのメンバーの layer には、さらに Layers や PathItems や TextFrames、GroupItems など、これもわんさかあって、それぞれにいくつものメソッドが用意されています。これらを駆使できれば、さぞかし面白いことができると思われますが、それは必要に駆られたときに挑戦するとして、ここではレイヤーをちょっといじってみました。
次の LayerVisibility() は、個々のレイヤーを表示したり隠したりするプロパティです。
LayerVisibility(レイヤー名または番号) = True で表示、= False で隠します(ここで対象となるレイヤーは、AiDoc 直下のレイヤーだけで、その下の子孫レイヤーは無視されるかエラーとなります)。
操作した結果は、イラストレーター画面がアクティブにならないと視覚的には反映されませんのでご注意。

標準モジュール     LayerVisibility()

Public Property Let LayerVisibility(layerName, sw)
      AiDoc.Layers(layerName).Visible = sw
End Property

レイヤーの一覧を表示

次に、入れ子状態になったレイヤーの一覧表をつくってみました。
たとえば、左図のようなレイヤー構成の場合、ワークシートに右図のような表を作ってくれます。

layerList という名前のワークシートを用意しておくと、その B2 セルから始まって右に子ども、下に兄弟のツリー型のリストを作成します。

標準モジュール     MakeLayerList()

Public Sub MakeLayerList()
      ThisWorkbook.Worksheets("layerList").Activate
      ActiveSheet.Cells.ClearContents
      displayLayerList AiDoc, 2, 2
End Sub

Private Sub displayLayerList(layer, row, column)
Dim visibleChar, n
      With layer
            If .Layers.count = 0 Then Exit Sub
            For n = 1 To .Layers.count
                  visibleChar = "・"
                  If .Layers(n).Visible Then visibleChar = "〇"
                  ActiveSheet.Cells(row, column).value = _
                        visibleChar & .Layers(n).Name
                  displayLayerList .Layers(n), row, column + 1
                  row = row + 1
            Next
            row = row - 1
      End With
End Sub

これが、何の役に立つかと言われれば、ほとんど何の役にも立ちません。しかし、何となくアプリケーション・オブジェクトのメンバーのいじり方のイメージがわかって、次は TextFrame の文字を入れ替えてみようとか、新しく Layer にパスを追加してみようとか、展開していくための入口にはなります。