【AutoLISP】複数のDwgファイルを、一括で1つのファイルのモデル空間に集めて並べるコード

AutoCAD

複数のDwgファイルを、一括で1つのファイルのモデル空間に集めて並べるAutolLISPコードを書いたので、紹介します。

スポンサーリンク

はじめに

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

▼ 動作イメージ図

複数のDwgファイルを、一括で1つのファイルのモデル空間に集めて並べるコードのイメージ図

動作環境

正常動作を確認したCADは以下の通りです。いずれもWindows版です。

  • AutoCAD 2025
  • BricsCAD Classic V17 (BricsCAD Classic V17では動作しません)

動作デモ

使い方の大まかな流れは以下の通りです。詳しい導入方法や使い方は、後述しています。

  1. 対象のファイルを、一つのフォルダに入れておく
  2. 新規作成画面を開き、コマンドを起動する
  3. 対象のファイルが入っているフォルダを開き、ファイルを一つ指定する
    (※ファイルを何か一つ選ぶと、dwgファイルの一覧を取得します)
  4. 最終確認後、実行

▼ 動作の様子のgifアニメです。

▼ 実行前の元データの例

それぞれが独立したDwgファイルです。A~Iの9枚分用意しました。

▼ 実行結果

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

コード

コードは以下のGithubに置きました。
テスト用のDwgファイルもアップしています。(図面は、zipファイルにしています)
詳細は、導入方法使い方の項に記載しています。

2025/10/11 コメント欄に頂いたリクエストで、X,Y方向の数、ピッチを指定できるバージョンを作りました。開発中バージョンですが、今現在で一番新しいです。
コードの場所と、詳しい機能は、こちら

files/lisp-batch-insert-multiple-dwg-model at main ?? mechanoboyu/files
Contribute to mechanoboyu/files development by creating an account on GitHub.

導入方法

使用される際は、元図はバックアップの上、ご自身の環境でまずは数枚の図面でテストして下さい。

  • データの消失など、ファイルの挙動には十分にご注意ください。
  • 一度に大量の図面の読み込みを行うと、フリーズやエラーが発生する可能性があります。  
  • 後の項にも注意点記載しています。

LISPファイルを保存する

コードをメモ帳等テキストエディタに保存します。以下の方法でできます。

.lspファイルを保存する

まず、Githubのページを開きます。
そして、右上の raw を右クリック→名前を付けてリンク先を保存を選択して保存場所を選び、保存します。
または、Rawの近くのボタンをクリックすると、全文をコピーできます。

  • もし拡張子が.txtになっていたら、.lsp に変更して下さい。

【重要】文字コードを変更する

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

テキストエディタのMeryで開いて、文字コードを変更している様子です。

lspファイルをテキストエディタで開いて、文字コードを変更している様子

使い方

対象の図面ファイルを、一つのフォルダに入れる

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

新規作成で新しいファイルを用意する

ファイル→新規作成で、新しいまっさらな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に、全く同一の名前のブロックがあるとします。全く共通の図形なら問題ありません。
しかし両者で形状が違っていると、名前が同じだと先に読み込んだブロックと同一だとみなされて、ブロックが共用されてしまいます。
普通は「同じブロック名で形状違い」という運用は無いかもしれませんが、一応処理を入れておきました。

現在の処理では、ネストされたブロック(ブロックの中にブロックがあって、一回のExplodeではオモテに出てこないレベルのもの)には無効ですのでご注意ください。

参考ドキュメント

さいごに

当初は「一つのファイルから分割して書き出す」事しか頭にありませんでしたが、その逆も便利だなと思いました。
複数の関連図面を並べて一覧できると、検討時などに役立ちそうです。

バリエーション

コメント欄に頂いたリクエストにより、改変版を作ってみました。

下側へ

▼ 元のLISPは、行方向が原点より上側(プラス側)でしたが、下側に並ぶようにしたバージョンです。

複数図面を、一つの図面に集めている様子

・2023/6/6追記:AutoCAD2024で確認時、正常に動かなかったので修正しました。

files/lisp-batch-insert-multiple-dwg-model/batch-insert-multiple-dwg-model.lsp at dev1 · mechanoboyu/files
Contribute to mechanoboyu/files development by creating an account on GitHub.

各図面を同一位置に配置+それぞれブロック化

各図面を並べずに同一点に重ねて配置し、それぞれをブロック化するバージョンです。

複数図面を、一つの図面に集めている様子(挿入点が同一かつ各図面をブロック化バージョン)
files/lisp-batch-insert-multiple-dwg-model/batch-insert-multiple-dwg-model.lsp at dev2 · mechanoboyu/files
Contribute to mechanoboyu/files development by creating an account on GitHub.

