Добрый день. Выделяю все элементы на виде рамкой - получаю 22 тысячи. Нахожу у каждого элемента ближайший уровень снизу. В try обрабатываются- FamilyInstance, в Catch -системные (трубы ,воздуховоды и тд). Имею одну транзакцию. В  начале открываю и в самом конце (после цикла по всем элементам). Если это FamilyInstance нахожу ближайший уровень  - высчитываю новое смещение - и устанавливаю элементу новый уровень - записываю  значение параметра "этаж" с нового уровня в параметр "этаж"  элемента. Если это системное , все аналогично , кроме смещение (его не будет). Пишу много if(ов) так, как есть такие трудности  - точка расчета площади, на грани  и тд ( мне это нужно  для нового смещение). Например, если семейство имеет "точку расчета площади", то я беру не LocationPoint.Z,  а "GetSpatialElementCalculationPoint().Z" и смещение задаю по "BoundingBoxXYZ.Min.Z" , чтобы не "скакало". . Фотографии кода прикладываю.  
Статистика: 
- файл ВК 3.5 тысячи- обработал за 2 минуты.
- файл ОВ 22 тысячи - обработал за 1 час 20 минут.
Причем, в начале к каждому елементу применял две транзакции и коллектор искал заново , НО 
на время это никак не повлияло - 1 час 20 мин , как и был.
С результатом работы, пока вопросов нет, но время хотелось бы сократить. 
1 вопрос - как сократить время?
2 вопрос - почему при изменение с двух транзакций на одну общую в программе - результат по времени одинаковый ?


