dwg.ru forum rss xml
| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны |  Справка по форуму |

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

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

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

card17 вне форума Вставить имя

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

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


 
Регистрация: 21.08.2003
Штаб
Сообщений: 942
Отправить сообщение для Torino с помощью ICQ


Возможно тебе поможет опция 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
С.-Петербург
Сообщений: 35,830


Или как вариант (тоже весьма под вопросом выгода такого хода): поверху обрисовывать полилинией, с самого начала пользуясь опцией _Arc.
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей 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,102
Отправить сообщение для Apelsinov с помощью ICQ


вот нашел 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,102
Отправить сообщение для Apelsinov с помощью ICQ


Цитата:
Сообщение от 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,701
Отправить сообщение для VVA с помощью ICQ Отправить сообщение для VVA с помощью Skype™


В 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,701
Отправить сообщение для VVA с помощью ICQ Отправить сообщение для VVA с помощью Skype™


Цитата:
Сообщение от 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 Кб, 188 просмотров)
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 Кб, 253 просмотров)

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

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


Как-то не особо оптимально - см.вложение.
Вложения
Тип файла: dwg
DWG 2004
splinetoplinetest.dwg (52.2 Кб, 2291 просмотров)
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 Кб, 2279 просмотров)

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

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


Хорошо, с DLEN понятно - это длина отрезка, на которые изначально делится сплайн. А вот что такое EPS?
__________________
Толковый выбор приходит с опытом, а к нему приводит выбор бестолковый. (The Mechanic)
Do$ вне форума вставить имя Обратить внимание модератора на это сообщение  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > нужен нормальный конвертер spline to polyline

Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск

Быстрый переход

|| Главная || Каталог САПР || Тендеры || Публикации || Объявления || Биржа труда || Download || Галерея ||
|| Библиотека || Кунсткамера || Каталог предприятий || Контакты || Файлообменник || Блоги ||