ForwardIterator Method

Hello
please explain to me when to apply and what is ForwardIterator Method()
from RevitAPI:

for example here

con_set=[i.ConnectorManager.Connectors.ForwardIterator() for i in pipes]

I want to understand for what purposes I can use it

Any forward iterator know it all’s able to answer this?

Trying to decipher the code on this page (Set parameter of multiple family types in .RFA-file with python - #2 by blsalvio) and am scared to run a while loop without knowing what the forward iteration really is!

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

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

doc = DocumentManager.Instance.CurrentDBDocument

param_values = list()
types = doc.FamilyManager.Types
famMan = doc.FamilyManager

TransactionManager.Instance.EnsureInTransaction(doc)

familyTypesItor = famMan.Types.ForwardIterator()
familyTypesItor.Reset()

while (familyTypesItor.MoveNext()):
    familyType = familyTypesItor.Current
    familyParam = famMan.get_Parameter(IN[0])
    param_values.append(familyType.AsString(familyParam))
    famMan.CurrentType = familyType
    famMan.Set(familyParam, IN[1] + familyType.AsString(familyParam))


TransactionManager.Instance.TransactionTaskDone()

OUT = param_values

Thanks,
Jake

An iterator is a method that allows you to step through a data set, like a list, one object at a time.
In your specific instance, famMan.Types calls a FamilyTypeSet, the ForwardIterator() method then calls up a FamilyTypeSetIterator. If you look at the methods here, there is a .MoveNext() but no .MoveBack(). If we go back to the FamilyTypeSet page, you can see there is also a ReverseIterator() method. However, ReverseIterator() is also a FamilyTypeSetIterator, so it also only has a MoveNext().

What this means, is that ForwardIterator() and ReverseIterator() are used tell the code which direction you’re moving through the list when you call .MoveNext().

You’re code looks fine - once MoveNext() reaches the end it will return False.
That said, at least during testing it’s never a bad idea to add a safety exit.

exit_variable = 0
while ____ and exit_variable < 1000:
    exit_variable += 1
    #The rest of your code goes here
4 Likes

Thanks for your explanation! Makes a lot more sense now and also a great trick to try and avoid the dreaded infinite loop!

Thanks

1 Like