Задача такая: рисовать точки в определенной области. Но перед отрисовкой проверить, есть ли уже в указанных координатах нарисованная точка (из условия - все нужные слои включены). Ну и изначально участок, на котором планируется рисовать много-много
точек может лежать за пределами видимости экрана.
Вот исходя из этих начальных условий, решить есть ли в указанных координатах точка или нет можно двумя (вот больше не придумал) способами:
1. последовательный перебор всех объектов чертежа в поисках AcDbPoint, ну и если нашли, то проверить координаты.
2. программный выбор рамкой (формируется массив точек вокруг исходной точки и acedSSGet(_T("_cp")... в помощь)
У первого варианта есть один существенный недостаток - чем больше объектов в чертеже, тем больше тратится времени на поиск одной точки (даже если в первый пробег по базе сформировать массив всех известных AcDbPoint, а потом искать чисто в нём)
Второй вариант работает на порядок быстрей (где-то раз в 10-15 на чертеже с большим количеством объектов). НО... не всегда работает, как показала практика. А тестовый пример всегда НЕ работает
Итак по поводу тестового примера. Первоначально идет зуммирование рамкой, чтоб вся требуемая область была видна на экране, а потом идет в цикле acedSSGet
Так вот, если зуммирование идет внутри моей команды, причем не важно, вызывается оно через acedCommand или с использованием автокадовского ActiveX, acedSSGet всегда возвращает RTERROR. Если же чертеж отзуммировать как нужно через меню автокада, а потом вызвать мою команду (в которой убрать строчки, отвечающие за зуммирование), то acedSSGet всегда работает правильно.
И вот тут вопрос: это лечится?
Нужен обязательный зум внутри команды.
PS: тестовый проект прилагается. Тестировал в 2014x64 и в 2017x64. Результат одинаковый. В коде есть оба варианта зума для текстирования