研发动态

自动批量建族?一步神奇的骚操作! [课程编码973]

[复制链接] []
发表于 2020-9-10 18:14:44| 字数 4,373 | 显示全部楼层 |阅读模式
事情的缘由是这样的。最近他一直在琢磨怎么通过Python编程和Dynamo带来更高的生产力,也经常在群里和大家探讨,回答教程问题,已经成了群宠。 012739lj6ubo9pajppj6u0.jpg 于是,Vctcn93就和Null要来了图纸,答应大家周末抽空把节点和教程给写出来。不过,在叫了对方好几声哥们之后,经@开开提醒,Null是女生,事情的发展又比预想的迅猛很多 012739by7787y7jxzxff7y.jpg 尽管他和我说,主要是因为本来觉得很简单的一个脚本,越琢磨越有意思,好玩的知识点很多,于是越写越兴奋,这才搞了8个小时。咳咳。Anyway,Vctcn93找到我,说他觉得挖出来的知识点很有趣,单独发群里有点浪费,问我是否愿意发文分享给大家。他不好意思地说:「等我出大点的教程吧,毕竟我也穷。不过这个教程挺小的,等我异化出更牛逼的东西来,再做成视频教程。」我仔细看了一下他的思路,确实很有启发。于是答应下来,拿出时间把他的思路和成果整理成大家更容易阅读的文章,免费分享给所有人看。暂时不想做,也可以花十几分钟读一遍,重点看看思路,领略一下Dynamo和Python的自动化之美,以及用自动化解决重复问题时那种灵光乍现的酸爽。下面正式开始—— 012743s4kklk4uuko6lkxo.jpg 首先你需要掌握一点基础知识。我们先到 Revit 中制作一个简单的自适应族,来搞清楚自适应构件的原理。 012743lwkkhdhkadyo64gw.jpg 012746yr6gf33vi1l5n3pn.jpg ➤ 全选点,然后点击上部面板下的 使之自适应 按钮。它们就变成了这个样子:➤ 使用线工具,并打开 三维捕捉。➤ 依照 点 上方的序号(index),依次链接各点。➤ 选中全部的线,点击 创建实体形状。这时,我们就成功创建了一个简单的 自适应嵌板。左侧的属性栏可以调整厚度。➤ 保存一下,新建一个项目,把建立的族加载进项目中,只要给定任意的四个点(按顺序点击四下),就能得到依照点生成的嵌板。以上就是制作一个简单自适应族的过程。拓扑关系是图形学中的常用概念,本质就是把各种图形,抽象简化为各个点之间的关系。有了这些基本的关系,我们则不需要在乎它绘制出来究竟是什么形状。我们在制作 自适应族构件的过程中,有一个重点操作叫使之自适应,它的作用是记录各个点的位置、顺序、谁与谁相连等拓扑关系。当我们使用线将各个点连接起来的时候,这个点就会记录下另外哪两个点和自己相连,而它不会在乎这两个点在空间中的什么位置。我们在使用这个族的时候,点击四下,这个操作是告诉Revit预先设定的四个点的空间坐标,它们是我们使用族的输入信息。族的输出状态=预设定默认信息+使用时的输入信息在这个族里,输入信息的重点在于顺序,它决定了点的序号,决定了谁去找谁连线,决定了拓扑关系,从而决定了最终的形状。 012747ci9338l3zulzic8i.jpg 在 Dynamo 中,有一个使用自适应族的强大节点: 012748ci5bj0a56gjpa7l4.jpg 012750kh3e1s7q0u5zo5oh.jpg 012751cu422ms4tjzj0zax.jpg 假设我们有一个需要四个点生成的自适应嵌板,则我们先来模拟建立点的二维数组,下面的代码你不懂python也能大概看懂:[Point.ByCoordinates(1000, 0, 0),Point.ByCoordinates(0, 1000, 0)[Point.ByCoordinates(2000, 0, 0),Point.ByCoordinates(1000, 1000, 0)[Point.ByCoordinates(3000, 0, 0),Point.ByCoordinates(2000, 1000, 0)这段代码,Dynamo 中的 CodeBlock 与 Python 都可以直读,结果会生成一个 点阵(Points Array)。在上面的 points数组(List)中,每一个元素都是一个小数组,每个小数组里又包含了四个点。我们把数据点阵和族类型Family Types连接到AdaptiveComponents.ByPoints这个节点上。依照上面的点数据,Dynamo 便会依照每一个嵌板的输入点,生成 3个 自适应嵌板。在Dynamo 中看不见族的加载结果,我们得切换回 Revit 界面中才能看到。有多少个 points 数据,将决定我们生成多少块玻璃嵌板,嵌板中的点,即是嵌板的拓扑关系,Dynamo 将根据这四个点的位置与顺序,把嵌板放进去。顺序非常关键。03 解决问题为了降低难度,我将把她的图简化为方方正正的矩形,制作的时候也先暂时忽略尺寸,我们需要根据这个矩形,来运用一下刚刚所学到的东西。➤ 制作Dynamo脚本之前,我们需要先思考一下:· 未来能否扩充与异化?先来看第一个问题,对于这个简化版的脚本,我需要的参数是:· 每块面板的高度➤ 这些参数当然不能一个个手动输入,所以在一开始,我们就把这三个参数做成 Number Slider 节点,放置到界面的最左边,把它们重命名,并编组为 参数调节:这里需要注意两点:· 嵌板的个数必须是整数,所以面板个数的间距(step)一定要是整数。 012752uwzxdigmtksf118t.jpg 此处使用 Code Block代码来完成:➤ 然后把面板长度与面板个数分别输入到step与quentity两个输入之中,便可生成第一个数组,也就是未来各点的 x 坐标值:➤ 有了各点的 x 坐标值,我们便可以使用 Geometry.Translate 节点,把原点按照坐标批量生产。➤ x轴方向搞定后,接下来以同样的方法,把这条线上的点,依照嵌板高度,在 y 方向上做条一模一样的出来:到此为止,我们便制作了一个参数化、实时可调的点阵(Points Array)。根据我们前面说的拓扑知识,输入进 AdaptiveComponents.ByPoints 节点中的点顺序,一定要正确反应嵌板的拓扑关系。 012754xxkokyyyoxynyzhh.jpg 012756n96n8ws19sdsjwn7.jpg ➤ 接下来就是Python 数据处理。· 我想要那些参数?· 是否有优化效率的可能?在这种思路下,我们来开始写下面的脚本。这里有点烧脑,看不懂代码没关系,蓝色的字是中文代码说明:import clrfrom Autodesk.Design.Geometry import *dataEnteringNode = IN__author__ = 'Vctcn93'__publisher__ = 'ArchiPython'result = list # 创建一个用以装载结果的空列表current_line = data # 当前的线<i>for k in range(len(current_line) - 1): # 拿取线上的每一个点node.append(current_line[k]) # 添加第 0 号点node.append(next_line[k + 1]) # 添加第 2 号点result.append(node) # 把嵌板点组添加到结果中OUT = result # 输出结果 012758fgso7g7ghi7ogrgf.jpg 012759oio7ilie414uokwi.jpg 012801ocrl3u7k1osv8oz7.jpg 03 异化不过,每次建立一个程序,我们都要思考,能不能再它的基础上,用抽象思维去解决更多的事?比如这个案例,可以思考一下:能不能任意形状都能自动生成?➤ 首先,在 Revit 中,使用模型线工具绘制 4条 三维曲线:注意:这些线可以足够异型,但不可以在同一标高上,这样才能构成正确的拓扑关系。➤ 下面,我们在 Dynamo 中使用 Select Model Elements 节点,将这四条线由下至上(你看,顺序真的很重要)选进 Dynamo 中。➤ 接下来,再使用 Element.Geometry 的方式让这些线在 Dynamo 中可见,且能被处理。➤ 关于参数的设置,因为目前是弧线且不等长的缘故,再想让嵌板数量与嵌板长度兼得可调是不可能了,所以我们可以仅要嵌板长度这一个可调参数。还没完,嵌板数量也是一个很重要的参数,我们该怎样获取呢?呃,是小学数学,就是取个平均值啦➤ 先算出四条线的平均长度,再使用平均长度除以嵌板长度,便是我们的嵌板数量。可是由于这个值除出来之后很有可能是小数,我们可以取最接近这个值的整数,作为每条边的嵌板数量。这一步是怎么来的呢?parameter是把样条曲线的起点值当作 0,终点值当作 1,不管样条曲线多长,多曲折,都具有这样的属性。知道了这样的一个特性,那么我们想把一条样条曲线均分为 嵌板个数段,只要把 0 到 1 均分为长度为嵌板个数的数组就好了。0..1..#steps 012803zfinaoyyyt2gqogy.jpg 012805ycxcc8xffhfstu1h.jpg 刚刚编写代码的时候,是用的抽象方法,所以不用改一个字,就能直接让新的脚本用上它,这就是抽象的好处。➤ 最后使用 AdaptiveComponents.ByPoints 节点,就能在 Revit 中找到做好的嵌板了。 012808qoa95fyvzy3zsyyp.jpg 012812yhvbhp6mpv3cvabb.jpg 04 小姐姐的需求 012813d2b8cbcfgutbgbvn.jpg 012813ulwlbumwlk5w0rrb.jpg 按照我们的顺序,是第一块嵌板的最后一点,与第最后一块嵌板的第二点。➤ 先打开初始版.dyn,加两个参数:➤ 再回到我们第一次用 Python 处理完成之后的点组位置:➤ 由于 Dynamo 自带的节点更改数据十分麻烦,所以我们再请出 Python写一个脚本,修改目前点数组中,第一组第4点,以及最后一组第2点的值,给它们做一个偏移。 012815y6qy7ddqy7yf6ty7.jpg # 启用 Python 支持和加载 Design 库clr.AddReference('ProtoGeometry')# 该节点的输入内容将存储为 IN 变量中的一个列表。# 将代码放在该行下面__date__ = 20190706data = IN[0] # 将刚刚的数据,赋予到变量 data 中right_offset = IN[2] # 右端偏移值point2 = data[-1][1] # 拿取最后一组第二点的点坐标data[-1][1] = Point.ByCoordinates(point2.X + right_offset, point2.Y, point2.Z) # 重新创造偏移后的点,取代原先的点OUT = data # 输出结果 012815gos7cxhixb0oeihx.jpg ➤ 新点阵通过AdaptiveComponents.ByPoints 节点,输入到 Revit 中,我们便得到了左端偏移、右端偏移、嵌板个数、嵌板长度、嵌板高度,这五个数值可调的参数化构件了。我们把最终的成果储存为「小姐姐版.dyn」,下载链接见文末。Vctcn93的教程结束了,最后来给你总结一下,说说我们的观点。· 拓扑关系与自适应族的概念· 如何有效地使用 Python 为自己加速这也是他为之前在知乎上免费开源写的一系列文章《Dynamo速成大法》填的一个坑。 012817izxebshcsxhs9a09.jpg 侵权真的会让人伤心的。大家最终看到的这篇东西,来自于社群里每一个人的高质量提问、不撕逼的交流氛围、对版权的共同维护、还有小伙伴们像朋友一样的彼此信任。发文多了,我们也会经常收到这样的评论:「你的这个不行,XXX用XXX早就实现了。」原因并非因为他说的不对,而是我们觉得,人的表达分为两种:高水平的人,也会有低水平的分享,而我们更关注「分享」的水平。正如Vctcn93自己所说:拒绝嘴遁,从我做起。如果对Python感兴趣,想深入学习,知乎上搜索「九章Python」,是Vctcn93写的入门学习教程。当然,也会收点费,毕竟——今天的教程完全免费,建议收藏随时看。Vctcn93做的三个Dynamo成果也免费分享给大家,下载地址请见评论区置顶。注:· 但请大家知悉主要原创工作为Vctcn93做出,本篇原创已授权Vctcn93在其个人名下的平台号转发。<font style="color:rgb(25, 25, 25)">
回复 申请删帖

使用道具 举报

  • 联系我们
  • 邮箱:837005074#qq.com(请把#改成@)
  • 电话:18810188033
  • QQ客服 837005074
  • 人工客服:周一至周日(晚6点至11点)
  • 扫描加客服QQ

  • 扫描加客服微信

QQ|关于我们|Archiver|手机版|小黑屋|畅建科技 ( 京ICP备2022013818号-3 )

GMT+8, 2024-5-5 03:22 , Processed in 0.700549 second(s), 57 queries .

Powered by 找最好 X3.4

© 2015至今 zhaozuihao.com