Тема: Как определить радиус в полилинии LISPом

Добрый день форумчане.
Подскажите пожалуйста: как определить радиус, если он вписан в полилинию?
Значение радиуса должно быть под номером 40 в списке свойств объекта,но
дело в том что по запросу объекта(полилинии) через:

setq myline (entget (car (entsel "select object:")))

под номером 40 у меня нули!
Пример полилинии с радиусом в приложении.
Спасибо.
Как определить радиус в полилинии LISPом

Re: Как определить радиус в полилинии LISPом

вопрос решён следующей функцией:

(defun pline-get-radii (p1 p2 bulge)
  (if (not (zerop bulge))
    (abs (/ (/ (distance p1 p2) 2.0)
        (sin (* 2.0 (atan bulge)))
     )
    )
    0.0
  )
)

8)

Re: Как определить радиус в полилинии LISPом

Виталий пишет:

Подскажите пожалуйста: как определить радиус, если он вписан в полилинию?
Значение радиуса должно быть под номером 40 в списке свойств объекта,но
дело в том что по запросу объекта(полилинии) через:

Если расчленить полилинию, то можно получить  радиус дуги при указании на неё,
использовав заявленные 

(entget (car (entsel "select object:")))

.

Re: Как определить радиус в полилинии LISPом

Alan aka Александр Назаров пишет:

Если расчленить полилинию, то можно получить радиус дуги при указании на неё,
использовав заявленные

расчленение мне не подходит - полилиния это будущий ход станка с ЧПУ по её координатам.
если расчленять , то сама суть автоматизации этого процесса пропадает  :)

Re: Как определить радиус в полилинии LISPом

Виталий пишет:

если расчленять ,

Никто и ничто не мешает отменить это действие после указания Дуги.

Re: Как определить радиус в полилинии LISPом

http://elpanov.com/index.php?id=35#eea-lw_arc_Rad_1
http://elpanov.com/index.php?id=35#eea-lw_arc_Rad_2
http://elpanov.com/index.php?id=35#eea-cen-lw-seg
И еще тьма материала: http://elpanov.com/index.php?id=34

Re: Как определить радиус в полилинии LISPом

Alan aka Александр Назаров пишет:

Никто и ничто не мешает отменить это действие после указания Дуги.

если бы не нашёл для решения этого вопроса вышеприведённую функцию - так и поступил бы  :)

Кулик Алексей aka kpblc пишет:

И еще тьма материала:

именно там и нашёл решение, спасибо.

Re: Как определить радиус в полилинии LISPом

В приведенных библиотечных функциях Евгения для работы надо передавать несколько аргументов, типа  (p1 p2 bulge).
Если же хочешь просто указанием, то случай с расчленением имеет право быть. ЯТД

(setvar "osmode" 0)
(setq myel (entsel "Выберите дуговой сегмент полилинии"))
(command "_.EXPLODE" (car myel) "")
(setq myarc (entget (ssname (ssget (cadr myel)) 0))
      rad   (cdr (assoc 40 myarc))
) ;_ конец setq
(command "_.UNDO" "1")
(if rad
  (print (strcat "Радиус дуги равен:" (rtos rad 2 3)))
  (prompt "\n Выбран не дуговой сегмент полилинии")
) ;_ конец if

Главное! Решение тобой найдено :!:

Re: Как определить радиус в полилинии LISPом

На фига так? Получить через (entsel) указатель на примитив и координаты точки, высчитать ближайшую к примитиву, получить значение параметра, округлить до целого и по параметру получить координаты вершины (это предыдущая вершина), добавить 1 к параметру и получить координаты вершины (это следующая вершина), через vla-getbundle получить значение кривизны - и все. Никаких дополнительных построений, разбиваний и отмен.

Re: Как определить радиус в полилинии LISPом

Кулик Алексей aka kpblc пишет:

