Sponsored links

【AutoLISP リスト】ドットペアリストをデータベースとして使う

Sponsored links
AutoLISP
Sponsored links

ドットペアリストをデータベースとして使う例です。

複数のコマンドで使う情報は1つにリストにしてまとめておくと、

図面ルールの変更があったり、複数の図面ルールがあるときにリストを書き換えるだけでコマンド用のプログラムの変更しなくて済んで楽です。

さらにドットペアのリストにすると、記号で欲しい情報を呼び出せます。

Sponsored links

予備知識

ドットペアの作成方法

ドットペアリスト使用例

画層やスタイルや線種などの図面ルールを、ドットペアを使ってまとめて1つの関数にします。

データベース用の自作関数

  • 文字画層情報(画層名 線種 画層の色)
  • 寸法画層情報(画層名 線種 画層の色)
  • 線種ファイルのリンク
  • 図面で使う線種
  • 文字スタイル
  • 寸法スタイル

これらをドットペアのリストでまとめたのがこちらです。

(defun JagaStandard (Sym)
  
   (cdr(assoc Sym 
      (setq Info (list
         (cons 'TxLy '("Jaga-Text" "CONTINUOUS" 2))
         (cons 'DimLy '("Jaga-Dim" "CONTINUOUS" 3))
         (cons 'LtLk "C:/Linetypes/JagaLine.lin")
         (cons 'Lt '("DASHED" "HIDDEN" "CENTER" "PHANTOM"))
         (cons 'Stl "JagaTxStyle") (cons 'DimStl "JagaDimStyle")
      );setq
    )); assoc cdr
 
);defun

AutoLISPの説明

(defun JagaStandard (Sym)

JagaStandard という名前で、引数でSymに入れる関数を定義します。
ここで渡される引数は、ドットペアの記号です。

(cdr(assoc Sym
  (list
   (cons 'TxLy '("Jaga-Text" "CONTINUOUS" 2))
   (cons 'DimLy '("Jaga-Dim" "CONTINUOUS" 3))
   (cons 'LtLk "C:/Linetypes/JagaLine.lin")
   (cons 'Lt '("DASHED" "HIDDEN" "CENTER" "PHANTOM"))
   (cons 'Stl "JagaTxStyle") (cons 'DimStl "JagaDimStyle")
)); assoc cdr

ドットペアのリストを作ります。
ついでに(cdr (assoc Sym を付けたので、引数として渡された記号とペアになっている値が戻り値になります。

情報を呼び出す

定義した関数JagaStandardに引数として記号名を入れるだけで、欲しい情報が戻り値になります。

例えば、文字画層の情報が欲しい時、

(setq Ly (JagaStandard 'TxLy))

で、(“Jaga-Text” “CONTINUOUS” 2) を変数Lyに入れることができます。

もし、画層名だけ欲しいという場合はcar も足して

(setq LyNm (car (JagaStandard 'TxLy)))

で、文字画層名の “Jaga-Text” が変数LyNmに入ります。

条件式との組み合わせ

いくつもの設定を使い分けたいというときは、条件式condを使って、その状況に合わせた寸法情報得るようにもできます。

これは、スタンダード番号を指定して、その番号に合った情報を戻すようにした例です。

(defun JagaStandard (Sym / Std Lst)
  
  (setq Std (getint "スタンダード番号:"))
    
  (cond 
    
    ((= 1 Std)  
        
      (setq Lst 
        (list
           (cons 'TxLy '("Jaga-Text1" "CONTINUOUS" 2))
           (cons 'DimLy '("Jaga-Dim1" "CONTINUOUS" 3))
           (cons 'LtLk "C:/Linetypes/JagaLine1.lin")
           (cons 'Lt '("DASHED" "HIDDEN" "CENTER" "PHANTOM"))
           (cons 'Stl "JagaTxStyle1") 
           (cons 'DimStl "JagaDimStyle1")
        );list
      );setq
    );1
    
    
    ((= 2 Std)  
        
      (setq Lst 
        (list
           (cons 'TxLy '("Jaga-Text2" "Linetype2" 2))
           (cons 'DimLy '("Jaga-Dim2" "Linetype2" 3))
           (cons 'LtLk "C:/Linetypes/JagaLine2.lin")
           (cons 'Lt '("Linetype2"))
           (cons 'Stl "JagaTxStyle2") (cons 'DimStl "JagaDimStyle2")
       );list
      );setq
    );2
    
    
    
  );cond
(cdr(assoc Sym Lst))
);

スタンダード番号をグローバル変数にすると、2回目からは入力しなくて済むようになります。

そして、これは例なのでgetint を使いましたが、実際には、ダイアログボックスやinitget などを使って指定した番号以外は入力できないようにした方がエラーの要因が減ると思います。

参考記事

ダイアログボックスについての記事。

ユーザー入力を選択肢の中からのみだけにする方法がこちらの記事。

まとめ

  • 情報をリストにして、複数のコマンドに出てくる情報をひとまとめに整理しておくと、変更があった時や複数の図面ルールを使い分けるときに便利。

Comments