簡易柱状図DXF出力LISPをGeminiで連続出力版にした。

50個もちまちまやるのがめんどくさくなったので、もう一気DXF出力で良いじゃないか?

LISP改造計画

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

50個のデータを一個一個作るのが嫌になりました。
下方向きの折れ線グラフ(N値)のLISPから簡易柱状図版にブラッシュアップしてもらった。 | 地質屋さんと呼ばないで

実現したいこと

先日作った簡易柱状図を連続してDXF出力したい。

出来上がったLISPはこれだ

(defun c:kanikan ( / dxf-template target-csv csv-dir files f-name csv-file file-handle 
                     header-line label-top label-bottom point-list p-data line-data 
                     max-depth grid-bottom final-point-list circle-radius old-osmode 
                     ss i ent ent-data txt-val save-path acad-obj doc model-space)
  (vl-load-com)
  (princ "\n--- 地質調査グラフ一括作成モード開始 ---")

  ;; --- 基本設定 ---
  (setq circle-radius 20.0)
  (setq old-osmode (getvar "OSMODE"))
  (setvar "OSMODE" 0)
  (setvar "CMDECHO" 0)

  (setq acad-obj (vlax-get-acad-object)
        doc      (vla-get-activedocument acad-obj)
        model-space (vla-get-modelspace doc))

  ;; 1. テンプレートDXFの選択
  (setq dxf-template (getfiled "ベースのDXFファイルを選択" "" "dxf" 4))
  (if (not (and dxf-template (findfile dxf-template)))
    (progn (princ "\nDXFテンプレートが選択されませんでした。") (exit))
  )

  ;; 2. CSVフォルダの取得
  (setq target-csv (getfiled "処理したいフォルダ内のCSVをどれか1つ選択" "" "csv" 4))
  (if (and target-csv (setq csv-dir (vl-filename-directory target-csv)))
    (progn
      (setq files (vl-directory-files csv-dir "*.csv" 1))
      (princ (strcat "\n合計 " (itoa (length files)) " 個のファイルを処理します..."))

      ;; --- メインループ開始 ---
      (foreach f-name files
        (setq csv-file (strcat csv-dir "\\" f-name))
        (setq file-handle (open csv-file "r"))
        
        (if file-handle
          (progn
            ;; 図面を全削除して初期化
            (vlax-for obj model-space (vla-delete obj))
            (vla-purgeall doc)

            ;; テンプレート挿入
            (command "_.-INSERT" (strcat "*" dxf-template) "0,0" "1" "0")
            
            ;; 1行目:ラベル分離
            (setq header-line (read-line file-handle))
            (if (setq pos (vl-string-search "," header-line))
              (setq label-top (substr header-line 1 pos)
                    label-bottom (substr header-line (+ 2 pos)))
              (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-translate "," " " line-data))
              (setq p-data (read (strcat "(" line-data ")")))
              (if (and (listp p-data) (>= (length p-data) 2))
                (progn
                  (setq point-list (append point-list (list p-data)))
                  (if (> (float (cadr p-data)) max-depth) (setq max-depth (float (cadr p-data))))
                )
              )
            )
            (close file-handle)

            ;; グリッド作成
            (setq grid-bottom (* (+ max-depth 500.0) -1.0))
            (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) "")

            ;; グラフ作図
            (if point-list
              (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))

                ;; ラベル置換
                (setq ss (ssget "X" '((0 . "TEXT,MTEXT"))))
                (if ss
                  (progn
                    (setq i 0)
                    (repeat (sslength ss)
                      (setq ent (ssname ss i)
                            ent-data (entget ent)
                            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))
                    )
                  )
                )

                ;; DXF書き出し
                (setq save-path (strcat csv-dir "\\" (vl-filename-base f-name) ".dxf"))
                (if (findfile save-path) (vl-file-delete save-path))
                (setvar "FILEDIA" 0)
                (command "_DXFOUT" save-path "V" "2000" "16")
                (setvar "FILEDIA" 1)
                (princ (strcat "\n完了: " save-path))
              )
            )
          )
        )
      )
    )
  )

  (setvar "OSMODE" old-osmode)
  (setvar "CMDECHO" 1)
  (princ "\n--- 全てのCSV処理が完了しました ---")
  (princ)
)

フォルダ内の1個のcsvを指定すると残りのcsvファイルも連続してDXFに変換できるようになりました。
短冊形ボーリング柱状図の各ファイルを羅列するLISPを作成した | 地質屋さんと呼ばないで
あとはこれで並べれば、終了。

SnapCrab_NoName_2026-3-6_17-29-22_No-00.png

これ以上何かやろうとすると本業の方に支障が出るのでこれでひとまず。

\ 最新情報をチェック /

コメントを残す

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

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