行、列方向の数と、ピッチをそれぞれ指定

行および列方向の数、行および列方向のピッチを指定できるバージョンです。

処理の順番として、ファイル名の接頭辞、接尾辞のソートも行います。
例えば、A1、A2、2A1、2A2、3A1、4A1のようにソートする機能があります。

files/lisp-batch-insert-multiple-dwg-model/batch-insert-multiple-dwg-model.lsp at dev3 · mechanoboyu/files
Contribute to mechanoboyu/files development by creating an account on GitHub.

コメント

  1. Sld_heta より:

    とても素晴らしいです。
    挿入は上方向ではなく、下方向は可能ですか?

  2. Sld_heta より:

    不具合修正本当にありがとうございました。🙇
    のぼゆ様のBD_INSERTを酷使させていただきます😄

    • のぼゆ のぼゆ より:

      ご返信ありがとうございます。
      お役に立てれば、幸いです😄

  3. みかん より:

    お世話になります。
    素晴らしいです。利用させていただいてます。ありがとうございます。

    こちらのLispですが、以下のような形に改変することは可能でしょうか。
    ①貼り付け先の図面に、並べるのではなく同じ位置に重ねる
    ②重ねる際は、それぞれの図面をブロック化して配置する

    • のぼゆ のぼゆ より:

      コメント、ありがとうございます。
      ご質問の件ですが、(1)(2)共に可能です。
      手が空いたら、書いてみますね。

  4. みかん より:

    のぼゆ様

    ありがとうございます!
    非常に助かります!

    • のぼゆ のぼゆ より:

      とりいそぎ、(1)(2)を満たすものを書いてみました。
      まだ未完成で、ブロック名の重複処理は、まだ実装できていません。(思ったより難儀して、処理中です😅)
      たとえば、それぞれの図面の中に「ブロック名は同じだが、図面ごとに形状が違うブロック」があったら、先に読み込んだ図面のブロックに上書きされてしまいます。

      (🔹 2023/6/3追記:)
      ↓一応、ブロック名の重複処理込みで一旦完成しました。
      https://github.com/mechanoboyu/files/blob/dev2/lisp-batch-insert-multiple-dwg-model/batch-insert-multiple-dwg-model.lsp
      ただし現在の重複処理は、深くネストされたブロック(ブロックの中にあるブロック)に対しては無効なのでご注意くださいませ。

      • みかん より:

        のぼゆ様

        お忙しい中、お手数おかけしていまい申し訳ありません。
        ご対応のほどありがとうございます。

        作成いただいたLispですが実行すると、
        ヒストリの末尾に下記のように表示されてしまい、最初の図面の貼り付けの段階で止まってしまいます。

        ————————————————————————————–
        新しいブロック名を入力: A$C995d87c0-0 -rename 名前を変更するオブジェクトのタイプを入力
        [ブロック(B)/詳細ビュー スタイル(E)/寸法スタイル(D)/画層(LA)/線種(LT)/マテリアル(M)/マルチ引出線スタイル(R)/断面ビュー スタイル(C)/文字スタイル(S)/表スタイル(T)/UCS(U)/ビュー(VI)/ビューポート設定(VP)]: B
        元のブロック名を入力: tempU271
        新しいブロック名を入力: tempU271-0
        ブロック の “tempU271-0” という名前は既に存在しています。
        *無効*
        モデルを再作図中。
        コマンド: オートメーション エラー。キーが重複しています
        ————————————————————————————–

        • のぼゆ のぼゆ より:

          みかん様
          フィードバックありがとうございます。
          エラー出してしまい申し訳ありません😱
          エラーログ参考になります。ちょっと後程確認してみます。

        • のぼゆ のぼゆ より:

          みかん様
          色々試したら、同様のエラーが再現したので修正致しました。
          こちらのAutoCAD2024では、一応エラーなしで実行できるようになりました。

          🔷コードはこちらです。
          https://github.com/mechanoboyu/files/blob/dev2/lisp-batch-insert-multiple-dwg-model/batch-insert-multiple-dwg-model.lsp
          よろしくお願い致します。

          • みかん より:

            のぼゆ様

            正常に動作しました。
            天才ですね。
            これで作業が数倍はかどります。
            Lispはまだ難しくて数行の簡単なものしか作れませんが、
            もっとスキルを上げようと意欲が湧きました。
            本当にありがとうございました。

          • のぼゆ のぼゆ より:

            みかん様
            ご返信ありがとうございます。
            動いて良かったです。
            こちらこそ、今回の改変は勉強になりました。ありがとうございました。

  5. シロー より:

    お世話になります。
    配列複写みたいにX方向に*回、ピッチは***、Y方向に*回、ピッチは***とはできないでしょうか?
    可能ならば非常にありがたいです。お忙しいと思いますが、検討下されば幸いです。
    よろしくお願いいたします。

    • のぼゆ のぼゆ より:

      コメントありがとうございます。
      とりあえず、XとY方向のピッチだけ指定できるバージョンを書いてみました。
      (XとY方向の回数指定までは対応する時間が取れないもので..)

      従来通り行数を指定したら、ピッチを聞いてきますので、入力してください。
      なお、ピッチは並ぶ図枠の左下同士の距離となっています。

      ※入力したピッチのエラー処理などは入れておりませんので、テストファイルでのご確認をお願いします。
      https://github.com/mechanoboyu/files/blob/dev3/lisp-batch-insert-multiple-dwg-model/batch-insert-multiple-dwg-model.lsp

      • シロー より:

        のぼゆ様
        すばやい対応ありがとうございました。
        試しましたところ、X方向2列目に残りの図が全部重なります。修正できますでしょうか?
        後、専用CADから出力された複数枚の図を読み込むとき、ファイル名の連番が1から9の時(1桁の時)は01~09と認識さして読み込むことは可能でしょうか?
        リネームしてから読み込めばすむ話ではありますが、並び順が変わってくるので対応できるのであればお願いします。
        お忙しいと思いますが、よろしくお願いいたします。

        • のぼゆ のぼゆ より:

          フィードバックありがとうございます。
          ■ 座標の取得時のコードが間違えていたので、修正しました。すみません。こちらでは、一応6枚の図面で正常動作確認しております。
          https://github.com/mechanoboyu/files/blob/dev3/lisp-batch-insert-multiple-dwg-model/batch-insert-multiple-dwg-model.lsp

          ■ 連番の件ですが、処理中のコマンドラインの表示を変えるということでしょうか?
          (「No. 0 のファイルD:\xxx\test_1.dwg です。」という感じで表示されてる箇所)

          ちなみに、処理の順番のことでしたら、仕様上はファイル名で昇順にソートしているので、ファイル名の連番が1から9の時はその順で処理が進んでいると思います。

          よろしくお願い致します。

          • シロー より:

            のぼゆ様
            早速修正ありがとうございました。
            2列目に重なるのは改善されています。
            連番の件ですが、表示ではなく配置順が1,10,11,12,13,14,15,16,17,18,19,2,20,21,22となるので、01,02,03と認識さして読み込めれば、1,2,3と番号順に並ばないかと思っての質問でした。
            又お手すきの時にでも検討下されば、幸いです。ありがとうございました。

          • のぼゆ のぼゆ より:

            フィードバックありがとうございます。
            連番の件、ご指摘の通りでした😮 

            修正してみたので、またお時間あればご確認いただけますか?
            条件として、末尾の番号の前には‐(半角ハイフン)がついている想定です。
            例)aaat-1.dwg、aaa-10.dwg

            https://github.com/mechanoboyu/files/blob/dev3/lisp-batch-insert-multiple-dwg-model/batch-insert-multiple-dwg-model.lsp

            また変な動きをしたら、お知らせください

  6. シロー より:

    のぼゆ様
    何度も修正ありがとうございました。
    しかし今回はうまく行きませんでした。ピッチX,Yを入力後読み込むファイルを指定するとCanselとでて止まってしまいます。何度も申し訳ございませんが、よろしくお願いいたします。

    • のぼゆ のぼゆ より:

      フィードバックありがとうございます。エラー出してしまってすみません。
      差し支えなければ、代表的なファイル名をいくつか教えていただけますか?
      もちろん、固有名称などはabcとかで伏せていただいて大丈夫です。

      例えば、「abc装置_部品a-1.dwg」みたいな感じで、ファイル名の構造がわかれば、こちらで再現して対処できるかもです。
      次に時間ができるのが、週末になりそうなので、取り組んでみますね。

      • シロー より:

        のぼゆ様
        何度もありがとうございます。
        ファイル名はシンプルにリネームしてabc-1.DWG abc-2.DWG abc-10.DWG abc-11.DWGとしても結果は同じで、止まります。また時間がとれた時お願いいたします。

        • のぼゆ のぼゆ より:

          ご返信ありがとうございます。
          再現を試みたところ、拡張子が大文字(DWG)の時に同じエラーが出ました。
          その対策をしてみましたので、取り急ぎ修正版貼っておきますね。

          https://github.com/mechanoboyu/files/blob/dev3/lisp-batch-insert-multiple-dwg-model/batch-insert-multiple-dwg-model.lsp

          再びエラーが出ましたら、AUTOCADのバージョンと状況を教えて戴けましたら幸いです。
          よろしくお願いします。

          • シロー より:

            のぼゆ様
            早速修正ありがとうございました。バッチリ直っています。後はぼちぼちでもいいのですが、追加対応は可能でしょうか?現在は行数=Y方向指定ですが、列数=X方向も選択指定できれば助かります。希望する配置例は、X方向に№10迄で、№11から20迄は2段目№21~30は3段目とかに配置できれば最高です。
            わがままなお願いですがよろしくお願いいたします。
            ありがたく使用させていただきます。

          • のぼゆ のぼゆ より:

            早速のフィードバックありがとうございます。ひとまず安心しました。
            列数の指定の件、了解です。時間できたら取り組んでみますね。

          • のぼゆ のぼゆ より:

            列数の指定の件、実装してみました。
            冒頭に、以下の順番でメッセージが出ます。
             行数を入力
             列数を入力
             X方向のピッチを入力
             Y方向のピッチを入力

            一応こちらで動作確認済みですが、また変なエラーが出たら、症状を教えて頂ければ幸いです。(修正は少し先になるかもです)
            https://github.com/mechanoboyu/files/blob/dev3/lisp-batch-insert-multiple-dwg-model/batch-insert-multiple-dwg-model.lsp

  7. シロー より:

    のぼゆ様
    早速追加機能ありがとうございました。希望通りの配置ができ感謝感激です。
    今までは専用CADから出力された多数の詳細図を一枚のシートに張り付けるのに手間をかけていましたが、これであっという間にできます。とりあえず試験的にやってみました。
    またゆっくりと色々な配置とかやってみたいと思います。
    ありがとうございました。

    • のぼゆ のぼゆ より:

      早々のご確認ありがとうございます。ひとまず安心しました。
      こちらこそ、フィードバックを頂けたことで新しい機能の実装ができて、勉強になり感謝です。😄

      • シロー より:

        のぼゆ様
        何度も申し訳ございません。色々とやってみたら気づいた点がありましたので、報告いたします。この間のテストではX,Yのピッチを同じで打っていたので気付かなかったのですが、X,Yのピッチを変えて打つとXとYのピッチが逆になります。
        またファイル名のソートですがー以降の連番だけでなく頭付符号もソートできるようにできないでしょうか?現状は2G-1,RG-1,2G-2,RG-2…となります。2G-1,2G-2,2G-**,RG-1,RG-2,RG-**というように修正できないでしょうか、何回もで恐縮ですが対応していただけるとありがたいです。
        後DXFファイルにも対応できたら最高です。お忙しいとおもいますので。間がある時で結構ですのでよろしくお願いいたします。

        • のぼゆ のぼゆ より:

          フィードバックありがとうございます。
          できる範囲で修正しました。
          ■ピッチが逆の件→修正済み
          ■DXFの件:別途変換処理を入れる必要があり、時間の関係上これは対応できませんでした。

          ■ソートの件
          接頭辞→接尾辞の順でそれぞれ昇順にソートする機能を追加しました。
          例えば、「数字RG-数字」のようなファイル名の場合、以下の順番にソートします。
          RG-1
          RG-2
          2G-1
          2G-2
          3G-1
          4G-1

          (10/11:修正済みです)※頭と尾の間に数字があったら、たぶんエラー出ます(1R3G3など)

          ※接頭がない場合、コメント頂いた例では後回しになっていますが、標準関数の仕様上、先頭に来ます。
          これを回避するには別途処理を組み込まねばならないので、時間の都合上そのままにしてあります

          コードは以下に置いております。
          https://github.com/mechanoboyu/files/blob/dev3/lisp-batch-insert-multiple-dwg-model/batch-insert-multiple-dwg-model.lsp

          • シロー より:

            のぼゆ様
            何度もありがとうございました。X,Yの件もソートの件も修正されています。但しソートが増えた分、少し重たくなりました。当然ですね。
            DXFファイルの件は了解しました。先にファイル変換してから処理します。活用させていただきます。ありがとうございました。

          • のぼゆ のぼゆ より:

            早々のフィードバックありがとうございます。
            動作してひとまずほっとしました。こちらこそ色々試せて面白かったです。ありがとうございました。

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