一句废话没有,直奔主题。前一阵做一个项目,对方提出这样的要求:
这是具体要求:
以水管为例就是要把项目中所有管道的管道类型修改成带有楼层,管道英文缩写(pipe),管道系统,管道材质,管径的名称的管道类型。而现在管道类型名称都是这样的:
既然甲方爸爸提出这样的要求,我再怎么挣扎也显得苍白无力。项目中水,暖,电三专业有成千上万的管线(道),手动去改不知道要到猴年马月,下面是基于Dynamo的解决方案。
先来分析一下对方的需求:楼层信息,因项目每层是独立文件,所有管线的楼层信息都是一样;管线英文缩写,水管,风管,桥架各不相同,分批处理即可;管线系统,通过管段属性读取;管道材质,根据设计说明选用合适材质,以管道为例,除污水管道采用PVC材质外其他均采用镀锌钢管材质,管道尺寸,通过管段属性读取。
一个项目中有很多种管道系统,每个系统下又有很多尺寸的管道,那么把问题简单化来说就是对一个多维列表的数据处理。
1.管道分组
首先来获取到项目中所有的管道:
获取管道的系统缩写字段的信息,并通过List.GroupByKey节点所有管道按照系统缩写关键字分组:
接着再把按照系统缩写分好组的管道再按照尺寸字段信息再次分组:
管道按照系统和 尺寸分组已完成。
2.构造出所要求的管道类型名称并分组:
输入一个数字作为楼层号,通过StringFromObject节点将其数据类型从数字(double)转换成字符串(char)与管道英文缩写PI,获取到的系统缩写,材质信息组合在一起。
再获取管道尺寸信息与前面的名称拼接,只是获取到的“25mm”需要从末尾删除两个字符变成所需要的“25”:
再将这些名称同上面一样的通过系统缩写和尺寸分组:
这样就得到了所需要的管道类型名称。
3.将污水管道的管道类型的名称中材质信息改为PVC
由于污水管道的系统缩写都是“W”,就把名称中包含“W”的项筛选出来并用“PVC”来替代其中的“镀锌钢管”,获取到原列表中包含“W”的项的索引值,再按照索引值把替换后的项回填的元列表数据中:
值得注意的是这里的List.ReplaceItemAtIndex并不是Dynamo自带节点,因为当Item输入项为列表时,默认会将整个列表作为替代项:
它并不会如愿的将列表[1,2,3]变成[4,5,6],以我使用Python三脚猫的功夫的直觉告诉我在PythonScript中应该可以做一个for循环,几行代码就能解决这个问题,奈何Python我还仅仅停留在能够阅读的小白阶段,还不会用于项目实践。好在有巨人的肩膀可以站,ClockWork节点包中的List.ReplaceItemAtIndex+节点很好的解决这个问题。
当然也可以通过类似的方法将指定系统的管道类型名称的材质信息改为指定材质,如将给水管道材质信息改为不锈钢,来满足一些个性化的需求。
4.根据名称复制出管道类型并赋值
由第一步分好组的管道,获取到管道类型,再获取到管道类型的唯一项。在这些管道类型的基础上复制出指定名称的管道类型,然后在把得到的新的管道类型赋予到每个管道上,由于每个管道类型对应着很多管道,这里的Element.SetParameterByName节点连缀选择最长:
程序运行效果:
可以看到管道的类型已经按照要求修改,污水管道材质也已变成PVC,修改风管与电缆桥架的管线类型与此类似,不再赘述。动动手指,几秒钟就能完成大量的机械,枯燥,乏味的工作,是不是心动的感jio?
最后是整个程序的节点图:
如转载请注明出处,否则追究法律责任(说说而已,全靠自觉)。
评论0