NCF参数化建筑论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 9427|回复: 5
打印 上一主题 下一主题

[VB & C#] 运算器教程GeometryCache

[复制链接]
跳转到指定楼层
1m
发表于 2014-5-17 05:01:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
因为失眠所以发个非技术向的帖子。长话短说了。

在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);

一张狗皮膏药贴上去 效果完全一样。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享分享
2m
发表于 2014-5-17 09:47:33 | 只看该作者
抢到潘神的沙发,表示看不懂啊
3m
发表于 2014-5-17 10:46:15 | 只看该作者
浩哥的文章总是这么深奥。。。
头像被屏蔽
4m
发表于 2014-5-17 13:04:09 | 只看该作者
提示: 该帖被管理员或版主屏蔽
5m
发表于 2014-5-17 22:27:04 | 只看该作者
看不懂,但是顶一个!
6m
发表于 2014-5-21 11:50:32 | 只看该作者
不明觉厉。。。。

小黑屋|手机版|NCF参数化建筑论坛 ( 浙ICP备2020044100号-2 )    辽公网安备21021102000973号

GMT+8, 2024-4-25 12:13 , Processed in 0.162123 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表