XformChangeBasisTransformObjectXformChangeBasis関数とTransformObject関数で、作業平面を置き換えることができます。
本記事のGrasshopperファイルのダウンロードはこちら

例としてScaleObject関数では、作業平面ではなく、座標をスケール変更の中心とするため、X軸、Y軸、Z軸方向にしかスケール変更ができません。
斜めの方向にスケールを変えたりしたい場合、通常の方法ではできません。
そのような場合に、作業平面を置き換えることで、上の画像のように、自由な方向にスケールを変えたりすることができるようになります。

使用コンポーネント 1: Python 3 Script 2: Brep 3: Plane
import rhinoscriptsyntax as rs
# RhinoをPythonから操作するためのライブラリを読み込む
corner_pts = [(0,0,0),(10,0,0),(10,10,0),(0,10,0),(0,0,10),(10,0,10),(10,10,10),(0,10,10)]
# 直方体を構成する8つの頂点座標を定義
box = rs.AddBox(corner_pts)
# 8つの頂点を使って直方体を作成する
box_copy = rs.CopyObject(box)
# 元のボックスをコピーする
origin = (0,0,0)
# 平面の基準となる原点を定義
xaxis = (1,0,1)
# 平面のX方向を表すベクトルを定義
yaxis = (0,1,0)
# 平面のY方向を表すベクトルを定義
plane = rs.PlaneFromFrame(origin, xaxis, yaxis)
# 原点とX・Y方向ベクトルを使って基準平面を作成する
to_world = rs.XformChangeBasis(rs.WorldXYPlane(), plane)
# WorldXY平面から、作成した平面への変換情報を作成する
rs.TransformObject(box_copy, to_world)
# コピーしたボックスを、作成した平面基準へ変換する
rs.ScaleObject(box_copy, origin, (2,1,1))
# 平面基準の状態で、X方向のみ2倍にスケールする
from_world = rs.XformChangeBasis(plane, rs.WorldXYPlane())
# 作成した平面から、WorldXY平面へ戻すための変換情報を作成する
scaled_box = rs.TransformObject(box_copy, from_world)
# スケール後のボックスを元の座標系へ戻す「Python 3 Script」には、上記のコードが記載されています。
順番に、コードの解説をしていきます。
corner_pts = [(0,0,0),(10,0,0),(10,10,0),(0,10,0),(0,0,10),(10,0,10),(10,10,10),(0,10,10)]corner_pts = […] では、ボックスを構成する8つの頂点座標を、リストで定義しています。
下側4点と上側4点を指定することで、ボックスの形状を決めています。
box = rs.AddBox(corner_pts)AddBox 関数で、定義した8つの頂点を使って、ボックスを作成します。
box_copy = rs.CopyObject(box)CopyObject 関数で、元のボックスをコピーしています。
今回は、元の形状を残したまま変形を行うため、コピーしたオブジェクトを使用しています。
origin = (0,0,0)origin = (0,0,0) では、基準となる原点座標を定義しています。
平面作成やスケールの基準点として使用します。
xaxis = (1,0,1)
yaxis = (0,1,0)xaxis = (1,0,1) は、平面のX方向を表すベクトル、yaxis = (0,1,0) は、平面のY方向を表すベクトルを定義しています。
(1,0,1) とZ方向にも値を持たせることで、傾いた方向を設定しています。
plane = rs.PlaneFromFrame(origin, xaxis, yaxis)PlaneFromFrame 関数で、原点とX・Y方向ベクトルを使って、基準となる作業平面を作成します。
今回の場合は、傾いた作業平面を作成することができます。
to_world = rs.XformChangeBasis(rs.WorldXYPlane(), plane)XformChangeBasis 関数で、現在のデフォルトのWorldXY平面から、作成した平面へ変換するための変換情報を作成しています。
第一引数には、現在の作業平面の情報、第二引数には、変換先の作業平面を指定します。
第一引数の rs.WorldXYPlane() 関数は、デフォルトのXY作業平面を作成しています。
rs.TransformObject(box_copy, to_world)TransformObject 関数で、コピーしたボックスに変換した作業平面を適用しています。
これにより、コピーしたボックスが、作成した平面基準の座標系へ移動・変換されます。
rs.ScaleObject(box_copy, origin, (2,1,1))ScaleObject 関数で、変換後の作業平面の座標系を基準に、ボックスのスケールを変換しています。
(2,1,1) は、X方向のみ2倍に拡大し、Y・Z方向はそのままにする設定です。
from_world = rs.XformChangeBasis(plane, rs.WorldXYPlane())もう一度 XformChangeBasis 関数を使い、作成した平面から、元のWorldXY平面へ戻すための変換情報を作成しています。
元に戻すため、1回目と第一引数と第二引数を入れ替えています。
scaled_box = rs.TransformObject(box_copy, from_world)もう一度 TransformObject 関数で、スケール後のボックスを、元の座標系へ戻しています。
これにより、傾いた平面を基準に変形した形状を配置できます。
「Python 3 Script」の右側の端子名を「box」に設定するとスケール変更前のボックスデータ、「plane」に設定すると変更後の作業平面のデータ、「scaled_box」に設定するとスケール変更後のボックスデータがGH上に出力されます。




Comment