QQ登录

只需一步,快速开始

扫一扫,访问微社区

犀牛建筑网

查看: 24835|回复: 4

GH计算器的脚本计算器讲解(一)

[复制链接]
发表于 2014-10-25 11:42:55 | 显示全部楼层 |阅读模式
犀牛网校
GH中脚本计算器一共有三个如下图:

说是脚本,但实际上并非我们理解的VBS,VBA这样的语言,而是完全面向对象的.net语言。

C Sharp, VB.net 以及IronPython。其中C#是最为流行的,VB.net简单易学,使用VB6的同学可以转到这上面来,Python是非官方发布的一个插件,是开源的代码挂在GitHub上链接如下:

https://github.com/mcneel/ghpython感兴趣的同学可以在这上面和作者交流交流。虽然说python这种语言运行速度比较快,经过很多测试(学习了前面的基础界面课程,我想你自己也能够进行测试了)其速度还是比一般的电池速度慢的,我想这可能跟python在gh中的调用机制有关,而且这个计算器还有很多其他的bug,还不太完善,所以建议初学的同学不要使用此计算器(虽然跟目前网络上的python热有悖)。

而实际上,这三种语言基本上都是依赖于.netFrame框架,源码可以相互转换的。下面两个连接是转换源码页面:

http://www.developerfusion.com/tools/convert/csharp-to-vb/

http://www.dotnetspider.com/convert/vb-to-csharp.aspx

所谓.netframe框架是微软开发一套类库,里面有各种类,方法,函数,你可以通过一些语言进行调用,VB和C#是官方支持的两种语言,但是其他支持的语言也不下于百种。目前最新的netframe框架是netframe4.5,用户最多的是netframe3.5,rhino-3d.com" target="_blank" class="relatedlink">犀牛5使用的是netframe4.0,当然最新的gh也是。这个其实一般用户没必要担心,因为安装犀牛5的时候,会自动给你装上的,或者提示你去下载安装的。

  啰啰嗦嗦一大堆,有些童鞋可能急了,不要急,如果你想用代码写东西,就必须先了解一些基础东西才可以,要不然就是半瓶子醋,也摸不着头绪。

C# VS VB.net

  这是一个很纠结的问题吗?客观来讲,C#用户量比较大,网上代码铺天盖地,但VB6用户量在国内要更多,转到VB.net上的潜在量更大。有人嘲笑VB.net是玩具,有人说微软之所以不放弃VB.net是因为盖茨喜欢Qbasic....更中肯的说法就是,都是语言,都是工具而已。

VB.net的同学不要因为别人怎么说就觉得拿不出门,实际上GH官方的很多电池都是使用VB.net写的。两种语言从编译到运行都一样,从语言自身来说各有千秋。所以就别拿这些说事了,功能实现了就好。本人使用VB.net所以说的可能有点偏激,请使用其他语言的朋友多多包涵,勿喷。我们讲脚本,主要讲VB.net以及python,请C#同学们多用上述网页转换一下--

很久以前,曾经GH有两个VB计算器,两个C#计算器。但是随着Rhino_DotNet.dll的没落,以及犀牛官方说在犀牛6中要完全移除Rhino_DotNet.dll,最终那两个调用Rhino_DotNet.dll的计算器被贴上了OLD,并退出了gh的Tab,隐居后台。所以现在我们看到的VB,C#计算器使用的是RhinoCommon.dll里面的类库,当然也可以用Rhino_DotNet.dll,后面讲gha开放会讲解如何用。


好了,我们开始说电池。

所谓脚本电池就是你可以在这里(双击电池打开代码编辑器)写代码,利用输入输出端完成你所要的功能。

一,点击上图中加减号,我们可以增加或移除输入,输出端。整个脚本计算器的运算实际上只是一个名为Script_Instance的类,此类继承自GH_ScriptInstance。这个类中有一个最重要的过程如下:

Private Sub RunScript(ByVal x As Object, ByVal y As Object, ByRef A As Object)

End Sub

此过程的参数即电池的参数,byval的都是传值参数均为输入端参数,byref是传址参数或者叫引用参数 均为输出端类型。传值与传址的区别自己可以查一下,任何一本编程的基础篇应该都有,这里体现的并不是很明显。当你动态的添加或者移除参数,里面代码也动态的跟着改变。参数的名字及类型,以及数量只能通过电池界面设定。

二,参数类型

可以说了,是类型支撑了gh魔术般的功能。我们用gh如果不去深入的去了解其中的数据类型也只能做门外汉了。电池的参数有各种类型(我们将在后面讲到),脚本电池的参数的类型更丰富可以自定义,如下图:

我们姑且叫箭头所指的图标为自定义类型。见到此种图标我们就应该能知道此种类型我们可以自己在右键菜单里面去定义,设定(FX,以及Expression计算器除外里面的类型为本电池所支持的类型)。


上图菜单的下面四个字菜单是设置类型的地方,貌似很多人用了很久脚本都不清楚自己在用什么类型,一切都默认为Object--:


第一个 Item为默认的意思此数据类型只是一个单一的数据

第二个List 意思将此数据设置为一个列表,每次运算传输到计算器内部的是一个列表。

第三个Tree,这个恐怕是gh的核心类型了,这个太强大了,不了解这个就你无法触及GH的真谛。它是一种分叉式的类型,不仅记录了存储了多个列表,而且记录了每个列表的形成路径,暂时就样说一下吧,后面会深入讲解。每次运算传输的计算器内部的是N个列表。

我们写脚本之前一定要弄清楚,自己传输到过程中的参量到底是单一数据,还是列表,还是树。列表和树属于.netFrame框架中泛型(如果不了解,可以去恶补一下)的范畴,只是树是由GH自己定义的一种强大的数据类型。

OK,第四个就是储存数据的类型了。如下图:


A,System.object所有类型之父,我们基本上什么类型都可以用object去替代,但是用object速度可能要慢很多,因为使用了Object属于一种后期绑定(可以恶补一下装箱与绑定)。如果我们知道自己使用的类型,我们尽量自己设置好,避免影响速度以及出错不必要的错误。

B,Boolean,Integer,Double,Complex,String,DateTime,Color,Guid

这些属于计算数据类型,这些类型也是gh自己创建的类型,和我们net编程语言中的同名类型还是有些区别的,不过区别不大,我们照常使用即可。举个列子,如Integer的数据范围跟我们net里面的就不一样,在这个GH版本中(0.9.0075)Integer参数计算器有个致命的bug


拖出Integer计算器,然后右键设置数据为1e10,你的犀牛将直接崩溃掉。此bug我已经向David 反映,下个版本中就不存在了。从这里我们就可以看出这里面的Integer的上限为2^32

由32位,4个字节存储。因为你输入1e9就没问题,1e9.5都没问题。因为2^32次方是一个9-10位的数字。有同学可能会问为啥,因为 log(2^32)=32*log2 =9.63295这就是这个数的位数。所以当32位里面都存入1的时候最大为这个9.63位多的数字。好了不扯了,继续。

注意里面的Complex为复数类型。Guid也和常用,类似句柄一样的东西,这个你如果不清楚要好好研究一下。

C,Poing3d,Vector3d,Plane,Interval,UVInterval,Rectangle3d,Box,Transform

这些属于几何类型数据的范畴,这些类型模式都是结构体,结构体与类的区别这地方又需要恶补。可以说这些都必须要掌握,尤其是Transform矩阵类型,GH中几何变换的核心。如果你对矩阵不了解就恶补一下大学的高数吧。最起码你要掌握移动矩阵,镜像矩阵,旋转矩阵,以及投影矩阵。这些后面再说。

D,Line,Circle,Arc,Polyline,Curve,Surface,Brep,Mesh,GeometryBase几何线,面,体类型

其中Curve是其他线类型的父类,GeometryBase是这里面所有类型(结构体除外)的基类。

OK,以Point3d为例,我们可以设置dimx as point3d或者dim x as List(of point3d)或者dim x asDataTree(of point3d)

C#为 Point3dx,List<Point3d>x, DataTree<Point3d> x


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

发表于 2014-10-27 22:01:01 | 显示全部楼层
楼主功德无量
回复 支持 反对

使用道具 举报

发表于 2014-10-28 00:43:34 | 显示全部楼层
很好很强大
回复 支持 反对

使用道具 举报

发表于 2014-10-28 04:00:00 | 显示全部楼层
你做的真好,向你学习
回复 支持 反对

使用道具 举报

发表于 2014-10-29 11:56:56 | 显示全部楼层
刚接触还真的看不懂
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关于我们|网站地图|BIM|rhino3d ( 沪ICP备19001822号-2 )

GMT+8, 2024-4-29 06:55 , Processed in 0.150536 second(s), 21 queries .