Сообщество программистов Autodesk в СНГ
ADN Club => Civil 3D API => Тема начата: Дмитрий Загорулькин от 19-02-2014, 11:02:58
-
Здравствуйте!
У меня вопрос по методу SampleLineGroup.GetSampleLineIds(Double, Double). Этот метод позволяет найти нужную ось сечения, принадлежащую группе, по указанию пикета трассы и точности поиска. Но, на мой взгляд, у него есть довольно нелогичная (а главное - недокументированная!) особенность, которая мне много нервов попортила.
Предположим, что трасса имеет конечный пикет 25.0. В конце трассы располагается объект Structure. Я вычисляю его пикетаж по трассе. В результате, значение вычисленного пикетажа колодца-структуры у меня может получиться 25.00001 (например, из-за погрешности операций с плавающей точкой). Далее, мне нужно проверить, есть ли ось сечения в этом пикетаже. Казалось бы, что может быть проще при наличии такого метода? Зная про погрешности вычисления, я задаю допуск 0.001 и пробую искать.
Но, запросив SampleLineGroup.GetSampleLineIds(25.00001, 0.001) я получаю исключение - значение пикета выходит за рамки трассы! Какой бы там ни был допуск - хоть 3000, на ситуацию это не повлияет.
Как вы считаете, является это багом или это вполне нормальное поведение?
-
Как вы считаете, является это багом или это вполне нормальное поведение?
Вопрос конечно интересный. Прими во внимание, что я не знаком с Civil3D API, но знаю что в AutoCAD API если запросить точку на линии (методом Curve.GetPointAtDist) и передать ему расстояние большее, чем длина линии, то тоже возникнет исключение. И это нормально. Скорее всего это взаимосвязанные вещи и соответственно не следует этому методу давать значение большее, чем он может принять. :)
-
Но там же нет параметра "допуск", поэтому это вполне логично. Если передается значение дистанции вне кривой, то вариантов, кроме как исключение, нет никаких.
А в случае с GetSampleLineIds:
С учетом допуска, диапазон "попадания" из моего примера: от 24.99901 до 25.00101. Он перекрывается с диапазоном пикетов трассы на промежутке от 24.99901 до 25.0000, значит, есть пространство для деятельности! На мой взгляд, было бы логичнее выдавать исключение, если значение с учетом допуска выходит за пределы трассы.
-
С учетом допуска, диапазон "попадания" из моего примера: от 24.99901 до 25.00101.
А вот тут (IMHO) ты совершенно не прав. Да и документация говорит о том, что исключение возникнет:
Thrown when the specified station is out of the range of the alignment.
А диапазон до 25, а не до 25.00001
-
Ну как же неправ:
(https://adn-cis.org/forum/proxy.php?request=http%3A%2F%2Fs22.postimg.org%2Fx2t3y5f19%2FSLines_Get.jpg&hash=236c1d26c2bef635313f80217d99a910) (http://postimg.org/image/x2t3y5f19/)
Нечетко говорит. Не хватает что-то типа: Excluding tolerance. Поведение не очевидное, для меня по крайней мере.
-
Поведение не очевидное, для меня по крайней мере
Возможно и не вполне очевидное, но теперь ты знаешь как он себя ведет. Думаю просто этот метод в конечном счете сам использует что-то типа Curve.GetPointAtDist - отсюда и исключение.