2017-01-12 48 views
0

爲什麼下面的代碼在RevitPython Shell中作爲腳本工作,但在添加到模塊時將錯誤作爲宏拋出?這個想法是收集門,查詢他們的主人對象的防火等級和框架細節,然後將他們對準門。修復python宏與腳本

錯誤是「無類型沒有屬性設置()」。所以它一定是拋出這個錯誤的門元素。但是,爲什麼代碼非常相似(只是修改doc的定義)作爲腳本而不是宏來執行?

def updateDoors(self): 
    doc = self.Document 
    doors = FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_Doors).WhereElementIsNotElementType().ToElements() 

    t = Transaction(doc, 'Door Update') 
    t.Start() 

    for d in doors: 

     wallRating = "---" 
     doorRating = "---" 
     doorNumber = "---" 
     wallFr = "---" 
     wallH = "---" 
     wallJ = "---" 

     if d.Host is not None and d is not None: 

      wallTypeId = d.Host.GetTypeId() 
      wall = doc.GetElement(wallTypeId) 
      if wall.LookupParameter('Fire Rating') is not None: 
       wallFr = wall.LookupParameter('Fire Rating').AsString() 
      # Get Door Jamb from the wall 
      if wall.LookupParameter('Frame Jamb') is not None: 
       wallJ = wall.LookupParameter('Frame Jamb').AsString() 
      # Get Door Head from the wall 
      if wall.LookupParameter('Frame Head') is not None: 
       wallH = wall.LookupParameter('Frame Head').AsString() 

      if str(wallFr) == '': 
       d.LookupParameter('Fire Rating-Instance').Set('--') 
      if str(wallFr) == '0': 
       d.LookupParameter('Fire Rating-Instance').Set('--') 
      if str(wallFr) == '1': 
       d.LookupParameter('Fire Rating-Instance').Set('45') 
      if str(wallFr) == '2': 
       d.LookupParameter('Fire Rating-Instance').Set('90') 
      if str(wallFr) == '3': 
       d.LookupParameter('Fire Rating-Instance').Set('120') 

      if d.LookupParameter('Over ride wall assigned details').AsValueString() == 'No':  
       d.LookupParameter('Jamb').Set(wallJ) 
       d.LookupParameter('Head').Set(wallH) 

    t.Commit() 

回答

1

在SharpDevelop調試器中運行它,你會看到自己哪一行代碼導致了這個問題。這將使您能夠查看所有變量的值,並且可以檢查其中哪些爲無。

此外,這條線是很奇怪:

wall = doc.GetElement(wallTypeId)

據分配壁類型到可變壁。

所有參數值正在從牆上讀取類型,而不是wall實例。

是你的意圖嗎?

如果是這樣,我建議將wall變量重命名爲wallType以避免混淆您自己和他人。

+0

謝謝傑里米。是的,其目的是從牆系中收集「類型」參數並將它們分配給門的「實例」參數。我的調試器運行時會引發錯誤,所以我重新啓動了機器。現在這個腳本工作...調試101? –

+0

除了設置「門框」和「頭部」參數之外,一切都很好地工作。錯誤是「多個目標可以匹配」。讓我相信門系列或實例名爲'head'和'jamb'有多個參數 - 雖然通過元素搜索,但我並不認爲這是事實。我正努力讓調試器運行而不會崩潰。我需要看看這個。 –

+1

祝賀前進。是的,當您通過顯示名稱(不推薦!)選擇參數時,可以爲同一名稱獲取多個值。閱讀更多內容以及如何在此處應對:http://thebuildingcoder.typepad.com/blog/2015/06/cnc-direct-export-wall-parts-to-dxf-and-sat.html#2015.2 –