PR

VBA向けテンプレートエンジン「MiniTemplator」の使い方例。簡単にエクセルからCAD用のスクリプトが生成できて感動した!

CAD

VBA向けのテンプレエンジン「MiniTemplator」を紹介します。
テンプレートにエクセルから情報を流し込んで、ファイルを生成することができます。

このおかげで、プログラミングが最小限に抑えられます。
手軽に品質の良い結果が得られ、かなり助かりました。

スポンサーリンク

「MiniTemplator」の紹介

公式サイト

公式サイトはこちら。

MiniTemplator - A compact, optimized template engine for HTML files

各種言語にむけて配布されています。
私は、VBA向け (Visual Basic (VB/VBA) Version) を選びました。

テンプレートエンジンとは

「MiniTemplator」はテンプレートエンジンの一種です。

そしてテンプレートエンジンとは、「テンプレート(ひな型)となるデータに情報を流し込んで、ファイルを生成するためのライブラリー(コンポーネント)」です。

例えば、こんな感じ。

テンプレートエンジンとは

何が便利なのか?

独立したソフトではないので、プログラミングがゼロになるわけではありません。
何をさせたいかは、自分で書く必要があります。

ただ、都度必要になる下記のような処理は、「MiniTemplator」から機能を呼べばよいだけ。
ごく少ない記述で済みます。

・テンプレを読み込む
・定義どおりに置換する
・出力する・・・など

これを一から作るのは、考えただけでぞっとします。

シンプルで明快なルール

「MiniTemplator」はシンプルでコンパクトだけど、十分に使えます。

テンプレートの文法も簡単なので、覚える手間がほとんどかかりません。

こんなことが出来た

AutoCAD LTや互換CAD(DraftsightやBricsなど)で使うための、「スクリプトファイル」を生成しました。

「スクリプトファイル」とは、図面への処理内容を記述したファイル。大量の図面に処理を適用するために使います。

例えば、dwg形式のファイルが100枚あるとします。
それらを、「バージョンを指定してDXFに変換したい」としましょう。

その場合、100枚分の処理を1つのファイルに記述せねばなりません。

ただし、下記のような条件があります。

  • ファイル名の末尾がA3なら、バージョンは2000へ変換する。
  • ファイル名の末尾がA4なら、バージョンは2013へ変換する。

こういう条件を加味したスクリプトファイルを、手早く生成できるのです。

最終的に、こんなアウトプットファイルが出来ました。

一言でいうと、
図面一枚あたり数行のスクリプトを、図面枚数分繰り返して、一つのファイルにすべて記述した(一部可変させながら)

繰り返しの中で一部可変させたのは、ファイルパスとバージョン。難なく成功。

1000行以上のコードが一瞬で生成されるわけです。便利さに驚きました。

LTではないAutoCADならば、複数ファイルに適用できる専用ツールがあります。
その場合は、一枚分のみの処理を書いたスクリプトファイルを作ればokなので、この記事の方法は必要ありません。過去記事参照

動作のようす

★Windows10 64bit、エクセル2016、BricsCADとAutoCAD LTで動作確認しました。

変換対象の図面が入ったフォルダに、下記のファイルを置きます。

  • ひな型となるテンプレートファイル
  • VBAを仕込んだエクセルファイル

ひな型となるテンプレートファイルはこんな感じ

テンプレートは、図面一枚あたりの処理内容を書いておくだけ。
これをVBAから出す指示で、図面の枚数分繰り返したファイルを生成します。

色付きの部分(${file}${ver})は、私が任意に設定した変数です。
$と{}で囲むのは文法として決まっているので、従っています。

VBAを仕込んだエクセルファイルはこんな感じ

B列は、上記のひな形の${file}に流し込むためのリストです。

実行」をポチっとクリックすると、

一瞬で生成完了です。

生成されたスクリプトファイル

ちゃんと100枚分が、条件通りに生成されています。

一枚あたりの18行ほどのコードを、100枚分繰り返して1つのファイルに記述しています。

(更に、ファイル名がA3なら変換バージョンを2000に。A4は2013、という条件でしたね)

