I am using c# to create Macros through REVIT. what I am trying to do is to number objects in a certain order, they are sorted by level of placement. I want the code to loop through the first level, count the objects and number them, then go to the second level where it counts and start numbering with a reference from the level before for example if the first set of objects were numbered from 1 to 10 then the next set of object will start numbering from 11 and till the count of this new set of objects so if they are 5 the numbering will be till 15 and so on
This is the code I tried. The problem is that the numbering now start each time at 1.
public void UniqueTag()
{
Document document = Application.ActiveUIDocument.Document;
FilteredElementCollector collector = new FilteredElementCollector(document);
IList<Element> AllWindows = collector.OfCategory(BuiltInCategory.OST_Windows).OfClass(typeof(FamilyInstance)).ToList(); // gets only placed instances
Transaction tran = new Transaction(document, "Tags Modification");
tran.Start();
int start = 1;
foreach (Element window in AllWindows)
{
string WindowLevel = window.LookupParameter("Level").AsValueString();
FilteredElementCollector LevelCollector = new FilteredElementCollector(document);
ICollection<Element> levels = LevelCollector.OfClass(typeof(Level)).ToElements();
foreach (Level le in levels)
{
var LevelName = le.Name;
if (WindowLevel == LevelName)
{
var query = from element in LevelCollector where element.Name == LevelName select element;
List<Element> level = query.ToList<Element>();
ElementId levelId = level[0].Id;
ElementLevelFilter levelFilter = new ElementLevelFilter(levelId);
LevelCollector = new FilteredElementCollector(document);
ICollection<Element> allWindowssOnLevel = LevelCollector.OfCategory(BuiltInCategory.OST_Windows).OfClass(typeof(FamilyInstance)).WherePasses(levelFilter).ToElements();
int count = allWindowssOnLevel.Count;
for (int i = start; i <= count ; i++) // work correct for the first loop, need to be changed for the second loop
{
foreach (Element e in allWindowssOnLevel)
{
var tag = e.GetParameters("Tag#")[0].Set(i++);
start=count+1;
}//End of foreach allWindowssOnLevel
}//End of for
}//End of if
}//End of foreach levels
}//End of foreachAllWindows
tran.Commit();
} // End of UniqueTag
Update this version of the code with the start of the count outside all the loops number the windows correctly at the first level then skip the second level and number windows in the third level correctly starting from the the last tag+1. in case of having more levels after the third one, none of the windows in them are numbered.