Sponsored links

【AutoLISP ドリル】If 条件式 1 解答編

Sponsored links
ドリル
Sponsored links
Jagaimo
Jagaimo

If 条件式の練習問題1の解答編です。

Sponsored links

解答

If条件式

(if (< Rad 10)
(setq Col 1)
(setq Col 2)
)

変数Radに半径を入れて、もしRadが10より小さければ、変数Colに1(赤)、そうでなければ2(黄)を入れるとします。

解答例

DXF図形情報で半径情報を得て、コマンドCHANGE[データ変更]で色を変更しています。

(defun c:test (/ Obj Ent Rad Col)

  (setq Obj (car (entsel "円を選択:")))
  (setq Ent (entget Obj))
      (setq Rad (cdr (assoc 40 Ent)))
        
        (if (< Rad 10) 
          (setq Col 1)
          (setq Col 2)
        )
  
  (command-s "._CHANGE" Obj "" "_P" "_C" Col "")
(princ))

Visual Lisp

Visual Lisp を使って図形のプロパティの取得/変更をする場合です。
If条件式の部分は全く同じです。

 (defun c:test1 (/ VlObj Rad Col)

   (setq VlObj (vlax-ename->vla-object (car(entsel "円を選択:"))))
   (setq Rad (vla-get-radius VlObj))
        
        (if (< Rad 10) 
          (setq Col 1)
          (setq Col 2)
        )
  
  (vla-put-color VlObj Col)
  
(princ))

DXF図形情報を編集する場合

DXF図形情報を編集する場合、図形の色がbylayerになっているとグループコードの62の情報が省略されることがあります。

なので、以下のようにすると、entmodでは編集できない場合があります。

 (defun c:test3 (/ Obj Ent Rad Col)

  (setq Obj (car (entsel "円を選択:")))
  (setq Ent (entget Obj))
      (setq Rad (cdr (assoc 40 Ent)))
        
        (if (< Rad 10) 
          (setq Col 1)
          (setq Col 2)
        )
  
 (setq Ent (subst (cons 62 Col) (assoc 62 Ent) Ent))
  (entmod Ent)
(princ))

なので、もう一つ条件式を加えて、

もし62の情報があれば色番号を置き換える、そうでなければ(省略されて値が無い場合)、assoc を使ってグループコードと色番号のドットペアを足す。
としなければいけません。

(defun c:test4 (/ Obj Ent Rad Col)

  (setq Obj (car (entsel "円を選択:")))
  (setq Ent (entget Obj))
      (setq Rad (cdr (assoc 40 Ent)))
        
        (if (< Rad 10) 
          (setq Col 1)
          (setq Col 2)
        )
    
    
   (if (cdr (assoc 62 Ent))
      (setq Ent (subst (cons 62 Col) (assoc 62 Ent) Ent))
      (setq Ent (append Ent (list (cons 62 Col))))
   )

   (entmod Ent)

(princ))

ちょっと面倒ですね。
この場合はVisual Lispを使うか、コマンドCHANGE[データ変更]を使うのが簡単だと思います。

関連記事

図形の情報を得る

IF条件式

図形の色を変える

Comments