はじめに: ModelObjectのジオメトリ変更
GrasshopperのModel Objectコンポーネントのようなジオメトリ変更機能をC#で再現する際、`ModelObject.ToAttributes()`が返す属性の`Geometry`プロパティは`internal`設定のため、直接更新できません。
正しいコンストラクタと属性設定
解決策は、`ModelObject(RhinoDoc doc, Rhino.DocObjects.ObjectAttributes atts, GeometryBase geometry)`コンストラクタの利用です。Rhinoネイティブの`Rhino.DocObjects.ObjectAttributes`を渡す点が重要です(`ModelObject.ToAttributes()`は使用不可)。
属性の扱いは、元の`ModelObject`(`mo`)がRhinoドキュメント内に存在するかで異なります。`mo.Id`に値がある場合、`doc.Objects.FindId(mo.Id.Value).Attributes.Duplicate()`で既存属性を複製し、レイヤーや名前を引き継ぎます。`mo.Id`が`null`の場合は、`mo.Layer`等から必要な情報を手動でコピーします。その後、新しいジオメトリと共にコンストラクタに渡し、新しい`ModelObject`インスタンスを生成します。
GUIDとオブジェクト置き換えの限界
この方法で作成されるのは新しい`ModelObject`インスタンスであり、元のオブジェクトのジオメトリが更新されるのではなく、新規オブジェクトが生成されます。
GUID(`Id`)を維持したままジオメトリを置き換えたい場合、このC#メソッドでは直接対応できません。`Id`は手動でコピー不可です。Rhino 8のModel ObjectコンポーネントはGUIDを維持した置き換えをサポートしますが、RhinoCommonでの同様の挙動には、さらに高度なオブジェクト管理知識が必要です。
