нужен нормальный конвертер spline to polyline
| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > нужен нормальный конвертер spline to polyline

нужен нормальный конвертер spline to polyline

Ответ
Поиск в этой теме
Непрочитано 16.02.2005, 15:18 #1
нужен нормальный конвертер spline to polyline
card17
 
Регистрация: 16.02.2005
Сообщений: 2

нужно преобразовать spline в полилинию НО НЕ ОТРЕЗКАМИ а дугами и отрезками, все что упоминалось в форумах разбивает на отрезки определенного размера - это не годится т.к. далее идет обработка для резки и размер файла ограничен плюс некоторые особенности поведения лазеров тормозящих на узле линия линия. Вобщем нужны дуги и отрезки

ПОМОГИТЕ!!! пожалуйста
Просмотров: 17364
 
Непрочитано 16.02.2005, 16:01
#2
Torino


 
Регистрация: 21.08.2003
Штаб
Сообщений: 943
<phrase 1=


Возможно тебе поможет опция Spline команды Pedit.
Т.е. из исходного сплайна создается полилиния.
Затем к этой полилинии применяется Pedit с опцией Spline.
Torino вне форума  
 
Непрочитано 16.02.2005, 16:42
#3
MIP

инженер
 
Регистрация: 13.12.2004
Минск
Сообщений: 496


Вообще не встречал такого чтобы сплайн заменялся отрезками и дугами, помоему сплайн не описывается дугами у него другие формулы вычисления. А еще по какому критерию отслеживать где заменить на дугу, а где на отрезок? Вот отрезками другое дело, и замена сплайна на набор отрезков (хорд) наиболее логичный ход и простой в решении. Есть возможность заменить сплайн полилинией с фиксированным шагом сегментов, а потом ручками заменять сегменты с отрезков на дуги, но это неблагодарная работа.
__________________
Сейчас такая знаний бездна
доступна всякому уму,
что стало спорить бесполезно
и глупо думать самому.
MIP вне форума  
 
Непрочитано 16.02.2005, 16:53
#4
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,404


Или как вариант (тоже весьма под вопросом выгода такого хода): поверху обрисовывать полилинией, с самого начала пользуясь опцией _Arc.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 16.02.2005, 17:07
#5
MIP

инженер
 
Регистрация: 13.12.2004
Минск
Сообщений: 496


Кстати да, если не нужна уж такая точность и количествой сплайнов невелико, то самый простой способ! (Иногда стоит упрощать решение проблемы, дабы не зайти в тупик)
__________________
Сейчас такая знаний бездна
доступна всякому уму,
что стало спорить бесполезно
и глупо думать самому.
MIP вне форума  
 
Непрочитано 16.02.2005, 17:19
#6
Apelsinov

Проектировщик ВК. LISP-любитель.
 
Регистрация: 15.12.2003
Москва
Сообщений: 1,202
<phrase 1=


