Сообщество программистов Autodesk в СНГ

ADN Club => AutoCAD .NET API => Тема начата: Дмитрий Загорулькин от 15-09-2017, 16:33:33

Название: GetOffsetCurves для полилинии. Когда возвращается несколько кривых?
Отправлено: Дмитрий Загорулькин от 15-09-2017, 16:33:33
Из описания (https://knowledge.autodesk.com/search-result/caas/CloudHelp/cloudhelp/2015/ENU/AutoCAD-NET/files/GUID-80D106A9-A16F-4F32-BDE2-5C5B1F7C2C84-htm.html):
Цитировать
In some cases it may be necessary for the offset result to be several curves.
Я никак не могу представить, что это могут быть за случаи. Больше всего интересует, возможен ли хотя бы в теории такой вариант для полилинии, которая AcDbPolyline (DXF: LWPOLYLINE)?
Название: Re: GetOffsetCurves для полилинии. Когда возвращается несколько кривых?
Отправлено: Дмитрий Загорулькин от 15-09-2017, 17:41:09
Ответ нашёлся сам собой при тестировании. Если полилиния сама себя пересекает образуя петли, то оффсет "вовнутрь" выдаст внутри петель замкнутые контуры, которые будут отдельными объектами. Возможно, могут быть и другие варианты. Придётся предусматривать, прохалявить не получилось в этот раз  :D
Название: Re: GetOffsetCurves для полилинии. Когда возвращается несколько кривых?
Отправлено: Debalance от 15-09-2017, 18:23:24
Если полилиния сама себя пересекает образуя петли...
Эти "self-intersecting curves" часто являются причинами порождения всевозможных глюков в работе. Наиболее отчётливо это заметно при попытках осуществить экструзию, револвинг и т.п. операции. На мой взгляд для таких примитивов необходимо выполнять предварительную оптимизацию.
Название: Re: GetOffsetCurves для полилинии. Когда возвращается несколько кривых?
Отправлено: Дмитрий Загорулькин от 15-09-2017, 18:29:01
В моём случае полилиния - это трасса трубопроводной сети. Для неё самопересечение допустимо (хотя встречается крайне редко).
Название: Re: GetOffsetCurves для полилинии. Когда возвращается несколько кривых?
Отправлено: Debalance от 15-09-2017, 18:34:07
В моём случае полилиния - это трасса трубопроводной сети...
А как на счёт такого "ломаного" оффсета в данном случае? ДопустИм ли он?
Название: Re: GetOffsetCurves для полилинии. Когда возвращается несколько кривых?
Отправлено: Дмитрий Загорулькин от 15-09-2017, 18:45:27
Да, допустим. Оффсет нужен для получения контура вокруг участка сети. Контур нужен для визуальной идентификации участка сети. Это дальнейшее развитие вот этой темы: http://adn-cis.org/forum/index.php?topic=8011.0
Получается вполне симпатично:
Название: Re: GetOffsetCurves для полилинии. Когда возвращается несколько кривых?
Отправлено: Debalance от 15-09-2017, 18:53:52
Контур нужен для визуальной идентификации участка сети
Ну теперь понятно.....
Название: Re: GetOffsetCurves для полилинии. Когда возвращается несколько кривых?
Отправлено: Александр Ривилис от 15-09-2017, 19:36:35
Ответ нашёлся сам собой при тестировании. Если полилиния сама себя пересекает образуя петли, то оффсет "вовнутрь" выдаст внутри петель замкнутые контуры, которые будут отдельными объектами. Возможно, могут быть и другие варианты. Придётся предусматривать, прохалявить не получилось в этот раз  :D
Интересно. Я у себя проверил на нескольких примерах и получал по одной петле для таких полилиний. Правда проверял в какой-то из старых версий AutoCAD.
Название: Re: GetOffsetCurves для полилинии. Когда возвращается несколько кривых?
Отправлено: Дмитрий Загорулькин от 15-09-2017, 20:28:02
Хм. А это интересно. Я проверял только в 2016. Надо будет проверить в версиях постарше.
Название: Re: GetOffsetCurves для полилинии. Когда возвращается несколько кривых?
Отправлено: Debalance от 15-09-2017, 21:07:32
Правда проверял в какой-то из старых версий AutoCAD
Тестировал на 2012. Итог: оффсет "ломает" результирующую полилинию (сплайн). Впрочем термин "старая версия" несколько пространен. Интересно, что Вы подразумеваете под ним?
Название: Re: GetOffsetCurves для полилинии. Когда возвращается несколько кривых?
Отправлено: Александр Ривилис от 15-09-2017, 21:56:44
Впрочем термин "старая версия" несколько пространен. Интересно, что Вы подразумеваете под ним?
2008-ую. Причем проверял при помощи ARXDBG - там есть Curve test. Впрочем я не посмотрел её код. Может она рисует только первую из добавленных в массив кривых.
P.S.: Код пересмотрел - добавляет все полученные кривые.
Название: Re: GetOffsetCurves для полилинии. Когда возвращается несколько кривых?
Отправлено: Debalance от 15-09-2017, 22:19:39
2008-ую...
У меня нет возможности проверить на этой версии, но что-то подсказывает, что:
... она рисует только первую из добавленных в массив кривых ...
Название: Re: GetOffsetCurves для полилинии. Когда возвращается несколько кривых?
Отправлено: Debalance от 15-09-2017, 22:25:40
P.S.: Код пересмотрел - добавляет все полученные кривые.
А каков результат работы команды _OFFSET на данной версии AutoCAD? Тот же?
Название: Re: GetOffsetCurves для полилинии. Когда возвращается несколько кривых?
Отправлено: Александр Ривилис от 15-09-2017, 22:32:21
А каков результат работы команды _OFFSET на данной версии AutoCAD? Тот же?
Вот результат команды _OFFSET:

(https://farm5.staticflickr.com/4423/37056877516_b0bc53c10b_o.png)

GetOffsetCurves даёт в точности такой же результат.

Название: Re: GetOffsetCurves для полилинии. Когда возвращается несколько кривых?
Отправлено: Александр Ривилис от 15-09-2017, 22:37:13
Тестовая кривая во вложении.
Название: Re: GetOffsetCurves для полилинии. Когда возвращается несколько кривых?
Отправлено: Дмитрий Загорулькин от 15-09-2017, 22:37:55
Поставьте дистанцию смещения раз в 5 меньше. Картинка должна получиться веселей.
Название: Re: GetOffsetCurves для полилинии. Когда возвращается несколько кривых?
Отправлено: Debalance от 15-09-2017, 22:39:25
Вот результат команды _OFFSET:
Мудрёная кривая на мой взгляд, да и шаг смещения велик. Более показательным был бы пример с видео (http://adn-cis.org/forum/index.php?topic=8030.msg28134#msg28134) Дмитрия Загорулькина.
Название: Re: GetOffsetCurves для полилинии. Когда возвращается несколько кривых?
Отправлено: Александр Ривилис от 15-09-2017, 22:40:59
С меньшим шагом:

(https://farm5.staticflickr.com/4430/36433099153_a50d840702_o.png)

Т.е. оффсетится только одна из петель самопересекающейся кривой (с шагом еще в 10 раз меньше аналогично).

Название: Re: GetOffsetCurves для полилинии. Когда возвращается несколько кривых?
Отправлено: Debalance от 15-09-2017, 22:49:19
Т.е. оффсетится только одна из петель самопересекающейся кривой (с шагом еще в 10 раз меньше аналогично).
Похоже проблема в замкнутости объекта. Если разорвать, то получается вполне корректный вариант:
(https://adn-cis.org/forum/proxy.php?request=http%3A%2F%2Fimg-fotki.yandex.ru%2Fget%2F372429%2F105409719.8%2F0_1755d1_b4a9a1d0_orig.png&hash=87539b196c18771dc1466915cd9341d8)
Название: Re: GetOffsetCurves для полилинии. Когда возвращается несколько кривых?
Отправлено: Дмитрий Загорулькин от 15-09-2017, 22:49:51
С замкнутыми самопересекающимися полилиниями офсет довольно весёлым получается... Возможно, это какой-то баг.
Попробуйте сделать несколько петель и поофсетить в разные стороны.
Название: Re: GetOffsetCurves для полилинии. Когда возвращается несколько кривых?
Отправлено: Александр Ривилис от 15-09-2017, 22:51:05
Ага. Кажется понял в чем проблема. Если кривая замкнутая (фактически), то получается одна петля, а если её разомкнуть, то вот так (три отдельных сегмента):

(https://farm5.staticflickr.com/4398/37075677222_a0ea5b8391_o.png)

Название: Re: GetOffsetCurves для полилинии. Когда возвращается несколько кривых?
Отправлено: Александр Ривилис от 15-09-2017, 22:52:37
Debalance, Дмитрий Загорулькин
Пришли к одному результату.
Название: Re: GetOffsetCurves для полилинии. Когда возвращается несколько кривых?
Отправлено: Debalance от 15-09-2017, 22:56:31
С замкнутыми самопересекающимися полилиниями офсет довольно весёлым получается...
Я раньше говорил что нужна предварительная оптимизация... а то возможна куча всяческих глючных вариантов.
Возможно, это какой-то баг
Это не баг, это фирменная "фича" от Autodesk  ;D
Название: Re: GetOffsetCurves для полилинии. Когда возвращается несколько кривых?
Отправлено: Дмитрий Загорулькин от 15-09-2017, 23:04:19
Да и пусть. В моём случае вероятность появления объекта такой конфигурации нулевая. Это невероятно, чтобы трубопровод сам себя пересёк, да ещё и замкнулся  ;D
Название: Re: GetOffsetCurves для полилинии. Когда возвращается несколько кривых?
Отправлено: Debalance от 15-09-2017, 23:05:27
Это не баг, это фирменная "фича" от Autodesk 
В качестве интереса протестировал тот же чертёж на BricsCAD вот что получается:
(https://adn-cis.org/forum/proxy.php?request=http%3A%2F%2Fimg-fotki.yandex.ru%2Fget%2F770612%2F105409719.8%2F0_1755d8_2c0e983f_orig.png&hash=0e3de3c9f0ae96cce084baeb1d192e07)
Название: Re: GetOffsetCurves для полилинии. Когда возвращается несколько кривых?
Отправлено: Debalance от 15-09-2017, 23:12:42
Да и пусть...
Не могу согласиться.
В моём случае ...
Мне кажется полезнее смотреть дальше и шире, думая о насущных проблемах всего сообщества на этом сайте...
Название: Re: GetOffsetCurves для полилинии. Когда возвращается несколько кривых?
Отправлено: Дмитрий Загорулькин от 17-09-2017, 14:45:11
думая о насущных проблемах всего сообщества на этом сайте...
Думаю ненно и нощно. Ключевое слово: "насущных"  ;)
Есть подозрение, что можно по шапке получить за вопрос, но жутко интересно:
Цитировать
В качестве интереса протестировал тот же чертёж на BricsCAD вот что получается:
А при оффсете в другую сторону какой результат?
Название: Re: GetOffsetCurves для полилинии. Когда возвращается несколько кривых?
Отправлено: Дмитрий Загорулькин от 18-09-2017, 19:02:40
Ну теперь понятно.....
Лучше один раз увидеть...
Название: Re: GetOffsetCurves для полилинии. Когда возвращается несколько кривых?
Отправлено: Debalance от 18-09-2017, 20:24:40
А при оффсете в другую сторону какой результат?
А вот такой - идеальный результат (кривая синего цвета):
(https://adn-cis.org/forum/proxy.php?request=http%3A%2F%2Fimg-fotki.yandex.ru%2Fget%2F508505%2F105409719.8%2F0_17581e_c71a501d_orig.png&hash=fd27a6021670dda8d2bef1fe1268f789)

Более того усложнил задачу, нарисовав сложную "лессажу" из сплайна. И тут отработка на пять баллов:
(https://adn-cis.org/forum/proxy.php?request=http%3A%2F%2Fimg-fotki.yandex.ru%2Fget%2F762837%2F105409719.8%2F0_17581f_6f1cdf77_orig.png&hash=706bc1c3b397b85945cb949a0c977732)
Всё строится в два клика как говорится без "проблем и без систем". В общем Автокаду такое и не снилось.
Название: Re: GetOffsetCurves для полилинии. Когда возвращается несколько кривых?
Отправлено: Debalance от 18-09-2017, 20:25:19
Лучше один раз увидеть...
Поздравляю - весьма достойно!