Мы делали такие вручную для каждого кабельного лотка, который идет один под другим.
Для каждого лотка своя аннотация.
Теперь как бы я реализовывал это программно:
1. Пользователь должен по клику мышки выбрать 2 точки: Точку вставки аннотации и точку в которой надо посчитать количество лотков.
2. Берем все лотки на активном виде. С лотков считываем и баундинг-бокс. Формируем новую точку, чтоб Z точно попадал в баундинг бокс лотка, а ХУ берем с точки из п.1. Если точка в баундинг-боксе лотка, то отбираем лоток. таким образом формируем список лотков, которые есть в текущей точке на текущем виде.
3. Сортируем лотки по высоте размещения, считываем нужные параметры. Организуем цикл поштучной вставки аннотаций для каждого лотка. Каждую последующую аннотацию вставляем с каким-то отступом. Я бы отступ задал вручную, хотя можно заморочится и с баундинг-боксом и проверять не накладываются ли аннотации.
П.С. Я описал принцип поиска по оси Z, но никто не запрещает добавить дополнительную проверку по ХУ. Например, если трубы идут рядом (насколько рядом?), например на расстоянии не больше 50 мм, то можно задать в условии отфильтровывания, что Х >= 50. Да хоть создать свой баундинг-бокс…