之前大家应该都有听说E3也是一款功能强大的参数化设计工具,今天这个案例带大家上手E3的图形功能。
案例辅助文件在此【建议跟帖从零开始练习,如遇到问题可借助此文件差错】
图龙001.zip (24.8 KB)
新建一个E3项目,在package.toml文件中复制下面这串代码,这是E3在每个项目中调用不同运算功能模组的操作方式(这部分工作未来会给大家更新一个简易版,目前是专业版的)
platform = "net8.0"
[dependencies]
"E3.Core" = "nuget:1.2.4"
"Tulo.Clipper" = "1.3.1"
"Tulo.Geometry" = "1.3.4"
"Tulo.Intersects" = "1.3.1"
"Tulo.Triangulation" = "1.3.2"
编辑完的结果注意Ctrl+S保存。然后关闭项目重新打开。这个过程是未来让我们的项目正式加载这些运算功能模组。
重新进入文件后,能够看到模块菜单中新增加的Tulo(图龙图形库)
这样项目开发的环境文件就配置好了,下面我们正式开始
/
/
/
让我们先来学习如何创建一个点,双击面板调出模块菜单,键入point,找到Geomoetry–Point3–[Constructor]Point3(float,float,float),这个功能卡的名字也代表了这个运算模块的功能,这部分我们后续单独开帖为大家深入剖析。【这里重点是如果名字太长,大家看不到名字后面内容时,注意面板最下方有个拉棒可以往后拉,把名字看全】
调出的功能模块是用三个坐标绘制一个点,接下来我们用三个input float,给这三点点分别赋予三个数值
此时我们点击模型窗口并没有看到这个点,这是因为程序还没有运行,同时我们也还没有告诉程序这个点是否要显示出来,或者以何种方式显示。
下一步我们调出display和print两个模块,分别对点的信息进行显示。
然后点击程序运行,查看运行结果,注意右上方【屏幕】按钮打开模型窗口,右下角【!】按钮打开信息打印窗口,此时我们看到这个点已经生成了。
/
/
/
接下来我们来看怎么来画多个点:
在图龙最基础的图形库中并不存在像Grasshopper中的等差数列运算器那样可以一次性的给我们提供一个数列。但作为一个强大的研发工具,我们可以通过最基础的程序运算快速的还原这个功能。用到核心功能就是这个叫for的功能模块:这个模块可以被理解成为一个计数器,它并不是每次运算都给我们生成一串数列,而是通过建立循环算法,一次又一次的为我们提供变化的单个数据。比如目前的设置,start【0】stop【10】step【1】意思是从0离开时到10结束,中间每次循环递增数值为【1】。所以这个功能卡片会被触发10次循环运算,每次计算输出的数值都在递增,且都是单一数据。(注意生成的数据没有0,因为第一次循环的计算就能就是star+step即0+1,输出的结果是1)
让我们尝试把这个生成的递增数值提供给x,用它来生成之前的点。此时我们能看到一共我们生成了10个点,同时我们能在打印记录之中看到这些点是依次生成的。
这个时候如果我们把点数调成非常多,比如10000个,我们会看到这些点并不是一次性被生成出来的,而是有先后的顺序,它们被计算并显示的过程就像一个动画。

这是因为我们通过for创建了一个最建议的循环程序,这个程序在这个循环里被跑了一万次,并且每次都经历了for【1回】–display【1回】–print【1回】–for【2回】–display【2回】–print【2回】–for【3回】–display【3回】–print【3回】–for【4回】–display【4回】–print【4回】……
这样的一个过程。我们看到的点的增长动画,就是在着一万次循环中,分别生成的。
在这个过程中,我们能清晰的感受到流程线的意义:这个循环是从for的loop端发的,进入到display去显示点,然后去print打印这个点的信息,在print之后流程结束了,自动回到for的loop进入下一次循环,一直到for的循环结束,运算流程可以从for的Done输出端继续链接后续的程序。
ok,解析来继续用这个方法制作一个二维点阵**【注意先把for里的stop值改到100,先生成1万个点,数据量过大程序会卡】**,在第一个for和display之间再追加一个for,将第二个for的i值比配给点的y坐标。因为第一个for建立了10个循环,每次给x坐标提供一个值,这里创建第二个for意思是在上一级循环中,每次循环里再次创建第二级内部循环。相当于有十次大循环,生成了不同的x值,然后每个大循环里又出了十次小循环,给每个x值匹配10个不同的y值。
这次我们生成的效果是这样的。

