![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=1739599858-tICEzroYdB4sJCGeVmyXEb3KjI1o2XsJ-0-d9c5eee3b87235517b78949930bff8d6)
图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=1739599858-7gatk8TapN0tVRsP3k3Wo1HJQ7AQ2PAx-0-b51e44208367f4cc39deb08b3db61198)
图1-36
这里有两个绝对值节点,它们的区别在于输入、输出的数据类型不一样:一个是double型(双精度型浮点数据),另一个是int型(整数类型),使用时根据实际项目需要选择适用的数据类型。
同理,选择Math(数学)→Functions(函数)→Sqrt(开平方根函数),添加Sqrt(开平方根函数)节点。
根据前面已学的知识点,可以顺利地找到两个函数图像上的点,主要操作步骤如下(图1-37)。
![](https://epubservercos.yuewen.com/8A2F8F/23083818501903406/epubprivate/OEBPS/Images/30_02.jpg?sign=1739599858-4oQbqW3NNciMXHX8kG7mnRxOwVnzZpHZ-0-b56a09ee094a9c10b2c73d3bcbce922d)
图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=1739599858-EGYLa02pWoXDlfp8rASJ2BelwpkyLmYc-0-d8f2cb5a97d14b7f7e578d55664c749d)
图1-38
![](https://epubservercos.yuewen.com/8A2F8F/23083818501903406/epubprivate/OEBPS/Images/31_02.jpg?sign=1739599858-3lm4I0miZtA46zKhty4TJQvvzrTOBTXm-0-4e0708b8b36113372bbac52e9077203e)
图1-39
将两组点接入List Create(创建列表)节点,再输入NurbsCurve.ByPoints(通过点的样条曲线)节点。
结果如图1-40所示,显然问题并没有得到解决,这是为什么呢?
![](https://epubservercos.yuewen.com/8A2F8F/23083818501903406/epubprivate/OEBPS/Images/31_03.jpg?sign=1739599858-RuCXFlO6RXX5wPEAodulEN6AXDkdGIbf-0-f4a1819b7a8be79c21926b125f9b74b5)
图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=1739599858-p3yB27RwPVINsM06l2MziYypTnwXzS4j-0-dfa57b6ab5fd20fb143821182c3cb6dc)
图1-41
![](https://epubservercos.yuewen.com/8A2F8F/23083818501903406/epubprivate/OEBPS/Images/32_02.jpg?sign=1739599858-fYd5HJ9JnJ0xRD12WJYlLDMYL0dyt9NM-0-df562bdda73fc10a42dca4f0bf63dee3)
图1-42
(3)调整列表中连接两个函数点的顺序。再次分析发现,NurbsCurve.ByPoints(通过点的样条曲线)是按照列表中点的顺序,依次连接各点形成曲线,如图1-43所示。
第二组数据,即h(x)函数上的点是从左边开始依次排序的,所以会出现两组数据对角相连的情况。也就是说,如果将第二组数据的排序反转,让它从右边开始排序,就不会出现图1-43中的错误情况了。
![](https://epubservercos.yuewen.com/8A2F8F/23083818501903406/epubprivate/OEBPS/Images/32_03.jpg?sign=1739599858-bG2SD9k9WXYWmQIyg9UBsplSkVeaITMW-0-e86a110662b3a8dfe6c898fdba1aca45)
图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=1739599858-Z7O6GLrWPSwdZ7dNALJrUr3LVJk7A839-0-76a8686ccc14f8ba2156c1b556f0db0a)
图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=1739599858-1FbCHfIiXkeGMoP0mqu2BJoVo4JzC4Kg-0-8bdf25430acd0f03ce26cc20af528fdc)
图1-45
![](https://epubservercos.yuewen.com/8A2F8F/23083818501903406/epubprivate/OEBPS/Images/33_03.jpg?sign=1739599858-aSZ8Wc2Ldw35GPkQAeIDhpUrhUTlaQVZ-0-6dfcacf9b654cd7dab709f72c11e4a31)
图1-46
保存文件为“心形线.dyn”。