发布网友 发布时间:2024-10-24 12:51
共1个回答
热心网友 时间:2024-11-09 10:07
grasshopper的学习历程已有数年,虽然不敢自称精通,但已能将之应用于实际。疫情期间,我有更多时间去思考那些平时忽略的问题,如沉寂在命令栏中的电池、插件,以及看似了解却不一定真正理解的内容。
最近,我开始写研究记录,原因在于最近做的一个项目。几天前,队友发给我一个动图,展示了根据道路中心线生成block,再在其中进行分割,简单布置建筑体量的过程。这个逻辑并不复杂。
在编写这个电池组的过程中,我发现了几个有趣的地方。
1.关于树形数据结构的理解
树形数据是grasshopper中的核心内容,简单易懂,但应用变化多端,不同层级间的数据杂糅在一起,筛选和处理耗时费力。
提取每个block边线的中点,最左面和最右面的连线形成横向分割线。但当多个block同时输入时,这实际上就是一个multiline data的input,多个block(surface)拆分成edges时,就会出现树形数据。这16个blocks会产生{15;3}共个lines,取中点时,divide成3个点,就是{15;3;2}252个points。提取出中点(个)再进行排序寻找X坐标最小点时,无法保证找到的是那个block4个点中的最小点(需要的是局部最低,全局不一定是),然而这个时候个点虽然还是在{15;3}目录下,但与flatten并没有太大差别。
为了达到局部排序的目的,我选择了重新分组(partition list),将252个points每4个一组,但如果输入block不是四边形,这里就会出bug(但真实的道路网络不可能都是四边形),所以这里的处理还是不够严谨。
——————————————————————————————————————
在写这篇文章时,我突然想起了Trim tree的命令,其实可以完美解决重新分组的问题。这里解释一下这个电池:将下一层级的数据合并至上一级,应用在这个例子中,即每个block的若干个点(不一定12个)都会归在一组,最后一定是16组。
这里附加一个trim tree与shift paths区别的帖子
2.不稳定的offset curve
我周围的grasshopper用户也都有过这个问题,gh中的offset curve 方向总是正或负,造成“里出外进”的结果。
为了解决这个问题,我思考了很久,最终使用双向offset curve使每个block无论正负都能统一结果。这里同样用到了树形数据结构,即{15;1}offset curve的长度排序,巧妙解决了offset不稳定的问题。
3. 关于GH中实现模块化
在刚开始接触grasshopper时,如何通过gh实现模块化这个问题让我头疼不已。在百度等中文搜索引擎上也找不到相关的教学,甚至一度怀疑自己是否理解错了“模块化”这三个字。
所谓模块化,广义上讲就是可以把固定的几种模式(pattern)或模块(module)应用在某几种有对应属性的位置。比如建造上的模块化,固定几种尺寸的构件,材料生产和建造上都会大幅提高效率。在设计上,或许模块化没有固定尺寸完全相同这样的严格要求,但相似的生成逻辑生成的空间、布局可以更有秩序地推敲和研究方案(也就是所说的类型学研究的应用)。
可以说,模块化是参数化的一种基础应用。
拿我这次做的例子来说,将生成的地块分类(比较深入的才能叫类型学研究),这里是按照每个地块的面积大小来分的【按个人方案的需求来】,面积大的选择了围合式,小一些的选择半开放,再小的就空出来当绿地(这里的逻辑可能不准确,权当举例子)。
这样我们就提出了三种模块,那么如何在GH中操作呢?我提出两种方向,可能适用于不同的情况。
(1)dispatch分模块
简单说就是,46个blocks面积塞进dispatch,大于A的,拿出来做成围合式;剩下的再进dispatch,大于B的拿出来做半开放式……
(2)find domain分模块
46个blocks面积范围是从24到60,那在这个【24,60】区间里分3份,然后再根据面积大小把46个blocks从分出的三个区间里【24,36)、【36,48)、【48,60】找出来,再分别处理模块。
在做find domain分模块时,发现了一个问题。
①从find domain的index中提取出的“1”可以被member index识别
②输入在panel中的“1”无法被member index识别
③调整数据结构后,即使和find domain的index提取出的一样仍然无法识别
④测试数据类型,发现只有int(整数)可以被member index识别,与数据结构无关。
最后发几个随便改了改线生成的结果:
以及最后的电池组(自己动手丰衣足食)