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

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

OCS と配置したい図形との間を埋める計算をする前に、【押し出し方向】と座標だけで配置できる比較的簡単な図形として点と円があります。点は大事なことは座標だけで軸の方向は関係ありませんが、画面表示上は【押し出し方向】を反映したものとなります。円は Z 軸を表す XY 平面の法線以外の X 軸 Y 軸の向きは関係なく配置できます。

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

DXF グループコード プロパティ 意味
10 Coodinates 座標(WCS)
210 Normal 【押し出し方向】ベクトル

次は WCS 座標 (100.0 100.0 100.0) で【押し出し方向】ベクトル (0.0 1.0 0.5) の点を作成する例です。DXF グループコードと entmake 関数を使う場合は次のように書けます。

(entmake '((0 . "POINT") (10 100.0 100.0 100.0) (210 0.0 1.0 0.5)))

ActiveX 対応関数を使う場合は次のように書けます。*ModelSpace* には【モデル空間】のブロックオブジェクトが代入されているものとします。

(setq point-obj (vla-addPoint
                  *ModelSpace*
                  (vlax-3D-point '(100.0 100.0 100.0))
                )
)
(vla-put-Normal point-obj (vlax-3D-point '(0.0 1.0 0.5)))

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

DXF グループコード プロパティ 意味
10   中心点(OCS)
  Center 中心点(WCS)
40 Radius 半径
210 Normal 【押し出し方向】ベクトル

次は WCS 座標 (100.0 100.0 100.0) を中心点とし半径 50.0 、【押し出し方向】ベクトル (0.0 1.0 0.5) の円を作成する例です。

DXF グループコードと entmake 関数を使う場合は次のように書けます。点の場合とは異なり、今回は中心の座標を OCS で指定する必要があります。そのため WCS の座標を【押し出し方向】で表す OCS 上の座標へ変換してやる必要があります。変換は trans 関数を用います。

(entmake
  (list '(0 . "CIRCLE")
        (cons 10 (trans '(100.0 100.0 100.0) acWorld '(0.0 1.0 0.5)))
        '(40 . 50.0)
        '(210 0.0 1.0 0.5)
  )
)

この時、【押し出し方向】によって変換され中心点にセットされる値は、以下の通りあらかじめ予測しにくいものです。そのため、数値だけを見て正しいかどうかを人間が確認するのは困難です。

_$ (trans '(100.0 100.0 100.0) acWorld '(0.0 1.0 0.5)) ⏎
(-100.0 44.7214 134.164)

ActiveX 対応関数を使う場合は次のように書けます。*ModelSpace* には【モデル空間】のブロックオブジェクトが代入されているものとします。中心点の座標は WCS で指定するため座標変換の必要性はありません。

(setq circle-obj
       (vla-addCircle
         *ModelSpace*
         (vlax-3D-point '(100.0 100.0 100.0))
         50.0
       )
)
(vla-put-Normal circle-obj (vlax-3D-point '(0.0 1.0 0.5)))