相信已经熟练掌握了GH的朋友第一次接触用这种方式创建点阵会很奇怪:为什么不能一个功能模块就直接创建一个点阵呢?其实这个问题也好理解,那就是E3的本质是算法研发工具,这个案例为大家展示的即是编写一个点阵生成算法的底层过程。也可以说我们可以基于E3开发一个类似GH的参数化设计工具出来。
从另一个方面讲,GH和其他编程软件相比,还是更容易上手一些,这其中的原由之一就是上述的运算过程已经被GH电池高度封装,让使用者不被感知到。这个过程虽然对萌新友好,但是也限制了程序的底床,使其程序编写能力被局限在了一个范围内,同时也让模型生成程序变得更加笨重,GH里大家很少感受到循环的存在就是一个例子。而我们最熟悉的树形数据,其实也是对GH中无法实现循环套循环这类算法的一种补偿规则。
这里我还是要肯定GH1的,毕竟我个人也用了十五年,还为它编写过书籍教材。想强调E3和GH是无缝链接的,两者可以协同跑,这是我们对GH和参数化设计师的最大认同和福利。同时既然要重新定义国人自己的参数化设计平台,我们就得打破过去的限制,直击程序的本质。我们正在闭合的RPA扩展包都将是一些非常便于操作的集成模块。而作为这些智能程序的载体,E3平台的使命是为广大的算法程序开发者们提供一个更自由、更灵活的无代码开发平台,这也是E3的创造者KavinD最初的理念。
/
/
/
回到这个案例,目前这么写其实很占用资源,原因是display和print都在循环内部,被触发了1w次,这是为什么出现动画效果以及1w个点也会运算卡的原因。接下来我们把它优化一下。方法就是我们先来创建一个点的列表,把这1w个点都放进列表中,然后一次性显示和打印。
创建一个变量,类型设置成point,名字取名为【点阵A】
注意这个变量是在循环开始之前创建的,一定不要放在循环里,否则会被执行1w次……
然后找到另一个核心功能模块:list下面的Append,它是用来往变量里装数据的。
在每次循环结束时,我们要把新生成的点装到【点阵A】这个变量里,生成一个新的数据列表。
然后从第一级for的Done输出端,连出来display和print,把变量也关联好。此时我们在运行就能够看到运算时长从之前的4s动画编程了106ms,其实这个计算时间还包含了一次网络请求,如果扣去网速的延迟,这个计算速度会更快。
/
/
/
到这里一个基本的矩形点阵算法就写好了,最好一步也是最重要的一步,让我们把它封装成一个功能卡片。
双击程序起始端这个功能卡,打开程序的参数创建面板,增加程序的输入端和输出端。输入参数面板打开后点击【+】按钮可以创建变量。
点击新建的参数,可以设置参数的名字、数据类型(点、数值、字符)、数据形式(单个、列表、字典)、以及是否为必填参数
这里我们创建三个输入参数,x、y、S。均为小数、单个数据、不必填
输出端创建一个P。设置point3,数据列表。创建好之后不用保存,直接点【x】关掉即可。
回到编辑面板,调出core下的return模块,这个模块是程序的结束,我们可以看到刚才设置好的出口已经出现在了return上。
让我们把对应的数据相互之间关联上,去掉不必要的display和print,这样一个新模块就封装好了。
此时我们尝试运行一下,系统会提示有错误无法运行,因为目前我们还没有给这个算法配置它的输入参数。
接下来,我们新建一个ncf文件
此时我们看到main.ncf这个文件在新文件中已经可以作为一个模块被调用
最后我们用input给它输入参数,后面连上display显示这些点。然后运行程序~~~
自此恭喜各位已经开发了一个新的点阵功能模块~enjoy it
补充一下,如果大家想给卡片名字命名,直接修改ncf名字,然后重新调出就可以了

















































































