Revit Python Shell:如何获取项目中没有实例的 'Pipe Types' 族的类型名称?

Revit Python Shell: How to get Type names of 'Pipe Types' Family with no instances in project?

最终目标是将我想要的 PipeType (Plex Wire) 的 ElementId 传递给 Pipe.Create,但我不知道如何在项目中 select 正确的 PipeType ElementId 没有要检查的管道实例。

在一个测试项目中,我使用了 Transfer Project Standards 带来了我想使用的 PipeType,并手动创建了几个 Pipe 实例来检查...

>>> import Autodesk.Revit as R
>>> types=R.DB.FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_PipeCurves).WhereElementIsElementType().ToElements()
>>> elems=R.DB.FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_PipeCurves).WhereElementIsNotElementType().ToElements()
>>> for i in elems: print(i.Name)
...
Default
Default
Default
Plex Wire
>>> for i in types: print(i.Name)
... 
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
AttributeError: Name

...但正如我所提到的,我希望能够从包含所需 PipeTypes(来自项目模板)但没有预先存在的 Pipe 实例的项目中使用 Pipe.Create .

谢谢

使用 ElementType FamilyName property introduced in Revit 2015.

在此之前,最简单的选择是使用临时事务技巧:打开一个事务,插入一个虚拟实例,获取所需的名称,然后回滚事务。

我让 Jeremy 的 'transaction trick' 开始工作(见下文)。感谢对我的代码的任何批评,谢谢!

import Autodesk.Revit as R

pipeTypeNames={}

def GetPipeTypeNames():
    types=R.DB.FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_PipeCurves).WhereElementIsElementType().ToElements()
    pipingSystemTypes=R.DB.FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_PipingSystem).ToElements()
    levels=R.DB.FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_Levels).WhereElementIsNotElementType().ToElements()
    pipeDoc=doc
    pipeSystem=pipingSystemTypes[0].Id
    pipeLevel=levels[0].Id
    points=[]

    transaction=R.DB.Transaction(doc,'Get Pipe Type Names')

    transaction.Start()

    for t in range(len(types)):
        pipeType=types[t].Id
        points.append((R.DB.XYZ(0,t,0),R.DB.XYZ(10,t,0)))
        R.DB.Plumbing.Pipe.Create(pipeDoc,pipeSystem,pipeType,pipeLevel,points[t][0],points[t][1])

    pipeElems=R.DB.FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_PipeCurves).WhereElementIsNotElementType().ToElements()

    for p in pipeElems:
        pipeTypeNames[p.Name]=p.PipeType

    transaction.RollBack()

GetPipeTypeNames()