Sponsored links

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

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

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

Sponsored links

コマンドの内容

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、名称の列番号、属性のタグ名、画層名の設定はカスタマイズしやすいようにプログラムの最初にまとめておきました。

コマンド名は TEST です。

;/////////////////////////////////////////////
;|
Jagaimo Lisp 
Inserting Survey Point Text Var.20240123
|;
;/////////////////////////////////////////////
(defun c:Test 
       (/ *error* Folder Path X_Easting Y_Northing Tag_Column
         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 ;; テキストの高さ
    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" "MC" (list PtX PtY) Text_Height 0 TxTag) ; テキストの挿入
        
	      
      );while
  ));if progn

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

参考記事

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

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

点座標についてです。

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

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


自作関数について。

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

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

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

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

Comments