Visual Studio Code への移行

Visual Studio Code

AutoCAD 2021 から AutoLISP の開発は Visual Studio Code を主流にしていくことが AutoDesk から表明されました。Visual Studio Code は Microsoft が開発しているソースコードエディターです。MIT ライセンス下によりオープンに現在も改良が加えられており、高い柔軟性や拡張性から現在の主流な汎用エディターの最大手です。そして AutoCAD 2021 から日本語を含むマルチバイト文字のあつかいが UNICODE をベースにするものに完全に変更になったため、特に非英語圏はそれに正式に対応する Visual Studio Code を開発の中心としなければならなくなりました。

UNICODE 変換における注意点

既存のプログラムでユーザーへのプロンプトを SHIFT_JIS の文字列で表示していた場合、多くはプログラムのソースコードを UTF-8 といった UNICODE に変換して保存しなおせば AutoCAD 2021 以降でも正しく文字列が表示されるようになります。しかし、変換の仕方によっては問題が発生する場合もあるので確認が必要です。

それは、改行などを表すエスケープシーケンスで使っていた「¥(円マーク)」が UNICODE 下では「\(バックスラッシュ)」と厳密に区別され、文字コードでは 10 進表記で「¥」は 165 、「\」は従前どおり 92 です。従前は同じ ASCII コードに割り当てられた異なる記号だったので見た目が異なっていても地域差ということで問題になりませんでした。しかし、文字コードの変換の仕方によっては、「¥」が「¥」のまま UNICODE に変換され正しいエスケープシーケンスとは認識されなくなりますので、注意が必要です。また、表示ソフトウェアとフォントの設定で文字コードが 92 でも「¥」と表示されている場合もあります。UNICODE 下では「\n」といった「\(バックスラッシュ)」、文字コードで 92 を使うのが正しいエスケープシーケンスです。

なお、UNICODE に変換したプログラムのマルチバイト文字は AutoCAD 2020 以前では正しく表示できなくなります。また、UNICODE の種類に UTF-8 や UTF-16 といったエンコードの種類がありますが、コードをバイト単位で表す際の処理の仕方が異なるだけで、AutoCAD ではどれを選んでも表立って差は出ないようです。しかし、文字化けが起こった場合はエンコード情報が頭に付加された「UTF-8 with BOM」を試してみてください。

新しい環境だからより便利になったというわけではありませんが、Visual Studio Code に開発環境を移行するメリットとして今のところ次のようなものが挙げられます。

  1. SHIFT_JIS などといった古い文字コードベースで時には不具合の原因になっていた仕様を、現代的な UNICODE に移行できる。
  2. ソースコード補完が使用でき、自分で拡張できる。
  3. ソースコードバージョン管理システム Git を利用でき、ソースコードをホスティングするインターネットサービス GitHub にもアクセスが容易である。

現代的な開発環境になる一方で従前の Visual LISP は古いデザインとなってきているとはいえ AutoCAD と一体化され AutoLISP 開発専用に作られていることもあって、Visual LISP でしかできないことが多々あります。Visual Studio Code の AutoLISP 開発環境が今後 Visual LISP のそれにどれだけ近づけられるかは未知数ですが、利便性が落ちるところは時には Visual LISP を使用しながらこれからは Visual Studio Code を主に使ってプログラムを作っていくことになります。

以降は、Visual LISP などで AutoLISP のプログラムを作ってきた人向けの Visual Studio Code への移行のためのガイドとなります。初めて AutoLISP のプログラムを作る方は、別コラムの「Visual LISP 入門」で開発の流れのイメージを持ったうえで読まれることをお勧めします。

Visual Studio Code の準備

Visual LISP とは異なり、Visual Studio Code は AutoCAD をインストールしただけでは使用可能となっていません。そのため別途ダウンロードしインストールを行います。そして Visual Studio Code を起動したら、その拡張機能の AutoCAD AutoLISP Extension を導入します。これにより、拡張子が LSP のファイルは LISP のソースコードであると認識し、AutoCAD と接続して AutoLISP プログラムを走らせたりデバッグを行うことができるようになります。ここまでの手順は通常のアプリケーションのインストールであり Visual Studio Code の拡張機能の導入のインターフェイスが簡便に作られているため AutoCAD のヘルプを参照しながら迷うことなく進めることができるでしょう。Visual Studio Code メニューの日本語化など検索すればやり方がすぐ見つかりますし手順も簡単です。

