Revit python 宏与脚本
revit python macros vs scripts
为什么以下代码在 RevitPython 中作为脚本工作 Shell 但在添加到模块时作为宏抛出错误?这个想法是收集门,查询其宿主对象的防火等级和框架详细信息,然后将它们分配给门。
错误是"None type has no attribute set()"。所以一定是门元素抛出了这个错误。但是,为什么完全相同的代码(仅修改 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()
运行 它在 SharpDevelop 调试器中,您将自己看到是哪一行代码导致了问题。这将使您能够看到所有变量的值,并且您可以检查其中哪个是 None.
另外,这一行很奇怪:
wall = doc.GetElement(wallTypeId)
它正在将墙类型分配给变量墙。
正在从墙 type 中读取所有参数值,而不是从墙实例中读取。
这是你的意图吗?
如果是这样,我建议将 wall
变量重命名为 wallType
以避免混淆自己和他人。
为什么以下代码在 RevitPython 中作为脚本工作 Shell 但在添加到模块时作为宏抛出错误?这个想法是收集门,查询其宿主对象的防火等级和框架详细信息,然后将它们分配给门。
错误是"None type has no attribute set()"。所以一定是门元素抛出了这个错误。但是,为什么完全相同的代码(仅修改 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()
运行 它在 SharpDevelop 调试器中,您将自己看到是哪一行代码导致了问题。这将使您能够看到所有变量的值,并且您可以检查其中哪个是 None.
另外,这一行很奇怪:
wall = doc.GetElement(wallTypeId)
它正在将墙类型分配给变量墙。
正在从墙 type 中读取所有参数值,而不是从墙实例中读取。
这是你的意图吗?
如果是这样,我建议将 wall
变量重命名为 wallType
以避免混淆自己和他人。