PR

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

AutoCAD

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

スポンサーリンク

はじめに

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

▼ 動作イメージ図

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

動作環境

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

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

動作デモ

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

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

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

▼ 実行前の元データの例

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

▼ 実行結果

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

コード

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

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.

コメント

  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はまだ難しくて数行の簡単なものしか作れませんが、
            もっとスキルを上げようと意欲が湧きました。
            本当にありがとうございました。

          • のぼゆ のぼゆ より:

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

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