Visual Studio Code のウィンドウ構成

以降の説明のためにも、簡単に Visual Studio Code のウィンドウ構成について説明します。Visual Studio Code の一般的な使い方は WEB を検索したり書籍を読んだりして詳細を確認してください。

Visual Studio Code で特徴的なのが【アクティビティバー】とそれに連動した【サイドバー】の存在です。【アクティビティバー】は初期状態では 5 つのボタンが縦に並んでいますが、数は拡張機能によって変わります。【アクティビティバー】で機能を選び、そのための入力欄や表示欄が【サイドバー】に表示されます。

Visual Studio Code

【エクスプローラービュー】 : 現在開いているファイルやフォルダ、または【ワークスペース】を表示し、ファイルやフォルダにアクセスしやすくします。

【検索ビュー】 : 検索と置換を行います。Visual Studio Code の検索と置換はたいへん使いやすく強力です。

【ソースコントロールビュー】 : バージョン管理システム git の【コミット】を行います。

【デバッグビュー】 : AutoCAD に接続し、AutoLISP プログラムを実行しデバッグを行います。AutoCAD に接続時には、自動的にこのビューに切り替わります。

【拡張機能ビュー】 : AutoCAD AutoLISP Extension や Visual Studio Code 日本語化パックなどといった拡張機能の追加や削除を行います。

【エディター】 : エディターのメイン部分です。

【パネル】 : 必要に応じて表示するエリアです。【表示(View)】>【デバッグコンソール(Debug Console)】 とすると AutoLISP の【コンソール】が表示されます。【コンソール】は AutoCAD と接続している場合のみ有効です。

【スタータスバー】 : 編集のファイルの状態を簡単に示したり、AutoCAD との接続状況を表します。

Visual Studio Code と AutoCAD の接続

Visual Studio Code と AutoCAD は別々の独立したアプリケーションです。そのため互いに接続しなければデバッグなどの機能を使えないのが、Visual LISP と異なる最初の点です。この接続のことを【デバッグの開始(Start Debugging)】と呼びます。

接続の種類は二つあります。一つは Attach (アタッチ)で、今現に AutoCAD で開いている図面の AutoLISP 実行環境に接続します。もう一つは、Launch (ランチ)で、新たに AutoCAD アプリケーションを起動し、新たに図面を開いてクリーンな AutoLISP 実行環境に接続します。ランチは AutoCAD アプリケーションを起動しておくという手間を省ける他、実行環境がクリーンである一方で、アプリケーションを起動して図面を開く分だけ時間がかかります。

接続という動作で、もう一つ注意する点があります。Visual Studio Code で拡張子が LSP のファイルをアクティブにしているときに接続しますと、単に接続が張られるだけでなくそのファイルが AutoCAD にロードされます。一度ロードされたプログラムファイルは、接続を一度切らないと新たに編集したものを再ロードできません。

さて、その接続の仕方ですが、ここでは Visual Studio Code の作業フォルダの設定をしていない、LISP のファイルが開かれていない状態の、最初の最もシンプルな接続としてアタッチを行ってみます。

アタッチを行うには、Visual Studio Code のメニューから【実行(Run)】>【デバッグの開始(Start Debugging)】を選びます。【環境の選択(Select Enviroment)】というメニューが新たに表示されるので【AutoLISP Debug: Attach】を選びます。すると、どの図面の AutoLISP 実行環境に接続するのか問うメニューが出ますので、一つ選ぶとそれに接続されます。【スタータスバー】が紫(または青)からオレンジに変わります。【サイドバー】は【デバッグビュー】に切り替わります。

今回は何も起こらなかったと思いますが、Visual Studio Code のメニューから【表示(View)】>【デバッグコンソール(Debug Console)】 を選びますと AutoLISP の 【コンソール】が表示され、ここから関数の実行や変数の値を表示させることができます。

