【AutoLISP サンプル】CSVデータから座標点を入力(点とテキスト編)

close up photo of assorted color of push pins on map AutoLISP
Photo by Aksonsat Uanthoeng on Pexels.com
Jagaimo
Jagaimo

CSVファイルで受け取った座標点をに点とテキストを挿入します。

コマンドの内容

CSVファイルを読み込み、その座標に点をブロック挿入します。

今回のコマンドで使用するCSVファイル例です。

1列目は連番
2列目はAutoCADのY座標(南北の座標)
3列目はAutoCADのX座標 (東西の座標)
4列目はAutoCADのZ座標(高さの座標)
5列目は座標点の名称

という形式です。

このコマンドでは、は2、3列目の情報を使って、(x,y) 座標に点とテキストを挿入します。

準備

csv ファイル

読み込むcsvファイルを用意してください。

2列目 AutoCADのY座標(南北の座標)
3列目 AutoCADのX座標 (東西の座標)
5列目 挿入するテキストの内容

という形式のデータが前提です。

コマンドを実行するとファイル指定のダイアログボックスが出てきます。


C:/JagaimoLISP/ が最初に開くようになっています。
必要に応じて書き換えてください。

フォルダパスの区切りは \ ではなく \\ もしくは / ですので気を付けてください。

〇  C:\\JagaimoLISP\\
〇  C:/JagaimoLISP/

×  C:\JagaimoLISP\
×  C://JagaimoLISP//

点の表示形式

点の表示形式を見やすいものに変更しておいてください。
コマンド DDPTYPE で設定ダイアログボックスが出てきます。

AutoLISP サンプル

ファイルパス名、X、Y、名称の列番号、属性のタグ名、画層名の設定はカスタマイズしやすいようにプログラムの最初にまとめておきました。

Var. 20241008 文字位置も編集しやすいようにプログラムの最初に設定する変数に入れました。

テキスト位置合わせオプションはAutoCADの公式サイトTEXT[文字記入] (コマンド)を参考にしてください。 初期値”MC”は中央です。

Text_X と Text_Y の値は、座標点から文字挿入点の距離です。

コマンド名は TEST です。

