下方向きの折れ線グラフ(N値)のLISPから簡易柱状図版にブラッシュアップしてもらった。

LISP改造計画

50本のデータを処理する必要が出てきましたので、昨年作ったやっつけLISPからブラッシュアップすることにしました。
下方向きの折れ線グラフ(N値)のLISPをGemini(AI)に作ってもらった | 地質屋さんと呼ばないで

少なくとも断面図でよく見る形の旗立ち上げの部品を作って、勝手に保存するところまで機能アップをしたい。
上手く出来たので、ここでは手順を保存しておきたい。
最近すぐ忘れるのでやったことノートです。

実現したいこと

・旗揚げラベルを自動入れ替えしたい。
・柱状図の換算N値のラベルを入れたい。
・N値グラフを矩形で閉じたい。
・DXFファイルに自動で保存したい。

加工元のDXFファイルをGeminiに登録してLISPを作る

AutoCADのDXFファイルはGeminiは認識しているしているようで、モデルとするDXFファイルをGeminiにぶっ込んでやればいい。

CSVファイルの1行目をラベルとして、上段、下段のラベルだということをGeminiに認識させた。
深度方向のデータが異なるので、最大深度+500で矩形で枠を閉じることを指示した。
いちいち保存するのがめんどくさいので、上段ラベルの名前でDXF保存させてやる。
LISPの起動コードを自分の使いやすい名前にしてやる。

出来上がったLISPはこれだ

(defun c:kanikan ( / dxf-template csv-file file-handle header-line label-top label-bottom point-list p-data max-depth grid-bottom final-point-list circle-radius old-osmode ss i ent ent-data txt-val csv-dir save-path)
  (princ "\n--- 地質調査グラフ作成 (kanikan) を開始 ---")

  ;; --- 基本設定 ---
  (setq circle-radius 20.0)
  (setq old-osmode (getvar "OSMODE"))
  (setvar "OSMODE" 0) ;; スナップをオフにして作図ミスを防止

  ;; 1. テンプレートDXFの挿入
  ;; 既存の図枠や「No.」「m」というテキストが含まれるファイルを指定してください
  (setq dxf-template (getfiled "ベースのDXFファイルを選択" "" "dxf" 4))
  (if (and dxf-template (findfile dxf-template))
    (progn
      (command "_.-INSERT" dxf-template "0,0" "1" "1" "0")
      (command "_.EXPLODE" (entlast))
    )
    (progn (princ "\nDXFが見つかりません。") (exit))
  )

  ;; 2. CSVデータの読み込み
  (setq csv-file (getfiled "CSVデータを選択" "" "csv" 4))
  (if (and csv-file (setq file-handle (open csv-file "r")))
    (progn
      (setq csv-dir (vl-filename-directory csv-file))
      
      ;; 1行目:ラベル分離 (1列目:上段ラベル/ファイル名, 2列目:下段ラベル)
      (setq header-line (read-line file-handle))
      (if (vl-string-search "," header-line)
        (progn
          (setq label-top (substr header-line 1 (vl-string-search "," header-line)))
          (setq label-bottom (substr header-line (+ 2 (vl-string-search "," header-line))))
        )
        (setq label-top header-line label-bottom "")
      )
      
      ;; 2行目以降:データ取得と最大深度の特定
      (setq point-list '() max-depth 0.0)
      (while (setq line-data (read-line file-handle))
        (setq line-data (vl-string-subst " " "," line-data))
        (setq line-data (strcat "(" (vl-string-trim " " line-data) ")"))
        (setq p-data (vl-catch-all-apply 'read (list line-data)))
        (if (and (listp p-data) (= (length p-data) 2))
          (progn
            (setq point-list (append point-list (list p-data)))
            (if (> (cadr p-data) max-depth) (setq max-depth (cadr p-data)))
          )
        )
      )
      (close file-handle)

      ;; 3. 動的グリッドの作成 (最大深度 + 500)
      (setq grid-bottom (* (+ max-depth 500.0) -1.0))
      ;; N値 0, 10, 20, 30, 40, 50 の垂直線を引く
      (foreach x-val '(0 10 20 30 40 50)
        (command "_LINE" (list (* x-val 40.0) 0.0) (list (* x-val 40.0) grid-bottom) "")
      )
      ;; 水平の枠線を引き直す
      (command "_LINE" (list 0.0 0.0) (list 2000.0 0.0) "")
      (command "_LINE" (list 0.0 grid-bottom) (list 2000.0 grid-bottom) "")

      ;; 4. グラフのプロット (X軸:N値*40倍, Y軸:深度*-1)
      (if (>= (length point-list) 1)
        (progn
          (setq final-point-list '())
          (foreach pt point-list
            (setq final-point-list (append final-point-list (list (list (* (car pt) 40.0) (* (cadr pt) -1.0)))))
          )
          
          ;; 折れ線グラフ
          (command "_PLINE") (foreach pt final-point-list (command pt)) (command "")
          
          ;; 各点のマーカー(円)
          (foreach pt final-point-list
            (command "_CIRCLE" pt circle-radius)
          )

          ;; 5. ラベル置換 (DXF内の既存テキストを検索して書き換え)
          (setq ss (ssget "X" '((0 . "TEXT,MTEXT"))))
          (if ss
            (progn
              (setq i 0)
              (repeat (sslength ss)
                (setq ent (ssname ss i))
                (setq ent-data (entget ent))
                (setq txt-val (cdr (assoc 1 ent-data)))
                (cond
                  ((vl-string-search "No." txt-val)
                   (setq ent-data (subst (cons 1 label-top) (assoc 1 ent-data) ent-data)))
                  ((vl-string-search "m" txt-val)
                   (setq ent-data (subst (cons 1 label-bottom) (assoc 1 ent-data) ent-data)))
                )
                (entmod ent-data)
                (setq i (1+ i))
              )
            )
          )

          ;; 6. DXF形式で自動保存 (保存名はCSVの1列目)
          (setq save-path (strcat csv-dir "\\" label-top ".dxf"))
          (if (findfile save-path) (vl-file-delete save-path))
          (command "_DXFOUT" save-path "Version" "2000" "16" "")
          
          (princ (strcat "\n完了: ファイル「" save-path "」を生成しました。"))
        )
      )
    )
    (princ "\nCSVファイルの読み込みに失敗しました。")
  )

  (setvar "OSMODE" old-osmode) ;; OSNAP設定を元に戻す
  (princ)
)

元のDXFファイルを読み込ませ、書かせたいデータのCSVファイルを読むと、勝手に作図して勝手に保存するLISPとなりました。

SnapCrab_NoName_2026-3-4_16-16-47_No-00.png

これで、50本のデータがあっという間に出来上がる。この仕事は勝ったな。
構想5分、試行完成が1時間。マクロ職人撲滅委員長の仕事である。

\ 最新情報をチェック /

目を開けたまま寝言を言えるようになれば出世できます

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください