図形共通の幾何操作
既存の図形を移動や回転したい場合に、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 を自分の都合の良いように動かしていた場合には正しい結果となりません。プログラムを書いていく際には常に座標系を考えて慎重に組み上げなければ、あるときは上手く動いたり、あるときは誤動作をしたりといった現象に悩まされることになりますので、大変な注意が必要です。