幾何操作と座標系

図形共通の幾何操作

既存の図形を移動や回転したい場合に、AutoCAD のコマンドを command 系関数で使用する方法と、ActiveX の VLA-Object の図形要素共通メソッドを使用してオブジェクトを変更する方法が用意されています。図面データベース内の図形のプロパティを直接変更する方法もありますが、まずはこれらを使用することを検討します。

  AutoCAD コマンド(UCS) VLA-Object メソッド(WCS と UCS)
コピー ._COPY vla-Copy
移動 ._MOVE vla-Move
回転 ._ROTATE vla-Rotate
回転3D ._ROTATE3D vla-Rotate3D
拡大縮小 ._SCALE vla-ScaleEntity
ミラー ._MIRROR vla-Mirror
ミラー3D ._MIRROR3D vla-Mirror3D
座標変換   vla-TransformBy
矩形状配列複写 ._-ARRAY vla-ArrayRectangular
円形状配列複写 ._-ARRAY vla-ArrayPolar
他との交点検出   vla-IntersectWith
図形を囲む矩形   vla-GetBoundingBox

座標変換 vla-TransformBy 関数については、4 × 4 の行列で表される変換マトリックスを用いて、図形を移動・回転・スケールするものです。変換マトリックスを適切に指定することによって、これらの操作を一度に行うことができます。変換マトリックスの詳細については後述します。

すべての図形ではありませんが、次の操作を行えるものもあります。

  AutoCAD コマンド(UCS) VLA-Object メソッド(WCS と UCS)
オフセット ._OFFSET vla-Offset

これらの方法を使えば基本的な幾何操作を行えますが、きちんと使いこなすためには座標系というものを理解しなければなりません。この二つの方法で使われる座標系は、AutoCAD コマンドの場合は AutoCAD ユーザーがするのと同じように行うので座標の指定や動作は UCS に基づいたものです。VLA-Object メソッドの場合は、座標の指定は WCS で指定しますが、XYZ 軸の向きは UCS を前提とした動作が主のようです。詳細はヘルプを確認してください。UCS や WCS といった座標系を表す言葉が出てきました。詳細は後述するとして、具体的にこの差がどのようにプログラムに現れるか見てみます。

ROTATE コマンドを使用して、選択した図形を 90 度回転させるコマンド Rotate90 のひな形を作成してみた例は以下の通りです。

(defun c:Rotate90 (/ ss basePoint)
  (if (and (setq ss (ssget))            ;オブジェクトを選択
           (setq basePoint (getPoint "基点を指定:"))
      )
    (command "._ROTATE" ss "" basePoint 90.0)
  )
)

また、VLA-Object のメソッドを使用して同じことを行うコマンド X-Rotate90 のひな形は次のようになります。

(defun c:X-Rotate90 (/ ss basePoint index)
  (if (and (setq ss (ssget))            ;オブジェクトを選択
           (setq basePoint (getPoint "基点を指定:")) ;基点を指定
      )
    (progn (setq index 0)
           (repeat (sslength ss)
             (vla-Rotate
               (vlax-ename->VLA-object (ssname ss index))
               (vlax-3D-point (trans basePoint acUCS acWorld))
               (/ PI 2) ;_ 90 degree
             )
             (setq index (1+ index))
           )
    )
  )
)

VLA-Objectメソッドの場合は trans 関数を使用して、ユーザーが入力する UCS の座標を WCS の座標に変換して回転を実行しています。これを行わないと、AutoCAD ユーザーが UCS を自分の都合の良いように動かしていた場合には正しい結果となりません。プログラムを書いていく際には常に座標系を考えて慎重に組み上げなければ、あるときは上手く動いたり、あるときは誤動作をしたりといった現象に悩まされることになりますので、大変な注意が必要です。