最近在学习Dynamo读取Excel数据,想把最近的学习以博客的形式记录一下。Dynamo读取Excel数据有两种方式(.NET方法与Dynamo原生方法,初学这个的小伙伴可以去b站上搜相关视频。
第一种形式:以Net方式读取Excel数据
#1、使用.Net方法读取已有的Excel表信息,并创建族实例(难)
import clr
clr.AddReference('ProtoGeometry')
from Autodesk.DesignScript.Geometry import *
from Autodesk.DesignScript.Geometry import Point as DyPoint
#导入Dynamo封装的revit模块
clr.AddReference("RevitNodes")
import Revit
from Revit.Elements import *
#载入office模块
clr.AddReferenceByName('Microsoft.Office.Interop.Excel, Version=11.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c')
import System
#clr.AddReference("Microsoft.Office.Interop.Excel")
import Microsoft.Office.Interop.Excel as MOExcel
from System import Array
#该节点的输入内容将存储为 IN 变量中的一个列表。
dataEnteringNode = IN
#获得excel程序
excel=MOExcel.ApplicationClass()
excel.Visible=True
excel.DisplayAlerts = False
#打开工作环境(文档)
System.Threading.Thread.CurrentThread.CurrentCulture = System.Globalization.CultureInfo("en-US") #防止中英文出错
workbook=excel.Workbooks.Open(IN[0])
#新建sheet
worksheet=workbook.Worksheets[1] #从1开始的
workbook.ActiveSheet
#读取范围数据
xlrange=worksheet.Range["A1","C6"]
string=xlrange.Address[False,False] #打印数据范围
a = Array.CreateInstance(float, 6, 3)
a = xlrange.Value2
i=1
while i<6:
p1=float(a[i,0])
p2=float(a[i,1])
p3=float(a[i,2])
point=DyPoint.ByCoordinates(p1,p2,p3)
famInstance=Revit.Elements.FamilyInstance.ByPoint(IN[1],point)
i=i+1
#将输出内容指定给 OUT 变量。
OUT =famInstance
第二种方式:Dynamo原生节点方法(REVIT2018)
#3、使用dynamo自带节点方法读取Excel数据,并创建族实例
import clr
clr.AddReference('ProtoGeometry')
from Autodesk.DesignScript.Geometry import *
from Autodesk.DesignScript.Geometry import Point as DyPoint
#导入RevitAPI与RevitUI
clr.AddReference("RevitAPI")
clr.AddReference("RevitAPIUI")
import Autodesk
from Autodesk.Revit.DB import *
from Autodesk.Revit.UI import *
#引入文档与事务模块
clr.AddReference('RevitServices')
from RevitServices.Persistence import DocumentManager
from RevitServices.Transactions import TransactionManager
#导入Dynamo中的Revit封装模块
clr.AddReference("RevitNodes")
import Revit
from Revit.Elements import *
#几何转换与非几何转换
clr.ImportExtensions(Revit.Elements)
clr.ImportExtensions(Revit.GeometryConversion)
#导入系统文件操作
import System
from System.IO import FileInfo
#导入Dynamo中EXCEL读取功能模块
clr.AddReference("DSOffice")
from DSOffice import Excel
# 该节点的输入内容将存储为 IN 变量中的一个列表。
dataEnteringNode = IN
#创建族实例
#【1】获取Excel文档
excel_f=FileInfo(IN[0])
#【2】读取Excel文档中数据(ReadFromFile(文档,工作表名称,是否为字符串类型))
ColunmInfo1=Excel.ReadFromFile(excel_f,"Sheet1",False)
ColunmInfo2=Excel.ReadFromFile(excel_f,"Sheet1",True)
#【3】声明list储存族实例
column_list=[];
#【4】获取当前文档
revitDoc=DocumentManager.Instance.CurrentDBDocument
#【5】过滤族类型方法
def GetFamilyTypes(revitDoc,str_N):
#过滤符合条件的柱类型
collector=FilteredElementCollector(revitDoc)
#元素过滤
result=collector.OfCategory(BuiltInCategory.OST_Columns).OfClass(FamilySymbol).ToElements()
for symbol in result:
if symbol.get_Parameter(BuiltInParameter.ALL_MODEL_TYPE_NAME).AsString()==str_N:
return symbol
#【6】读取excel文档,创建族实例
for i in range(1,10):
x=ColunmInfo1[i][1];
y=ColunmInfo1[i][2];
z=ColunmInfo1[i][3];
ctype=ColunmInfo1[i][4];
rotate=ColunmInfo1[i][5];
point=DyPoint.ByCoordinates(x,y,z)
famInstance=Revit.Elements.FamilyInstance.ByPointAndLevel(GetFamilyTypes(revitDoc,ctype).ToDSType(True),point,IN[1])
famInstance_r =Revit.Elements.FamilyInstance.SetRotation(famInstance,rotate)
column_list.append(famInstance_r)
#将输出内容指定给 OUT 变量。
OUT = column_list
结果如下:
第二中方法:参考博客https://blog.csdn.net/birdfly2015/article/details/85057379



