13.最恐怖运算器!|详谈脚本编程类运算器

各位朋友大家好,欢迎来到由DanielJin在拓筑学院开设的Grasshopper小讲堂。感谢你们购买我原创的课程,对我进行肯定和支持。这笔课程收入将会有50%用于E拓建筑网的维护和发展,50%用于我个人学习所用。
请所有初级课程学员加入QQ讨论群83296128,我将在群内提供初级教程范围内的答疑。当我发现具有代表性的问题时,我会通知大家进行公开课视频直播,让大家从我分享桌面实际演示中更高效地进行学习。

今天我们要来讲一讲Grasshopper中的数学部分剩余的运算器。首先我们先来看一下Math面板里我们常用的电池都有哪些。

图片2

这一部分电池我想基本上就不用赘述了,大家看运算器的符号就可以知道他们的内容了。要提的一个小小的运算器是累加(乘)运算器。它的Pr输出端可以输出非常常用的分级求和,累乘运算器也类似。

图片3

Relative Difference是指每一项和上一项的差值。注意该运算器不只能输入数字,还可以输入点和向量啊朋友们!这是什么概念呢?如果我们有某地100年来的高程点数据一万个,我们把这一百组每组一万个的点(树形数据的知识,还记得吗?)用这个命令就可以做出一个十年来的地貌变化图。这些在设计中就是你的分析,完全秒杀别人各种low到家的分析。关于高程点的知识,我在群内当做福利讲解过了(所以说越早开始学习越好嘛~哈哈)。这部分内容属于提高篇,大家不必着急,稳扎稳打将基础打好,将来很多现在看似很复杂的插件电池就很容易学会。

图片4

接下来介绍三个神奇的电池。这三个电池是脚本运算器,哥儿仨分别是VB,C#和Python。它们是用来做编程脚本的电池。其中Python为插件需要安装,非原厂电池。大家的Grasshopper中是没有的,所以打开今天的案例gh文件可能会报错。

图片5

这里要插播一句,Grasshopper建模最怕什么大家知道吗?最怕的是无逻辑(随机也算一种逻辑)。大家可以仔细回想一下,我们之前所讲的整个建模过程,第一步便是脑中进行逻辑步骤分析。如果是一个没有逻辑的模型,或者换句话说是一个“动态逻辑”的建模过程,是十分难用Grasshopper建模的。打个比方,我们可以设置“如果x大于五则输出Daniel,其余情况输出Jin”,但是如果“操作手法”部分被改成了:“如果x大于五则输出A,如果A大于B则输出C,否则输出D,如果C……如果D……”大家可以看到这种逻辑处理问题中,每一个结果有两种可能生成新结果(大于/小于,两种结果),这样的程序用计算机脚本很简单,但是如果用Grasshopper的运算器将会非常复杂,几步下来就会有很大很复杂的电池程序了。这时候就是脚本运算器三兄弟的天下了。大家可以看一下用Python所做的原型建筑:

图片6

该方案由Wang Shuliang, Duan Tingwei及队友设计,运用的是GhPython。

图片7

该方案为08-09届宾大的Chen Qi前辈的毕业设计。由于版权问题请允许我加上前辈对该设计的介绍:This project tries to explore the relationship between public space and private space by employing the cellular automata (CA) system and Isosurf technique. Representing the tower as a series of points or nodes that change their status according to the environment, I randomly input the public spaces and private spaces. These points will look around and survey the neighboring points to see whether the local environment is lacking either in public or private nodes. Each point then determines and identifies itself as either public or private. Its status will alter the balance from the point of view of other nearby points, and provoke some of them to alter their status. Ultimately the chain reaction returns back to the original point, which reinvents itself again and again. The overall system thus creates a richly dynamic space.

接下来我们讲两个跟表达式有关的运算器。其中第一个是非常好理解的,我们在之前讲拉棒的时候讲过的函数编辑运算器Evaluate。我们只需要在F端右键用Expression Editor编辑好表达式,或直接输入一个表达式,即可根据自变量x,y和函数表达式得到输出值。在放大窗口的情况下我们还可以增加输入端,改变变量的数量。

图片8

图片9

这是函数编辑器的界面,我们之前已经简单进行过讲解。今天我们再讲深入一点,事实上有些函数并没有在上方的函数选项中给出。这时候我们点击红框内的按钮,会出现一个完整的Grasshopper支持的函数表格。其中标注了支持的函数名称,输入格式等详细信息。如图:

图片10

怎么样,是不是非常的齐全?

接下来介绍的是整个Grasshopper中非常重要,非常实用的Expression运算器。大家如果想要做一些复杂的逻辑判定,用“大于小于加Dispatch”的串联套路往往会很复杂且力不从心。对于多层的筛选判断,该套路的结果总是不尽如人意。如果用VB等脚本,相信很多人和我一样是个代码白痴。这时候我们就可以用这个运算器做逻辑判断。

图片11

这是这个运算器的默认样子,放大后依然可以增加输入端。它和Evaluate运算器的区别在哪里呢?请往下看。
这个运算器允许我们进行非常复杂的逻辑判定。首先我来解释一下中间这一行Format(“{0},{1}”,x,y)的意思。这句话的意思是该运算器内部的输入语法格式为(“{0},{1}”,x,y),其代表的意思是:我们给输入端x,y输入数值A,B后,会输出“(A,B)”。其中0,1代表第几个输入端(第一个为0,第二个为1,从0开始编号)输入的数字。

图片12

如果大家双击中间的表达式,打开编辑面板,改为0,0那么会输出两个X输入端(第一个输入端)的值。

图片13

