Реклама i
Стань нашим партнером - зарабатывай с нами!
| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны |  Справка по форуму | Файлообменник |

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

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

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

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

ПОМОГИТЕ!!! пожалуйста
Просмотров: 16768
 
Непрочитано 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
С.-Петербург
Сообщений: 39,787


Или как вариант (тоже весьма под вопросом выгода такого хода): поверху обрисовывать полилинией, с самого начала пользуясь опцией _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,186
<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,186
<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,990
<phrase 1= Отправить сообщение для 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,990
<phrase 1= Отправить сообщение для 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 Кб, 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 Кб, 287 просмотров)

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

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


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

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

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


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

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

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