Jagaimo
If 条件式の練習問題1の解答編です。
解答
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