設計業務や図面修正の中で、「図面内の色々な場所にあるテキストを、特定の表やリストに順番にコピー&ペーストしていく」という地道な作業に時間を取られていませんか?
今回は、そんなお悩みを一発で解決する超便利なLISPスクリプトをご紹介します。ARES Standardはもちろん、AutoCADなどLISPが動くCADであればそのまま使えます。
今回紹介するLISPでできること
- 文字をクリックするだけで、あらかじめ指定した基準点から「指定した間隔(行)」で上から順に自動配置されます。
- 文字の角度自動リセット機能:元データが縦向きや斜め(角度0以外)になっていても、配置先では自動的に0度(水平方向)に回転を補正して綺麗に並べます。
- 終了したいときは、いつでも
Escキーを押すだけで安全に中断できます。 - コピー元文字のフォントサイズや画層(レイヤー)を維持したまま綺麗に整列します。
連続配置&角度補正LISPのコード
以下のコードをコピーして、メモ帳などに貼り付け、ファイル名を TextToDrawing.lsp (拡張子は必ず .lsp)として保存してください。
(defun c:TextToDrawing ( / basePt offsetPt offsetVec count loop flag entName entData entType txtValue insPt newEntName newEntData)
(vl-load-com)
;; 1. 配置基準の設定
(setq basePt (getpoint "\n1番目の貼り付け基準点をクリック: "))
(if basePt
(progn
(setq offsetPt (getpoint basePt "\n2番目の貼り付け位置をクリック(間隔と方向の指定): "))
(if offsetPt
(progn
;; 基準点から2番目へのベクトル(間隔)を計算
(setq offsetVec (mapcar '- offsetPt basePt))
;; カウンターを初期化(0=1番目)
(setq count 0)
(setq loop t)
(princ "\n--- 文字を連続クリックしてください(※ 終了するには Esc キー を押してください) ---\n")
;; 2. クリックの連続ループ処理
(while loop
(setq flag nil)
(while (not flag)
(setq entName (car (entsel (strcat "\n[" (itoa (+ count 1)) "番目] の文字をクリック: "))))
(cond
;; 空クリック(右クリックやEnter)された場合は、終了せずそのまま次の入力を待つ
((null entName)
(princ "\nオブジェクトが選択されませんでした。もう一度クリックしてください。")
)
;; オブジェクトが選択された場合
(t
(setq entData (entget entName))
(setq entType (cdr (assoc 0 entData)))
;; TEXTまたはMTEXTの場合のみ処理
(if (or (= entType "TEXT") (= entType "MTEXT"))
(progn
(setq txtValue (cdr (assoc 1 entData)))
;; 現在の順番に応じた貼り付け座標を計算
(setq insPt (mapcar '+ basePt (mapcar '(lambda (x) (* x count)) offsetVec)))
;; 元の文字をコピーして指定位置に配置
(command "._copy" entName "" "_none" (cdr (assoc 10 entData)) "_none" insPt)
;; コピーした新しい文字のデータを取得
(setq newEntName (entlast))
(setq newEntData (entget newEntName))
;; 文字の内容を書き換えつつ、配置角度(グループコード50)を「0」に強制変更
(setq newEntData (subst (cons 1 txtValue) (assoc 1 newEntData) newEntData))
(if (assoc 50 newEntData)
(setq newEntData (subst (cons 50 0.0) (assoc 50 newEntData) newEntData))
(setq newEntData (append newEntData (list (cons 50 0.0))))
)
;; 図面への反映
(entmod newEntData)
(entupd newEntName)
(princ (strcat "\n" (itoa (+ count 1)) "番目に配置しました(角度を0度に変更): " txtValue))
;; カウンターを1進める
(setq count (+ count 1))
(setq flag t)
)
;; 文字以外をクリックした場合の警告
(princ "\n選択されたオブジェクトは文字ではありません。再選択してください。")
)
)
)
)
)
)
)
)
)
(princ)
)
使い方・操作手順
操作はとてもシンプルで、たったの3ステップです。
1. LISPのロード
作成した TextToDrawing.lsp ファイルをARES(またはAutoCAD)の図面画面内にドラッグ&ドロップするか、APPLOAD コマンドからロードします。
2. コマンドの実行と配置ルールの指定
コマンドラインに TEXTTODRAWING と入力して Enter を押します。
- 「1番目の貼り付け基準点をクリック」
→ リストや表の「1行目(文字を置きたい場所)」をクリックします。 - 「2番目の貼り付け位置をクリック」
→ リストの「2行目」をクリックします。
※これでプログラムが「下方向にこの間隔で並べるんだな」と規則性を自動認識します。
3. 文字を連続クリック!
あとは、図面内にある抽出したい文字を順番にクリックしていくだけです。自動的に1行目、2行目、3行目……と指定した間隔で文字がコピー配置されていきます。
- 斜めの文字をクリックしても、自動的に水平(角度0)になって配置されるので安心です!
- 途中で空クリック(右クリックやEnter)しても終了しません。 ミスクリックを気にせず、テンポよくマウス操作に集中できます。
- 終了したいときは
Escキー を押せばいつでも安全にコマンドを終了できます。
まとめ
バラバラの位置や、様々な角度で書かれたテキストを集約してリスト化する作業は、手動で行うとコピー&ペーストの往復だけでなく回転の修正処理も加わり、非常に時間がかかります。
このLISPを使えば、画面の行き来や角度調整の手間がなくなり、ただ文字をクリックしていくだけで綺麗なリストが一瞬で完成します。ぜひ日々の図面作成・修正業務に役立ててみてください!
