複数のDwgファイルを、一括で1つのファイルのモデル空間に集めて並べるAutolLISPコードを書いたので、紹介します。
はじめに
先日、「1つのモデル空間に描いた複数の図面を、一括で1枚ずつ書き出して分割保存するコード」を書きました。
Youtubeに紹介動画をアップしたところ、「その逆はできませんか?」という旨のコメントを頂きました。そこで、今回この記事で新たに取り組んでみました。
▼ 動作イメージ図

動作環境
正常動作を確認したCADは以下の通りです。いずれもWindows版です。
- AutoCAD 2023
BricsCAD Classic V17(BricsCAD Classic V17では動作しません)
動作デモ
使い方の大まかな流れは以下の通りです。詳しい導入方法や使い方は、後述しています。
- 対象のファイルを、一つのフォルダに入れておく
- 新規作成画面を開き、コマンドを起動する
- 対象のファイルが入っているフォルダを開き、ファイルを一つ指定する
(※ファイルを何か一つ選ぶと、dwgファイルの一覧を取得します) - 最終確認後、実行
▼ 動作の様子のgifアニメです。

▼ 実行前の元データの例
それぞれが独立したDwgファイルです。A~Iの9枚分用意しました。

▼ 実行結果
9枚のdwgファイルを指定して、実行しました。100mm間隔で、2行n列に並んでいく設定にしてあります。行数は、任意の数を指定できます。

コード
コードは以下のGithubに置きました。
テスト用のDwgファイルもアップしています。(図面は、zipファイルにしています)
詳細は、導入方法、使い方の項に記載しています。
導入方法
LISPファイルを保存する
コードをメモ帳等テキストエディタに保存します。以下の方法でできます。
.lspファイルを保存する
まず、Githubのページを開きます。
そして、右上の raw を右クリック→名前を付けてリンク先を保存を選択して保存場所を選び、保存します。
または、Rawの近くのボタンをクリックすると、全文をコピーできます。
- もし拡張子が.txtになっていたら、.lsp に変更して下さい。

【重要】文字コードを変更する
.lspファイルを作ったら、テキストエディタでファイルを開き、文字コードをShift-JISに指定して上書き保存して下さい。
この操作が無いと、動作しません。(Windows付属のメモ帳だったら、ANSIを選んでください)
▼ テキストエディタのMeryで開いて、文字コードを変更している様子です。

使い方
対象の図面ファイルを、一つのフォルダに入れる
まず、読み込みたい複数の図面ファイルを、任意のフォルダにまとめて入れておきます。

新規作成で新しいファイルを用意する
ファイル→新規作成で、新しいまっさらなdwgファイルの画面を開きます。

Lispファイルをロードする
先ほど作った.lspファイルを、新規dwgファイルの画面にロードします。
一度試すだけなら、.lspファイルをCAD画面にポイっとドラッグアンドドロップすれば、ロードされます。
その場合、以下のようなメッセージが出る場合があります。その際は内容を確認の上、「1回ロードする」を選んでおけばOKです。

常時ロードしたい場合は、appload
というコマンドで出てくる画面で設定できます。詳しい仕様は、ドキュメントをご覧ください。
- BricsCADも同様に appload というコマンドで設定できます。
→別記事に詳細を記載しています。
コマンドを起動
コマンドラインに bd_insert
と打ち込んで、エンターキーを押します。

行数を指示する
最初に、以下のメッセージが出るので、行数を入力して下さい。
行数を入力して下さい:
例えば、 2 と入力してエンターキーで確定すると、2行n列で並びます。
対象ファイルの場所を指示
次に、ファイルの保存場所を選ぶ画面が出ます。
対象の図面ファイルが入っているフォルダの中のファイルを、何か一つ選択します。
するとそのファイルから、Dwgファイルの一覧を自動的に取得します。

最終確認
最後に、コマンドラインに以下の選択肢が出ます。
n個のファイルを読み込みます。よろしいですか?[Yes/No] :
問題なければ、Yesと入力します。選択肢がポップアップされるので、マウスで選んでもokです。
よろしくない場合は、No(もしくは n)と入力するとコマンドがキャンセルされます。
完了
あとはdwgファイルが順次読み込まれ、図面が自動的に並びます。
始めの行数の指示で、2と入力したので、2行n列で並んでいます。

