AutoLISPでファイルの読み込みや書き出しをしたいけど、方法がわからずお困りではないでしょうか。処理した結果をファイルに保存できたら便利と思う方も多いはず。
私はAutoLISPを独学し、業務の自動化・効率化に役立つプログラムを5年以上作成しています。数行で書けるような簡単なプログラムから、1000行以上の少し複雑なプログラムまで様々なツールを作成してきました。
そもそもAutoLISPってなに?という方はこちらの記事をご覧ください。
>>AutoCADユーザー必見!【AutoLISPを覚えるべきメリット5選】デメリットも解説
当記事ではAutoLISPのファイル関数について解説します。ファイルの読み込みや書き出しができるとデータの共有や解析ができたり、AutoCAD以外のソフトウェアで使えたりさまざまな場面で役立ちます。
ファイルを上手に活用して作業を効率化したい方はぜひ最後までご覧ください。
ファイルを開く関数はopen、ファイルを閉じる関数はcloseです。開いたファイルを読み込むときはread-line、ファイルに書き出すときはwrite-lineを使用してください。findfileはファイルを検索して、見つかったファイルのフルパスを取得することができます。
AutoLISPのファイル関数5選
今回ご紹介するAutoLISPのファイル関数は以下の4つです。どの関数もファイルを操作するときに重要な働きをするのでしっかり覚えましょう。
- open
- close
- read-line
- wirte-line
- findfile
open
openとはAutoLISPの関数がアクセスできるようにファイルを開く関数です。openには次のような特徴があります。
- 開きたいファイルの名前またはフルパスが必要。ファイル名だけの場合は既定の図面フォルダを指定したと見なされる
- ファイルを開くモードの指定も必須(読み込み、書き出し、追加のいずれか)
- ファイルを開くことができたらファイルディスクリプタを返す
- 読み込みモードでファイルが開けなかった場合はnilを返す
- 文字エンコードを指定してファイルの読み込みができる(基本的に文字エンコードは省略でOK)
ファイルディスクリプタとはファイルの場所を表すものです。後述するファイル関数で使用します。
既定の図面フォルダを変更する方法はこちらのサイトで解説されています。
>>既定の図面フォルダを変更するには|AutoCAD 2025 ヘルプ
文字エンコードについてはこちらのサイトをご覧ください。
>>バイトオーダーマークとは|「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典
ファイルを開く3つのモードはそれぞれアルファベット1文字で表現します。詳細は下記のとおりです。
- ”r” 読み込みモード
- ファイルの内容を読み込むモード。read-lineを実行するためには読み込みモードでファイルを開く必要がある。
- ”w” 書き出しモード
- ファイルにデータを書き出すモード。指定したファイルが存在しない場合は新規ファイルを作成する。存在するファイルの場合は既存のデータが上書きされる。
- ”a” 追加モード
- ファイルにデータを追加するモード。指定したファイルが存在しない場合は新規ファイルを作成する。存在するファイルの場合、新しいデータは既存データの後ろに追加される。
モードのアルファベットは大文字にしても動作します。
たとえば、既存のファイルを読み込みモードで開いて、返り値を変数fに格納する場合は次のように記述します。
(setq f (open "C:/Users/デスクトップ" "r"))
パスのディレクトリを区切る「\(¥)」は必ず「/(スラッシュ)」または「\\(¥¥)」に置き換えてください。「”」で囲うため「\(¥)」のままではパスとして認識されません。
ちなみに、ファイルのパスは変数を使って以下のように記述することもできます。
(setq path "C:/Users/デスクトップ")
(setq f (open path "r"))
ファイルのパスのような長い文字列を扱う場合は変数を活用しましょう。記述の手間が省けたり、動作がわかりやすくなったりするので便利です。
close
closeとはopenで開いたファイルを閉じる関数です。引数のファイルディスクリプタが有効な場合はnil、無効な場合はエラーメッセージを返します。
closeでファイルを閉じるときは次のように記述してください。変数fはopenで取得したファイルディスクリプタを表しています。
(close f)
閉じたいファイルのファイルディスクリプタを与えるだけです。
ちなみに、閉じられていないファイルは削除や移動ができません。AutoCAD自体を閉じればファイルも閉じられますが、効率的ではないので使い終わったファイルは必ず閉じるようにしましょう。
read-line
read-lineは開いているファイルから1行読み込み、文字列として返す関数です。read-lineには以下のような特徴があります。
- 読み込みモード以外で開かれているファイルは読み込みできない
- 返り値は必ず「”」で囲われる
- 「”」や「\」など文字列としてそのまま表現できない文字は制御文字に置換される
- 続けて記述すると2行目以降を読み込める
- ファイルの終端に達したらnilを返す
- 引数を省略した場合はユーザーがキーボード入力した値を文字列として返す
AutoLISPの制御文字について知りたい方はこちらの記事をご覧ください。
>>コマンドラインにメッセージを表示しよう!AutoLISPの表示関数4選
たとえば、読み込みモードで開かれたファイルの1行目を読み込む場合は以下のように記述します。
(setq path "C:/Users/デスクトップ")
(setq f (open path "r"))
(read-line f)
(close f)
ファイルの1行目から最終行までをリストに格納したいときは、次のようにwhileなどの繰り返し関数を活用してください。
(setq path "C:/Users/デスクトップ")
(setq f (open path "r"))
(setq tmp (read-line f))
(while tmp
(setq lst (append lst (list tmp)))
(setq tmp (read-line f))
)
(close f)
繰り返し関数についてはこちらの記事で解説しています。
>>AutoCADで楽をしたい人必見【繰り返しを自動化するAutoLISP関数3選】
上記のプログラムで使用しているappendはリストにデータを追加できる関数です。appendの詳細はこちらの記事をご覧ください。
>>【初心者必読】リストを作成するAutoLISP関数3選|使用例も解説
read-lineはファイルの終端に達するとnilを返し、whileは条件がnilになると繰り返しを終了します。このため、読み込みが完了したタイミングで繰り返しを終了できます。
write-line
write-lineとは開いているファイルに1行分の文字列を書き出す関数です。write-lineの特徴は以下のとおり。
- 文字列の書き出しができるのは、書き出しモードまたは追加モードで開かれたファイルのみ
- 返り値の文字列は「”」で囲われるが、ファイルに書き出される文字列は「”」で囲われない
- 書き出される文字列は制御文字(「\\」や「\n」など)の影響を受ける
- 続けて記述すると2行目以降に書き出される
- ファイルディスクリプタを省略した場合、コマンドラインに引数の文字列が表示される
書き込みモードで開かれたファイルに、1行分のデータを書き出す場合は次のように記述してください。
(setq path "C:/Users/デスクトップ")
(setq f (open path "w"))
(write-line "abc" f)
(close f)
追加モードで開かれた既存のファイルに、リスト内のデータを1行ずつ追加していく場合は以下のように記述します。
(setq lst (list "abc" "def" 123))
(setq path "C:/Users/デスクトップ")
(setq f (open path "a"))
(setq n 0)
(repeat (length lst)
(setq tmp (nth n lst))
(write-line tmp f)
(setq n (1+ n))
)
(close f)
ファイルに書き出されるときは「”」で囲われないため、数値はそのまま数値として書き出されます。
ちなみにprincやprintなどの表示関数でもファイルへの書き出しができます。表示関数についてはこちらの記事をご覧ください。
>>コマンドラインにメッセージを表示しよう!AutoLISPの表示関数4選
findfile
findfileとは指定されたフォルダまたはファイルを検索する関数です。findfileには次のような特徴があります。
- 指定されたフォルダまたはファイルが見つかった場合は対象のフルパス、見つからなかった場合はnilを返す
- フォルダ名または拡張子を含むファイル名で検索することも可能(検索範囲は制限あり)
- 見つかったファイルのパスは「”」で囲われた文字列で返す
たとえば、既存のファイルをフルパスで検索した結果は次のとおり。
編集中の図面が保存されているフォルダや「サポート ファイルの検索パス」に登録されているフォルダであれば、以下のようにフォルダ名または拡張子を含むファイル名だけで検索することができます。
「サポート ファイルの検索パス」はAutoCADの「オプション」から設定できます。詳細はこちらの記事をご覧ください。
>>【入門】AutoLISP開発をはじめよう!Visual LISP エディタの使い方
特定のフォルダにあるファイルなら、ファイル名だけでフルパスを取得できる便利な関数です。
ファイルを上手に活用して面倒な作業を楽にしよう
今回ご紹介した関数を以下にまとめます。
- open
- 構文:(open パス モード [文字エンコード]) ※[]内は省略可
指定されたファイルを開き、対象のファイルディスクリプタを返す。
ファイルを開くときは読み込み、書き出し、追加のいずれかのモードを指定する。 - close
- 構文:(close ファイルディスクリプタ)
openで開いたファイルを閉じる。 - read-line
- 構文:(read-line [ファイルディスクリプタ]) ※[]内は省略可
読み込みモードで開かれたファイルから1行ずつ文字列を読み込む。 - write-line
- 構文:(write-line 文字列 [ファイルディスクリプタ]) ※[]内は省略可
書き出しモードまたは追加モードで開かれたファイルに1行ずつ文字列を書き出す。 - findfile
- 構文:(findfile パスまたは拡張子込みのファイル名)
指定されたファイルが存在するか検索する。存在する場合は対象のフルパスを返す。
ファイル関数の扱い方がわかるとAutoCADだけでなく、AutoCAD以外のソフトウェアとの連携が取りやすくなります。ファイル関数を使いこなして作業の効率化に役立ててください。
あなたに代わってAutoLISPプログラムを作成します
AutoLISPで作業を自動化したいけど、プログラミングに詳しくないのでツールが作れずにお悩みの方へ。5年以上のAutoLISP経験を活かしてAutoCADを自動化するツールを作成します。既にお持ちのAutoLISPプログラム修正も対応可能です。
AutoCADの面倒くさい作業から解放されたい方は下記リンクからお気軽にご相談ください。
>>AutoLISPプログラムの作成を代行します