请选择 进入手机版 | 继续访问电脑版

[原创] GeometryCache电池教程

[复制链接]
47223 panhao1 发表于 2014-5-17 04:50:56 楼主
本帖最后由 Jorin 于 2014-5-21 11:52 编辑

因为失眠所以发个非技术向的帖子。长话短说了。
GC.jpg
在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);

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

评分

参与人数 2技术 +4 坛币 +8 收起 理由
Jessesn + 2 + 4 赞一个!
Jorin + 2 + 4 很给力!

查看全部评分

关于大陆地区Rhino原厂培训中心
Jessesn 发表于 2014-5-17 10:36:07
2
大早上就看到这种精品文章,顶一下呀!
meteor_li 发表于 2014-6-6 07:58:54
3
顶一个。。。
raythrone 发表于 2014-7-4 23:26:31
4
好高级啊
您需要登录后才可以回帖 登录 | 注册成为会员

本版积分规则