概要 - 図形コンテキストと座標変換データ(AutoLISP)

nentsel 関数と nentselp 関数は、ブロック参照の中にネストされている図形のハンドルに関する 2 つの値を余分に返すこと以外は、entsel によく似ています。

この 2 つの関数と entsel とのもう 1 つの違いは、ユーザが複合化図形を選択することで nentsel の呼び出しに応答したり、nentselp で複合化図形を選択した場合は、entsel のように複合化図形のヘッダを返すのではなく、選択された従属図形の図形名を返すことです。

たとえば、ユーザが 3D ポリラインを選択すると、nentsel はポリライン ヘッダではなく頂点従属図形を返します。entnext を連続して呼び出すことによってシーケンス終了(Seqend)従属図形に進み、次にシーケンス終了従属図形の -2 DXF グループ コードからヘッダの名前を取得することにより、ポリライン ヘッダを取得することができます。同じことは、ネストされているブロック参照の中の属性をユーザが選択したときにも当てはまります。

ブロック参照の属性を選択すると、属性の名前とクリックした点が返されます。選択したオブジェクトが属性ではなくブロック参照の構成要素の場合、nentsel は次の要素を含むリストを返します。

次の表に、nentsel を使用して選択したブロックから返されたリストを示します。

(<Entity Name: ename1>   ; Name of entity.
  (Px Py Pz)             ; Pick point.
  ( (X0 Y0 Z0)           ; Model to World Transformation Matrix.
  (X1 Y1 Z1)
  (X2 Y2 Z2)
  (X3 Y3 Z3)
)
(<Entity name: ename2>   ; Name of most deeply nested block
  .                      ; containing selected object.
  ..
  <Entity name: enamen>) ; Name of outermost block
)                        ; containing selected object.

次の例では、まず nentsel 関数で使用するブロックを作成します。

コマンド: line

1 点目を指定:1,1

次の点を指定 または [元に戻す(U)]: 3,1

次の点を指定 または [元に戻す(U)]: 3,3

次の点を指定 または [閉じる(C)/元に戻す(U)]:1,3

次の点を指定 または [閉じる(C)/元に戻す(U)]: c

コマンド: -block

ブロック名を入力 または [一覧(?)]: square

挿入基点を指定または[異尺度対応(A)]: 2,2

オブジェクトを選択: 今描いた 4 本の線分を選択します

オブジェクトを選択: [Enter]を押します

次に、Z 軸を中心に 45 度回転した UCS にブロックを挿入します。

コマンド: ucs

現在の UCS 名: *ワールド*

UCS 原点を指定または[面(F)/名前の付いた UCS(NA)/オブジェクト(OB)/直前(P)/ビュー(V)/ワールド(W)/X/Y/Z/Z 軸(ZA)] <ワールド>: z

Z 軸の回りの回転角度を指定 <90>: 45

コマンド: -insert

ブロック名を入力 または [一覧(?)]: square

挿入点を指定または[基点(B)/尺度(S)/X/Y/Z/回転(R)]: 7,0

X 方向の尺度を入力するか対角コーナーを指定または [コーナー(C)/XYZ] <1>: [Enter]を押します

Y 方向の尺度を入力 <X 方向の尺度を使用>: [Enter]を押します

回転角度を指定 <0>: [Enter]を押します

nentsel を使用して、正方形の左下の辺を選択します。

(setq ndata (nentsel))

このコードにより、ndata に次のようなリストが代入されます。

(<Entity Name: 400000a0>   ; Entity name.
  (6.46616 -1.0606 0.0)    ; Pick point.
  ((0.707107 0.707107 0.0) ; Model to World
  (-0.707107 0.707107 0.0) ; Transformation Matrix.
  (0.0 -0.0 1.0)
  (4.94975 4.94975 0.0)
)
  (<Entity name:6000001c>) ; Name of block containing
                           ; selected object.
)

図形名とモデルからワールドへの変換マトリックスを取得すると、図形定義データ点を MCS から WCS に変換できます。MCS 座標で表される定義点を取得するには、図形名を使用して entgetassoc を使用します。nentsel が返すモデルからワールドへの変換マトリックスは、4 つの点の配列として渡される 4 x 3 のマトリックスで、点は列ではなく行であるという規約が使用されます。変換は、次の行列乗算で表されます。

したがって、新しい座標を計算する式は次のようになります。

Mij、(0 le; i, j le; 2) は、モデルからワールドへの変換マトリックス座標、XYZ は MCS 座標で表された図形の定義データ点です。X'、Y'、Z' は WCS 座標で表された図形の定義データ点の変換結果です。

点ではなくベクトルを変換する場合は、変換ベクトル(変換マトリックスの 4 列目からの M30 M31 M32)を含めないでください。

注: これは、このタイプのマトリックスを使用する AutoLISP 関数だけです。nentselp 関数は、他の AutoLISP、ObjectARX、Managed .NET 関数で使用されるのと同じ様なマトリックスを返すため、nentsel よりも nentselp を使用する方が便利だといえます。

次の例は、nentsel を使用して以前に取得した図形名を使用して、ブロックの定義に含まれている線分の MCS での始点(グループ コード 10)を取得する方法を示しています。

コマンド: (setq edata (assoc 10 (entget (car ndata))))

(10 -1.0 1.0 0.0)

次の文は、シンボル matrix にモデルからワールドへの変換マトリックスのサブリストを格納します。

コマンド: (setq matrix (caddr ndata))

((0.707107 0.707107 0.0)   ; X transformation
  (-0.707107 0.707107 0.0) ; Y transformation
  (0.0 -0.0 1.0)           ; Z transformation
  (4.94975 4.94975 0.0)    ; Displacement from WCS origin
)

次の文は、X' に変換式を適用して、線分の始点の X 座標を MCS 座標から WCS 座標に変更します。

(setq answer
  (+                                       ; add:
    (* (car (nth 0 matrix))(cadr edata))   ; M00 * X
    (* (car (nth 1 matrix))(caddr edata))  ; M10 * Y
    (* (car (nth 2 matrix))(cadddr edata)) ; M20 * Z
    (car (nth 3 matrix))                   ; M30
  )
)

この文は選択した線分の始点の WCS の X 座標、3.53553 を返します。