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

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 について書いてあります。
画層だけでなく、オブジェクトスナップなど、ビットコードで設定されているものを変更したいとき、この関数はとても便利です。

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

Comments

  1. 江本 外明 より:

    Jagaimo様
    CSVデータから座標点を入力(点とテキスト編)について

    よろしくお願いします。
    座標点の名称の指定を5列目ではなく、初めの1列目を指定できますか。またテキストの挿入位置を座標点の上5mm離してテキスト中心は”下中心”となりますか。レイヤの指定は無くても良いのですが。
    また、リスプの置く場所が良くわかりません。通常のロードと違うのでしょうか。
    通常のCSVファイルから作業したいのですが、よろしくお願いいたします。

  2. Jagaimo より:

    >座標点の名称の指定を5列目ではなく、初めの1列目を指定できますか。


    Tag_Column 5 ;; 名称の列番号

    この部分を

    Tag_Column 1 ;; 名称の列番号

    に書きかえれば名称が1列目になります。

    >またテキストの挿入位置を座標点の上5mm離してテキスト中心は”下中心”となりますか。

    Text_Justify "MC" ;; テキスト位置合わせオプション  
    Text_X 0 ;; テキスト挿入点 座標+X方向
    Text_Y 0 ;; テキスト挿入点 座標+Y方向

    この部分で変更できます。下中心はBC、上に移動するにはYの値を増やします。

    文字を下中心にして上に0.1移動させた書きかえ例

    Text_Justify "BC" ;; テキスト位置合わせオプション  
    Text_X 0 ;; テキスト挿入点 座標+X方向
    Text_Y 0.1 ;; テキスト挿入点 座標+Y方向

    >リスプの置く場所が良くわかりません。通常のロードと違うのでしょうか。
    通常のCSVファイルから作業したいのですが

    CSVファイルの指定場所はこの部分の書き換えで変更できます。

    Folder "C:/JagaimoLISP/" ;; データファイル指定フォルダの初期値

    リスプの読み込み方はこの記事が参考にしてください。方法2が一番簡単だと思います。

    https://jagaimolisp.com/load/

  3. 江本 より:

    jagaimo様

    ありがとうございます。

    今一つ質問させてください。X列とY列の位置関ですが、X列が2番目、Y列が3番目の時は
    X_Easting 3 ;; AutoCADのX軸(東西)座標の列番号・・・2に変更
    Y_Northing 2 ;; AutoCADのY軸(南北)座標の列番号・・・3に変更

    でよろしいのでしょうか?

    よろしくお願いいたします。

  4. Jagaimo より:

    こんにちは。
    その通りです。

  5. 江本外明 より:

    Jagaimo様
    ご指導有難うございます。
    実行してみました。Z値が反映されません。まったくの平面に書かれます。
    こちらの手順が悪いのでしょうか?
    ご教授 お願いいたします。

  6. 江本外明 より:

    jagaimo様
    お世話になります。あと1点 画層がたくさん作られますが画層選択をキャドの画層に準じることはできますか。
    よろしくお願いします。

  7. 江本外明 より:

    jagaimo様
    お世話になります。 座標のZ値が反映されません。このLISPは2D用でしょうか。 3Dに対応できませんでしょうか。よろしくお願いいたします。

  8. Jagaimo より:

    そうです。これは2D用です。でも、Z値を加えることもできます。

    設定部分にZの値の列番号を加えます。
    Z_Elevationの部分です。

    (setq
    Folder "C:/JagaimoLISP/" ;; データファイル指定フォルダの初期値
    X_Easting 3 ;; AutoCADのX軸(東西)座標の列番号
    Y_Northing 2 ;; AutoCADのY軸(南北)座標の列番号
    Z_Elevation 4 ;; AutoCADのZ軸(高さ)座標の列番号
    Tag_Column 5 ;; 名称の列番号
    Text_Height 0.1 ;; テキストの高さ
    Text_Justify "MC" ;; テキスト位置合わせオプション
    Text_X 0 ;; テキスト挿入点 座標+X方向
    Text_Y 0 ;; テキスト挿入点 座標+Y方向
    Layer_Name "Jaga-Point-" ;; 画層名
    );setq 

    点の値を定義する部分にZの情報を加えます。PtZとの部分です。

    (setq PtY (atof (nth (1- Y_Northing) Lst))
    PtX (atof (nth (1- X_Easting) Lst))
    PtZ (atof (nth (1- Z_Elevation) Lst))
    TxTag (nth (1- Tag_Column) Lst)
    );setq

    点の作成の部分にPtZを加えます。

    (command-s "._POINT" (list PtX PtY PtZ)) ; 点の挿入

    この3か所を書き換えることで、Z値も反映されます。

  9. Jagaimo より:

    画層作成、オフ/フリーズチェックの部分を消します。

    この行から
    (defun LyCk (LyNm / LyInfo Ly62 Ly70)

    仕切りに使っている
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    の上までです。

    そして、作画をする画層の設定をしているコマンド部分を消せば、現在の画層に作画されます。
    (command-s "._LAYER" "S" LyNm "") ; 現在の画層をLyNmに設定

  10. 江本外明 より:

    jagaimo様
    ありがとうございます。ご教授の通りに直したつもりですが
    コマンド: CSV
    JagaimoLisp ERR
    no function definition: LYCK
    =========== JagaimoLISP.com =========== でエラーになります。
    誠に申し訳ございませんが、修正リスプの作成をお願いできませんでしょうか。
    厚かましいお願いとは存じますが、何卒 よろしくお願いいたします。

  11. Jagaimo より:

    失礼しました、まだ画層設定のコードが残っていましたね。

    (setq LyNm (strcat Layer_Name TxTag))
    (LyCk LyNm)

    も消してください。

  12. 江本外明 より:

    jagaimo様

    ありがとうございます。座標は3Dで表示されますが、文字が追従しません。
    文字の設定を再度ご教授願いたく、よろしくお願いいたします。

  13. Jagaimo より:

    文字挿入コマンドの部分でZ値の情報を加えます。

    (command-s "._-TEXT" "J" Text_Justify (list (+ PtX Text_X) (+ PtY Text_Y) PtZ) Text_Height 0 TxTag) ; テキストの挿入

  14. 江本外明 より:

    lagaimo様

    重ね重ねありがとうございます。
    無事動作いたしました。お付き合いいただき有難うございます。
    感謝申し上げます。

  15. Jagaimo より:

    よかったです。
    試行錯誤して欲しいコマンドが思い通りに動いた時ってすごくうれしいですよね!
    オリジナルコマンド完成おめでとうございます。