Сообщество программистов Autodesk в СНГ
ADN Club => VBA => Тема начата: DMuzer от 25-08-2019, 19:04:43
-
Добрый день!
Может быть кто то сталкивался.
У меня есть функция, которая выбирает блоки, расположенные вдоль полилинии.
Для этой задачи выбирается полиния, формируется массив с координатами вершин и передается в функцию SelectByPolygon.
Столкнулся с ситуацией, что по непонятной мне причине вдруг функция перестает выбирать объекты.
Начал разбираться, пошел таким путем: начиная с двух первых вершин полилинии, формирую выборку, смотрю на количество выбранных объектов.
добавляю следующую вершину и опять делаю выборку, смотрю на количество полученных объектов.
И начиная с какой то точки, вдруг количество выбранных объектов становится равным нулю.
Не понятно с чем это может быть связано? Может какие то неописанные ограничения. Вроде и добавленные координаты вершин нормальные.
Может кто нибудь поделиться мыслями на эту ситуацию?
-
1. Все точки должны быть видимы на экране.
2. Если полигон будет самопересекающимся, то выбор работать не будет.
-
Разобрался.
1. Все точки должны быть видимы на экране.
Не обязательно, все работает даже если точки не видны, какие то варианты функций работают только при видимости на экране, какие то нет.
допустим Select с опцией acSelectionSetAll работает в любом случае (можно фильтры применять) , а вот с другими опциями только в области видимости...
SelectByPolygon - с опцией acSelectionSetWindowPolygon и acSelectionSetFence - также работает без видимости на экране, проверено многократно, про другие утверждать не будут, не пользовался, но думаю, что также будет работать, а вот SelectAtPoint - работает только при видимости на экране.
2. Если полигон будет самопересекающимся, то выбор работать не будет.
в случае опции acSelectionSetFence - будет работать даже если линия будет самопересекаться (проверено многократно), а вот в случае acSelectionSetWindowPolygon - уже не будет.
В общем проблема была в том, что две подряд идущие точки лежали друг на друге, по сути, длина сегмента равнялась 0. Когда добавил проверку на совпадающие последовательные точки, и если в случае совпадения этих точек одну из них исключить, то все начинает работать.
-
DMuzer,
Среди всего написанного выше абсолютно правильное утверждение только одно:
Select с опцией acSelectionSetAll работает в любом случае (можно фильтры применять) , а вот с другими опциями только в области видимости...
Остальные зависят от многих факторов, в том числе и от версии AutoCAD. Полагаться, что вне области видимости будут работать методы SelectByXXX не следует.
-
Понятно, спасибо!
-
А есть ли где информация о том как работают эти методы в каждой конкретной версии AutoCad? Или тут какждый раз проверять надо? Сюрпизы?
-
А есть ли где информация о том как работают эти методы в каждой конкретной версии AutoCad? Или тут какждый раз проверять надо? Сюрпизы?
Это недокументировано. Документировано лишь то, что примитивы и точки должны быть в видимой области (точнее в виртуальном экране, который может быть несколько больше видимой области) и то что только SelectAll работает в не зависимости от видимости примитивов, так как он проверяет все примитивы в чертеже.