「選択フィルタ」の版間の差分

提供:GizmoLabs - だいたい CAD LISP なサイト
(ページの作成: ssget 等で特定の条件を満たすオブジェクトのみ選択をする場合、フィルタ リストの引数を記述する。 例えば、特定の画層上のオブ...)
 
編集の要約なし
10行目: 10行目:


<pre class="brush: autolisp;">
<pre class="brush: autolisp;">
(setq ss1 (ssget '((0 . "TEXT"))))   ; ユーザにオブジェクト選択を要求し、文字オブジェクトだけを選択セットに追加。
; ユーザにオブジェクト選択を要求し、文字オブジェクトだけを選択セットに追加。
(setq ss1 (ssget '((0 . "TEXT"))))


(setq ss1 (ssget '((0 . "TEXT,MTEXT"))))  ; ユーザにオブジェクト選択を要求し、文字とマルチテキストオブジェクトだけを選択セットに追加。
; ユーザにオブジェクト選択を要求し、文字とマルチテキストオブジェクトだけを選択セットに追加。
(setq ss1 (ssget '((0 . "TEXT,MTEXT"))))   
 
; 直前に作成された選択セットから線分を含む選択セットを作成。
(setq ss1 (ssget "P" '((0 . "LINE"))))
   
   
(setq ss1 (ssget "P" '((0 . "LINE"))))  ; 直前に作成された選択セットから線分を含む選択セットを作成。
; 画層"寸法"上にある、窓内のすべてのオブジェクトの選択セットを作成。
(setq ss1 (ssget "W" pt1 pt2 '((8 . "寸法"))) )
(setq ss1 (ssget "W" pt1 pt2 '((8 . "寸法"))) ) ; 画層"寸法"上にある、窓内のすべてのオブジェクトの選択セットを作成。
 
; データベース内の円オブジェクトの選択セットを作成。
(setq ss1 (ssget "X" '((0 . "CIRCLE"))))  ; データベース内の円オブジェクトの選択セットを作成。
(setq ss1 (ssget "X" '((0 . "CIRCLE"))))   
   
   
(ssget "I" '((0 . "LINE") (62 . 5))) ;  暗黙の選択セット(PICKFIRST が有効なときに選択されたオブジェクト)に含まれるすべての青(5番)の線分オブジェクトの選択セットを作成。
;  暗黙の選択セット(PICKFIRST が有効なときに選択されたオブジェクト)に含まれるすべての青(5番)の線分オブジェクトの選択セットを作成。
                                    ; 注意:このフィルタでは、ByLayer または ByBlock の色を持つ線分は選択されない。
; 注意:このフィルタでは、ByLayer または ByBlock の色を持つ線分は選択されない。
(ssget "I" '((0 . "LINE") (62 . 5)))  


(ssget "X" '((0 . "CIRCLE") (-4 . ">=") (40 . 2.0))) ; 半径(グループ コード 40)が 2.0 以上 のすべての円の選択セットを作成。
; 半径(グループ コード 40)が 2.0 以上 のすべての円の選択セットを作成。
(ssget "X" '((0 . "CIRCLE") (-4 . ">=") (40 . 2.0)))  


(ssget "X" '((0 . "CIRCLE") (-3 ("APPNAME")))) ; APPNAMEアプリケーションの拡張データを含む全ての円オブジェクトの選択セットを作成。
; APPNAMEアプリケーションの拡張データを含む全ての円オブジェクトの選択セットを作成。
(ssget "X" '((0 . "CIRCLE") (-3 ("APPNAME"))))


(ssget "X" '((0 . "CIRCLE") (-3 ("APP1")("APP2")))) ; APP1またはAPP2 アプリケーションの拡張データを含む全ての円オブジェクトを選択
; APP1またはAPP2 アプリケーションの拡張データを含む全ての円オブジェクトを選択
(ssget "X" '((0 . "CIRCLE") (-3 ("APP1")("APP2"))))
(ssget "X" '((0 . "CIRCLE") (-3 ("APP[12]"))))    ; 同、ワイルドカードを使用した例
(ssget "X" '((0 . "CIRCLE") (-3 ("APP[12]"))))    ; 同、ワイルドカードを使用した例
(ssget "X" '((0 . "CIRCLE") (-3 ("APP1,APP2"))))  ; 同、ワイルドカードを使用した例
(ssget "X" '((0 . "CIRCLE") (-3 ("APP1,APP2"))))  ; 同、ワイルドカードを使用した例


(ssget "X" '((2 . "`*U2"))) ; 匿名ブロック *U2 の選択セットを作成。ワイルドカードを使用した例
; 匿名ブロック *U2 の選択セットを作成。ワイルドカードを使用した例
(ssget "X" '((2 . "`*U2")))  


</pre>
</pre>

2010年10月10日 (日) 12:03時点における版

ssget 等で特定の条件を満たすオブジェクトのみ選択をする場合、フィルタ リストの引数を記述する。 例えば、特定の画層上のオブジェクトや、特定のタイプのオブジェクト、特定の色のオブジェクトオブジェクト、指定以上のサイズのオブジェクトというような選択セットを取得できる。

フィルタリストは、entget が返すリストと同じ形式の DXF グループ コードを使用した連想リストで、図形のどの特性(1 つまたは複数)を調べさせて、どの値と一致していなければならないかを指定する。(グループ コードのリストは、『DXF リファレンス』を参照)。


ssget 関数は、図形名(グループ -1)、ハンドル(グループ 5)、および拡張データ(Xdata)コード(1000 以上のグループ)以外のすべてのグループ コードを認識する。フィルタリスト引数に無効なグループ コードを指定した場合は、ssget により無視される。拡張データ(Xdata)を持つオブジェクトを検索するには、コード -3 を使用する。

以下は、ssget でのフィルタリストの使用例。

; ユーザにオブジェクト選択を要求し、文字オブジェクトだけを選択セットに追加。
(setq ss1 (ssget '((0 . "TEXT"))))

; ユーザにオブジェクト選択を要求し、文字とマルチテキストオブジェクトだけを選択セットに追加。
(setq ss1 (ssget '((0 . "TEXT,MTEXT"))))   

; 直前に作成された選択セットから線分を含む選択セットを作成。
(setq ss1 (ssget "P" '((0 . "LINE")))) 
 
; 画層"寸法"上にある、窓内のすべてのオブジェクトの選択セットを作成。
(setq ss1 (ssget "W" pt1 pt2 '((8 . "寸法"))) )  

; データベース内の円オブジェクトの選択セットを作成。
(setq ss1 (ssget "X" '((0 . "CIRCLE"))))  
 
;  暗黙の選択セット(PICKFIRST が有効なときに選択されたオブジェクト)に含まれるすべての青(5番)の線分オブジェクトの選択セットを作成。
; 注意:このフィルタでは、ByLayer または ByBlock の色を持つ線分は選択されない。
(ssget "I" '((0 . "LINE") (62 . 5))) 

; 半径(グループ コード 40)が 2.0 以上 のすべての円の選択セットを作成。
(ssget "X" '((0 . "CIRCLE") (-4 . ">=") (40 . 2.0))) 

; APPNAMEアプリケーションの拡張データを含む全ての円オブジェクトの選択セットを作成。
(ssget "X" '((0 . "CIRCLE") (-3 ("APPNAME"))))

; APP1またはAPP2 アプリケーションの拡張データを含む全ての円オブジェクトを選択
(ssget "X" '((0 . "CIRCLE") (-3 ("APP1")("APP2"))))
(ssget "X" '((0 . "CIRCLE") (-3 ("APP[12]"))))     ; 同、ワイルドカードを使用した例
(ssget "X" '((0 . "CIRCLE") (-3 ("APP1,APP2"))))   ; 同、ワイルドカードを使用した例

; 匿名ブロック *U2 の選択セットを作成。ワイルドカードを使用した例
(ssget "X" '((2 . "`*U2"))) 

選択セット操作の例

  • 現在の図面の最初と最後の図形を含む選択セットを作成する。
(setq fname (entnext))         ; 図面内の最初の図形を取得。
(setq lname (entlast))         ; 図面内の最後の図形を取得。
(if (not fname)
 (princ "¥n図面内に図形はありません。")")
 (progn
   (setq ourset (ssadd fname)) ; 最初の図形の選択セットを作成。
   (ssadd lname ourset)        ; 選択セットに最後の図形を追加。
 )
)
  • この例は、1 つの図形しかなくても正しく実行される(fname とlnameは同じ値になる)。既に選択セットに含まれている図形名を ssadd に渡しても、その要求は無視され、エラーにはならない。
  • 選択セットの最後の図形名を取得する
(setq sset (ssget)) ; 選択セットを作成するようユーザに要求。
(setq ent1 (ssname sset 0))  ; sset 内の最初の図形の名前を取得。
(setq ent4 (ssname sset 3))  ; sset 内の 4 番目の図形の名前を取得。
(if (not ent4)
 (princ "¥n最低 4 つの図形を選択しなければなりません。 ")")
)
(setq ilast (sslength sset)) ; sset 内の最後の図形のインデックスを取得し、sset 内の最後の図形の名前を取得する
(setq lastent (ssname sset (1- ilast)))
  • 選択セットへの図形追加で、選択セットに図形が重複して含まれることはない。同じ図形を複数回追加しても、2 回目以降の追加は無視される。したがって、sslength は、指定された選択セット内の図形の正確な数を返す。