完善主体资料,免费赠送VIP会员!
* 主体类型
* 企业名称
* 信用代码
* 所在行业
* 企业规模
* 所在职位
* 姓名
* 所在行业
* 学历
* 工作性质
请先选择行业
您还可以选择以下福利:
行业福利,领完即止!

下载app免费领取会员

NULL

5cdd2dc095060.jpg

想要一摸一样的BIM模型?试试Dynamo复制一个!

发布于:2020-12-17
首页/BIM专题
2540
分享

我之前在利用Civil3D做道路模型,然后利用DynamoforCivil3D将道路模型转化为Revit模型,但是导入到Revit中模型的坐标是设计图纸中的绝对坐标,导致模型的坐标与Revit中的坐标原点距离太远,导致我们无法在Revit中查看到模型。所以我想利用RevitAPI尝试将所有的模型统一复制到Revit的坐标原点。使得我们可以在Revit中可以查看到我的模型。以下就是我的研究过程:

我查阅了RevitAPI指导手册,找到了如下的方法:

腿腿教学网-想要一摸一样的BIM模型?试试Dynamo复制一个!

一共有四种方法可以复制模型,但是通过过滤第二种方法最适合我当前的需求。

腿腿教学网-想要一摸一样的BIM模型?试试Dynamo复制一个!

我们就可以参照这个方法的C#例子得到大致的语法了

ElementTransformUtils.CopyElements(Document,ICollection(ElementId),XYZ)

从语法得出,我们需要三个输入参数依次为要工作的文档、模型的ID,以及向量坐标。

此时我们就直接打开PythonScript,首选先创建标准样板:

#加载PythonStandardDesignScript

importsys

importSystem

importclr

clr.AddReference('ProtoGeometry')

fromAutodesk.DesignScript.Geometryimport*

clr.AddReference("RevitAPI")

importAutodesk

fromAutodesk.Revit.DB.Eventsimport*

fromAutodesk.Revit.DBimport*

clr.AddReference("RevitNodes")

importRevit

fromRevit.Elementsimport*

fromRevit.GeometryConversionimport*

clr.AddReference("System")

fromSystem.Collections.GenericimportList

clr.AddReference("RevitServices")

importRevitServices

fromRevitServices.PersistenceimportDocumentManager

fromRevitServices.TransactionsimportTransactionManager

doc=DocumentManager.Instance.CurrentDBDocument

这个时候我们就可以开始准备输入端口了。

由于Dynamo中的单位是英寸,我想将其转化为Revit中的米。我查阅了API手册找到如下方法:

同样我们也可以参照这个方法的C#例子得到大致的语法了:

UnitUtils.ConverToInternalUnits(double,DisplayUnitType)

从语法得出,我们需要两个输入的参数依次为要数值、要转换的单位类型,DisplayUnitType是一个枚举,在手册中点击DisplayUnitType,就可以查看其枚举的内容,有好多,我要转为m,所以选择DUT_METERS,这样单位转换解决掉了。

直接上代码:

UnitType=Autodesk.Revit.DB.DisplayUnitType.DUT_METERS

x=UnitUtils.ConvertToInternalUnits(float(IN[1]),UnitType)

y=UnitUtils.ConvertToInternalUnits(float(IN[2]),UnitType)

z=UnitUtils.ConvertToInternalUnits(float(IN[3]),UnitType)

此时就剩余一个向量点了,这个就很简单了直接看代码:

XYZ=XYZ(x,y,z)

这时貌似所有的输入端口都完成了,接下来我们就将这些输入端填写到上述的方法里边看看是否能够成功。

PS:我文章最开始已经说了,我需要将多个模型统一复制到同一个位置,所以此处需要获得多个模型的ID,所以会用到for循环。

此时方法已经填写完毕,待我在外部选择多个模型和填写坐标值后看看会发生什么事情。

很遗憾,没有按照我们既定的想法去实现,报错了:

Ele=ElementTransformUtils.CopyElements(doc,b,XYZ)

通过报错提示,说我们方法中的a,也就是ElementId接受的需要是一个ICollection[ElementId],但是我们却给它输入的是一个列表。这个问题一直卡了我很久。但是当我仔细看了一下API手册和查阅相关资料,终于知道问题出在哪了:

API中其实已经说的很明白了,此时只需要添加一下内容就可以了。在我们创建标准样板的时候添加一下三行代码

importSystem

clr.AddReference("System")

fromSystem.Collections.GenericimportList

以及在进行for循环的时候添加一下代码就可以了:

b=List[ElementId](a)

此时我们运行,就没有任何错误提示:

Revit即可完成我们想要的操作了~

以下是完整的代码:

importsys

importSystem

importclr

clr.AddReference('ProtoGeometry')

fromAutodesk.DesignScript.Geometryimport*

clr.AddReference("RevitAPI")

importAutodesk

fromAutodesk.Revit.DB.Eventsimport*

fromAutodesk.Revit.DBimport*

clr.AddReference("RevitNodes")

importRevit

fromRevit.Elementsimport*

fromRevit.GeometryConversionimport*

clr.AddReference("System")

fromSystem.Collections.GenericimportList

clr.AddReference("RevitServices")

importRevitServices

fromRevitServices.PersistenceimportDocumentManager

fromRevitServices.TransactionsimportTransactionManager

doc=DocumentManager.Instance.CurrentDBDocument

#将单位转换为米

UnitType=Autodesk.Revit.DB.DisplayUnitType.DUT_METERS

x=UnitUtils.ConvertToInternalUnits(float(IN[1]),UnitType)

y=UnitUtils.ConvertToInternalUnits(float(IN[2]),UnitType)

z=UnitUtils.ConvertToInternalUnits(float(IN[3]),UnitType)

#创建向量

XYZ=XYZ(x,y,z)

#执行事务

TransactionManager.Instance.EnsureInTransaction(doc)

#dynamo模型转换为revit模型(解封)

Elements=UnwrapElement(IN[0])

a=[]

foriinElements:

a.append(i.Id)

b=List[ElementId](a)

#复制模型

Ele=ElementTransformUtils.CopyElements(doc,b,XYZ)

#结束事务

TransactionManager.Instance.TransactionTaskDone()

#输出结果

OUT=Ele

特别注意:由于此段代码,我在转换单位的时候是米,所以我们在进行运行程序之前要先将Revit中的单位改为米,这样我们运行程序就不会有什么问题了。最终的Dynamo文件,由于使用了DataShapes,大家需要自行下载。

腿腿教学网-想要一摸一样的BIM模型?试试Dynamo复制一个!

文章来源:BIM的乐趣

仅作分享交流,文章著作权归原作者所有。

转载请注明来源本文地址:https://www.tuituisoft/bim/18694.html

未标题-1.jpg

上一篇:没有了

下一篇:没有了

微信咨询
扫描客服微信
QQ咨询
联系QQ:

2158157721

电话咨询
咨询电话:

15359439502

APP下载
扫码关注
关注微信公众号
返回顶部