生成したスクリプトファイル

さあ、では次からは詳細な使い方を解説していきます。
その前に、使うツールを準備して下さい。

使うツールの準備

MiniTemplator

これがないと始まりません。

MiniTemplator - A compact, optimized template engine for HTML files

各種言語にむけて配布されています。
VBA向け (Visual Basic (VB/VBA) Version) を選んで下さい。

ダウンロードしたら、ZIPファイルを解凍しておいて下さい。

エクセル

VBAを使うので、「開発タブ」を有効にしてください。

[開発] タブを表示する - Microsoft サポート
必要に応じ、 タブをリボンに追加します。

そして、「開発」→「Visual Basic」をクリック。

Visual Basicが立ち上がったら、「ファイル」→「ファイルのインポート」をクリック。
先ほどダウンロードしたMiniTemplatorの「MiniTemplator.cls」をインポートして下さい。

ちなみに、コードは「挿入」→「標準モジュール」で追加されるエリアに書き込んでいきます。

テキストエディタ

エンコードによりエラーが出る可能性もあるので、必須といえると思います。
無料で高機能のMeryがおすすめです。

MeryWiki
フリーのテキストエディタ「Mery」を公開しています。

作り方の詳細

ファイルの置き場所

これから説明するファイルは、同じフォルダの中に置く想定です。
最後に実行して作られるファイルも、同じ場所に生成されます。

テンプレートファイルを作る

繰り返すベースとなる、テンプレート(ひな形)を作ります。
ファイルの文法はシンプルです。

拡張子はtxtのテキストファイルとして、保存しておけばOKです。
ファイル名は、「cad-script-template.txt」としておきます。

  • 可変部分のカタマリを、beginblockとendblockで囲みます。
  • 変数(条件によって可変させたい部分)を、${hogehoge}で表現します。
    hogehogeは、自分で好きに決めて下さい。

スクリプトをいきなり生成すると、PCがフリーズする恐れがあります。一枚だけのテストスクリプトを書いて、必ず正常動作を確認してください。

また、AutoCAD LTとBricsCADなど互換CADでは同じスクリプトが動かない可能性があります。

例えば、下記を見て下さい。
どちらも、今回の課題「dwgファイルを、バージョン指定して変換する」スクリプトです。

AutoCAD LTの場合

Autocad LTの場合は、変換後のファイル名はエンターで自動的に決めてくれます。

※ 上記のコードが表示されない方は、こちらのリンク先をご覧ください。

BricsCAD V17の場合

しかしBricsCADは、変換後の名前はきっちりと具体的に指示してやらねばなりません。
こういうCADごとの細かい違いにご注意ください。

※ 上記のコードが表示されない方は、こちらのリンク先をご覧ください。

VBAを仕込んだエクセルファイルを作る

今回の課題では、下記のような流れで処理します。

  1. エクセルファイルにファイル名のリストを貼付
  2. VBAから順次リストを読み出し、テンプレの変数へ流し込む

1.  エクセルファイルにファイル名のリストを貼付

まず、エクセルで、変換対象のファイルリストを作ります。
これを、後から作るVBAのプログラムで読み取っていきます。

実行ボタンの作り方は、後述します。

ファイルリストの作り方

ここで、「ファイルリストってどうやって作るの??もしかして手打ち?」と心配になった方。
大丈夫です、自動でできます。

まず、変換対象のdwgファイルを、一つのフォルダにまとめて入れておきます。

次に、下記のバッチファイルのコード5行をテキストエディタでコピペして、「file.bat」とでも名付けて同フォルダに置きます。

※ 上記のコードが表示されない方は、こちらのリンク先をご覧ください。

そして、そのbatファイルをダブルクリックして実行します。

すると、「file-list.txt」というファイルが出来ています。
それを開いて、エクセルにコピペすればOKです。

なおbatファイルを見て頂くとわかりますが、わざと拡張子無しのリストを生成する仕様です。

2.  VBAから順次リストを読み出し、テンプレの変数へ流し込む

こんな感じのコードで処理しました。

