@k.khisamova
here is the fixed code
[image]
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
doc = DocumentManager.Instance.CurrentDBDocument
# Import RevitAPI
clr.AddReference("RevitAPI")
import Autodesk
from Autodesk.Revit.DB import *
toDoList = lambda x : x if hasattr(x, '__iter__') else [x]
lstView = toDoList(UnwrapElement(IN[0]))
nameParaFilter = IN[1]
valueBool = IN[2]
def findFilter(paraName, scheduleDef):
filterCount = scheduleDef.GetFilterCount()
for idx in range(filterCount):
schedFilter = scheduleDef.GetFilter(idx)
field_Id = schedFilter.FieldId
field = scheduleDef.GetField(field_Id)
if field.GetName() == paraName:
return idx, schedFilter
return None, None
def createFilter(paraName, scheduleDef):
#sub foncion
def checkField(fieldToAdd):
fieldIds = scheduleDef.GetFieldOrder()
for fieldId in fieldIds:
if scheduleDef.GetField(fieldId).HasSchedulableField:
if scheduleDef.GetField(fieldId).GetSchedulableField() == fieldToAdd:
return fieldId
return None
#main function
fieldToAdd = None
#get GetSchedulableField by Name
lstAvailbleField = scheduleDef.GetSchedulableFields()
for schField in lstAvailbleField:
if schField.GetName(doc) == paraName:
fieldToAdd = schField
break
#check if field is already added and find the corresponding fieldId
fieldId = checkField(fieldToAdd)
if fieldId is not None:
return fieldId
else:
#if not found add the corresponding field
scheduleDef.AddField(ScheduleFieldType.Instance, fieldToAdd.ParameterId )
doc.Regenerate()
#then return the corresponding fieldId
return checkField(fieldToAdd)
TransactionManager.Instance.EnsureInTransaction(doc)
for v in lstView:
if v.ViewType == ViewType.Schedule:
scheduleDef = v.Definition
idx, schedFilter = findFilter(nameParaFilter, scheduleDef)
if idx is not None:
if valueBool:
schedFilter.SetValue(1)
else:
schedFilter.SetValue(0)
scheduleDef.SetFilter(idx, schedFilter)
else:
fieldId = createFilter(nameParaFilter, scheduleDef)
if valueBool:
newSchFilter = ScheduleFilter(fieldId, ScheduleFilterType.Equal, 1)
else:
newSchFilter = ScheduleFilter(fieldId, ScheduleFilterType.Equal, 0)
scheduleDef.AddFilter(newSchFilter)
TransactionManager.Instance.TransactionTaskDone()
OUT = lstView