Revit Python Shell: Как получить имена типов семейства «Типы труб» без экземпляров в проекте? - PullRequest
0 голосов
/ 20 октября 2019

Конечная цель - передать ElementId нужного мне PipeType (Plex Wire) в Pipe.Create, но я не знаю, как выбрать правильный ElementId PipeType в проекте без экземпляров Pipe для проверки.

В тестовом проекте я использовал стандарты переноса проекта для переноса 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

... но какЯ упоминал, что хотел бы иметь возможность использовать Pipe.Create из проекта, который содержит нужные PipeTypes (из шаблона проекта), но не имеет ранее существующих экземпляров Pipe.

Спасибо

Ответы [ 2 ]

1 голос
/ 21 октября 2019

Я заставил Джереми работать с трюком (см. Ниже). Любая критика моего кода приветствуется, спасибо!

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()
0 голосов
/ 21 октября 2019

Используйте свойство ElementType FamilyName , представленное в Revit 2015 .

До этого самым простым вариантом было использование трюка с временными транзакциями. : открыть транзакцию, вставить фиктивный экземпляр, получить нужное имя и откатить транзакцию.

...