1.2 GH 工具和编程习惯
Created on Sun Jan 16 19:56:03 2022; Last updated on Thu Aug 22 21:39:31 2024 @author: Richie Bao
1.2.1 GH 图形用户界面
组件(component/capsule)是 GH 的核心,主要可以分为数据操作类、几何操作类,及显示标注,和默认的扩展组件 Kangaroo2(动力学组件)等。根据功用的不同进一步细分为 GH 面板中的不同归类,大类包括 Params, Maths, Sets, Vector, Curve,Surface, Mesh, Intersect, Transform、Display、Rhino 和 Kangroo2,及需要自行安装高达 500 个的扩展组件,涉及到机器人、结构工程、分析仿真、动画、游戏、渲染与可视化、界面、建筑、景观、城市规划、土木工程等。组件通常包括输入端和输出端,或者仅有输入或输出端,也可以都不具备。为了方便代码编写(即连接组件构建逻辑实现某一功能)GH 工具通过组件颜色的显示提示当前组件的运行状态(包括正常、警告、禁用、隐藏和已选等)。并通过线型表明数据流的数据结构类型(包括单一值、列表和树型数据)。
图形用户界面(Graphical User Interface,GUI)设计上,为了方便组件识别和代码编写,通常在 Display 选项下勾选Draw Icons
,Draw Fancy Wires
和Draw Full Names
,显示组件图标、线型和输入、输出端名称全称。当勾选Draw Icons
时,以图形化的图标方便用户快速的识别和选择组件(图标在视觉上传达信息更明确、紧凑,承载的认知负荷更低),则不显示组件名称,此时可以安装Bifocals组件① ,在每个文件下调用该组件,则可以在各个组件上部显示该组件的名称,这不仅可以一目了然组件的功用,当以图片形式(例如书籍或者PDF文档)交流时,读者也可以知道该组件的名称,复现代码时方便搜寻定位。
1.2.2 编程习惯
虽然节点可视化编程(Visual programming language,VPL)与文本式编程的核心编程思想一致,但是 VPL 的操作形式使得代码很难保持清晰整洁,尤其在处理一项设计任务时,组件与连线互相交织穿插。当组件数量不断增加,代码的“混乱”会显得尤其突出,这是受到 GH 工具本身操作模式及设计推敲和逻辑算法要反复修改等因素的影响,要规整组件目前实属费时费力的工作。虽然 VPL 不具备 Python 文本式编程强制缩进使得代码规整清晰的优势,但在用 GH 书写代码时,也要尽量养成一些可以达成的习惯(图1.2-1)。
一是,对于组件名称和输入输出端,及抬头部分名称的重新定义,通常与当前代码所要实现的功能保持一致;二是,使用组件Scribble
或者Panel
增加注释,可以快速得知代码块的实现功能,尤其包含有大量组件的文件,及他日重读代码或者迁移代码时,显得尤为重要;三是,利用Group
成组组件,明确代码块。当代码块经常被调用时,可以定义为Cluster
,方便迁移。
类似 Python 语言要不断使用print()
函数打印查看数据,GH 同样需要时刻使用Panel
和Param Viewer
来查看数据及数据结构,从而能够清晰编写数据的处理方式和实现功能的逻辑算法,避免盲目连接组件。
图 1.2-1 GH 图形用户界面和组件、线型说明,及注释
⇩代码下载(1_2_01_GHtoolNcodingHabits_note.gh)
学习代码过程中,如果只有代码截图,但可以获知组件的名称时,为了避免逐一的从组件面板中寻找,可以双击工作区(画布),在弹出的搜索窗口中输入组件名以获得对应的组件(图1.2-2);如果已有代码文件,打开代码后,需要知道某个组件在组件面板中的位置时,可以同时按住Ctrl
和Alt
键后,左键单击所要查询的组件后会显示其在面板中的位置(图1.2-3)。
![]() |
![]() |
---|---|
图 1.2-2 弹出的搜索窗口 |
图 1.2-3 查询组件在组件面板中的位置 |
1.2.3 参数化
GH 属于可视化编程,其自身是实现参数化设计的工具,参数化是 GH 所要达成的目的。因此,GH 的代码编写要尽量保持数据的因果、联动关系,当某一输入参数发生变化时,后续的数据流应相应发生变化,这一情况同步发生在设计推敲对应的模型上。这不仅可以避免繁琐的几何构建,也为设计自身需要不断修改调整这一特点导致工作量的增加给与减负。
GH 代码编写就是要实现构建设计空间几何和相关分析的数理逻辑。那么设计的方法除了使用 GH 参数化传统的设计空间(例如构建古建筑);又可以直接从数理逻辑构建开始思考实现设计形式(例如生成设计)。两种途径的思维方式是不同的,这也足以说明设计师需要掌握 GH 等编程语言的必要性。
1.2.4 英语与编程语言
几乎所有文本式编程语言均为英语书写,而节点可视化编程的组件连接方式弱化了这个过程。但是GH 的编程脚本(Python Script、C# Script 和 VB Script)仍需英语书写。因此为了尽量保持二者的一致性,在本书的阐释过程中,并不对组件、输入输出端等各类(变量)名称给予英文的翻译。这对进一步使用 Python Script 等编程脚本是有益的。
1.2.5 完成度记录表
参数化设计工具 GH 本质上就是写代码,这与用文本式编程语言,例如 Python 等是相同的。学写代码最重要的就是不断的练习,不断在解决问题和试错中提升写代码的思维和技巧,不断增强解决问题的效率和解决问题的深度。学习写代码时,不是很容易判断自己究竟掌握知识到了什么程度,这不仅在于代码知识内容浩瀚如汪洋;也因为很多学习者实际上尚未在设计实践或科学研究中去实际的应用,而是希望具有了一定能力之后,再不断的尝试应用实践,解决设计和科研问题。
为了方便读者能够衡量自己学习的层次,明确存在的不足和确定进一步提升编程能力需要学习的知识点内容,有的放矢的练习积累,增加了如下完成进度表格。阶段总共有两个个,小学生和建构者。每一阶段下有多个段位,方便衡量知识掌握的进度。这两个阶段是递进的关系,不过实际上各个阶段又是互相交错的,例如在小学生阶段就可以开始构建自己的模组,提升参数化应用与设计实践的能力。为了方便评估完成情况,制定了一个评分标准,如下:
- 小学生阶段总共 419分; 完成度 80% 需 336 分
- 建构者阶段总共 280分; 完成度 80% 需 224 分
代码段可以顺序练习,也可以随机选取练习,尤其练习数据组织管理的方式和参数化设计的思维逻辑。
等级 | 知识点 | 代码段 | 是否完成练习 | 得分(难易) | 备注 |
---|---|---|---|---|---|
小学生-1段 | List(列表) | 代码段-练习-1 | 1 | ||
代码段-练习-2 | 1 | ||||
代码段-练习-3 | 1 | ||||
代码段-练习-4 | 1 | ||||
代码段-练习-5 | 1 | ||||
代码段-练习-6 | 1 | ||||
代码段-练习-7 | 1 | ||||
代码段-练习-8 | 1 | ||||
代码段-练习-9 | 1 | ||||
代码段-练习-10 | 1 | ||||
代码段-练习-11 | 1 | ||||
代码段-练习-12 | 1 | ||||
代码段-练习-13 | 1 | ||||
代码段-练习-14 | 1 | ||||
代码段-练习-15 | 1 | ||||
代码段-练习-16 | 1 | ||||
代码段-练习-17 | 1 | ||||
代码段-练习-18 | 1 | ||||
代码段-练习-19 | 1 | ||||
Sets (集合) | 代码段-练习-20 | 1 | |||
代码段-练习-21 | 2 | ||||
代码段-练习-22 | 2 | ||||
代码段-练习-23 | 1 | ||||
代码段-练习-24 | 2 | ||||
代码段-练习-25 | 1 | ||||
代码段-练习-26 | 1 | ||||
代码段-练习-27 | 2 | ||||
代码段-练习-28 | 2 | ||||
代码段-练习-29 | 1 | ||||
代码段-练习-30 | 3 | ||||
代码段-练习-31 | 2 | ||||
代码段-练习-32 | 3 | ||||
代码段-练习-33 | 3 | ||||
Tree(树型数据) | 代码段-练习-34 | 3 | |||
代码段-练习-35 | 3 | ||||
代码段-练习-36 | 4 | ||||
代码段-练习-37 | 7 | ||||
代码段-练习-38 | 6 | ||||
代码段-练习-39 | 3 | ||||
代码段-练习-40 | 1 | ||||
代码段-练习-41 | 3 | ||||
Text(字符串) | 代码段-练习-42 | 7 | |||
代码段-练习-43 | 5 | ||||
Sequence(序列) | 代码段-练习-44 | 6 | |||
代码段-练习-45 | 2 | ||||
1.3.1 数据类型与结构-练习题组-练习题-A组 | 练习-A | 5 | |||
练习-B | 6 | ||||
练习-C | 5 | ||||
1.3.1 数据类型与结构-练习题组-练习题-B组 | 练习-D | 5 | |||
练习-E | 7 | ||||
练习-F. | 5 | ||||
小学生-2段 | Point(点) | 代码段-练习-1 | 4 | ||
代码段-练习-2 | 5 | ||||
代码段-练习-3 | 3 | ||||
代码段-练习-4 | 7 | ||||
代码段-练习-5 | 7 | ||||
代码段-练习-6 | 5 | ||||
Vector(向量) | 代码段-练习-7-A | 9 | |||
代码段-练习-7-B | 9 | ||||
Plane(参考平面) | 代码段-练习-8-A | 9 | |||
代码段-练习-8-B | 8 | ||||
Field(磁场) | 代码段-练习-9 | 4 | |||
代码段-练习-10 | 9 | ||||
代码段-练习-11 | 9 | ||||
1.3.2 空间定位-点、向量与参考平面-练习题-A组 | 9 | ||||
1.3.2 空间定位-点、向量与参考平面-练习题-B组 | 5 | ||||
小学生-3段 | Curve(曲线) | 代码段-练习-1 | 5 | ||
代码段-练习-2 | 5 | ||||
代码段-练习-3 | 5 | ||||
代码段-练习-4 | 5 | ||||
代码段-练习-5 | 5 | ||||
代码段-练习-6 | 6 | ||||
代码段-练习-7 | 4 | ||||
代码段-练习-8 | 6 | ||||
代码段-练习-9 | 3 | ||||
Surface(曲面) | 代码段-练习-10 | 8 | |||
代码段-练习-11 | 6 | ||||
代码段-练习-12 | 3 | ||||
代码段-练习-13 | 8 | ||||
代码段-练习-14 | 7 | ||||
代码段-练习-15 | 5 | ||||
代码段-练习-16 | 7 | ||||
代码段-练习-17 | 7 | ||||
代码段-练习-18 | 6 | ||||
Mesh(格网) | 代码段-练习-19 | 9 | |||
代码段-练习-20 | 8 | ||||
代码段-练习-21 | 5 | ||||
代码段-练习-22 | 9 | ||||
代码段-练习-23 | 8 | ||||
代码段-练习-24 | 8 | ||||
代码段-练习-25 | 7 | ||||
代码段-练习-26 | 7 | ||||
代码段-练习-27 | 8 | ||||
SubD(细分格网) | 代码段-练习-28 | 5 | |||
代码段-练习-29 | 4 | ||||
1.3.3 空间几何-练习题-A组 | 5 | ||||
1.3.3 空间几何-练习题-B组 | 5 | ||||
建构者-1段 | 1.3.4 建立模组库 | 构建10个组件 | 10 | 组件需要有其价值 | |
累积构建30个组件 | 20 | ||||
建构者-2段 | 累积构建60个组件 | 30 | |||
累积构建100个组件 | 40 | ||||
建构者-3段 | 累积构建150个组件 | 50 | |||
累积构建210个组件 | 60 | ||||
建构者-4段 | 累积构建超过280个组件 | 70 |
注释(Notes):
① Bifocals 组件,实现显示组件图标同时,标出组件名称(https://www.food4rhino.com/en/app/bifocals)。