Используйте python для получения фильтров представления для представлений в проекте Revit

Я хотел бы иметь возможность найти все фильтры представления в моем проекте, которые не используются.

import clr
clr.AddReference('ProtoGeometry')
from Autodesk.DesignScript.Geometry import *

# Import DocumentManager and TransactionManager
clr.AddReference("RevitServices")
import RevitServices
from RevitServices.Persistence import DocumentManager
from RevitServices.Transactions import TransactionManager

# Import RevitAPI
clr.AddReference("RevitAPI")
import Autodesk
from Autodesk.Revit.DB import *

doc = DocumentManager.Instance.CurrentDBDocument
uiapp = DocumentManager.Instance.CurrentUIApplication
app = uiapp.Application

from System.Collections.Generic import *

# Import ToDSType(bool) extension method
clr.AddReference("RevitNodes")
import Revit
clr.ImportExtensions(Revit.Elements)

#The inputs to this node will be stored as a list in the IN variable.
dataEnteringNode = IN

#collect all views in model
collector = FilteredElementCollector(doc)
views = collector.OfClass(View).ToElements()
areaPlans = []

#collect all views filters in the model
collector = FilteredElementCollector(doc)
filters = collector.OfClass(ParameterFilterElement).ToElements()
#viewFilters = []

#filter out view templates
for i in views:
    if not i.IsTemplate:
        if i.ViewType == ViewType.AreaPlan:
            areaPlans.append(i.ToDSType(True))
        else:
            continue

bipViewFilter = filters

#Assign your output to the OUT variable.
OUT = bipViewFilter, areaPlans

2 ответа

Был добавлен еще один шаг для фильтрации неиспользуемых фильтров просмотра. Собрал все View Filters в документе и использовал узел 'SetDifference', чтобы получить фильтры, которые в данный момент не использовались.

Вот один из способов добиться того, что вам нужно:

# Import Element wrapper extension methods
import clr
clr.AddReference("RevitNodes")
import Revit
clr.ImportExtensions(Revit.Elements)

# Import DocumentManager and TransactionManager
clr.AddReference("RevitServices")
import RevitServices
from RevitServices.Persistence import DocumentManager
from RevitServices.Transactions import TransactionManager
doc = DocumentManager.Instance.CurrentDBDocument

# Import RevitAPI
clr.AddReference("RevitAPI")
import Autodesk
from Autodesk.Revit.DB import *

#The inputs to this node will be stored as a list in the IN variable.
dataEnteringNode = IN

# first collect all of the views in a project
allViews = FilteredElementCollector(doc).OfClass(View).ToElements()

# filter out just the Area Plans
areaPlans = []
for i in allViews:
    if not i.IsTemplate and i.ViewType == ViewType.AreaPlan:
        areaPlans.append(i)

# extract filters used in all area plans
if len(areaPlans) != 0:
    viewFilters = [[] for i in range(len(areaPlans))]
    for index, item in enumerate(areaPlans):
        filters = item.GetFilters()
        if len(filters) != 0:
            for j in filters:
                viewFilters[index].append(doc.GetElement(j))


OUT = areaPlans, viewFilters

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

Другие вопросы по тегам