
前言
一直在想有空的时候深入学习犀牛内置的grasshopper,然后在这个基础上做一些拓展与开发。在听取别人的意见之后,被告知建议先暂时系统学习一下杨开老师关于grasshopper讲解的一些公开课程,然后再在这个基础上做出一点相应的突破(杨开老师课程中的内容是跳跃性比较大,但是胜在逻辑性比较强,可操作性好,这对自己的提升是十分快的,只要自己能够跟上),我认为这是一种比较好的方式,也确实可以将知识理解的更加深刻一点。什么方面都要去抓,结果到头来就是什么都没有抓住,这样最后也是很难受的,所以还是把杨开老师课程里面的一些东西慢慢的吃透比较好。最终自己想要达到的目的:将所学的知识进行整合,也能发散开来,既一直浮于表面又不能进行触类旁通肯定是不可取的。
几节公开课自己是从头到尾一遍遍认真的看了的,自己在一边往后看的同时,一边做系统的归纳与总结。第一遍总归会有遗漏的部分,就像看书一样,第一遍总归会有一部分是自己遗漏的,第二次重新听课程的讲解发现确实很有裨益,值得去反复的听,在听的过程中逐渐的加深了自己对这个软件的兴趣以及对参数化的一些理解。写这篇文章有一个最大的难点:自己可能不是那么的深入和浅出,用别人的案例没有问题,把别人的东西用自己的话讲出来,而且讲的自己能听懂,别人能听懂也是一种可行的方式。
为什么需要用grasshopper?
-
结构参数化建模软件:是借助于犀牛平台的grasshopper;
-
犀牛里面的grassshopper具有参数化的功能,而sap2000对二次开发的接口很友好,由此这两个软件如果能够巧妙的融合的话,可以达到意想不到的效果,尽管如此,终究还是轻量级别的、低代码形式的,还远远没有达到智能化的一个程度;
-
面临的阻碍:阻碍有点大,因为之前只是初步接触过犀牛,没有对这里面东西做过深入的探讨过;
-
参数化建模速度快,而且很难出错,在设定合理的情况下一个节点不会存在随意的几根杆件连接到一起的情况;
-
搭建起来快,后面随时修改起来也同样是特别的快:类似于跨度、网格数量都是可以修改的;
-
没有编程技术也是能学会的(这里不是说要给自己设置限制,加之自己也是有一定的编程基础的)
-
其他暂时我还不知道的很多功能......
如何形成一榀桁架
操作前的一些小细节
在犀牛空间将网格去掉
在查看---格线选项中可以将网格线给去掉

如何形成点?
-
constrct point 通过直接输入三维坐标形成点(grassshopper是可以直接读excel的坐标的);
-
线和线相交可以形成点;
-
线和面相交也可以形成很多点;
-
等分也可以形成很多点;
如何形成一条线?
-
两点确定一条直线;
-
通过一个点+一个向量+一个长度(数学知识);
-
两个面的相交;
如何形成一个面?
constrct point 通过直接输入三维坐标形成点(grassshopper是可以直接读excel的坐标的);
线和线相交可以形成点;
线和面相交也可以形成很多点;
等分也可以形成很多点;
-
两点确定一条直线;
-
通过一个点+一个向量+一个长度(数学知识);
-
两个面的相交;
如何形成一个面?
形成一个面的方式有很多种,以下是基本的三种方法
-
可以通过用一条线extrude去挤出形成一个面;
-
也可以通过两条线去loft去放样形成一个面;
-
还可以通过扫掠sweep(单轨扫掠,双轨扫掠)形成一个面;
梳理grasshopper中所有的相交
-
都在Intersect里面;
-
Brep和Line相交(体和线相交);
-
Line和Line相交(线和线相交);
-
Curve和Plane相交(面和面相交);
-
Brep和Plane(平面和曲线相交);
主要内容概括
桁架组成部分
桁架是由若干杆件在每杆的两端用铰连接而成,可分为平面桁架和空间桁架。按组成的零件截面形式可以分为管桁架、H型钢桁架、箱型截面桁架、角钢桁架等。桁架一般由上弦杆、下弦杆、竖杆、斜腹杆、桁架间支撑组成。

