情報を書き換える
こんにちは!
エカキオです!
今回は、オブジェクトのプロパティを「Lisp」を使って行いたいと思います。
以前書いたオブジェクトの情報を得るを使用します。(やっとです…)
はてなブログを初めて、まだ使い方をいろいろ調べながらやってます。
記載しているコードが長くなってきたので、見やすい方法を模索しながらやっていますが、
なかなか上手くいっていないような。。。
こうやるといいよ!っていう方法を知っている方いましたら教えてくださると幸いです。
よろしくお願い致します。
情報を抽出、変数にセット
(defun c:info () (setq li (entget (car (entsel)))) (princ) )
まずは、変数「li」に情報を保存します。
次に、何の情報を得たいか決めてください。
レイヤー(画層名)なのか、
オブジェクト色なのか、
基点(始点)の位置なのか、
取りたい情報が決まったら、下記よりグループコードを探してください。
レイヤーであれば「8」
オブジェクト色であれば「62」
基点(始点)であれば「10」
といった感じです。
ここで新しい関数を紹介します。
(assoc ○ △);要素の取り出し
(cadr □);中身の左から2番目を抽出(凄く省略して表現してます)
○:グループコード
△:リスト群(今回でいうと、変数「li」)
□:中身を取りたいリスト・変数など
Lispに組み込んでみます。
例えばレイヤーを抽出しましょう。
(defun c:info ( / li l2 l3) (setq li (entget (car (entsel))));liに情報をセット① (setq l2 (assoc 8 li));liから画層を抽出② (setq l3 (cdr l2));l2の二番目を抽出③ (princ) )
このLispを使うとどういう流れが起きているか見てみましょう。
変数「li」にセットされる情報(例です)①のところ
( (-1 .
(assoc)関数で取り出されるもの②
(8 . "0")
(cadr)関数で取り出されるもの③
"0"
ここでは"0"となっています。ご存知と思いますがAutoCADのデフォルトで存在する画層名です。
説明上、上のような表現をしましたが、実際はこうも書けます。
(defun c:info ( / li l2) (setq li (entget (car (entsel))));liに情報をセット (setq l2 (cadr(assoc 8 li)));liから画層を抽出→二番目を抽出(閉じカッコの個数に注意) (princ) )
これで、オブジェクトの「画層名」をl2にセットできました。
情報を書き換える
上の例は、「画層名」や「オブジェクト色」を直接取得するやり方を
説明しました。
今度は、取得ではなく、書き換えを説明します。
まずは最終の形をお見せします。
画層名「0」を画層名「見え掛かり」に書き換えます。
(defun c:ch ( / li ) (setq li (entget (car (entsel)))) (setq li (subst (cons 8 "見え掛かり") (assoc 8 li) li )) (entmod li) (princ) )
(subst ○ △ □);特定の要素を入れ替え
(cons ● ▲);リストの先頭に追加、または(8 . "0")←この形を作れる
(entmod ◎);オブジェクト(図形)の定義データを更新します。
○:新要素
△:旧要素
□:この中の要素を入れ替える
●:前に追加されるもの
▲:追加されるベース
◎:変更された図形リスト
※使用用途が複雑なので、リンクも参考にどうぞ。。。
説明します。
(setq li (subst (cons 8 "見え掛かり") (assoc 8 li) li ))
この部分では、
(cons 8 "見え掛かり")
をすることで
(8 . "見え掛かり")
を作ります。
(assoc 8 li)
は記事中盤で説明した
(8 . "0")
を変数「li」から抽出しています。
(subst)を使うことで、
(8 . "見え掛かり")と(8 . "0")を入れ替えているのです。
そして(setq)で変数「li」を上書きしています。
その後、
(entmod li)
を入れることで、データを更新しているということですね。
いやぁ、難しい。
今回は複雑でした。
皆様ついて来れましたか。
できるだけ分かりやすいように解説を入れているつもりですが、
伝わっていないと意味がないので、率直な意見を書いていただけると
改善の余地ありです。
言われずとも、見やすく分かりやすく更新はしていきます。
それでは、この辺で失礼しますね。
エカキオ