座標系と図面データベース

UCS における図形配置

高度と回転のそれぞれのタイプについて各パラメータの意味を、実例をもって見てきました。ある任意の座標系からの課題の見方で、その座標系を UCS と置いたものが最も頻出するパターンなので、繰り返しになりますが応用と確認のために手順を追ってみたいと思います。

今、UCS の設定が次のようになっていたとします。原点以外は頭の中では想像しにくい設定にしてありますが、実は UCS という AutoCAD の座標系であるためこれらに直接触れる必要はありません。

この UCS を基準として図形を描いていきます。以下本文の座標は UCS の座標です。

高度を使う例として、ライトウェイトポリラインの(0.0 0.0) と (100.0 50.0) を対角頂点とする長方形を描きます。

この UCS に図形を描いた場合の【押し出し方向】ベクトルは UCS の Z 軸の方向で前出の UCS-Normal 関数で得ることができます。

_$ (setq normal (UCS-Normal)) ⏎
(0.707107 -0.353553 0.612372)

UCS から OCS への座標変換はこの【押し出し方向】ベクトルを使って trans 関数で行うことができます。

_$ (mapcar (function (lambda (point) (trans point acUCS normal)))
'((0.0 0.0 0.0) (100.0 0.0 0.0) (100.0 50.0 0.0) (0.0 50.0 0.0))
) ⏎
((134.164 51.6708 96.5926) (232.869 67.7132 96.5926) (224.848 117.066 96.5926) (126.143 101.023 96.5926))

変換後の Z 座標が 96.59 となっているのが「高度」に設定する値になります。

まとめますと、次のように書けます。

(setq normal    (UCS-Normal)
      plist     (mapcar
                  (function (lambda (point) (trans point acUCS normal)))
                  '((0.0 0.0 0.0) (100.0 0.0 0.0) (100.0 50.0 0.0) (0.0 50.0 0.0))
                )
      elevation (3DVector:ref (car plist) 'Z)
)
(entmake
  (append
    '((0 . "LWPOLYLINE")
      (100 . "AcDbEntity")
      (100 . "AcDbPolyline")
      (90 . 4)                          ; 頂点数
     )
    (mapcar (function (lambda (point) (cons 10 (3DVector:~ref point 'Z))))
            plist
    )
    '((70 . 1))                         ; 閉じている
    (list (cons 38 elevation)           ; 高度
          (cons 210 normal)             ; 押し出し方向
    )
  )
)

次に、回転を使う例としてテキストを (100.0 50.0 0.0) の位置に UCS の X 軸から 30 度ほど行の向きを傾けて配置します。

UCS から得られた【押し出し方向】を使って、UCS 上のテキストの基準点を OCS 上に変換します。

_$ (trans '(100.0 50.0 0.0) acUCS normal) ⏎
(224.848 117.066 96.5926)

UCS の X 軸が OCS のそれとどれだけ回転しているか調べます。

_$ (angle '(0.0 0.0 0.0) (trans '(1.0 0.0 0.0) acUCS normal T)) ⏎
0.16112

これは次のようにも書けます。

_$ (angle '(0.0 0.0 0.0) (trans (getvar "UCSXDIR") acWorld normal T)) ⏎
0.16112

これに、今回の 30 度を加算してセットします。

まとめると次のように書けます。

(setq normal (UCS-Normal)
      rBase  (angle '(0.0 0.0 0.0) (trans '(1.0 0.0 0.0) acUCS normal T))
)
(entmake (append '((0 . "TEXT")
                   (100 . "AcDbEntity")
                   (100 . "AcDbText")
                   (1 . "This is new text")
                   (40 . 5.0)            ; 文字高さ
                  )
                 (list (cons 10 (trans '(100.0 50.0 0.0) acUCS normal))
                       (cons 50
                             (+ rBase
                                (/ PI 6) ; 30 度
                             )
                       )
                       (cons 210 normal) ; 押し出し方向
                 )
         )
)

以上のように、AutoCAD の座標系の範囲内では trans 関数が使え、パラメータの意味をしっかり理解していればそう複雑なことにはなりません。ここで使った幾何的な独自の関数は UCS-Normal 関数だけでした。そして、それを外れて座標変換を行おうとすると変換マトリックスを駆使することになります。