既に色んなAddonで提供されているBake Componentについて簡単に考え方を整理してみました。例えば、適当なLineをC# Component内で作ってボタンを押す事でbakeされるコンポーネントを想定します。
因みに個人的によく使うBakeコンポーネントはElefrontです。
private void RunScript(bool bake)
{
Line ln = new Line(new Point3d(0, 0, 0), new Point3d(77, 77, 77));
if(bake)
{
doc.Objects.AddLine(ln);
}
}
と、これでBakeが機能します。(今回はAttributeの設定などは除外して考えています。)docって何だろうと思ったのが最初の疑問でしたがそれは後述します。
次に、James Ramsden氏がC#によるBakeについて書いたBake and delete objects in Rhino with RhinoCommonの書き方を参考にすると、
private void RunScript(bool bake, ref object A)
{
Line ln = new Line(new Point3d(0, 0, 0), new Point3d(77, 77, 77));
Rhino.DocObjects.Tables.ObjectTable ot =
Rhino.RhinoDoc.ActiveDoc.Objects;
if(bake)
{
ot.AddLine(ln);
}
}
と、これでも同様に機能しますがやっている事が違うように見えます。
ではまずdocについて、公式フォーラムの投稿のリプライを参照すると、
var doc = RhinoDoc.ActiveDoc;
とありますが、要はdocはRhinoDoc.ActiveDocの事で、
C#Componentの場合は最初からGH Script_Instance class内で定義してくれているものだとの事。これを踏まえて先ほどの二つを見比べると、
doc.Objects.AddLine(ln);
は、
RhinoDoc.ActiveDoc.Objects.AddLine(ln);
を意味し、
ot.AddLine(ln);
のotは、Rhino.RhinoDoc.ActiveDoc.Objectsを代入したものですから、
RhinoDoc.ActiveDoc.Objects.AddLine(ln);
となり、実はObjectTableクラスのメソッドを利用して、同じことをやっているだけの話でした。ObjectTableクラスには様々なオブジェクトをベイクできるメソッドが用意されており、一般的なBake Componentは各種オブジェクト(Curve、Brep、Surface、Arc、Line等々・・・)の何が来てもベイクできるようにコードが記述されているはずです。
余談ですが、C#Component上ではdocのインテリセンス(予測変換)が利かないようなのですがRunScript内の文頭にでも
var doc = RhinoDoc.ActiveDoc;
と書いておけば(本来は必要ないですが)予測変換が利くようになります。
コメントをするにはログインしてください。