Sponsored links

【AutoLISP サンプル】CSVデータから座標点を入力(ブロック編)

Sponsored links
loupe and smartphone with compass on maps AutoLISP
Photo by Monstera 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、5列目の情報を使って、(x,y) 座標にブロック挿入し、そのブロックの属性に座標点の名称を入れます。

さらに、5列目の名称を使って画層 ”Jaga-Point-名称” を作成します。
画層の色は1(赤)から始まり、新しい画層を作る度に色番号を一づつ増やしていきます。
挿入したブロックの画層はその名称の画層になります。

今回のCSVファイルの例でコマンドを実行すると、
“Jaga-Point-JAGA” (色番号1赤)
“Jaga-Point-IMO”(色番号2黄)
“Jaga-Point-LISP”(色番号3緑)
3つの画層が作成されます。

そして、各座標にブロックが挿入され、名称の画層になり属性が入ります。

準備

csv ファイル

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

2列目 AutoCADのY座標(南北の座標)
3列目 AutoCADのX座標 (東西の座標)
5列目 座標点の名称

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

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


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

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

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

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

ブロック

このコマンドには属性が入ったブロック ”Jaga-Pt” が必要です。

ブロック名”Jaga-Pt XYZ尺度を均一に設定してください。
ブロック内の属性は、タグ名: TAG プリセット: なし に設定してください。
色を ByLayerにしておくと名称ごとに違う色になります。


上記の設定のブロック Jaga-Pt” が図面ファイル内にあるか、検索パス内にあるフォルダに保存してあることを前提に、AutoLISPが組まれています。

ブロックを別ファイルにして保存する方法はコチラの記事にあります。

AutoLISP サンプル

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

コマンド名は TEST です。

;/////////////////////////////////////////////
;|
Jagaimo Lisp 
Inserting Survey Block Var.20221208
|;
;/////////////////////////////////////////////



(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 ;; 名称の列番号
    
    Block_Name "Jaga-Pt" ;; 挿入ブロックの名前
    Block_Tag "TAG" ;; 名称を入れる属性のタグ名
    Layer_Name "Jaga-Point-" ;; 画層名
  
  );setq
  ;///////////////////////////////////////
  ;///////////////////////////////////////
  
  
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;--------------------------------------- 
    (setq OldCmdEcho (getvar "CMDECHO")) 
    (setvar "CMDECHO" 0)
    (setq OldOsmode (getvar "OSMODE"))
    (command-s "undo" "be")
;-----------------------------------------
  (defun JagaEnd ()
    (command-s "undo" "end")
    (setvar "CMDECHO" OldCmdEcho)
    (setvar "OSMODE" OldOsmode)
  ;-----------------------------------------	 
  (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 "._INSERT" Block_Name (list PtX PtY) "1" "0" "" )
          (command-s "._CHANGE" (entlast) "" "P" "LA" LyNm "")
        
         (setq VlObj (vlax-ename->vla-object (entlast)))
  
	      (vl-some
       '(lambda (att)
            (if (= Block_Tag (strcase (vla-get-tagstring att)))
                (progn (vla-put-textstring att TxTag) TxTag)
            );if
        );lambda
        (vlax-invoke VlObj 'getattributes)
         );vlsome
          
      );while
  ));if progn

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

参考記事

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

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

点座標についてです。

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

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


自作関数について。

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

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

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

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

Comments