本帖最后由 Jorin 于 2014-5-21 11:52 编辑
因为失眠所以发个非技术向的帖子。长话短说了。
在param菜单里面,原版自带一个叫GeometryCache的电池。其实自定义gh类型官方早就有教程了。所以这个电池其实就是个封装好的类。public class GH_GeometryCache : GH_Param<IGH_GeometricGoo>, IGH_PreviewObject
相对与其他IGH_GeometricGoo这货多出以下这些
private void Menu_DeleteGeometry(object sender, EventArgs e);
private void Menu_MaintainReferences(object sender, EventArgs e);
private void Menu_NameItemKeyEvent(object sender, KeyEventArgs e);
private void Menu_NameItemTextChanged(object sender, EventArgs e);
private void Menu_ReadGeometry(object sender, EventArgs e);
private void Menu_WriteGeometry(object sender, EventArgs e);
这些显然都是委托,看名字就知道右键点击来运行内置的一些函数
(PS:public override bool AppendMenuItems(ToolStripDropDown menu)这个函数负责添加委托)
看到这里 用法其实也是显而易见
就是readGeometry() loadGeometry() 和writeGeometry()
这个自带private GH_Structure<IGH_GeometricGoo> m_loadedData; 显然是存数据用的
(PS:大部分param类是用base.m_value来存数据)
那么read和load肯定就是存数据了。
Write应该就是导出数据,至于怎么导出:
internal void WriteGeometryCache() {
。。。
RhinoDoc activeDoc = RhinoDoc.ActiveDoc;
。。。
data.BakeGeometry(activeDoc, att, out guid);
。。。
foreach (RhinoObject obj3 in list.Values) { if (obj3 != null) { activeDoc.Objects.Delete(obj3, true); } } activeDoc.EndUndoRecord(undoRecordSerialNumber);
}
看这个关键词大概就知道了吧,
1存储上一步bake的物体到list
2bake物体
3清除list
在RhinoCommon5.1之后版本的架构还是比较科学的。所以即使有doc操作这一过程也非常迅速。
在动态编译中使用WriteGeometryCache有2个简单方法,
方法1是继承这货。然后添加一个显式转换的construct函数并且复制一个public WriteGeometryCache()函数。输入之后先拆箱
然后直接调用修改好的函数。其实只有一行吧。。
缺点很明显 必须先编译一下。
方法2是利用C#的反射来做
Grasshopper.Kernel.Special.GH_GeometryCache cache = Component.Params.Input[0].Sources[0] as Grasshopper.Kernel.Special.GH_GeometryCache;Print(Component.Name.ToString());if (cache == null){Print("null input"); return;}
首先也是拆箱
BindingFlags bindingFlags = BindingFlags.Instance | BindingFlags.NonPublic;
MethodInfo minfo = typeof(Grasshopper.Kernel.Special.GH_GeometryCache).GetMethod("WriteGeometryCache", bindingFlags);
minfo.Invoke(cache, null);
一张狗皮膏药贴上去 效果完全一样。
|