【コンソール】の使い勝手は最下段にプロンプトが常にある以外は Visual LISP のそれとほぼ同じですが、エラーで止まってしまった時は、接続時に上部に表示される Visual Studio Code の【再起動(Restart)】ボタンを押すか、 Ctrl+Shift+F5 キーを押します。 接続を解除するには、【切断(Disconnect)】ボタンを押します。切断すると【スタータスバー】がオレンジから紫(または青)に戻ります。

Visual Studio Code 再起動(Restart) 切断(Disconnect)

もう一つの接続の仕方であるランチを行うには、作業フォルダを作成しそこに Visual Studio Code のデバッグ用設定ファイルを置く必要があります。

AutoCAD AutoLISP Extension のマイナーアップデートにより、次で説明するデバッグ用設定ファイルは必須ではなくなりました。しかし、同内容の設定を行わなければならないのは同じです。これについては、次の節の最後に説明します。最新の AutoCAD AutoLISP Extension を使っている場合は次の説明と少し異なるところもありますので、読みながら自身の設定を行ってみるのではなく、節の最後まで読んだ上で必要ならばデバッグ設定ファイルを作成してください。

作業フォルダーとデバッグ設定ファイル

これから書いていく LISP のプログラムを置く作業フォルダーをエクスプローラーなどで作成します。Visual Studio Code メニューより【ファイル(File)】>【フォルダーを開く(Open Folder)】を選び、該当のフォルダを選択します。以降は、このフォルダーを基準に作業が進められるようになり、フォルダ内のファイルが【エクスプローラービュー】の【EXPLORER】欄にならびます。解除するには、【ファイル(File)】>【フォルダーを閉じる(Close Folder)】を選びます。フォルダーを開いたり後述の【ワークスペース】を開いている場合は、【スタータスバー】が紫から青に変わります。

フォルダーを開いている状態で先程のアタッチ接続を試してみますと同じように接続されますが、【デバッグビュー】の上に【構成がありません(No Configuration)】という表示や新たなボタンが並んでいることに気づきます。これが、作業フォルダーに関わる設定ファイルの状態を示しています。

Visual Studio Code No Configuration

ここを触っても設定ファイルを作成したり変更できますが、今回は最上部に並ぶメニューから【実行(Run)】>【構成を開く(Open Configuration)】を選んで進めていきます。どのデバッグ環境を作成編集するかメニューが新たに出ますので、【AutoLISP Debug: Launch】を選ぶと新たに「launch.json」というファイルが作成され開きます。このファイルは作業フォルダーの「.vscode」という不可視フォルダーの中に作成されます。ランチを行うためには、path の値に AutoCAD アプリケーションの絶対パスを含めた実行ファイル名を指定します。

Visual Studio Code AutoLISP Debug: Launch

AutoCAD 2021 の通常のインストールでは以下のとおりです。

C:\\Program Files\\Autodesk\\AutoCAD 2021\\acad.exe

実行ファイル名を指定したら保存して、必要なければ設定ファイルは閉じてください。これで、この作業フォルダに関する設定がされましたので、改めて【実行(Run)】>【デバッグの開始(Start Debugging)】を選びますと、作業フォルダーの設定ファイルに記述があるランチの設定を見て、自動的に新たな AutoCAD アプリケーションが起動して図面が開かれ接続し、LISP ファイルを編集していたならばロードされます。設定ファイルが作成されたので、 【デバッグビュー】の上には作業フォルダーに関わる設定ファイル関係のメニューやボタンが常に表示されるようになります。

いつもランチの接続をやっていては時間がかかるので、アタッチの接続と選べるようにします。【実行(Run)】>【構成の追加(Add Configuration...)】を選択すると、何に関する設定を追加するのかメニューが出ますので【AutoLISP Debug: Attach】を選びます。設定ファイルに挿入する位置は、エディターが適切に判断しますのでお任せでよいです。アタッチの設定の内容はプロセス名に "acad" を指定するようにヘルプでは書かれていますが、特に手を加えなくても動作するようです。

Visual Studio Code AutoLISP Debug: Attach