达到什么样的效果?
基本上是按照视频的思维导向来的,我原本也想过按照自己的思维来,但是兜了一大圈发现,还是按照杨开老师的思维走比较的顺畅,也是逻辑自洽的,有一种条分缕析的感觉,这样走下去也是最有成果的。视频的案例的主要内容就是如何形成一榀桁架,做出更加复杂的空间桁架的原理就可以以此类推过来。
很直观的显示参数化的过程:桁架会随着参数的调整随时/及时的在空间模型中显示出来,并且这个可以直接导入到CAD中,用DXF文件格式就可以再次导入到各种各样的计算软件中[sap2000、3D3S、Madis、Mst],(可能对于结构工程师来说,这就是他最大的一个利器,也是我自己一直想去攻克的一部分,有了这样的一部分,相应的建模效率就会大大的提升,但是究其本质:结构工程师只是利用了其中很小的一部分功能,但是可以大大的提升效率,可以在方案阶段进行多方案的一个比选。
对于桁架来说有哪些参数可以设置?
-
桁架的跨度:修改数值,跨度就可以发生改变;
-
桁架的高度:一个三角桁架高度的变化;
-
桁架的宽度:
-
桁架的密度:理解为桁架里面的一个等分数的变化;
-
系杆的数量:
-
其他一些有实际意义的参数......
所举的例子是由一条直线形成的直线空间桁架,如果是一个曲线的,也同样是可以得到一个相应的曲线桁架。
都在Intersect里面;
Brep和Line相交(体和线相交);
Line和Line相交(线和线相交);
Curve和Plane相交(面和面相交);
Brep和Plane(平面和曲线相交);
桁架组成部分
桁架是由若干杆件在每杆的两端用铰连接而成,可分为平面桁架和空间桁架。按组成的零件截面形式可以分为管桁架、H型钢桁架、箱型截面桁架、角钢桁架等。桁架一般由上弦杆、下弦杆、竖杆、斜腹杆、桁架间支撑组成。

达到什么样的效果?
基本上是按照视频的思维导向来的,我原本也想过按照自己的思维来,但是兜了一大圈发现,还是按照杨开老师的思维走比较的顺畅,也是逻辑自洽的,有一种条分缕析的感觉,这样走下去也是最有成果的。视频的案例的主要内容就是如何形成一榀桁架,做出更加复杂的空间桁架的原理就可以以此类推过来。
很直观的显示参数化的过程:桁架会随着参数的调整随时/及时的在空间模型中显示出来,并且这个可以直接导入到CAD中,用DXF文件格式就可以再次导入到各种各样的计算软件中[sap2000、3D3S、Madis、Mst],(可能对于结构工程师来说,这就是他最大的一个利器,也是我自己一直想去攻克的一部分,有了这样的一部分,相应的建模效率就会大大的提升,但是究其本质:结构工程师只是利用了其中很小的一部分功能,但是可以大大的提升效率,可以在方案阶段进行多方案的一个比选。
对于桁架来说有哪些参数可以设置?
-
桁架的跨度:修改数值,跨度就可以发生改变;
-
桁架的高度:一个三角桁架高度的变化;
-
桁架的宽度:
-
桁架的密度:理解为桁架里面的一个等分数的变化;
-
系杆的数量:
-
其他一些有实际意义的参数......
所举的例子是由一条直线形成的直线空间桁架,如果是一个曲线的,也同样是可以得到一个相应的曲线桁架。
桁架是由若干杆件在每杆的两端用铰连接而成,可分为平面桁架和空间桁架。按组成的零件截面形式可以分为管桁架、H型钢桁架、箱型截面桁架、角钢桁架等。桁架一般由上弦杆、下弦杆、竖杆、斜腹杆、桁架间支撑组成。

基本上是按照视频的思维导向来的,我原本也想过按照自己的思维来,但是兜了一大圈发现,还是按照杨开老师的思维走比较的顺畅,也是逻辑自洽的,有一种条分缕析的感觉,这样走下去也是最有成果的。视频的案例的主要内容就是如何形成一榀桁架,做出更加复杂的空间桁架的原理就可以以此类推过来。
很直观的显示参数化的过程:桁架会随着参数的调整随时/及时的在空间模型中显示出来,并且这个可以直接导入到CAD中,用DXF文件格式就可以再次导入到各种各样的计算软件中[sap2000、3D3S、Madis、Mst],(可能对于结构工程师来说,这就是他最大的一个利器,也是我自己一直想去攻克的一部分,有了这样的一部分,相应的建模效率就会大大的提升,但是究其本质:结构工程师只是利用了其中很小的一部分功能,但是可以大大的提升效率,可以在方案阶段进行多方案的一个比选。
对于桁架来说有哪些参数可以设置?
桁架的跨度:修改数值,跨度就可以发生改变;
桁架的高度:一个三角桁架高度的变化;
桁架的宽度:
桁架的密度:理解为桁架里面的一个等分数的变化;
系杆的数量:
其他一些有实际意义的参数......
所举的例子是由一条直线形成的直线空间桁架,如果是一个曲线的,也同样是可以得到一个相应的曲线桁架。
说完了这里的概念之后其实自己正真想做的也只是用犀牛的方式在模型中将桁架模型给建立出来,并将某些参数做成可变的形式,这样随着外部条件的更改,模型可以同步进行相应的修改,然后就可以省略大量繁杂和不必要的劳动力,这也是本篇文章的一个中心思想,也正应为如此才写下了这篇文章。(这里不是想去说在cad里面怎么把模型建立出来,亦或者是这个桁架的受力分析啥的,暂时还没有涉及到这个层面,也可以认为现在是在一个起步阶段而已)。
一个大体的思维框架
具体的思路导向:由一个点---->2个点----->一条直线----->三条直线----->等分直线----->连线成桁架.....>......(点形成线,线再进行扩展,对线进行等分,不同等分之间连线形成空间结构体......)
具体的思路导向:由一个点---->2个点----->一条直线----->三条直线----->等分直线----->连线成桁架.....>......(点形成线,线再进行扩展,对线进行等分,不同等分之间连线形成空间结构体......)
1、首先会有上弦杆和下弦杆,先形成一个点:constrct point,并把相应的panel点出来;


2、在里面可以输入一些字符,注意不要回车,不然会显示两个字符,电池就会报错;
3、形成两个点(思路就是很简单的)
-
先建立一个原点,相应的坐标就是(0,0,0) ,然后就会在犀牛模型的空间位置形成一个点;



-
形成另外的一个点,就是桁架的跨度的一个点,因为另外的一个点的y坐标的值是变化的,所以就直接定义一个活动的拉棒就可以了(这个拉棒后期是可以做参数化调整的,其余涉及拉棒的都是对应的一个可调节参数) ;
-
双击拉棒的左侧弹出相应的对话框做一些相应的调整,比如定义桁架的跨度让他最大不超过50m,这样拉棒就可以在0~50m之间做任意的更改;


4、形成一条线:用到line命令,通过两个点建立一条直线,将两个点连好之后,就是形成一根空间的直线

5. 形成桁架的上下弦:以这条直线为基准线,让左边形成一个上弦、右边形成一个上弦,下面形成它的下弦。具体操作如下:
-
对于下弦的形成比较方便,把已经有了的线向下移动一个相应的高度就可以形成下弦,用命令move,左边是输入端,右边是输出端,把相应的直线接入就行,T是往哪个方向移动,目的是往z方向就行移动就可以进行相应的平移,双击输入一个z,然后回车接入T中;设定一个高度,假定桁架的高度是3m,此时接入一个-3000的高度就可以完成下弦的绘制;



-
紧接着形成上弦,因为上弦通常是对称的,在左侧有一个,对称位置也会有一个,让这个值左侧移动多少右侧就会同步移动多少,这里也是采用移动的命令,只不过采用的是向正方向进行相应的移动,删掉negative,采用向正方向进行移动,这样就可以做到分别改右边就是向右边移动,改左边就是向左边移动;


-
如何做到统一和联动的问题?通常上弦杆的宽度是会统一的(当然如果要做左右宽度不统一的肯定是可以按照以前的来做的),把同一个值接给其中一个的同时还接给另外一个,这样就达到了用一个参数值同时调整上弦左右对称位置的值,这里都是由一条直线分出去的三个电池;


6. 为了养成一个良好的习惯,通常这个位置可以设置一个接收器Curve,因为直线也是属于特殊的曲线,如果是想延展做一个曲线的桁架,这里索性用一个curve接收器把相应的直线给它,也即在三条线之间加入一个接收器。
学会用接收器,让自己的程序更加的简洁和方便,能够有效的提高自己的编程能力,就是那种所见即所得,你能感受到那种把杂乱无序的东西一下子收纳好的一种畅快,别的不说,对于强迫症患者真的是舒服的很。

7. 紧接着是画三角桁架,主要是找到相应的点,然后对应的进行连线,找到点的方法有很多:一条直线和一个面相交可以,这里采用最简单的方式,直接用等分的方式
-
把上弦用一个curve接收器接收一下,因为是对称的,这里多个线同时接入一个curve的时候第二个需要按住shift进行连接(不按住默认只会有单向连接)
-
然后将这条直线等分:divide curve

-
等分的个数就是相当于桁架的密度,也是一个可以变化的参数,也是需要输出一个拉棒,这里设置30份,然后将拉棒接入N(connent是指相应的份数)通常三角桁架的下弦,相应的点会连到他们的中间,相当于4个点都跟下面的来相连,上弦如果等分N的话,下弦就要等分2N份(简单数学知识),还是用到之前的参数化的思路而且要相互的关联,用到数学里面的一个”x”号;

-
然后再引入2倍,这里有两种方法:
-
方法一:直接敲击2(固定的值,不需要变)
-
方法二:用panel
-

-
紧接着把这个divide进行复制;
-
需求:把下弦给等分上弦数量的一倍
-

-
下图中红、绿分别是上弦、蓝色是下弦,然后下弦的等分数是上弦的两倍;

8. 接下来的操作就是每隔一个取一个点,这里用到了dispatch命令(在grashhopper中有很多的方法可以做到隔一个取一个,这里的这个方法是比较简单的一个)这里将线的等分点给接进来,里面的A B是通过逻辑(true or false)来去接的,A B都是点,这里用一个点接收器来接收A B;


9. 到这一步之后,这里整合编辑了一个电池包(后面马上就要展开说的),可以直接将桁架给连出来,这里从一条线变成一个桁架就可以打包出来,右边这部分就可以作为一个打包成为一个group(从这一步开始就有了一个跨越式的发展,在被打包之后,由线直接连出体,一些繁杂的过程被隐藏起来了)
以下主要想讲如何将上弦点、下弦点连入进来,得出上弦杆、腹杆、系杆以及下弦杆的后续过程:
回顾之前的操作:两个点连成一条母线--->线连到一个curv接收器--->然后分出三根线:分别是两根上弦杆和一根下弦杆---然后就是进行分段(主要对前面的操作又做了一个概要)
连线:连线必然是通过两个点来连接的

知识点延申:可以通过一个点和一个长度或者向量来找到另一个点并连成线。不过绝大部分的方式都是通过两个点来找到这样的直线(前面已提到)。
等分有一个不好的地方:不好控制相应的长度,我们经常需要的是在轴网上的点,会有相应的支座在这里,等分是很难找到这个点的,如果用到轴网去找到这个点就会用到其他的一些命令
用这三个点,然后用到下面一个很重要的命令:point list
point list:主要是给点进行相应的编号的,在整个结构的参数化建模过程当中,这个命令非常的常用,把点输入到P端,S是调显示的一个参数;
通过编号设置我们就可以直观的反映出来:上弦的节点编号是从0-20,是从第一个点开始的;下弦的节点编号是从第二个点开始的,然后间隔一个开始进行相应的编号,节点编号从0-19
直观感受,通过这样的一步步的操作,正真的做到了所见即所得的目的,我想要怎么样,最后就会得到什么样的一个结果,就如同视频里面之前说的那样,下弦的分段是上弦的两倍
为了使得编号的展示更加的合理,这里可以将S端右键点开后设置S
number的数量,这里设置一个比较合理的值:500,然后更新显示如下,查看直线与编号的一个相对大小。(其实也可以用panle来设置,因为需要复制的地方比较多,所以用这种方式还比较好)

接下来开始进行连点的操作
在grasshopper中的连点一定是从0连到1再到3,一定是数字从小到大开始连的(从最简单的说起,后面会有一些树形数据,相对就比较的复杂)
接下来采用polyline函数,V端就是一个点的集合

紧接着把这条线上的点进行相应的烘培(bake)映射到犀牛空间,但是在犀牛空间中是一根完整的直线,我们想要的其实是每个点连起来的多段线(在其他的一些软件中都无法直接操作这样的一整根线,下弦杆必须被腹杆所打断)

处理方式:
1、先删除犀牛空间中烘培的线;
2、在polyline后面继续接explode,执行这样的操作之后这条线就被之前点给打断了;
3、接着用line接收器(为什么不用cure接收器?因为我们需要的是直线,如果这边爆红就说明不是直线,就会出错);
4、再将这条直线烘培到犀牛空间中,这个时候再看就是一段段线段了,也就实现了之前的目标(分段的是可以有节点,后续可以导入一些计算软件中进行计算的);

这里第一次用到组的概念,将三个命令创建为一个组。group的作用就是将有若干个点的直线变成一段段线段连接的下弦杆

同理对上弦进行相同的一个操作,全部变成一段一段的直线可以在软件中进行相应的计算的。
上面的连线的方法是因为有编号的基础上的一个方法,这里采用方法二
一种比较基础的方法,将每个点一条线一条线的进行连接起来,虽然听起来很复杂,但是如果用参数化去实现它就还是比较的快的,有了最基本的方法之后连什么线都比较的方便(比如后面还需要连接腹杆等,采用编号就不行了)
以下采用两点连接一条直线的方式:先把所有的点bake到犀牛空间,后面会经常用到这样的一些点

用line进行两点连接会遇到一个新的问题:由于上弦杆的编号多于下弦杆的编号,到末尾的部分,上弦杆多余的编号会全部连到弦杆的最后一个编号

这里的处理方式是:去头或去尾的命令:shift list,这里的S端就是说明如何去除它
shift list:这是对数据进行处理的一个电池;
如果输入-1:就是把末端的点给去掉了;
W是去除完点之后需不需要进行相应的循环;

采用shit list默认的方式(S里面是1,W里面是True),然后再接入一个节点编号就实现:所有的编号都向后退了一步
如果将W里面的值改为False,也即不循环,就是下面的第二张图,通过这两张简单的图就能够明白相应的False的作用


因此后面的连接方式发生改变,变成了正常的腹杆的连接


紧接着再去连接另一个斜向的腹杆,操作步骤如下:
1、将上面的shift list 连同后面连接的point list 一起进行复制;
2、然后将shift list中S参数改为-1,此时的编号就变成0~19,将尾部的编号给去掉,并且不循环;

到这一步之后,一侧的腹杆就被连接好了,了解参数化编程的流程之后,另一侧就必然可以画出来。

这里为了养成一个好的习惯,用一个point接收器来进行相应的接收(从一个点引出两条曲线)

然后将这一块区域打一个包,group一下

紧接着把这个包复制然后连另一个上弦杆,经过这样的一番操作后,所有的腹杆都已经连接好了,并且没有任何多余的线条,自此这边已经完成90%的部分了。


当时连接下弦杆的时候用的polyline,现在采用另外的一个命令line,如何用两点去连了,这里会用到编程的一些思想
-
有一串点,0、1、2、3...将它本身复制一份,在同一个位置还是0、1、2、3...;
-
然后将新复制的编号shif向后挪动一下就变成了1、2、3、4...;
-
最后将原始数据和改编的复制的数据用line进行连接就会形成一段段的直线,这里面主要是编程的思想;
现在实际进行相应的操作:
1、由于是需要去头的,将shift list 中的s改为1;
2、经过这样的一番操作之后,同时让两个编号显示就会发现是符合我们的预期的;
3、一旦把两种编号连接起来,就形成了下弦的杆,并且肯定是一段一段的(命令的特性导致的,只能是一段一段的);
4、所有的东西连完之后其实就可以打包成一个电池了最后其实还差一个系杆的连接,这里会用到另外的电池,相当于新的知识点;


如何打包形成一个自己的电池?
1、用Line接收器,先复制几个接收器;
2、然后用4个接收器分别连接:上弦杆、下弦杆、腹杆、系杆;

3、前面接几个电池接收器

4、打包的时候选择中间这一段进行相应的打包,这样接收器在前面都断开了;

这样整体就做了这样的简化操作

发现线条还是有点多,将最后结尾的部分进行相应的复制之后简化相应的线条再二次打包

这样一番操作之后,相应的界面就更加的简洁明了


可以将名字做一些相应的修改符合自己平时的习惯一些后续的总结
1、虽然已经做了打包,但是我们如果要查看接入的东西,也是可以的,比如另外接入point list来查看弦杆的编号(前面在连接直线的时候就是通过编号来处理的,后面的一些数据结构如果不是这样就建议最好处理成这样)
2、还可以用panle看一下点的数据;

后记
以这个例子为基础进行发散并在后续尝试做一些独立自主的拓展与延申,慢慢的做一些参数化的例子与开发,借助工具的力量做一些减少重复工作的事情,然后是借助数据结构的学习,深入融合里面的一些参数化的思想。
参考资料
-
https://www.bilibili.com/video/BV1Cf4y1T7KU?p=1&vd_source=9e107638935a61bd37e6161cb560baba
-
http://www.weiouyishu.com/news/206.html



