2017-01-12 51 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 –