内容の追加が終わったら保存します。上のメニューで、アタッチかランチか選べるようになります。ここの【実行(Run)】ボタンを押すだけで、AutoCAD に接続できます。

Visual Studio Code AutoLISP Debug: Attach

AutoCAD AutoLISP Extension のマイナーアップデートにより上記の設定はフォルダごとに設定ファイルを置くのではなく、AutoCAD AutoLISP Extension の設定として指定するようになっています。しかしながら、上記の手順を行ってみると「この環境設定は廃止されました~」などと表示されますが、依然としてこの設定を行うことも可能であり【デバッグビュー】の上の【実行(Run)】ボタンで接続できる利点もあります。

さて、AutoCAD AutoLISP Extension の設定の方法は Visual Studio Code のメニューから【ファイル】>【ユーザー設定】>【設定】で表示される設定一覧の 【AutoCAD AutoLISP の環境設定】のセクションで行います。そこの【Debug: Attach Process】に「acad」と指定し、【Debug: Launch Program】に「C:\Program Files\Autodesk\AutoCAD 2021\acad.exe」と指定します。

ワークスペースについて

Visual Studio Code には【ワークスペース】という機能があります。一般にはプロジェクト機能と説明されますが、Visual LISP のプロジェクト機能とは異なるものなので頭の切り替えが必要です。一般のプロジェクト機能といえば、ある開発をしているときにはソースコードを収めるフォルダー、リソースを収めるフォルダー、マニュアルを収めるフォルダーと、フォルダーが複数できるのが普通です。これら必要なフォルダーを【ワークスペース】に登録することによって、【ワークスペース】を開くだけで【エクスプローラービュー】にフォルダーとファイルの一覧が表示され、アクセスしやすい環境にすることができます。

何もフォルダを開いていないか既存の作業フォルダを開いている状態で【ファイル(File)】>【フォルダーをワークスペースに追加(Add Folder to Workspace...)】を選び、追加するフォルダーを選択すると新しい無名の【ワークスペース】が作成されます。【ワークスペース】の状態を保存するには、【ファイル(File)】>【名前を付けてワークスペースを保存...(Save Workspace As...)】を選択します。ワークスペース設定ファイルは、自分のアクセスしやすい任意の場所に保存しますが、フォルダーが相対パスで記述されているためワークスペース設定ファイルだけを後から移動することは避けなければなりません。

Visual LISP のプロジェクト機能に当たるものは

Visual LISP のプロジェクト機能に当たるものは今現在用意されていません。AutoCAD に接続した際にアクティブな LISP ソースコードファイルは自動的にロードされるのは前述のとおりですが、複数のファイルをロードする場合は、続けて他のファイルをアクティブにして【スタータスバー】に【LISP をロード(Load lisp)】と表示されている文字をクリックします。

Visual Studio Code Load lisp

毎回手作業で複数のファイルをロードするのは現実的ではないため、load 関数で必要なファイルをロードするように記述したものを用意して、これを最初にロードさせるようにするのが現実的な手段でしょう。コンパイルも vlisp-compile 関数を使って同様に行うことができますが、出来上がった複数の FAS ファイルを一つにまとめるオプションは使用できないため、一つにまとめたファイルにコンパイルするには【VLX アプリケーション】として作成しなければなりません。しかしこのプロジェクト機能の不在は、大きくて複雑なプログラムを作成している際に日本語などのマルチバイト文字 UNICODE の話が絡んで、スマートでない状況を生み出しています。

UNICODE とファイル出力関数

システム変数 LISPSYS が 1 ないし 2 の場合はファイル入出力関数が UNICODE を受け付けるようになったとアナウンスされていますが、出力関数においては言葉通りではないので注意が必要です。

ファイルに出力できる関数 write-char、write-line、prinX 系関数で UNICODE をファイルに出力するとイメージ通りに動作せず、UTF-16 に符号化されます。具体的には次のような首をかしげる仕様です。ファイルを指定しないでコンソール等に表示させる場合は大丈夫です。

出力する UNICODE 文字列 ファイルの内容
"ABCD" ABCD
"あいうえお" \U+3042\U+3044\U+3046\U+3048\U+304A

read-line 等といった入力関数においては、従来と変わらないイメージで UNICODE でも動作します。これは write-line で書き出した文字列を read-line で読み取っても使えないということも意味します。そもそも write-line 等でファイルに書き出した UNICODE の使い道が思いつきません。

VLX アプリケーションの作成時の注意点

【VLX アプリケーション】の作成は新しい AutoCAD のコマンド MAKELISPAPP から作成できます。一方でシステム変数 LISPSYS が 0 の時は、このコマンドを使用することはできません。操作感は従前の Visual LISP と同様ですので特に迷わないと思いますが、ここでも制約があるので注意が必要です。

Visual Studio Code 開発環境下では Visual LISP 従来のプロジェクト機能の設定ファイルである PRJ ファイルを扱えないのは前述のとおりですが、【VLX アプリケーション】の作成において設定ファイルの作成時は PRJ ファイルを設定することが可能です。しかしそれは、システム変数 LISPSYS が 1 ないし 2 の場合は、設定ファイルに PRJ ファイルの記述が含まれていてもコンパイルが無視されます。しかし、Visual LISP で既にコンパイルしてあればパッキングだけなら行なえます。非常に複雑でおかしな現状です。PRJ ファイルを使って【VLX アプリケーション】の作成を行いたい場合は他の制約と勘案して Visual LISP でコンパイルを行うことになりますが、日本語などの UNICODE の扱いでまた考えることが出てきます。

次に日本語などのマルチバイト文字の UNICODE とコンパイル時の LISPSYS の値、実行時の LISPSYS の値の関係も複雑な状況にあります。表にすると次のようになります。

「インライン UNICODE」は通常通りソースコード内に文字列を書いた場合のことです。「VLX リソース UNICODE」は【VLX アプリケーション】のリソースとしておさめたテキストファイルのことですが、DCL ファイルは含みません。DCL ファイルの挙動はここでは「外部ファイル UNICODE」と同じになります。「○」は UNICODE として正しい文字コードで扱われ正しく表示されます。「✕」は UNICODE が誤った文字コードとして解釈され正しく表示もされません。

なお、数字やアルファベットなどで ASCII コードの文字列だけを扱っている場合は UNICODE と互換性があるので、ここで述べる文字コードの問題は関係なく気にする必要はありません。

LISPSYS と UNICODE AutoCAD 2020 以前の実行環境 AutoCAD 2021 以降の実行環境
LISPSYS=0 LISPSYS=1 LISPSYS=2
コンパイル環境 AutoCAD 2020 以前 インライン UNICODE 以前のバージョンでは UNICODE はコンパイル不可
外部ファイル UNICODE
VLX リソース UNICODE
 
LISPSYS=0 インライン UNICODE
外部ファイル UNICODE
VLX リソース UNICODE
 
LISPSYS=1 インライン UNICODE 実行不能 実行不能
外部ファイル UNICODE
VLX リソース UNICODE
 
LISPSYS=2 インライン UNICODE 表示のみ○ 表示のみ○
外部ファイル UNICODE
VLX リソース UNICODE

上の表から次のようなことが言えます。

このように、最新のバージョンだけを実行環境とするならば単純に LISPSYS=1 を選べばよいのですが、前のバージョンをサポートすることを考えはじめるとコンパイル方式を選ばなければならず、時には文字列操作の安定性のために AutoCAD ユーザーの実行環境の LISPSYS の値が 1 ないし 2 とするように強く勧める必要があります。

AutoCAD 2021 以降と以前で同じように動くプログラムとするために、表示文字列などを SHIFT_JIS と UNICODE の外部ファイルとして用意して、AutoCAD のバージョンによって使用ファイルを切り替えるというアイデアがあります。DCL ファイルで有効です。しかし DCL ファイル以外のテキストファイルは LISPSYS=1 以外の時は【VLX アプリケーション】のリソースに UNICODE として格納されません。したがって前のバージョンをサポートするのが目的ならば、せっかくの【VLX アプリケーション】ですがテキストファイルはリソースではなく別の外部ファイルとして提供するしかないようです。