revit python宏与脚本

2024-06-01 20:43:25 发布

您现在位置:Python中文网/ 问答频道 /正文

为什么下面的代码在revitpythonshell中作为脚本工作,但在添加到模块时却以宏的形式抛出错误?其思想是收集门,查询其宿主对象的防火等级和框架详细信息,然后将其指定给门。在

错误是“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()

Tags: instancenonedocifisnotframefire
1条回答
网友
1楼 · 发布于 2024-06-01 20:43:25

在sharpdevelople调试器中运行它,您将亲眼看到是哪一行代码导致了问题。这将使您能够看到所有变量的值,并且您可以检查其中哪一个是空的。在

此外,这句话很奇怪:

wall = doc.GetElement(wallTypeId)

它将wall类型指定给变量wall。在

所有参数值都是从wall类型读取的,而不是墙实例。在

这是你的意图吗?在

如果是这样,我建议将wall变量重命名为wallType,以避免混淆自己和他人。在

相关问题 更多 >