;/////////////////////////////////////////////
;|
Jagaimo Lisp 
Inserting Survey Point Text Var.20241008
|;
;/////////////////////////////////////////////
(defun c:Test 
       (/ *error* 
         Folder Path X_Easting Y_Northing Tag_Column
         Text_Height Text_Justify Text_X Text_Y
         Block_Name Block_Tag Layer_Name
          OldCmdEcho OldDynMode OldOsmode JagaEnd
           LyCk File T2Lst LyCol Tx Lst PtY PtX TxTag LyNm VlObj
        ) 
  
  ;///////////////////////////////////////
  ;///////////////////////////////////////
  (setq
    
    Folder "C:/JagaimoLISP/"  ;; データファイル指定フォルダの初期値
    X_Easting 3 ;; AutoCADのX軸(東西)座標の列番号
    Y_Northing 2 ;; AutoCADのY軸(南北)座標の列番号
    Tag_Column 5 ;; 名称の列番号
    Text_Height 0.1 ;; テキストの高さ
    Text_Justify "MC" ;; テキスト位置合わせオプション
    Text_X 0 ;; テキスト挿入点 座標+X方向
    Text_Y 0 ;; テキスト挿入点 座標+Y方向
    Layer_Name "Jaga-Point-" ;; 画層名
  
  );setq

  ;///////////////////////////////////////
  ;///////////////////////////////////////
  
  
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;--------------------------------------- 
    (setq OldCmdEcho (getvar "CMDECHO")) 
    (setvar "CMDECHO" 0)
    (setq OldOsmode (getvar "OSMODE"))
    (setq OldLayer (getvar "CLAYER"))
    (command-s "undo" "be")
;-----------------------------------------
  (defun JagaEnd ()
    (command-s "undo" "end")
    (setvar "CMDECHO" OldCmdEcho)
    (setvar "OSMODE" OldOsmode)
    (setvar "CLAYER" OldLayer)
  ;-----------------------------------------	 
  (princ "\n=========== JagaimoLISP.com ===========")
  (princ));defun
  ;-----------------------------------------
    (defun *error* (msg)	
      (princ (strcat"\nJagaimoLisp ERR\n " msg))
      (JagaEnd)
    (princ));defun Err
 
  ;----------------------------------------------------
  
  (defun LyCk (LyNm / LyInfo Ly62 Ly70)       
    (if (null (tblsearch "layer" LyNm )) 
     (progn
       (setq LyCol (1+ LyCol))
       (command-s ".-layer" 
                     "N" LyNm 
                      "C" LyCol LyNm 
                        "")
       
       (princ (strcat " \n 画層 < " LyNm " > 作成しました\n"))
  
  )) ;if progn
;----------------------------------------------------

   (setq LyInfo (tblsearch "layer" LyNm)) ;
		  
   (if LyInfo	
   (progn
      (setq 
          Ly62 (cdr(assoc 62 LyInfo)) 
          Ly70 (cdr(assoc 70 LyInfo))
      );setq

;----------------------------------------------------
     
     (if (> 0 Ly62) 
      (progn
            (command-s "._LAYER" "ON" LyNm "") 
            (alert (strcat " \n 画層 < " LyNm " > 非表示だったので表示にしました\n"))
      ));if progn
  
;----------------------------------------------------   
     
      (if (= 1 (logand 1 Ly70))
         (progn
         (command-s "._LAYER" "T" LyNm "")
            (alert (strcat " \n 画層 < " LyNm " > フリーズ解除しました"))
      ));if progn
     
;----------------------------------------------------
     
      (if (= 4 (logand 4 Ly70))
       (progn
        (command-s "._LAYER" "U" LyNm "")
      ));if progn
     
  ));if progn

);defun
  
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  (setq Path (getfiled "Select Data File" Folder "csv" 16))
  
  (if (setq File (open Path "r"))  
    (progn
      
      (defun T2Lst (Tx Del / Num )
        (if (setq Num (vl-string-search Del Tx))
          (cons (substr Tx 1 Num) (T2Lst (substr Tx (+ Num 2)) Del))
          (list Tx)
        );if
       );defun
      
      (setvar "OSMODE" 0)
      (setq LyCol 0)
      
      (while 
        (setq Tx (read-line File))
        (setq Lst (T2Lst Tx ","))
        
        (setq PtY (atof (nth (1- Y_Northing) Lst))
              PtX (atof (nth (1- X_Easting) Lst))
              TxTag (nth (1- Tag_Column) Lst)
        );setq
        
        (setq LyNm (strcat Layer_Name TxTag))
        (LyCk LyNm)
        
        (command-s "._LAYER" "S" LyNm "") ; 現在の画層をLyNmに設定
        (command-s "._POINT" (list PtX PtY)) ; 点の挿入
        (command-s "._-TEXT" "J" Text_Justify (list (+ PtX Text_X) (+ PtY Text_Y)) Text_Height 0 TxTag) ; テキストの挿入
        
	      
      );while
  ));if progn

  (close File)
(JagaEnd)
(princ));defun

参考記事

点とテキストではなく、属性付きのブロックを挿入するバージョン

関数 open, close read-lineでテキストファイルをAutoCADに読み込む記事です。
csvファイルも同じように読み込めます。

点座標についてです。

エラー処理について。ブロックをたくさん挿入して画層を変更するなど手数が多いので、UNDOで戻すときに点を一つ一つ戻すのではなく、UNDO1回でコマンド実行前に戻るように処理を入れています。
エラーが起きた時も実行前の状態に戻ります。

画層作成、テキストをリストにする処理は自作関数にしています。
コマンド内でしか使わないローカルコマンドの定義について。


自作関数について。

非表示画層を表示する関数です。
関数 strcat で文字をつなげることについても書いています。

画層がフリーズかどうかを調べて、もしフリーズなら解凍する方法についてです。

画層がロックされているかどうかを調べて、ロックされていたら解除する方法についてです。
ビットコードが含まれているかどうかを調べる logand について書いてあります。
画層だけでなく、オブジェクトスナップなど、ビットコードで設定されているものを変更したいとき、この関数はとても便利です。

コマンド実行中、必要無いエコーバックとプロンプトを消す設定にしています。それらのシステム変数について。