このコードは、エクセルの「開発」タブ→Visual Basicをクリック。
そして、「挿入」→「標準モジュール」をクリックしてできたエリアに書き込んでください。

※ 上記のコードが表示されない方は、こちらのリンク先をご覧ください。

1.で作ったエクセルリストがありますよね。そのセルB2から順にファイルリストを読み取って、テンプレートの変数に流し込んでいます。

そして、読み取ったファイル名の条件により、変換バージョンを分岐させています。

なお、テンプレートの読み込みや書き出し、ブロックへの追加はエンジンの規則に従った定型文です。

VBAでのコードの流れは、下記サイトを参考にさせて頂きました。

実行ボタンの作り方

「開発」→「挿入」から、フォームコントロールのボタンの絵をクリック。
適当にボタンを配置して下さい。

そうすると、ダイアログが出てきます。
実行させたいプロージャ名を選択してください。
この記事のサンプルコードではmainの中にコードを書きました。
ですので、mainを選択します。

そして、作った実行ボタンをクリックすれば、プログラムが実行されファイルが生成されます。

生成したスクリプトファイルの使い方

注意
スクリプトファイルは、必ず動作前にテストファイルで正常動作を確認してください。
思わぬミス(ファイルの消失)などが発生する可能性があります。

一言でいうと、
CADを立ち上げて、スクリプトファイルをドラッグアンドドロップするだけ
です。

または、CADのメニューからスクリプトファイルを実行しても構いません。

例えば、「output-cad-script.scr」というファイルを生成したとしましょう。

まず、CADを立ち上げます。
とりあえず新規作成で空の図面をひらいておきます。

そしてそこへ、先の「output-cad-script.scr」をドラッグあんどドロップします。

すると、処理が実行されます。

VBAでやるメリット

テンプレートエンジンはいろんな言語向けに、様々に存在します。
そのなかで、VBAがおすすめな理由を書いてみました。

親しみやすい

いくらテンプレートエンジンが便利でも、それを操る言語を覚えるハードルが高いと億劫になってしまいます。

しかしエクセルなら、日常的に使っている方は多いはず。
私もCADのカスタマイズやエクセルの自動化でVBAを日常的に触っていて、得意ではなくとも抵抗がありませんでした。

「使ってないからわからない」という方もいるかもしれません。
しかしVBAなら今の時点でわからなくても、エクセルが使えるならすぐに馴染めます。
資料や書籍も豊富です。

私は、この本で勉強しました。
分厚く取っつきにくく感じるかもしれませんが、順を追って丁寧に書かれています。
文中の説明用の細かいサンプルコードも、地味に役立ちますよ。

UIも手軽に作れる

VBAなので、エクセルとの連携は容易です。

そして、そのエクセルのワークシートで最低限のUIを手軽に作れるのが良いです。

パラメータの入力欄など、テンプレートに流し込む情報をエクセル上で表現できます。
実行ボタンやメッセージウインドウの表示なども、手軽に使えますよね。

人に渡しやすい

エクセルは大抵のPCにインストールされています。

ですので、一般的なPC環境であればほぼ誰でも実行が可能です。

pythonにも、jinja2という割と手軽に使えるテンプレートエンジンがあって時々使っています。
しかし一人で使う分には良いですが、python環境がないと実行できないのがネックです。

さいごに

AutoCAD LTではLISPが使えない為、大量の図面処理はとても大変で、昔から良い方法がないものかと悩んでいました。

当初はコマンドプロンプトでFORループを回していました。この方法だと都度AutoCAD LTが立ち上がってしまい難儀していたんです。

そんな中、記事を見られた方から「スクリプトファイルに枚数分の処理を記述すれば良いよ!」という情報を頂きました。

そして、今度問題になるのが「スクリプトファイルをどう作るか」です。
今回出会った「MiniTemplator」を知る前は、自作VBAで生成していました。
単純な繰り返しならこれで賄えていましたが、しかし!
繰り返すスクリプトを変化させたいなど、条件が増えるとお手上げになります。

テンプレートエンジンの作者様に感謝しています。

関連記事

タイトルとURLをコピーしました