Schedule filter value - Integer

Continuing the discussion from Schedule Multiple Filter Creation:

What’s wrong with this Integer Value?
Sample file.rvt (1.8 MB)
SCHEDULES2.dyn (48.7 KB)


What is the error that you’re getting ? Can you please brief it ?

@shashank.baganeACM
I have a project parameter “Item Num” (Integer - type of parameter),
I’m trying to add filters to schedules but I’m not able to give correct input filter value (Integer) to ScheduleFilter.ByFieldTypeAndValue.
please check sample file
Sample file.rvt (1.8 MB)
SCHEDULES2.dyn (48.7 KB)

Hi vishal, as per my observations you can easily set your parameter values either by integer or double values to the parameter " Item Num" as you can see in the snip.

but when it comes to schedule part, it is not allowing to accept the integer value as it expects a number or a string. Correct me @JacobSmall if I am wrong. This should be raised to dynamo team.

if you can change your parameter type from integer to number, it can accept number values. The node “ScheduleFilter.byTypeandFilterValue” is only accepting either double values or string values not the integer values.

So it works if you can change the data type to number.

1 Like

Strange issue indeed. The solution is easy, in python with one line of code (line 26) you will change anything to an integer but you can not proceed with just that, because native nodes did not predict cases like this you will need to convert that value, to create that filter and to add that filter in the schedule. Here is how I did it. These are my inputs and Python node:

This is my Python code:

import clr

# Import Revit API
clr.AddReference('RevitAPI')
clr.AddReference('RevitAPIUI')

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

from Autodesk.Revit.DB import FilteredElementCollector, BuiltInCategory
from Autodesk.Revit.DB import ViewSchedule, ScheduleFilter, ScheduleFilterType


def construct_and_add_schedule_filter(schedule_name, field_name, filter_type, value):
    doc = DocumentManager.Instance.CurrentDBDocument
    schedules = FilteredElementCollector(doc).OfClass(ViewSchedule).ToElements()

    view_schedule = next((s for s in schedules if s.Name == schedule_name), None)

    if view_schedule is None:
        return "Schedule not found"

    schedule_field_ids = view_schedule.Definition.GetFieldOrder()
    value_as_int = int(value)
    filter_type_enum = getattr(ScheduleFilterType, filter_type, None)

    if filter_type_enum is None:
        return "Invalid filter type: {}".format(filter_type)

    target_field_id = None
    for field_id in schedule_field_ids:
        field = view_schedule.Definition.GetField(field_id)
        if field.GetName() == field_name:
            target_field_id = field_id
            break

    if target_field_id is None:
        return "Field name not found"

    new_filter = ScheduleFilter(target_field_id, filter_type_enum, value_as_int)

    # Start Transaction
    TransactionManager.Instance.EnsureInTransaction(doc)

    # Adding the filter to the schedule
    existing_filters = view_schedule.Definition.GetFilters()
    existing_filters.Add(new_filter)
    view_schedule.Definition.SetFilters(existing_filters)

    # End Transaction
    TransactionManager.Instance.TransactionTaskDone()

    return "Filter successfully added to schedule"

# Inputs from Dynamo
schedule_name = IN[0]  # Schedule name as string
field_name = IN[1]  # Field name as string
filter_type = IN[2]  # Filter type as ScheduleFilterType
value = IN[3]  # Value to be converted to an integer

# Output the result
OUT = construct_and_add_schedule_filter(schedule_name, field_name, filter_type, value)

Also here is my script:
SCHEDULES2_byNenad.dyn (10.4 KB)

1 Like

thank you @nenad.kovacevicSZH9A

In case if someone is looking for the same,
I have made some changes,
image


Add_Schedule_Filter_(Integer_value).dyf (11.9 KB)

import clr

# Import Revit API
clr.AddReference('RevitAPI')
clr.AddReference('RevitAPIUI')

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

from Autodesk.Revit.DB import FilteredElementCollector, BuiltInCategory
from Autodesk.Revit.DB import ViewSchedule, ScheduleFilter, ScheduleFilterType

def convert_to_integer(value):
    try:
        return int(value)
    except ValueError:
        return None

def construct_and_add_schedule_filter(view_schedule, field_name, filter_type, value):
    doc = DocumentManager.Instance.CurrentDBDocument

    if view_schedule is None:
        return "View schedule not provided", []

    schedule_field_ids = view_schedule.Definition.GetFieldOrder()
    value_as_int = convert_to_integer(value)  # Convert the value to integer

    if value_as_int is None:
        return "Invalid value: {}".format(value), []

    filter_type_enum = getattr(ScheduleFilterType, filter_type, None)

    if filter_type_enum is None:
        return "Invalid filter type: {}".format(filter_type), []

    target_field_id = None
    for field_id in schedule_field_ids:
        field = view_schedule.Definition.GetField(field_id)
        if field.GetName() == field_name:
            target_field_id = field_id
            break

    if target_field_id is None:
        return "Field name not found", []

    new_filter = ScheduleFilter(target_field_id, filter_type_enum, value_as_int)

    # Start Transaction
    TransactionManager.Instance.EnsureInTransaction(doc)

    # Adding the filter to the schedule
    existing_filters = view_schedule.Definition.GetFilters()
    existing_filters.Add(new_filter)
    view_schedule.Definition.SetFilters(existing_filters)

    # End Transaction
    TransactionManager.Instance.TransactionTaskDone()

    return "Filter successfully added to schedule", [view_schedule]

# Inputs from Dynamo
schedule_views = UnwrapElement(IN[0])  # List of schedule views
field_name = IN[1]  # Field name as string
filter_type = IN[2]  # Filter type as ScheduleFilterType
value = IN[3]  # Value to be converted to an integer

# Output the result
result, updated_schedule_views = [], []
for schedule_view in schedule_views:
    res, updated_view = construct_and_add_schedule_filter(schedule_view, field_name, filter_type, value)
    result.append(res)
    updated_schedule_views.append(updated_view)

OUT = updated_schedule_views

2 Likes