注意点
無限の構築線は処理できません
XLINEコマンドで描いた構築線があると、GetBoundingBox メソッドで処理できないため、読み込みを中止します。一応、コード上で例外エラーが発生するとアラート画面がでるようにしました。その場合は、元図の構築線を消してから、再度お試しください。
要素数が多いと固まるかも
このプログラムは、「図面を順次一枚ずつ読み込んで、配置する」という処理をファイルの個数分繰り返します。
要素数の多い図面をたくさん読み込むと、フリーズする可能性があるので、実行前は慎重にテストをお願いします。
共用防止のため、ブロック名が変わります
読み込んだDwgファイルのブロックについて、ブロック名に番号を付加して名前を変える処理を入れています。
理由は、ブロックの共用防止の為です。例えば、元図Aと元図Bに、全く同一の名前のブロックがあるとします。全く共通の図形なら問題ありません。
しかし両者で形状が違っていると、名前が同じだと先に読み込んだブロックと同一だとみなされて、ブロックが共用されてしまいます。
普通は「同じブロック名で形状違い」という運用は無いかもしれませんが、一応処理を入れておきました。
参考ドキュメント
- InsertBlock メソッド(ActiveX)
https://help.autodesk.com/view/OARX/2023/JPN/?guid=GUID-17F86FDD-B7FC-4F43-9F16-B4958F73A66D - BlockReference オブジェクト(ActiveX)
https://help.autodesk.com/view/OARX/2023/JPN/?guid=GUID-88EEBCA3-8AF5-4776-9D54-520B05AB9129 - Block オブジェクト(ActiveX)
https://help.autodesk.com/view/OARX/2023/JPN/?guid=GUID-E6F7B03B-F5CC-4A18-9C48-BBF1D32A31FD - GetBoundingBox メソッド(ActiveX)
https://help.autodesk.com/view/OARX/2023/JPN/?guid=GUID-A20C361C-BBF0-4EAB-8BE7-709154CEEE09
さいごに
当初は「一つのファイルから分割して書き出す」事しか頭にありませんでしたが、その逆も便利だなと思いました。
複数の関連図面を並べて一覧できると、検討時などに役立ちそうです。
AutoCADは個人でも必要な期間だけネットで入手できるので、興味がある方はAutodeskのストアを覗いてみて下さい。当ブログでも、使い方などの記事を随時アップしていきます。
コメント
とても素晴らしいです。
挿入は上方向ではなく、下方向は可能ですか?
コメント、ありがとうございます。
下方向にすることは可能です。(コードの後半のnextPointという変数の中身で変えられます)
↓ざっと書いてみました。(🔹2023/5/23追記:少しミスがあったので修正しました)
https://github.com/mechanoboyu/files/blob/dev1/lisp-batch-insert-multiple-dwg-model/batch-insert-multiple-dwg-model.lsp
※AutoCADできちんと動作テストを出来ていないので、もし試される場合は少数のテストファイルでお願いします。
ご返信ありがとうございます。
まさに思い描いてたコードです!ありがとうございました。
また素晴らしいコードの作成を心よりお待ちしております。
動いて良かったです。
こちらこそ、コメント頂けて励みになりました。
ありがとうございました😄
すいません。今気づいたんですけど、2行は大丈夫なんですが、3行以上を入力すると3行目の図枠が2行目に重なってました!ループ処理のとこですかね?
コードが難しすぎて・・・。
なんと……すみません😱
ちょっと後で確認してみます。
不具合を修正しました。一応当環境でサンプルdwgファイルで確認したところ動いているので、多分…大丈夫だと思います。
https://github.com/mechanoboyu/files/blob/dev1/lisp-batch-insert-multiple-dwg-model/batch-insert-multiple-dwg-model.lsp
不具合修正本当にありがとうございました。🙇
のぼゆ様のBD_INSERTを酷使させていただきます😄
ご返信ありがとうございます。
お役に立てれば、幸いです😄