AutoCAD 座標系間の変換
AutoLISP関数 |
---|
(trans pt from to [displacement]) |
pt:リスト from,to:整数、または【図形名】、リスト displacement: nil、または nil 以外 |
ある座標系から別の座標系に、座標を変換します。または、座標変換における変位ベクトルを返します。 |
戻り値:リスト |
trans 関数は、ある座標系から別の座標系へ座標の変換を行います。戻り値は三次元座標を表す XYZ 値を収めた三つの値からなるリストです。
pt 引数は、三次元座標、または二次元座標の XYZ 値をまとめたリストです。
From 引数 to 引数には、座標系を表す整数、図形を表す【図形名】、または【押し出し方向】を表す三次元のベクトルを指定します。
from,to引数 | 定義済みのシンボル | 説明 |
---|---|---|
0 | acWorld | ワールド座標系 (WCS) |
1 | acUCS | ユーザー座標系 (UCS) |
2 | acDisplayDCS | 現在の【ビューポート】のディスプレイ座標系 (DCS) |
【図形名】 | 図形の【押し出し方向】によるオブジェクト座標系 (OCS) | |
ベクトル | ベクトルを【押し出し方向】としたオブジェクト座標系 (OCS) |
【モデル空間】における座標変換を確認します。
次の例は、UCS 原点がWCSの (100.0 100.0 0.0) にあるとします。
_$ (trans '(0.0 0.0) acWorld acUCS) ⏎ ; WCS→UCS
(-100.0 -100.0 0.0)
_$ (trans '(100.0 100.0) acWorld acUCS) ⏎ ; WCS→UCS
(0.0 0.0 0.0)
_$ (trans '(0.0 0.0) acUCS acWorld) ⏎ ; UCS→WCS
(100.0 100.0 0.0)
_$ (trans '(-100.0 -100.0) acUCS acWorld) ⏎ ; UCS→WCS
(0.0 0.0 0.0)
次に【ペーパー空間】における from 引数 to 引数は、以下のとおりです。WCS が無くなる代わりに PSDCS が出てきます。
from,to引数 | 定義済みのシンボル | 説明 |
---|---|---|
2 | acDisplayDCS | 現在の【ビューポート】のディスプレイ座標系 (DCS) |
3 | acPaperSpaceDCS | ペーパー空間ディスプレイ座標系 (PSDCS) |
【図形名】 | 図形の【押し出し方向】によるオブジェクト座標系 (OCS) | |
ベクトル | ベクトルを【押し出し方向】としたオブジェクト座標系 (OCS) |
【ペーパー空間】の【浮動ビューポート】をとおして表示されている【モデル空間】の WCS または 【モデル空間】や【ペーパー空間】の UCS 座標を、PSDCS の座標系と相互に変換するには、一度 DCS を経由します。UCS は【モデル空間】と【ペーパー空間】とそれぞれ存在しますが、どのビューポートがアクティブかによって UCS の指すものが変わります。
displacement 引数に nil 以外を与えることによって、通常の座標の計算から変位ベクトルの計算モードになります。このモードはベクトルの向きとスケールだけ変換されます。この二つの具体的な違いの例として次のようなことがあげられます。
- 原点が(100.0 100.0)にある座標系へ座標変換するとして、座標 (100.0 100.0) を変換すると(0.0 0.0)となるが、変位ベクトルとして(100.0 100.0)を変換すると、(100.0 100.0)のままである。
- Z 軸で 90 度回転した座標系へ座標変換するとして、座標 (100.0 100.0) を変換すると(100.0 -100.0)となる。また変位ベクトルとして(100.0 100.0)としても(100.0 -100.0)となる。
プログラム内の座標系
AutoCAD の座標系の種類と、その相互の座標変換 trans 関数について見てきました。それでは、どの座標系を前提としてプログラムを書けばよいでしょうか。
簡単なプログラムではユーザーから座標を受け取り、それを使って AutoCAD のコマンドを使って描画します。その際、 getpoint などから得られる座標は UCS のものです。そして、描画の際にコマンドに渡す座標も UCS に基づいたものとなります。そのため、その途中の計算についても特に別の座標系に変換することなく UCS で一貫して扱うことが自然です。VLA-Objectのメソッドを使う場合も、その引数に渡すときに必要に応じて UCS から WCS に変換します。
少し考えてしまうのが、自分で図面データベースを操作するようになって WCS や OCS の座標が多く出てくるケースです。その際もユーザーからの入力は UCS のものですし、部分的に AutoCAD のコマンドを使う部分も出てきますので、UCS を基本としてプログラムは計算し、図面データベースに書き込む際にその図形に応じて WCS や OCS の座標に変換するのが良いと思います。図面データベースから読み取るときも WCS や OCS の座標を UCS に変換して使用します。
最後に、【ペーパー空間】で作業している際には WCS を PSDCS と読み替えて扱います。【ペーパー空間】の場合は図面データベースの座標は PSDCS か OCS という解釈となりますが、これはプログラミング上【モデル空間】の WCS と OCS と取り扱いは同じです。
三次元上の任意な位置に図形を描く方法
ワールドな XY 平面から離れて三次元上の任意の位置に図形を描くプログラムを作ろうとしている場合、 AutoCAD のコマンドを使用する場合は UCS をプログラムから都合のいい位置に設定してコマンドで図形を作成します。これは、AutoCAD ユーザーが三次元上に図形を描く場合に UCS を変更して作業するのとまったく同じです。
AutoCAD のコマンドを使っている間はよいのですが、図面データベースを直接触りだすと WCS や OCS といった座標系を扱わざるをおえません。もしかしたら UCS と WCS が一致していて、あるいは描く図形の OCS が一致していて問題が出ないかもしれません。しかし、それはたまたまです。UCS を動かすことを想定していないという制約は、AutoCAD ユーザーに守らせることはできません。
WCS や OCS を使って図面データベースを直接触る場合は、線形代数の座標変換の知識もやりくりして手練手管で図面データベースを変更する必要があります。次の章では線形代数の座標変換と、それを AutoCAD の図面データベースに反映する方法について述べていきます。