如果大家增加到4个输入端,然后输入2,2,1,3则会分别按照2,2,1,3的顺序输出结果。当然,由于我们设置输入端编号的时候输入了3,也就是说有四个输入端,我们在后边必须把x,y增加到x,y,z,u。如果我们后边不改,电脑会报错,因为它认为只读取x,y两个输入端,可是我们却要求它输出四个输入端的数据,电脑会找不到后两个在哪。

图片14

OK,基础用法介绍到此。但是作为“一向很负责任”且“一向善于类比和通俗演义”的小黄人君,接下来讲一些高级用法。前方高能,小心蒙圈。
该运算器在《Grasshopper完全自学手册》中采用的最终中文翻译是C# Script,VB Script即C#和VB脚本运算器。我前边也提到过这个运算器允许我们进行非常复杂的逻辑判定,事实上该运算器可以帮助我们绕开编程语言特殊的语法结构(虚词),只输入有实在内容的部分(实词)。该部分包括但不限于:(1)逻辑判断模式,如If;(2)自变量,如输入端x,y,z;(3)判断临界值,如5,(4)输出值。.这四个连起来就是VB中的逻辑判断:如果(If)x大于5,则输出x;反之(小于等于)5则输出5.那么这个程序的几种做法如下,大家请自行对比:
Maximum方法:

图片15

VB Script方法(红框内为我们输入部分)(惊呆了!两年前我竟然还记得VB怎么写!)双击VB即可看到脚本编辑页面。点击空白位置脚本编辑窗口,会最小化成为一个小窗口出现在旁边的位置。

图片16

图片17

Expression运算器方法:图片18

(Python我当时写这篇教程的时候还不会,哈哈,所以就不补图了)

 

大家可以发现,我们在输入的时候仅需要输入结构词汇“If”告诉Grasshopper这时要判断True or False的语句,输入条件x>y,输入需要输出的结果即可。和VB相比,我们省略掉了定义输出端“A”的部分(ByRef A As Object),省略掉了Else,省略掉了 End If这样的仅仅为VB语法服务的结构词。
扩展知识:如果我们给xy加上引号,那么结果将不会输出数字,而是直接输出x或y,原因是一旦加上引号计算机自动认为x和y不再是变量,而是“字符”x和y。

图片19

继续扩展。细心地朋友可能会发现我这里的Panel输入5变成了拉棒输入。为什么我要换一种输入形式呢?我们试试Panel输入会发生什么。

图片20

错误信息:

图片26

简单解释来说,大于号运算器对于Double和String无法进行运算。这里说明了输入的是文本,而该运算器对“字符”不能转化。错误原因中的Double指双精度型数据,String指字符串。即使我们取消了Mutiline Data,依然会爆红。这就是之前我说的为何用Panel输入命令是一个不好的习惯。一旦无法智能转化就会报错。现在再仔细回味上次我给的案例,有更深的理解了吗?注意线的不同。

图片21

各位看官,可能上边的案例你还没有看蒙。仅仅是一个判断最大值的案例,也许并不能体现出这个运算器的优势,因为判断逻辑是“一层”的逻辑。为了让你们明白它的优势,我们设置层层叠叠的判断条件。为了你们能尽量少蒙圈一些,我们先来理一理If结构中各部分的作用:

图片22

然后我们把它变复杂化:

图片23

你们信不信我可以无耻的把这个判定一层一层无限加下去?
第一行大家都看得懂,是基本形式。第二行就有逻辑嵌套的部分了。我们以第二行的语句做示范,下边的大家即可自行分析。

图片24

大家可以看到,整个逻辑部分分为了两个层级,红框内一层,紫色框内一层。但是究竟计算机判断是先判定紫色条件呢,还是红色条件呢?根据我们的数学知识应该是先算小括号内的,再算中括号最后是大括号,也就是说红框优先。但是根据我的感觉,Grasshopper应该是先判断最外层的条件。原因有二:(1)如果是False将会直接输出y,而不需要再进行True部分的嵌套逻辑的判断,这样比较节省计算机资源。(2)如果比较复杂,比如出现了上边的有两个或以上的二级(红色方框)逻辑包含在一级逻辑(紫色方框)内,那么运算顺序又要进行定义,比如从左往右。不然同样地位的几个二级逻辑先运算谁呢?但是我目前还没有很好的能够判断出先判定红框和紫框的案例,我想了一个晚上创作的案例都不能说明父子级关系的。不过下边这个案例可能比上边这个更容易表示这个运算器在处理多层逻辑时候的情况,大家也许思路会清晰一些。

图片25

在这个程序中,Grasshopper判断”x>y”为True,所以输出红框内部分。但是红框内部分并不是一个数字或者带引号的字符,而是一个逻辑判断,那么计算机再次进行红框内部分的逻辑判断。很显然,x+3>y为True,所以输出了Daniel;而x-100>y为False,所以输出了Jin。

通过今天的讲解,大家应该很快理解了这个王牌运算器Expression的使用方法。它的用途有很多,比如我们可以利用逻辑判定来控制建筑形体,根据红线距离来判定建筑外轮廓,根据……只要你想得到,并且写得出,Grasshopper就算得出。事实上,Expression支持很多种合法表达式(和Evaluate查看方法一样),用来作为条件进行选择或者逻辑判断有时候比脚本简单的多。

今天的内容就讲解到这里啦,快凌晨四点了,你们的小黄人君要休息啦。还在晕头转向的朋友们再多看几遍今天的内容吧!
爱你们的小黄人君
DanielJIn

 

Script

 

———————————————————————————————————————————————————————

本文所有内容版权均属于作者所有

欢迎您扫描下方二维码关注小黄人君的微信公众账号

二维码新

发表评论

邮箱地址不会被公开。 必填项已用*标注