【问题标题】:Pyrevit ISelectionFilter don't work with linked elementsPyrevit ISelectionFilter 不适用于链接元素
【发布时间】:2022-10-24 23:12:10
【问题描述】:

我有挑选对象(链接元素)的问题。我的“允许元素”过滤器适用于 revit 模型中的元素,但如果我对链接元素使用相同的 ISelectionFilter,我将无法选择任何内容。我的代码:

##imports
    
doc = revit.doc
uidoc = revit.uidoc
    
###Thanks to Cyril Waechter https://pythoncvc.net/?p=116 custom ISelectionFilter
class CustomISelectionFilter(ISelectionFilter):
    def __init__(self, nom_categorie):
        self.nom_categorie = nom_categorie
    def AllowElement(self, e):
        if e.Category.Name == self.nom_categorie:
            return True
        else:
            return False
    def AllowReference(self, ref, point):
        return true
###
    
# Pick model elements
try:
    with forms.WarningBar(title="Pick elements in model"):
        wall_collector = uidoc.Selection.PickObjects(ObjectType.Element, CustomISelectionFilter("Walls"))

except:
    print("No elements")
    
# Pick linked elements
try:
    with forms.WarningBar(title="Pick elements in linked model"):
        wall_collector_link = uidoc.Selection.PickObjects(ObjectType.LinkedElement, CustomISelectionFilter("Walls"))

except:
    print("No linked elements")

## Print Ids

【问题讨论】:

    标签: python revit-api revitpythonshell pyrevit


    【解决方案1】:

    这对我有用

    import clr
    from Autodesk.Revit.UI.Selection import *
    from pyrevit import revit
    
    doc = revit.doc
    uidoc = revit.uidoc
    
    
    class CustomISelectionFilter(ISelectionFilter):
        def __init__(self, category_name, document):
            self.category_name = category_name
            self.document = document
    
        def AllowElement(self, element):
            some_type = self.document.GetElement(element.GetTypeId())
            type_name = some_type.FamilyName
    
            if type_name == "Linked Revit Model":
                return True
            else:
                if element.Category.Name == self.category_name:
                    return True
                else:
                    return False
    
        def AllowReference(self, ref, point):
            element = self.document.GetElement(ref)
            some_type = revit.doc.GetElement(element.GetTypeId())
            type_name = some_type.FamilyName
    
            if type_name == "Linked Revit Model":
                li = clr.Convert(element, type(element))
                linked_document = li.GetLinkDocument()
                element = linked_document.GetElement(ref.LinkedElementId)
    
            if element.Category.Name == self.category_name:
                return True
            else:
                return False
    
    
    
    # Pick model elements
    try:
        with forms.WarningBar(title="Pick elements in model"):
            wall_collector = uidoc.Selection.PickObjects(ObjectType.Element, CustomISelectionFilter("Walls", doc))
    
    except:
        print("No elements")
    
    # Pick linked elements
    try:
        with forms.WarningBar(title="Pick elements in linked model"):
            wall_collector_link = uidoc.Selection.PickObjects(ObjectType.LinkedElement, CustomISelectionFilter("Walls", doc))
    
    except:
        print("No linked elements")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-22
      • 1970-01-01
      • 1970-01-01
      • 2017-01-04
      • 1970-01-01
      相关资源
      最近更新 更多