【AUTO CAD】Chat GPTとの連携 実践編(文字の書式一括変更ツール)
前回の記事でChat GPTとの連携機能が使えそうだと書いた。今回は実際に機能開発を行ったときのChat GPTとのやり取りを紹介しようと思う。
前回記事
【AUTO CAD】とっても詳しいChat GPTとの連携について|サンセツの日常 (note.com)
①どんな機能を開発するか?
建築事務所から来るJW CADのデータをAUTOCADのDWGに変換すると、文字スタイルがSTANDARDに変換される。弊社ではMSゴシックの書体を使っており、レイヤーを変更、MSゴシックに変更、幅係数を0.8に変更するという3つの変更をするのだが、表の中に文字があったりすると、文字だけを選ぶのが結構面倒だったりする。これをコマンド1つでできるようにする機能を作りたかった
②開発時のChatGPTとのやり取り(質問)
Q1:選択した要素の中から文字を選択して、その文字の画層をUSR2という画層に移動します。その次に文字スタイルをMSゴシックに変えるLISPを記述してください。
Q2:(defun c:ChangeTextLayerAndStyle ( / ss ent) はどんな意味?
Q3:引数のタイプが間違っています: lentityp (0 (18418.0 3839.2 0.0)) というエラーが出ます。
Q4:entmodはどんな関数ですか?
Q5:USR2の画層とMSゴシックの画層が存在しない場合にエラー表示をする様に変更してください。
Q6:選択した文字の幅係数を0.8にする様に上記プログラムを変更してください。
Q7:文字スタイルが変わらないです。その部分を1つ前の仕様に変更してください。
Q8:上記を実行しても、画層、文字幅は変わりますが、文字スタイルだけが変わりません。修正してください。
Q9:いえ、まだ文字スタイルが変わりません。テキストスタイルの処理の順番を最後にしてみてください。
Q10:今度は幅係数が0.8に変更されなくなりました。原因を究明して修正してください。
Q11:変更した文字を選択した状態のままにする処理を追加してください。
Q12:上記を実施しても選択した状態のままになりません。
Q13:いえ、まだされません。
Q14:いえ、やはり終了した後にすべて選択が解除されてしまいます。
→完成
③完成したプログラム
完成したプログラムはMG_text_changeというコマンドで起動する。起動した後、文字や線も含めて範囲選択すると、文字スタイル、幅、画層を変更してくれる便利なツールが出来た。
下記のテキストをテキストファイルに貼り付け→.LSPの拡張子で保存することでAUTOCADで使えるようになる。
(defun c:MG_text_change ( / ss i ent entdata newdata layername stylename layerfound stylefound newss)
(setq layername “USR2”
stylename “MS ゴシック”)
;; レイヤーとスタイルが存在するか確認
(setq layerfound (tblsearch “layer” layername))
(setq stylefound (tblsearch “style” stylename))
(if (and layerfound stylefound)
(progn
;; 選択セットを取得
(setq ss (ssget ‘((0 . “TEXT,MTEXT”))))
(if ss
(progn
;; 一時選択セットを作成
(setq newss (ssadd))
;; 選択セット内の各エンティティを処理
(setq i 0)
(while (< i (sslength ss)) (setq ent (ssname ss i)) ;; エンティティのデータリストを取得 (setq entdata (entget ent)) ;; レイヤーを変更 (setq newdata (subst (cons 8 layername) (assoc 8 entdata) entdata)) (entmod newdata) ;; テキストスタイルを変更 (TEXT と MTEXT で個別に処理) (cond ((= (cdr (assoc 0 entdata)) “TEXT”) (setq newdata (subst (cons 7 stylename) (assoc 7 entdata) entdata)) (setq newdata (subst (cons 41 0.8) (assoc 41 entdata) newdata)) ; 幅係数を設定 (entmod newdata)) ((= (cdr (assoc 0 entdata)) “MTEXT”) (setq newdata (subst (cons 7 stylename) (assoc 7 entdata) entdata)) (setq newdata (subst (cons 3 stylename) (assoc 3 entdata) newdata)) ;; MTEXTの幅係数を設定 (setq newdata (subst (cons 41 0.8) (assoc 41 entdata) newdata)) (entmod newdata) ;; MTEXTの場合、追加の幅係数設定 (vla-put-WidthFactor (vlax-ename->vla-object ent)
0.8))
)
;; 変更したエンティティを一時選択セットに追加
(ssadd ent newss)
(setq i (1+ i))
)
;; 選択状態を再設定
(sssetfirst nil newss) ; 一時選択セットを設定
(princ (strcat “\nSelected text elements have been moved to layer ‘” layername “‘ and text style changed to ‘” stylename “‘, and width factor set to 0.8.\n”))
)
(princ “\nNo text elements selected.\n”)
)
)
(progn
(if (not layerfound)
(princ (strcat “\nError: Layer ‘” layername “‘ does not exist.\n”))
)
(if (not stylefound)
(princ (strcat “\nError: Text style ‘” stylename “‘ does not exist.\n”))
)
)
)
(princ) ; プロンプトを終了
)
(princ “\nType ChangeTextLayerAndStyle to change the layer, text style, and width factor of selected text elements.\n”)
④開発後記
チャットGPTにはやりたいことと、やってみた結果、そして自分の分からない事を聞くだけでサクサク進んでいく印象。もちろん、分からない事を考える作業も少しはやってみるのだが、それよりChatGPTに聞く方が早いので、結果聞くことになる。
LISPのプログラムは全く分からないのだが、プログラムの中に丁寧に機能の説明も追加してくれるので、やっているうちにプログラムの言語も少し理解できるようになってきた気がする。
将棋の藤井君もこんな感じで爆速でいろんなことを吸収していって、あの強さになったのかなーと感じた。40代に突入してもChatGPTの力を借りればまだまだエンジニアとして成長できる気がして希望が持てた。
自分にとってChatGPTはCADと話せる便利な翻訳機みたいな感じ。