複数の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に、全く同一の名前のブロックがあるとします。全く共通の図形なら問題ありません。
しかし両者で形状が違っていると、名前が同じだと先に読み込んだブロックと同一だとみなされて、ブロックが共用されてしまいます。
普通は「同じブロック名で形状違い」という運用は無いかもしれませんが、一応処理を入れておきました。
現在の処理では、ネストされたブロック(ブロックの中にブロックがあって、一回のExplodeではオモテに出てこないレベルのもの)には無効ですのでご注意ください。
参考ドキュメント
- 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
さいごに
当初は「一つのファイルから分割して書き出す」事しか頭にありませんでしたが、その逆も便利だなと思いました。
複数の関連図面を並べて一覧できると、検討時などに役立ちそうです。
バリエーション
コメント欄に頂いたリクエストにより、改変版を作ってみました。
下側へ
▼ 元のLISPは、行方向が原点より上側(プラス側)でしたが、下側に並ぶようにしたバージョンです。
・2023/6/6追記:AutoCAD2024で確認時、正常に動かなかったので修正しました。
各図面を同一位置に配置+それぞれブロック化
各図面を並べずに同一点に重ねて配置し、それぞれをブロック化するバージョンです。
コメント
とても素晴らしいです。
挿入は上方向ではなく、下方向は可能ですか?
コメント、ありがとうございます。
下方向にすることは可能です。(コードの後半の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を酷使させていただきます😄
ご返信ありがとうございます。
お役に立てれば、幸いです😄
お世話になります。
素晴らしいです。利用させていただいてます。ありがとうございます。
こちらのLispですが、以下のような形に改変することは可能でしょうか。
①貼り付け先の図面に、並べるのではなく同じ位置に重ねる
②重ねる際は、それぞれの図面をブロック化して配置する
コメント、ありがとうございます。
ご質問の件ですが、(1)(2)共に可能です。
手が空いたら、書いてみますね。
のぼゆ様
ありがとうございます!
非常に助かります!
とりいそぎ、(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はまだ難しくて数行の簡単なものしか作れませんが、
もっとスキルを上げようと意欲が湧きました。
本当にありがとうございました。
みかん様
ご返信ありがとうございます。
動いて良かったです。
こちらこそ、今回の改変は勉強になりました。ありがとうございました。