概要 - 図形情報を取得する(AutoLISP)

entget 関数は、指定された図形の定義データをリストとして返します。

リスト内の各項目は、DXF グループ コードによって示されます。リスト内の最初の項目には、図形の現在の名前が格納されます。

この例では、次の条件(既定)を現在の図面に適用しているとします。

ユーザは、次のコマンド手順で線分を描いたとします。

コマンド: line

1 点目を指定: 1,2

次の点を指定: 6,6

次の点を指定: [Enter]を押します

AutoLISP アプリケーションは、次のサンプル コードを使用して、上記の線分に対する定義データを取得して出力することができます。

(defun C:PRINTDXF ( )
  (setq ent (entlast))               ; Set ent to last entity.
  (setq entl (entget ent))           ; Set entl to association list of last entity.
  (setq ct 0)                        ; Set ct (a counter) to 0.
  (textpage)                         ; Switch to the text screen.
  (princ "\nentget of last entity:")
  (repeat (length entl)              ; Repeat for number of members in list:
    (print (nth ct entl))            ; Output a newline, then each list member.
    (setq ct (1+ ct))                ; Increments the counter by one.
  )
 (princ)                             ; Exit quietly.
)

出力結果は次のようになります。

entget of last entity:
(-1 . <Entity name: 1bbd1c8>)
(0 . "LINE")
(330 . <Entity name: 1bbd0c8>)
(5 . "69")
(100 . "AcDbEntity")
(67 . 0)
(410 . "Model")
(8 . "0")
(100 . "AcDbLine")
(10 1.0 2.0 0.0)
(11 6.0 6.0 0.0)
(210 0.0 0.0 1.0)

リストの最初の項目 -1 には、図形名が格納されています。このセクションで説明する entmod 関数は、変更する図形を特定するためにその名前を使用します。値を表すそれぞれのドット ペアは、assoc 関数と cdr 関数を使用して抽出できます。

点のサブリストは、返された他の値のようにドット ペアとしては表されません。このサブリストの cdr はグループ コードの値であるという規則があります。点は 2 つ(または 3 つ)の実数のリストであるため、グループ全体の要素の数は 3 つ(または 4 つ)になります。このグループ コード値の cdr は、点を表すリストです。したがって、cdr は常に座標値を返すことになります。

図形の構成要素のグループ コードは、DXF で使用されるコードです。DXF と同様、図形ヘッダ項目(色、線種、厚さ、属性フラグ、図形ハンドル)は、それらが既定以外の値を持つ場合にのみ返されます。DXF と異なり、省略可能な図形定義フィールドは既定に等しいかどうかに関係なく返されます。また、関連する XYZ 座標に関係なく別個の X(10)、Y(20)、Z(30)グループ コードとしてではなく、1 つの点変数として返されます。

オブジェクトに関連する点は、すべてそのオブジェクトのオブジェクト座標系(OCS)で表されます。その内、点、線分、3D 線分、3D 面、3D ポリライン、3D メッシュ、寸法オブジェクトでは、OCS は WCS と等しくなります(オブジェクトの点がワールド座標系の点となります)。その他のすべてのオブジェクトでは、OCS は WCS とオブジェクトの押し出し方向(グループ コード 210)から派生されます。WCS 以外の座標系で描かれるオブジェクトを操作する際には、trans 関数を使用して、点を WCS や現在の UCS に変換しなければならない場合もあります。

図形リストを処理する関数を書くときは、関数ロジックが必ずサブリストの順序の影響を受けないように書いてください。そのためには、assoc を使用します。assoc 関数は、リストを検索して、指定されたタイプのグループ コードを探します。次のコードは、リスト entl から、"LINE" などのオブジェクト タイプ(0)を返します。

(cdr (assoc 0 entl))

指定されたグループ コードがリストにない場合(または有効なグループ コードでない場合)、assocnil を返します。

注意: 頂点図形に対して entget を使用する場合は、あらかじめポリライン図形のヘッダの読み込みか書き出しを行わなければなりません。直前に処理されたポリライン図形と、頂点が属するポリライン図形とが異なっていると、幅情報(グループ コード 40 と 41)が失われる可能性があります。