Rhino(犀牛)中国技术支持与推广中心

标题: GeometryCache电池教程 [打印本页]

作者: panhao1    时间: 2014-5-17 04:50
标题: GeometryCache电池教程
本帖最后由 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);

一张狗皮膏药贴上去 效果完全一样。


作者: Jessesn    时间: 2014-5-17 10:36
大早上就看到这种精品文章,顶一下呀!
作者: meteor_li    时间: 2014-6-6 07:58
顶一个。。。
作者: raythrone    时间: 2014-7-4 23:26
好高级啊




欢迎光临 Rhino(犀牛)中国技术支持与推广中心 (http://bbs.rhino3d.asia/) Powered by Discuz! X3.2