Количество точек, правда, зашкаливает - больше тысячи. Может ли это быть причиной того, что метод не хочет работать? Есть ли какое-то ограничение у него на количество точек?Официально точно никаких ограничений нет. Я бы предположил самопересечение контура (или касание его ребер).
Прикладываю контур.1. Как был получен контур? У тебя участки(сегменты) между вершинами не прямолинейные. см. между 1 и 2 вершиной еще одна точка лежащая на дуге ;-)
Я из этого контура вытягиваю коллекцию вершин и передаю в метод.Возможно тебе нужно добавить замыкающую вершину, т.к. полилиния была замкнута, а ты передаешь массив вершин, и получаешь разрыв контура. Т.е. в конце массива добавить точку с координатами 1й точки.
Пример кода - лучше тысячи слов!а где зуммирование вида, чтобы весь контур входил в экран? ;-)
Пример кода - лучше тысячи слов!а где зуммирование вида, чтобы весь контур входил в экран? ;-)
Я бы предположил самопересечение контура (или касание его ребер).Всё, нашел - была одна совпадающая вершина. Вы оказались правы.
Я уже как раз начинал тестировать, но ты успел раньше. :) Кстати, в AutoCAD 2020, на котором я начал тестировать, при selRes.Status == PromptStatus.Error системная переменная ERRNO остаётся равной 0, что не есть хорошо...Я бы предположил самопересечение контура (или касание его ребер).Всё, нашел - была одна совпадающая вершина. Вы оказались правы.
Кстати, в AutoCAD 2020, на котором я начал тестироватьНу хот в кратце, по секрету можно нам рассказать. Значимые изменения будут от 2019?
Эта версия уже официально вышла и уже есть её анонсы. Например, в первую очередь для программистов, здесь: https://adndevblog.typepad.com/autocad/2019/03/autocad-2020-quick-overview.htmlКстати, в AutoCAD 2020, на котором я начал тестироватьНу хот в кратце, по секрету можно нам рассказать. Значимые изменения будут от 2019?
Не помогла "прополка".Жаль.
Тесты показали, что просто сперва возвращается ERRNO = 2, а на третьем-четвёртом запуске и далее - ERRNO = 0. Такое поведение в Civil 3D as AutoCAD 2017. Может быть Вы как раз это наблюдали в AutoCAD 2020?Нет. У меня уже при первом запуске. Что я тебе могу посоветовать? Никогда не пользоваться Editor.SelectXXX методами. Причин почему на данном контуре не срабатывает выборка может быть множество. Одна из причин как ни странно может быть связана с разрешением экрана AutoCAD. Как работают все эти методы Editor.SelectXXX? Они работают с проекциями примитивов на некий виртуальный экран. В твоём случае вполне возможно, что в проекции начинают совпадать вершины контура выбора. Еще одна возможная причина - удалённость вершин контура от начала координат.
Иногда, кстати, вместо "Ошибка: 2" выводится "Ошибка: 93" - такого кода вообще нет в списке! Но воспроизвести при записи видео не получилось.Код такой есть, но что он в данном случае значит - большой вопрос:
Количество точек, правда, зашкаливает - больше тысячи. Может ли это быть причиной того, что метод не хочет работать?
Они работают с проекциями примитивов на некий виртуальный экран. В твоём случае вполне возможно, что в проекции начинают совпадать вершины контура выбора.
Мне вот стало интересно, а зачем вообще было эти методы реализовывать через проекции? Не понимаю плюсов такого решения.Всё упирается в скорость выбора.
Всё упирается в скорость выбора.Ну ладно выбираемые примитивы в пределах экрана спроецировали, но зачем понадобилось контур выбора проецировать и проверять что в него попало? Это ведь действительно накладывает ограничение на контур.
но зачем понадобилось контур выбора проецировать и проверять что в него попалоСтранный вопрос. Предложи другой вариант.
Странный вопрос. Предложи другой вариант.Ну насколько я понял действительно спроецированные объекты получить быстрее. При этом насколько я помню, если объекты не совпадают по Z c контуром, то в эту выборку не попадут.
У меня он работает безошибочно на твоих полилиниях.Это странно - у Вас в коде в 39 строке ошибка логическая. Догадаетесь, что за ошибка? :)
Ну насколько я понял действительно спроецированные объекты получить быстрее.Они уже спроецированы, а не в момент вызова Editor.SelectXXX. Быстрота не в их получении, а в скорости фильтрации спроецированных объектов. Как минимум мы перешли из 3D в 2D.
Это странно - у Вас в коде в 39 строке ошибка логическая. Догадаетесь, что за ошибка? :)Да. Вместо:
Очень тепло, но нет! :)Ну видимо я сегодня плохо соображаю. Объясни.
Они уже спроецированы, а не в момент вызова Editor.SelectXXX. Быстрота не в их получении, а в скорости фильтрации спроецированных объектов. Как минимум мы перешли из 3D в 2D.А ну ладно. Теперь стала понятнее внутрянка их работы и возможные ограничения.
Есть на это шанс?Нет. Но никто тебе не мешает написать самому. Civil 3d (а точнее Map 3d) использует ObjectARX и AutoCAD .NET API.
Очень тепло, но нет! :)А сообразил:
Очень тепло, но нет!
А сообразилДа. Причём из-за этого Ваш код у меня работал очень странно. Он пропустил одну точку по условиям и далее по идее должно было быть исключение - индекс выходит за пределы коллекции. Но вместо этого возвращалась точка (0,0,0) и условие всегда выполнялось. Я FUZZ уже размером несколько десятков ставил - а результат не менялся. В общем, странное поведение Point3dCollection.
Я исправил кодвозможно одной проверки может быть недостаточно, при контуре близком к линии?
Код не универсальный. В данном случае проверяется близость первой и последней вершин контура.Я исправил кодвозможно одной проверки может быть недостаточно, при контуре близком к линии?Код - C# [Выбрать]
// Повторять последнюю точку не нужно!!! if (pts[0].DistanceTo(pts[pts.Count - 1]) < FUZZ) { pts.RemoveAt(pts.Count - 1); }