![Autodesk Revit参数化设计之道:Dynamo实战剖析](https://wfqqreader-1252317822.image.myqcloud.com/cover/758/43806758/b_43806758.jpg)
1.5 例题4:应用Dynamo绘制心形线
1.解题思路
心形线由两个函数构成,根据函数关系式,可以求得x的取值范围为[-5.4,5.4]。沿用前几个例题中“描点”法的思路,要绘制心形线首先分别找到两个函数图像上的一系列点集,然后用光滑的曲线依次连接各点即可(图1-35)。
![](https://epubservercos.yuewen.com/8A2F8F/23083818501903406/epubprivate/OEBPS/Images/29_03.jpg?sign=1739430432-s4VFLpgHNajA7Nhdfn0AXNXJ13GPq5xs-0-4ef3c3ccbf574af202b84415bd1fae3f)
图1-35
2.知识点
● List Create
● List. Reverse
● List. Flatten
● NurbsCurve. ByPoints(closeCurve)
3.例题详解
(1)创建两个函数图像上的点。绝对值也是一种函数,选择Math(数学)→Functions(函数)→Abs(求绝对值),添加Abs(求绝对值)节点,如图1-36所示。
![](https://epubservercos.yuewen.com/8A2F8F/23083818501903406/epubprivate/OEBPS/Images/30_01.jpg?sign=1739430432-cb7H6jIPJegSSf8qlVxnLcUlLM1Xy67D-0-b58a6b3d8e647f604030971d911d195e)
图1-36
这里有两个绝对值节点,它们的区别在于输入、输出的数据类型不一样:一个是double型(双精度型浮点数据),另一个是int型(整数类型),使用时根据实际项目需要选择适用的数据类型。
同理,选择Math(数学)→Functions(函数)→Sqrt(开平方根函数),添加Sqrt(开平方根函数)节点。
根据前面已学的知识点,可以顺利地找到两个函数图像上的点,主要操作步骤如下(图1-37)。
![](https://epubservercos.yuewen.com/8A2F8F/23083818501903406/epubprivate/OEBPS/Images/30_02.jpg?sign=1739430432-l2yqf2MeCwgZ9pgZWdoh8X453KmN8ShK-0-3660aa9dbe8969e31613912a071e65c2)
图1-37
1)采用Range(范围)节点来构建一组点。
2)通过Math. Abs(求绝对值)节点及数学运算符号“∗”获取一组点y=0.6|x|。
3)通过Math. Sqrt(开平方根函数)节点、数学运算符号“∗”及数学运算符号“-”获取一组点y=0.8。
4)通过数学运算符号“+”获取一组点y=0.6|x|+0.8。
5)获取一组坐标数据(x,0.6|x|+0.8)。
6)同样的方法获取另一组坐标数据(x,0.6|x|-0.8)。
提示
这两组坐标数据的x值为同一组数据,均为第一步中通过Range(范围)节点来构建的一组点。
用两个NurbsCurve.ByPoints(通过点的样条曲线)节点只能将两个函数的点分别串联,但是心形线并不能完全闭合,如图1-38所示。
(2)合并二维列表,降低二维列表维度。为了解决这个问题,首先想到的办法就是将点进行叠加,也就是把两组点变成一组点,再输入NurbsCurve.ByPoints(通过点的样条曲线)节点。
看上去是两组点的合并,实际上是对两个列表的处理。
在List(列表)下Generate(创建)里有List Create(创建列表)节点,它可以将多组列表进行叠加,如图1-39所示。
![](https://epubservercos.yuewen.com/8A2F8F/23083818501903406/epubprivate/OEBPS/Images/31_01.jpg?sign=1739430432-GybDKL9yUbtx0fDaMOPI3XSg9hQxYdGq-0-64c9e3933c4887f1287bb8a011c45d3e)
图1-38
![](https://epubservercos.yuewen.com/8A2F8F/23083818501903406/epubprivate/OEBPS/Images/31_02.jpg?sign=1739430432-n5PomZVJfqE6A1t5AE3NFnhFJ5TIpcfl-0-0e03c007078bfe8737b8ed6c01cab362)
图1-39
将两组点接入List Create(创建列表)节点,再输入NurbsCurve.ByPoints(通过点的样条曲线)节点。
结果如图1-40所示,显然问题并没有得到解决,这是为什么呢?
![](https://epubservercos.yuewen.com/8A2F8F/23083818501903406/epubprivate/OEBPS/Images/31_03.jpg?sign=1739430432-VCFChwh1z4a1rGUJkEBkloVAvuflzAs2-0-e144e250faaecd19803a933a423c0cec)
图1-40
通过查看List Create(创建列表)节点发现,它确实对列表进行了叠加,但是它依然是一个二维列表,只是被组合在一起了。
现在需要做的是将二维列表变为一维列表。
这里需要使用List(列表)下Modify(修改)里的List.Flatten(列表拍平)节点,如图1-41所示,它可以降低列表维度,默认情况是降低1个维度,也可根据具体情况设置。
降维后再次输入NurbsCurve.ByPoints(通过点的样条曲线)节点,如图1-42所示。此时实现了用一条曲线串联各点的目的,但是明显连接顺序有问题,且没有闭合。
![](https://epubservercos.yuewen.com/8A2F8F/23083818501903406/epubprivate/OEBPS/Images/32_01.jpg?sign=1739430432-Unnrcg2xKOEeOqWNaRm8a7aCvxYOkMaM-0-7c868b470fa0090f0976ffe06b12b1f4)
图1-41
![](https://epubservercos.yuewen.com/8A2F8F/23083818501903406/epubprivate/OEBPS/Images/32_02.jpg?sign=1739430432-6r2uizufJTQEIOuIXhkv7lhVKCVxoNOU-0-552325f457808e61ddbe29e1e467ec42)
图1-42
(3)调整列表中连接两个函数点的顺序。再次分析发现,NurbsCurve.ByPoints(通过点的样条曲线)是按照列表中点的顺序,依次连接各点形成曲线,如图1-43所示。
第二组数据,即h(x)函数上的点是从左边开始依次排序的,所以会出现两组数据对角相连的情况。也就是说,如果将第二组数据的排序反转,让它从右边开始排序,就不会出现图1-43中的错误情况了。
![](https://epubservercos.yuewen.com/8A2F8F/23083818501903406/epubprivate/OEBPS/Images/32_03.jpg?sign=1739430432-CjWtGgp1apgFNpWHfZMZjGJ7NUeHM3gw-0-ff47931cbc605f775f8513df84ae7fc9)
图1-43
对于列表的处理,可以使用List(列表)下Organize(组织)里的List.Reverse(列表倒序)节点。利用List.Reverse(列表倒序)节点可以将函数h(x)上的点反转排序,然后再用NurbsCurve.ByPoints(通过点的样条曲线)节点串联各点形成曲线,如图1-44所示。
运行之后发现,图1-44中的曲线并没有闭合,有一端是开放的。
![](https://epubservercos.yuewen.com/8A2F8F/23083818501903406/epubprivate/OEBPS/Images/33_01.jpg?sign=1739430432-rpmsc0dyrFgAtfPgl1OKOAgd9QmjWv16-0-71ce148e6c74e39dbc36eff29362eb07)
图1-44
这是使用的节点的问题,需要替换一个可以使曲线闭合的节点。
(4)将曲线闭合。重新寻找合适的节点,在Geometry(几何学)→Curves(线)→NurbsCurve(样条曲线)中,有多个ByPoints(通过点的样条曲线)节点,选择可以通过布尔运算控制是否闭合的节点,如图1-45所示。
替换原来的节点:在Input(输入)→Basic(基础数据)→Boolean(布尔值),修改布尔值为True(真值),也就是要求曲线闭合,这样就完成了心形线绘制,如图1-46所示。
![](https://epubservercos.yuewen.com/8A2F8F/23083818501903406/epubprivate/OEBPS/Images/33_02.jpg?sign=1739430432-EPBRi8UGWWJquUuHmiyb2UIYgfJG3YUV-0-004d226e6765fa30fe145fa03d820b09)
图1-45
![](https://epubservercos.yuewen.com/8A2F8F/23083818501903406/epubprivate/OEBPS/Images/33_03.jpg?sign=1739430432-eIg9Qn5qAxA5ey9YNG0LqOGf9UiTqRd9-0-2a9ec533949369fd1d3c92e510f4b630)
图1-46
保存文件为“心形线.dyn”。