Dynamo_参数化造型3

 

之前看见过一些设计是利用格栅天花的多个缝隙填充成一个品牌LOGO的,忽然有一个想法想用图片生成这种格栅内的造型,然而功力不够,按照思路做出来的东西和想象的相差还是有点大,这里还是把这次的失败记录下来。

演示

 

思路

开始思路是将图片读取进Dynamo,通过Dynamo获取图片的明度信息(使用的图片LOGO为白色,背景为黑色),结合图片的尺寸,在有明度的位置创建一系列的坐标点,然后再通过点生成面,面生成体,最后将LOGO和格栅做一个布尔差集,就可以获得LOGO的几何。

实际操作的时候遇到一些问题,首先是Dynamo(2.0.3版本)中没有节点可以取得插入图片的位置,于是需要使用Python调用一下API,识别图片的BoundingBox获取位置。然后比较棘手的是获得点集后,我本想用ConvexHull节点取外边线的,做到这步的时候才惊醒ConvexHull只能求凸包,取不了凹型的外边缘,翻了一下没有其他合适的节点,网上查了一些资料后发现好像点集生成凹外边缘线并没有这么简单,于是改用创建立方体的方法将LOGO生成出来,实际效果感觉不是太好,不规则的地方太多,看来要完美解决的话还是需要抽时间补充一下图形学的知识了。

节点解析

节点总览

Dynamo_参数化造型3_第1张图片

读取体量格栅的几何

格栅使用了体量的方法创建,于是几何提取到Dynamo有点绕,需要将项目里的格栅族与体量面做一个相交检测,过滤出目标格栅几何。

获得格栅几何后,还需要提取出格栅天花的位置及厚度,用作LOGO的生成。

Dynamo_参数化造型3_第2张图片

获取图片信息

图片需要取得图片路径、源图片尺寸、图片实例尺寸、图片实例的位置、像素明度这几个信息。

图片路径、源图片尺寸、图片实例尺寸这些直接通过类型参数或者实例参数读取即可,这些信息是将图像读进Dynamo或者是后面生成点集的必要数据;

图片实例的位置没有节点可以直接获得,这里使用了PythonScript调用了Revit的API,通过读取实例的BoundingBox,取得MinPoint,用这个点作为LOGO的建模基准;

像素明度通过节点Color.Brightness获取即可,获得的列表还需要做一次倒序,要不然生成的几何是倒过来的。

Dynamo_参数化造型3_第3张图片

PythonScript节点代码

import clr
clr.AddReference('ProtoGeometry')
from Autodesk.DesignScript.Geometry import *

import clr

# 导入 RevitAPI 和 RevitAPIUI
clr.AddReference("RevitAPI")
clr.AddReference("RevitAPIUI")
import Autodesk
from Autodesk.Revit.DB import *
from Autodesk.Revit.UI import *

# 导入几何体转换和元素转换方法
clr.AddReference("RevitNodes")
import Revit
clr.ImportExtensions(Revit.GeometryConversion)
clr.ImportExtensions(Revit.Elements)

# 导入 DocumentManager 和 TransactionManager
clr.AddReference("RevitServices")
import RevitServices
from RevitServices.Persistence import DocumentManager
from RevitServices.Transactions import TransactionManager

# 取得文档和程序
doc = DocumentManager.Instance.CurrentDBDocument
uiapp = DocumentManager.Instance.CurrentUIApplication
app = uiapp.Application
uidoc = DocumentManager.Instance.CurrentUIApplication.ActiveUIDocument

imageInstance = UnwrapElement(IN[0])

box = imageInstance.get_BoundingBox(doc.GetElement(imageInstance.OwnerViewId))

OUT = Autodesk.Revit.DB.Point.Create(Autodesk.Revit.DB.XYZ(box.Min.X,box.Min.Y,box.Min.Z)).ToProtoType()

生成位置集合

这里逻辑就是判断像素明度是否大于0,过滤出大于0的列表索引,然后去空,构造出行列的索引列表,再结合图像尺寸,就可以生成有明度的XY坐标位置集合。

Dynamo_参数化造型3_第4张图片

生成LOGO

剩下的就比较简单了,通过坐标生成点集合,再生成立方体,将立方体合并成一个几何后与格栅几何做布尔差集,就能获得LOGO的几何。

Dynamo_参数化造型3_第5张图片

你可能感兴趣的:(Dynamo)