作为一个用了15年Grasshopper的老手且编著过《Grasshopper参数化设计教程》的人,我对【创建变量】这个事非常陌生。因为在gh中【创建变量】是自动完成的,它本身不在我们常用的参数化设计建模思维当中。但是【创建变量】在编程领域又是基础中的基础。它代表了我们要为执行的数据定义它的名字、类型、内容等等属性。它是一个更繁琐的过程,也是一个更精细的过程。
从gh到E3,我个人起初最不适应的也是【创建变量】,但一方面诺亚的开发工作已经深入到我们需要经常作类似的工作,另一方也是体会到了,如果开发人员自身不去深入思考设计这些【变量】,本质上会对所写的程序形式产生巨大的限制,不够自由,不够灵活,不够开放。
所以E3作为一个科研定位的研发工具平台,我们团队认为要把这个定义变量的功能放开给大家,而非用便捷式的操作将其封装。当然,这会让一些参数化设计师一开始觉得很不适应,但为了更高更远,这点成长相信是值得的。
(写的这里的时候,我用豆包桌面版帮我框选朗读了一下上面的文字,感觉真的很方便,这不是广告,这是感慨现在的AI产品如此之好,打字出来就能听到语音。)
/
/
/
好,我们正式开始:
首先同步一个概念没什么是【变量】,这点其实KavinD的《E3使用入门》里写的很系统,建议大家花时间学习了解下。我在这里也为大家复盘一种粗浅的理解方式:
我们来通俗地解释一下变量的概念。你可以把编程中的变量想象成生活里的收纳盒。
1. 变量是什么
在编程里,变量就如同生活中一个个带有特定用途的收纳盒。比如你有一个用来装袜子的收纳盒,这个收纳盒在编程里就相当于变量。它是一个容器,专门用来存放东西的。
2. 变量名
每个收纳盒都会有个名字,方便我们识别它装的是什么。比如你在收纳盒上贴个标签 “袜子盒”,这个 “袜子盒” 就相当于编程里变量的名字。在程序里,当我们需要用到某个变量里存放的东西时,就通过这个名字来找到它。
3. 数据类型
每个收纳盒都有它能装的东西的类型。比如 “袜子盒”,它就只能装袜子,不能用来装书本。在编程里,这就是数据类型的概念。数据类型规定了变量能存放什么样的数据。常见的数据类型有以下几种:
- 整数类型:就像一个专门装整数的收纳盒,只能放像 1、2、3 这样的整数,不能放小数或者其他类型的东西。
- 字符串类型:可以想象成一个装文字的收纳盒,里面能放 “你好”“世界” 这样的文字内容。
- 列表类型:类似于一个大的收纳箱,可以装很多个东西,而且这些东西可以是不同类型的。比如你可以在一个列表里同时放整数、字符串等。例如,[1, “苹果”, 3.14] 就是一个列表。
- 字典类型:它就像是一个有很多小格子的收纳柜,每个小格子都有一个独特的编号(键),通过这个编号就能找到放在里面的东西(值)。比如 {“姓名”: “张三”, “年龄”: 20},“姓名” 和 “年龄” 就是键,“张三” 和 20 就是对应的值。
4. 数据值
收纳盒里实际放的东西就是数据值。比如在 “袜子盒” 里放了一双蓝色的袜子,这双蓝色的袜子就是对应变量里的数据值。在编程里,如果有一个变量叫 “num”,它的数据类型是整数,当我们给它赋值为 5 时,5 就是这个变量的数据值。
5. 键(在字典类型中)
回到刚才说的有很多小格子的收纳柜(字典类型),每个小格子的编号就是键。通过这个编号(键),我们就能快速找到放在里面的东西(值)。比如在 {“城市”: “北京”, “温度”: 25} 这个字典里,“城市” 和 “温度” 就是键,“北京” 和 25 就是对应的值。
总结一下,变量是编程里用来存放数据的容器,变量名是我们识别它的标识,数据类型规定了它能存放的数据种类,数据值是实际存放在里面的内容,而键是在字典类型中用来索引值的标识。
/
/
/
如果大家不善于理解文字,没关系接下来,我会用一个小案例带着大家理解体会这个概念。大家可以操作一下之后,在回头体会我说的这个概念。
让我们打开一个新项目,进入到main.ncf主程序的编辑器中,双击面板选择命令菜单中的Create,这里我们看到三种创建数据类型的功能模块,分别对应了创建字典(单个或多个有名称的数据)、创建项目(单个数据)、创建列表(多个数据)。在这里让我们先选在一下数字字典CreateDict。
此时调出了一个新的功能模块,让我们先来认识一下它。
“VarA”是变量名称,这里可以双击自定义修改。数据类型这里可以看到E3覆盖的数据类型还是很多的,我们只需要选择自己常用的就可以,其中any代表了任何数据类型。
点击【+】可以创建一个“键值对”(可以理解为一种有自己对应名称的数据)“D1、D2”是数据名,前面对应的输入端给给予赋予对应的值。
双击input里面找到Float(小数)这个功能模块。
输入数值,链接数据连线,中间数据类型的转换是自动生成的。(此时注意如果我们需要移动这个input模块,需要让鼠标停留在模块边框处的位置进行抓取,有些特殊模块面板出是可以鼠标操作的,容易造成鼠标动作上的干扰。)这样一个变量以及它包含的数值内容就被创建好了。
让我们给后面加一个print看一下它的运行结果,这里出现了一个变量,它的数据内容是{D1:3;D2:5;}代表了这个变量的内容是一个字典包含两个键值对,键分别是D1、D2,值分别是3、5。
此时,这个变量已经存在整个程序的数据库中,在任意位置当我们需要调用这个变量时,我们只需要通过变量的名称就可以调用它了。操作一下,双击面板,直接键入get,调出Get变量A,意思是调用变量A的数据。
这里,我们讲要打印的信息改成Get变量A提供的数据,然后运行。我们方向结果和刚才是一样的。所以这里要建立一个对数据链接的新理解,在gh中,数据只有通过流线的形式才能传递,而在大部分程序中,数据是通过给他命名,并通过名字对其进行调用的形式传递的。它就像是一个全局的变量,你何时需要它就直接喊它的名字就可以。这也是为什么我们要了解【变量】,要给变量命名的原因。
到这里,前面我们已经尝试了【创建变量】和【获取变量】,接下来我们看看如何【修改变量】
双击面板,输入set,调取Set变量A。
我们看到Set变量模块的输入端让我们输入一个数据字典,我们可以用老方法创新创建一个数据字典来替换变量A的内容,这种方式可以讲变量A的内容整个替换掉。
当然我们也可以局部对变量A的内容进行修改,需要换另一种模块,调出Dict下的Set,这个模块可以只对数据字典的内容进行修改。
这里我们输入要修改的数据名称是D1,把D1名下的数据修改成100。然后注意编排一下程序的流程线,整个程序的运行流程是:先创建变量A,然后修改变量A,然后对变量A修改后的结果进行打印输出。我们看到最后的结果,D1的值变成了100。
到这里我们完成了【修改变量】,第一次这么操作的朋友一定有很多疑问。就像我第一次接触的时候也并不容易接受,长期使用grasshopper的习惯完全忽略了对这些问题的考虑。但相信也会有一些朋友会突然毛色洞开:如果我们在程序中,所有的数据都需要通过连线的方式来建立传递联系,而不是通过命名的方式。那么势必最终的程序会到处都是数据连线。我们在诺亚的开发升级过程中,经常遇到但gh文件里电池过万的情况,虽然可以通过结果合理化的打包解决一定问题,但仍然无法避免数据连线混乱的情况。所以经验趋势我们不断的需求跟专业的解决方案,也建立过多种数据传递的尝试。最终还是发现通过这种有名字的变量,有键的值是可以大幅度的简化数据传递流程的。对于大的程序开发而言,专业的途径才能转化专业的结果。所以理解【变量】,就是一个非常重要且好的开始。后续我们会带来很多练习,都跟本贴所讲相关,相信大家一旦熟练掌握就会发现其中的妙处,从而对这种算法逻辑欲罢不能。加油各位!