Получить через (entsel) указатель на примитив и координаты точки, высчитать ближайшую к примитиву, получить значение параметра, округлить до целого и по параметру получить координаты вершины (это предыдущая вершина), добавить 1 к параметру и получить координаты вершины (это следующая вершина), через vla-getbundle получить значение кривизны - и все.

Типичный спор хорошего программиста (т.е. тебя, Алексей), и инженера (плохого пргм, т.е. меня) :)
Из анекдота - "Эти хирурги, им всё резать и резать! Я Вам дам таблеточку, уши сами отпадут!"

Re: Как определить радиус в полилинии LISPом

немного не в тему вопроса, но теперь стала другая проблема :
через

 (setq myline (entget (car (entsel "select object:"))))

получаю список свойств полилинии, а вот как дальше вытянуть в новый список только координаты начала сегментов:

(cdr (assoc 10 myline))

не знаю  :cry:
подскажите какой из циклов лучше использовать, а если будет примерчик - буду ОЧЕНЬ благодарен.
Спасибо.

Re: Как определить радиус в полилинии LISPом

Вы писали:
"... как дальше вытянуть в новый список только координаты начала сегментов".

Попробуйте, возможно, Вас устроит. (Функция не моя, а с одного из форумов).

;; Функция получения координат легкой полилинии (LWPOLYLINE) в WCS. Возвращает список 3D-точек
(defun get-lwpolyline-vertices (lwpoly / plinee elev vnv)
  (setq plinee (entget lwpoly)
    elev   (cdr (assoc 38 plinee))
    vnv    (cdr (assoc 210 plinee))
  )
  (mapcar
    (function (lambda (x) (trans (list (cadr x) (caddr x) elev) vnv 0)))
    (vl-remove-if-not (function (lambda (x) (= (car x) 10))) plinee)
  )
)

Или возможно Вас устроит следующий вариант:

;; Функция получения координаты заданной вершины полилинии
(defun get-coordinates-top-PLN (lwpoly k / sset-work coordinates-top-PLN j n i exit-volume)
  (setq sset-work (entget lwpoly))
  (setq coordinates-top-PLN '(-999.789 -999.789) j 1)
  (while (and (assoc 10 sset-work) (<= j k))
    (if (= j k)
      (progn
    (setq coordinates-top-PLN (assoc 10 sset-work))
    (setq j (+ k 1))
      )
      (progn
    (setq j (1+ j))
      )
    )

Re: Как определить радиус в полилинии LISPом

первая вроде выдаёт что надо, а вот вторая не хочет работать (
даже после добавления 2 недостающих закрывающих скобок.
сейчас попробую первую подправить под свою задачу, спасибо )
я свою задачу разбил на несколько маленьких и теперь самое главное - собрать всё воедино ))
в идеале на выходе должно быть что то вроде этого :

 X 25.793   Z  -2.0868  
 X 24.8082   Z  -2.5000  CR=    0.5000
 X 24.1918   Z  -2.5000

 

где Z это координата AutoCada "Y", а CR - это радиус сегмента дуги полилинии.
как то так )

Re: Как определить радиус в полилинии LISPом

Моя вина... Прошу прощения...

Исправляюсь...

;; Функция получения координаты заданной вершины полилинии
(defun get-coordinates-top-PLN (lwpoly k / sset-work coordinates-top-PLN j n i exit-volume)
  (setq sset-work (entget lwpoly))
  (setq coordinates-top-PLN '(-999.789 -999.789) j 1)
  (while (and (assoc 10 sset-work) (<= j k))
    (if (= j k)
      (progn
    (setq coordinates-top-PLN (assoc 10 sset-work))
    (setq j (+ k 1))
      )
      (progn
    (setq j (1+ j))
      )
    ) 

    (setq n (vl-position (assoc 10 sset-work) sset-work) i 0)

    (while (<= i n)
      (setq sset-work (cdr sset-work))
      (setq i (1+ i))
    ); конец while
  ); конец while