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

押し出し方向と回転を使った図形配置

【押し出し方向】と回転を使った図形配置は、テキストやブロック参照図形といった、基準点と OCS の XY 平面上での回転で配置される図形で使われます。具体的には DXF グループコード 50 や VLA オブジェクトのプロパティ Rotation をもつものです。マルチテキストや寸法オブジェクトにも Rotation プロパティがありますが、まず他の基準によってテキストの角度が決まり、そこから追加の微調整の回転といった、見かけは同じようにふるまうけれども意味の異なるものもあるので注意が必要です。ここでは、OCS と連動する回転属性をもつ図形の配置を扱います。

図面データベース内で、テキストは DXF グループコードと VLA オブジェクトのプロパティでは次のように表されます。

DXF グループコード プロパティ 意味
10   基準点 (OCS)
  InsertionPoint
(又は TextAlignmentPoint)
基準点 (WCS)
50 Rotation 回転角度
210 Normal 【押し出し方向】ベクトル
autolisp rotation group

基準点を WCS の (10.0 10.0 10.0) とし、Y 軸を中心に30度回転させた平面に沿うように斜めに配置されたテキストを作成してみます。さらに、テキストの行の方向は WCS の Y 軸と平行とします。この課題を言い換えると、Y 軸を中心に30度回転し原点が WCS の (10.0 10.0 10.0) にある任意の座標系を基準に、行の向きは Y 軸にむいた回転を付けて原点にテキストを配置することになります。

この時、【押し出し方向】ベクトルは次のように求まります。

_$ (transformation-matrix:element (rotate-matrix:Y-axis (/ PI 6)) 'Z) ⏎
(0.5 0.0 0.866025)

DXF グループコードと entmake 関数を使う場合を考えていきます。

基準点は OCS で指定するので、その変換を trans 関数で行います。

(trans '(100.0 100.0 100.0) acWorld '(0.5 0.0 0.866025))

次に回転角度を考えますが、OCS は今テキストを配置したい座標系の方向と無関係の X 軸 Y 軸となっていますのでそれを調べて回転角度を割り出さなければなりません。具体的には今考えている座標系の X 軸と OCS 上の X 軸との角度を計算します。今考えている座標系の X 軸はベクトルとして次のようにして得られます。

(transformation-matrix:element (rotate-matrix:Y-axis (/ PI 6)) 'X)

このベクトルを OCS 上のものに座標変換して OCS の X 軸とのなす角を調べると、OCS からこちらが考えている座標系の回転角度となります。AutoLISP の angle 関数で X 軸からの角度を求めます。trans 関数の最後には T を指定して、変位ベクトルの変換を行っています。

(angle '(0.0 0.0 0.0)
        (trans (transformation-matrix:element (rotate-matrix:Y-axis (/ PI 6))
               acWorld
               '(0.5 0.0 0.866025)
               T
        )
)

ここで求められた回転角度をベースの回転角度として、今回は行の向きが WCS の Y 軸と平行ということで、90度を加算して設定します。まとめますと、次のように書けます。

(setq amatrix (rotate-matrix:Y-axis (/ PI 6))
      normal  (transformation-matrix:element amatrix 'Z)
      point   (trans '(10.0 10.0 10.0) acWorld normal)
      rBase   (angle '(0.0 0.0 0.0)
                     (trans (transformation-matrix:element amatrix 'X)
                            acWorld
                            normal
                            T
                     )
              )
)
(entmake (append '((0 . "TEXT")
                   (100 . "AcDbEntity")
                   (100 . "AcDbText")
                   (1 . "This is new text")
                   (40 . 5.0)            ; 文字高さ
                  )
                 (list (cons 10 point)
                       (cons 50
                             (+ rBase
                                (/ PI 2) ; 90 度
                             )
                       )
                       (cons 210 normal) ; 押し出し方向
                 )
         )
)

ActiveX 対応関数を使った場合も回転角度の考えは同じです。基準点は WCS となっているので、OCS に変換する手順は省きます。ただし、Text オブジェクトを作成した後に Normal を変更すると基準点が変わってしまうので、適当な位置に Text オブジェクトを作成し Normal を設定した後に基準点の設定を行います。

(setq amatrix  (rotate-matrix:Y-axis (/ PI 6))
      normal   (transformation-matrix:element amatrix 'Z)
      rBase    (angle '(0.0 0.0 0.0)
                      (trans (transformation-matrix:element amatrix 'X)
                             acWorld
                             normal
                             T
                      )
               )
      text-obj (vla-AddText
                 *ModelSpace*
                 "This is new text"
                 (vlax-3D-point '(0.0 0.0 0.0))
                 5.0                    ; 文字高さ
               )
)
(vla-put-Normal text-obj (vlax-3D-point normal))
(vla-put-InsertionPoint text-obj (vlax-3D-point '(10.0 10.0 10.0)))
(vla-put-Rotation
  text-obj
  (+ rBase
     (/ PI 2) ;_ 90 degree
  )
)