вот нашел http://www.autocad.ru/cgi-bin/f1/board.cgi?t=3723py
есть там лиспик (приведу тут) апроксимирующий сплайн дугами, если его чуть доработать - может не плохо получиться (к сожалению у меня времени нет сейчас может Fantomas за 5 минут прикинет - он может ).
Но, насколько я понял, сплайн даже теоретически абсолютно точно представить прямыми и дугами нельзя.
Код:
[Выделить все]
(defun SplineToPline (Spline DLeng / PLeng CurL EndPoint PointList P Tangent p1)
  (setq Spline   (vlax-ename->vla-object Spline)
        EndPoint (vlax-curve-getendpoint Spline)
        SpLeng   (vlax-curve-getdistatpoint Spline EndPoint)
        CurL     0
  )
  (while (< CurL SpLeng)
    (setq P         (vlax-curve-getpointatdist Spline CurL)
          Tangent   (vlax-curve-getfirstderiv Spline (vlax-curve-getparamatdist Spline CurL))
          PointList (cons (list p Tangent) PointList)
          CurL      (+ CurL DLeng)
    )
  )
  (setq PointList (reverse PointList)
        p1        (car PointList)
        PointList
                  (mapcar
                    '(lambda (x)
                       (list (car x) "_d" (mapcar '+ (car x) (cadr x)))
                     )
                    (cdr PointList)
                  )
        PointList (apply 'append PointList)
  )
  (command "_pline" (car p1) "_a" "_d" (mapcar '+ (car p1) (cadr p1)))
  (apply 'command PointList)
  (command EndPoint "")
)

(SPLINETOPLINE (car (entsel)) 1)
Apelsinov вне форума  
 
Автор темы   Непрочитано 17.02.2005, 11:21
#7
card17


 
Регистрация: 16.02.2005
Сообщений: 2


что-то в коде не так он строит окружности вместо дуг, спасибо за помощь, но проблема еще не решена. Может еще есть идеи?
card17 вне форума  
 
Непрочитано 17.02.2005, 13:52
#8
Apelsinov

Проектировщик ВК. LISP-любитель.
 
Регистрация: 15.12.2003
Москва
Сообщений: 1,202
<phrase 1=


Цитата:
Сообщение от card17
что-то в коде не так он строит окружности вместо дуг, спасибо за помощь, но проблема еще не решена. Может еще есть идеи?
В программе нет автоматического отключения привязок. Отключите автопривязки сами и запустите програмку, все работает.
Apelsinov вне форума  
 
Непрочитано 03.03.2011, 17:15
#9
Redya


 
Регистрация: 15.07.2008
Сообщений: 195


Цитата:
Сообщение от Torino Посмотреть сообщение
Возможно тебе поможет опция Spline команды Pedit.
Т.е. из исходного сплайна создается полилиния.
Затем к этой полилинии применяется Pedit с опцией Spline.
А можно подробнее? А то при переводе из PDF в DWG всё сплайнами рисуется, что ужасно. Приведённый лисп так и не понял как вызывать. (SplineToPline) - не вызывает.
Redya вне форума  
 
Непрочитано 03.03.2011, 17:21
#10
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,996


В 2011 Автокаде в команде _splinedit появилась опция "преобразовать в полилинию"
Код:
[Выделить все]
(defun C:SC ( / i)
  ;;;Spline convert
(if (< (atoi (substr (ver) 13)) 2011)
(alert "Для Автокада не ниже 2011 версии")
(progn
(setq ss nil ss (ssget "_X" '((0 . "SPLINE"))))
(setq i '-1)
(setvar "CMDECHO" 0)
(repeat (sslength ss)
  (command "_splinedit"(ssname ss (setq i (1+ i))) "_p" "")
    (grtext -2 (strcat "Inspecting : "(itoa i)))
  )
(command "_regenall")
  )
  )
  )
(princ "\nType SC in command line")(princ)
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 03.03.2011, 17:32
#11
Redya


 
Регистрация: 15.07.2008
Сообщений: 195


VVA, у меня 2008 автокад к сожалению. Да, и как запускать лисп #6? В моём понимании надо вводить (SplineToPline), но он ругается. И вообще я периодически встречаюсь с лиспами, которые не могу запустить, мол не знаю такой команды. Читал "Как использовать код на Лиспе читаем здесь" не раз, но таки не получалось иногда.
Redya вне форума  
 
Непрочитано 03.03.2011, 18:29
#12
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,996


Цитата:
Сообщение от Redya Посмотреть сообщение
Да, и как запускать лисп #6?
Код:
[Выделить все]
(SPLINETOPLINE (car (entsel)) 1)
В принципе делает то же, что и
ConvTo2d -Преобразование криволинейных объектов в 2D полилинии
В 2011 Автокаде делается лучше. Поставь триал и используй лисп с #10
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 05.03.2011, 21:23
#13
zaplev

программист (Autolisp,PHP,VBA)
 
Регистрация: 10.01.2011
г.Муром
Сообщений: 7
Отправить сообщение для zaplev с помощью Skype™


Используйте функцию fillter_points для уменьшения количество
линейных сегментов в полилинии.
Смотрите вложение.
Вложения
Тип файла: lsp filter_points.lsp (2.9 Кб, 207 просмотров)
zaplev вне форума  
 
Непрочитано 09.03.2011, 16:07
#14
CB

Конструирование в области нефтеразведки
 
Регистрация: 10.02.2006
Гомель
Сообщений: 321


Посмотри http://www.debalance.com/index.html
Одной из опций этой программы является то, что тебе нужно - конвертация различных типов примитивов в полилинии.
CB вне форума  
 
Непрочитано 16.03.2011, 13:30
#15
zaplev

программист (Autolisp,PHP,VBA)
 
Регистрация: 10.01.2011
г.Муром
Сообщений: 7
Отправить сообщение для zaplev с помощью Skype™


Команда CurveToPline v 2.0.
Аппроксимация кривой (сплайна эллипса ..) полилинией с заданной точностью.
Команду CurveToPline так же можно использовать для удаления лишних вершин в полилинии.
Смотрите вложение.
Вложения
Тип файла: lsp CurveToPline.lsp (16.6 Кб, 289 просмотров)

Последний раз редактировалось zaplev, 31.03.2011 в 22:33. Причина: Обновление файла вложения
zaplev вне форума  
 
Непрочитано 16.03.2011, 15:51
1 | #16
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,701
Отправить сообщение для Do$ с помощью Skype™


Как-то не особо оптимально - см.вложение.
Вложения
Тип файла: dwg
DWG 2004
splinetoplinetest.dwg (52.2 Кб, 2306 просмотров)
Do$ вне форума  
 
Непрочитано 17.03.2011, 15:33
#17
zaplev

программист (Autolisp,PHP,VBA)
 
Регистрация: 10.01.2011
г.Муром
Сообщений: 7
Отправить сообщение для zaplev с помощью Skype™


Цитата:
Сообщение от Do$ Посмотреть сообщение
Как-то не особо оптимально - см.вложение.
Меняйте параметры DLen = 0.5 и Eps = 0.05.
Отключите привязку!
См.вложение
Вложения
Тип файла: dwg
DWG 2004
splinetoplinetest.dwg (49.4 Кб, 2295 просмотров)

Последний раз редактировалось zaplev, 17.03.2011 в 16:22.
zaplev вне форума  
 
Непрочитано 17.03.2011, 17:13
#18
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,701
Отправить сообщение для Do$ с помощью Skype™


Как угадать какие параметры для конкретного сплайна применять?
Вот к примеру, мне надо, чтобы полилиния от сплайна не отличалась визуально на распечатанном чертеже, то есть, максимальное отклонение полилинии от сплайна не более, предположим, 0,05 мм (единицы чертежа миллиметры). Какие надо устанавливать значения DLEN и EPS?
А привязку хорошо бы в самом коде отключать, даже если командными методами работаете!
__________________
Толковый выбор приходит с опытом, а к нему приводит выбор бестолковый. (The Mechanic)
Do$ вне форума  
 
Непрочитано 21.03.2011, 19:45
#19
zaplev

программист (Autolisp,PHP,VBA)
 
Регистрация: 10.01.2011
г.Муром
Сообщений: 7
Отправить сообщение для zaplev с помощью Skype™


Цитата:
Сообщение от Do$ Посмотреть сообщение
Как угадать какие параметры для конкретного сплайна применять?
Вот к примеру, мне надо, чтобы полилиния от сплайна не отличалась визуально на распечатанном чертеже, то есть, максимальное отклонение полилинии от сплайна не более, предположим, 0,05 мм (единицы чертежа миллиметры). Какие надо устанавливать значения DLEN и EPS?
А привязку хорошо бы в самом коде отключать, даже если командными методами работаете!
Значение DLEN надо выбирать так, чтобы на самом крутом участке сплайна
погрешность линейной аппроксимации с шагом DLEN, пренебрежительно мала.
Если значение DLEN очень мало (например, DLEN = 0.01), то на конечный результат
это повлияет мало, только увеличится время вычислений.
А вот значение EPS существенно влияет на результат.
Чем больше EPS тем грубей аппроксимация, зато меньше точек, и наоборот.
Попробуйте менять DLEN и EPS примерно так:
1. не изменяя EPS = 0.05, изменяем DLEN = 1, 0.5, 0.05
2. не изменяя DLEN = 0.5, изменяем EPS = 0.5, 0.1, 0.05, 0.01
Сравните результат визуально и количество точек (length cn) = …

EPS – это погрешность аппроксимации, то есть любое кратчайшее расстояние
от сплайна до полилинии должно быть меньше EPS.
Это легко проверите.
Нарисуйте отрезок от сплайна до полилинии и посмотрите его длину.
Отрезок должен быть перпендикулярный к сплайна и полилинии..
Длина этого отрезка должна быть меньше EPS.

Последний раз редактировалось zaplev, 23.03.2011 в 16:00.
zaplev вне форума  
 
Непрочитано 21.03.2011, 21:00
#20
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,701
Отправить сообщение для Do$ с помощью Skype™


Хорошо, с DLEN понятно - это длина отрезка, на которые изначально делится сплайн. А вот что такое EPS?
__________________
Толковый выбор приходит с опытом, а к нему приводит выбор бестолковый. (The Mechanic)
Do$ вне форума  
 
Непрочитано 18.06.2018, 14:28
#21
SteelBrother

Проектировщик
 
Регистрация: 14.08.2011
Екатеринбург
Сообщений: 58
<phrase 1=


Люди знающие, подскажите, что нужно поправить в лиспе из поста 15, что бы он работал под 2018 автокад?
SteelBrother вне форума  
 
Непрочитано 18.06.2018, 14:33
#22
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,404


Правый клик на сплайне и в контекстном меню выбрать Сплайн - Преобразовать в полилинию. Чем не устраивает?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 18.06.2018, 14:57
#23
SteelBrother

Проектировщик
 
Регистрация: 14.08.2011
Екатеринбург
Сообщений: 58
<phrase 1=


Преобразовать сплайн в полилинию - создается очень много точек, даже если выставлять точность - 0, вне зависимости от метода преобразовать линиями или дугами, плюс в некоторых местах возникают дуги которые очень сильно отстоят от начальной траектории.
FLATTEN из набора ExpressTools - создает меньше точек, в целом все выглядит хорошо, но после ее исполнения возникает много явно выступающих полукругов и бывают незамкнутые полилинии.

В целом эти оба способа для решения задачи подходят, но в первом очень много точек, во втором слишком много руками доделывать.

Задача стоит следующая: Получаем файл CorelDraw с геометрией в виде сплайнов, импортируем из Корела в .DXF или .DWG, далее в автокаде разбираем спалйны на полилинии из отрезков и дуг. Затем файл идет в Inventor, там уже готовится УП для ЧПУ.
С импортированной геометрией в виде сплайнов ни Inventor(HSM) ни Solidworks(Solidcam) адекватно работать не хотят. Поиски парсера или лиспа или еще чего-нибудь внятного по корректному преобразованию сплайнов полилинии в виде отрезков и дуг ни к чему не привели(((
SteelBrother вне форума  
 
Непрочитано 18.06.2018, 15:22
#24
kp+

идущий по граблям
 
Регистрация: 26.05.2005
Сообщений: 5,170


Цитата:
Сообщение от SteelBrother Посмотреть сообщение
Получаем файл CorelDraw с геометрией в виде сплайнов
Сплайны были в исходном файле CorelDraw или получились при конвертации в DWG/DXF?
Просто я когда-то давно сталкивался с преобразованием CorelDraw в DWG/DXF, так даже то, что в Corel было нарисовано прямыми отрезками, экспортировались в сплайны с двумя точками

PS еще одна догадка на кофейной гуще. Нормальный человек не будет все-все-все рисовать сплайнами, где-то будут хотя бы прямые отрезки (возможное исключение - рисование электронным пером).
Но насколько я помню, Corel генерирует неуместное количество сплайнов после команды "Превратить в кривые". Несознательные граждане злоупотребляют этой командой, чтобы их "уникальные разработки" не попали в чужие руки в исходном, легко редактируемом виде. Может, надо попросить "неиспорченный" файл Corel?

Последний раз редактировалось kp+, 18.06.2018 в 15:34.
kp+ вне форума  
 
Непрочитано 18.06.2018, 15:32
#25
SteelBrother

Проектировщик
 
Регистрация: 14.08.2011
Екатеринбург
Сообщений: 58
<phrase 1=


Именно в Кореле все и нарисовано сплайнами. В большинстве случаев в кореле всегда рисуют сплайнами и потом возникает много проблем при подготовки файла для работы на станке.
Это все сводится к пляскам с бубнами с переводом в Adobeillustrator, потом в DWG/DXF, потом в ArtCam, тот в свою очередь имеет какой-то свой модуль по апроксимации, но тоже кривой.
Если файл с дестяком небольших спланов из Корела, можно конвертнуть в DWG/DXF, затем выполнить ПОЛРЕД или FLATTEN, то при сложной геометрии это проблематично.
Есть методы апроксиммации сплайнов(Кривых Безье), но реализованных под ACAD - не нашел.
Вот как пример: http://www.mathnet.ru/links/40ea825c.../zvmmf4915.pdf

ЗЫ: в приложении пример файла конвертированного из Корела
Вложения
Тип файла: rar 1.rar (1.48 Мб, 21 просмотров)
SteelBrother вне форума  
 
Непрочитано 18.06.2018, 15:38
#26
kp+

идущий по граблям
 
Регистрация: 26.05.2005
Сообщений: 5,170


посмотрите тут: https://apps.autodesk.com/ACD/en/Det...en&os=Win32_64
Единственное, работает только с новыми версиями (с 2015), проверить не могу (у меня 2010).

Последний раз редактировалось kp+, 18.06.2018 в 15:48.
kp+ вне форума  
 
Непрочитано 18.06.2018, 16:48
#27
SteelBrother

Проектировщик
 
Регистрация: 14.08.2011
Екатеринбург
Сообщений: 58
<phrase 1=


Спасибо за ссылку, почему-то ее сам не нашел на автодесковском форуме.
Лисп от французов вроде как работает, но как-то странно. Задать малую величину отрезка не дает, а если задавать величину отрезка в моем примере 1мм, то выдает ошибку "; ошибка: неверный тип аргумента: numberp: nil", если же задавать бОльшие длины то "; ошибка: деление на нуль"
То, под что получилось подогнать в приложении, но этот результат хуже штатного ПОЛРЕД или FLATTEN
Миниатюры
Нажмите на изображение для увеличения
Название: Тест.PNG
Просмотров: 66
Размер:	96.7 Кб
ID:	203656  
SteelBrother вне форума  
 
Непрочитано 23.11.2018, 16:53
#28
koMon


 
Блог
 
Регистрация: 26.09.2017
Сообщений: 1,809


тоже решил прибаловнуть)
Миниатюры
Нажмите на изображение для увеличения
Название: Spline_Approximation.gif
Просмотров: 108
Размер:	1.70 Мб
ID:	208391  
koMon вне форума  
 
Непрочитано 24.11.2018, 13:33
#29
trushev


 
Регистрация: 12.01.2015
Сообщений: 261


Цитата:
Сообщение от SteelBrother Посмотреть сообщение
Люди знающие, подскажите, что нужно поправить в лиспе из поста 15, что бы он работал под 2018 автокад?
Не вникая в программу, но может быть дело в:
Тема: Адаптация древних lisp-приложений под AutoCad 2016
От Александр Ривилис, установить LEGACYCODESEARCH = 1.
http://forum.dwg.ru/showpost.php?p=1498096&postcount=33
trushev вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > нужен нормальный конвертер spline to polyline