[dynamo]獲取構件位置並生成報表(eg.1軸交A軸)
最近帶領一位實習的同學 @院長不會長圓 完成了這個程序,下面介紹一下生成構件位置的一個做法。
我們在使用Revit的過程中,經常有生成報表的需求。利用dynamo導出構件各項屬性還是很方便,但描述構件位置一直是一個頭疼的問題。(例如:1軸交A軸)
1.獲取構件信息
這個功能很好寫,主要使用「GetParameterValueByName」。
我們EPC現場的同事在Revit模型中記錄了各種施工上遇到的問題,並拍了照片,將鏈接輸入到Revit對應構件的URL屬性上。
篩選構件和獲取構件屬性很好實現不再複述。
不是所有的構件都在「設計施工問題」有值。
靠GetParameterValueByName獲取信息,利用FilterByBoolMask或者直接用python篩選。
2.生成構件在軸網中的位置。
由於對python中調用RevitAPI還不熟悉,借用了 @李思凡 的
李思凡:[Dynamo]如何自動調整軸線影響範圍中的代碼
思路就是
先獲取構件的質心坐標,
分別選擇字母軸,和數字軸,利用RevitAPI中Curve.Distance()函數,得到質心到所有軸網的距離。
import clrnclr.AddReference(ProtoGeometry)nfrom Autodesk.DesignScript.Geometry import *nnclr.AddReference("RevitAPIUI")nfrom Autodesk.Revit.UI import TaskDialognnclr.AddReference("RevitAPI")nimport Autodesknfrom Autodesk.Revit.DB.Events import *nfrom Autodesk.Revit.DB import *nfrom math import *nnclr.AddReference("RevitNodes")nimport Revitnclr.ImportExtensions(Revit.Elements)nclr.ImportExtensions(Revit.GeometryConversion)nnclr.AddReference("RevitServices")nimport RevitServicesnfrom RevitServices.Persistence import DocumentManagernfrom RevitServices.Transactions import TransactionManagernn#注意這裡要調用C#的List不然我們無法給method提供List<ElementId>nclr.AddReference(System)nfrom System.Collections.Generic import ListnnDOC = DocumentManager.Instance.CurrentDBDocumentnnBOPTIONS = Autodesk.Revit.DB.SpatialElementBoundaryOptions()nVER = DOC.Application.VersionName.replace("Autodesk Revit ", "")nLOC = DOC.Application.Language == Autodesk.Revit.ApplicationServices.LanguageType.Chinese_Simplifiednn#引入元素需要解包ntnGrids = UnwrapElement(IN[0])npts=IN[1]nnpts=[]nfor pt in pts:ntnpts.append(pt.ToXyz())n#ndis=[]nfor pt in npts:nttmp=[]ntfor grid in Grids:ntttmp.append([grid.Curve.Distance(pt),grid.Name])ntttmp1=map(list,zip(*tmp))ntdis.append(tmp1)nnOUT = disn
IN[0]是軸網對象
IN[1]是構件質心點對象
其實這裡嘗試了很多方法,
最初試著直接把軸網curve導出成dynamo中的curve,但不知道怎麼強制轉換。
直接獲取軸網的坐標數字導出用dynamo重繪軸網再判斷,但使用API中GetEndPoint()一運行就崩。
可以直接獲取軸網交點坐標,歷遍構件質心與其交點,但有可能獲得的是數字+數字或者字母+字母。最終還是想得到分別獲取數字軸和字母軸再進行運算。
獲取軸網目前寫的是手動分別選取數字軸和字母軸,更方便可以直接使用類別選擇出所有軸網對象,通過字母數字軸分類輸入到python中。
樓層獲取只是獲取了level對象然後把質心z坐標做判斷在哪個範圍區間,其實不是很準確。最好還是分類別把梁、板、柱等分別獲取參照標高或其他標高參數。
然後獲得最近的距離,返回軸網標號,字元串處理後如下圖。
3.匯總數據,寫html文件
將幾個屬性匯總,如下圖:左邊結果,一個構件的四個屬性:ID,類別,位置,鏈接。
然後通過這個數組生成HTML,包含一個表格。
W3School在線測試工具 V2我們從w3school找一個表格案例,按照規則生成。
import renimport clrnclr.AddReference(ProtoGeometry)nfrom Autodesk.DesignScript.Geometry import *n#該節點的輸入內容將存儲為 IN 變數中的一個列表。ndatalst = IN[0]ndef replacekg(a):ntreturn a.replace(" ", "&nbsp;")n#替換url中的空格ndef getqu(str):n dotre=re.compile(r".www.?$")n return dotre.sub("",getlnkname(str))n#正則處理擴展名ndef getlnkname(str):n wtre=re.compile(r"")n new=wtre.split(str)[-1]n return newn#正則處理文件鏈接nnres=[]nres.append("<html>")nres.append("<head>")nres.append("<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />")nres.append("</head>")nres.append("<html>")nres.append("<body>")nres.append("<table border="8">")nres.append("<tr>")nres.append("<th>序號</th>")nres.append("<th>問題</th>")nres.append("<th>構件</th>")nres.append("<th>位置</th>")nres.append("<th>ID</th>")nres.append("<th>鏈接</th>")nres.append("</tr>")ni=0nfor data in datalst:nti=i+1ntres.append("<tr>")ntres.append("<td>"+str(i)+"</td>")ntres.append("<td>"+getqu(data[3])+"</td>")ntres.append("<td>"+data[1]+"</td>")ntres.append("<td>"+data[2]+"</td>")ntres.append("<td>"+data[0]+"</td>")ntres.append("<td><a target="_blank" href="+replacekg(data[3])+">"+ getlnkname(data[3]) +"</a></td>")ntres.append("</tr>")n nres.append("</table>")nres.append("</body>")nres.append("</html>")nhtm=""nfor tmp1 in res:n htm=htm+tmp1+"n"n#加入回車方便閱讀nn#將輸出內容指定給 OUT 變數。nOUT = htmn
然後輸入到File.WriteText,就生成了html文件。
運行這個網頁文件的效果:
這樣就把問題及鏈接整理了出來。
點擊鏈接會彈出對應位置的圖片或者文檔。
後期維護,如果有新增項,只需要在Revit啟動本腳本直接點擊,就可以重新生成最新的網頁文件。
推薦閱讀: