Тема: Алгоритм составления списка вершин LWPOLYLINE

Hi, All
Если не в лом, обясните начинающему, как составить список вершин LWPOLYLINE? (Поиск не помог) Первую и последнюю вытащил, а дальше? Что-то не думается... (Хотя, подозреваю - все просто)
С POLYLINE как-то без проблем...

Re: Алгоритм составления списка вершин LWPOLYLINE

Каждая вершина LWPOLYLINE определена группой 10 dxf

Re: Алгоритм составления списка вершин LWPOLYLINE

Спасибо, канешна! А как же я первую и последнюю выудил? Так и выудил... группой 10 dxf.
Спасибо, вопрос снят. Все до глупости просто.  Посмотрел на AfraLisp... и прозрел.

Re: Алгоритм составления списка вершин LWPOLYLINE

Первую и последнюю точки можно значительно проще выудить функциями vlax-curve-getStartPoint и vlax-curve-getEndPoint не расшифровывая то что получено из функции entget. Впрочем, к данному алгоритму это отношения не имеет.

Re: Алгоритм составления списка вершин LWPOLYLINE

Писал в свое время нечто подобное...

;;;---+---+---+---+---+---+---+---+---+---+---+---+---+---+---
;;; Функция возвращает список точек полилинии (облегченной либо стандартной)
;;; В качестве параметра функции передается имя примитива, возвращается список из
;;; двухмерных (для облегченной полилинии) или трехмерных (для стандартной) в том порядке,
;;; в котором они содержатся в описании примитива-полилинии
;;;---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+-
(defun $getPointsOfPolyline (polylineName / polylineInfo vertexName listOfPoints)
  (cond
    ;; Облегченная полилиния
    ((= (cdr (assoc '0 (entget polylineName))) "LWPOLYLINE")
     (setq polylineInfo (entget polylineName))
     (while (vl-position (assoc '10 polylineInfo) polylineInfo)
       (setq listOfPoints
          (cons
        (cdr
          (nth
            (vl-position
              (assoc '10 polylineInfo)
              polylineInfo
            ) ;_ vl-position
            polylineInfo
          ) ;_ nth
        ) ;_ cdr
        listOfPoints
          ) ;_ cons
       ) ;_ setq
       (setq polylineInfo
          (vl-remove (assoc '10 polylineInfo) polylineInfo)
       ) ;_ setq
     ) ;_ while
    )
    ;; Стандартная полилиния
    ((= (cdr (assoc '0 (entget polylineName))) "POLYLINE")
     (setq vertexName (entnext polylineName))
     (while vertexName
       (if (= (cdr (assoc '0 (entget vertexName))) "VERTEX")
     (setq listOfPoints
        (cons
          (cdr
            (assoc '10 (entget vertexName))
          ) ;_ cdr
          listOfPoints
        ) ;_ cons
     ) ;_ setq
       ) ;_ if
       (setq vertexName (entnext vertexName))
     ) ;_ while
    )
    ;; Не является полилинией
    (T
;;;  (alert "Примитив не является полилинией.")
     (setq listOfPoints nil)
    )
  ) ;_ cond
  (reverse listOfPoints)
) ;_ defun

Можно и с помощью ActiveX, как предлагает VK. Для промежуточных (не первой и не последней) точек полилинии нужно использовать функцию

(vlax-curve-getPointAtParam)

______________
Удачи.

Re: Алгоритм составления списка вершин LWPOLYLINE

Спасибо! Все заработало...
К сожалению пока к vlax -ам не добрался. Полещук как-то не вдохновил: примеров маловато, хотя как справочник его "VisualLisp..." хорошая помощь.

Re: Алгоритм составления списка вершин LWPOLYLINE

Вот, что у меня получилось...

(defun c:lwc (/ e len n e1)
  (setq e (entget (car (entsel))))
  (setq len (length e))
  (setq n 0)
  (repeat len
    (setq e1 (car (nth n e)))
    (if    (= e1 10)
      (progn
    (setq p      (cdr (nth n e))
          lis (cons p lis)
    )
      )
    )
    (setq n (1+ n))
  )
  (setq lis (reverse lis))
  (princ)
)
(princ)

Re: Алгоритм составления списка вершин LWPOLYLINE

(apply 'append
 (mapcar
  '(lambda (элемент)
    (if (= 10 (car элемент)) (list (cdr элемент))))
  (entget (car (entsel "\nSelect LWPOLYLINE: ")))))

Re: Алгоритм составления списка вершин LWPOLYLINE

> kos
К сожалению, только "точки" но не "вершины". А не каждая точка является вершиной.

Re: Алгоритм составления списка вершин LWPOLYLINE

> VK
Не понял.
Я, наверно, неправильно использовал терминологию. Должно быть так: Для промежуточных (не первой и не последней) вершин полилинии нужно использовать функцию

(vlax-curve-getPointAtParam <кривая> <параметр>)

Для вершин полилинии значение параметра, которое используется как аргумент данной функции, равно целому числу: таким образом, определив общее количество вершин и пройдя по полилинии от начала до конца получаем координаты вершин полилинии. Или не об этом разговор?
______________
Удачи.

Re: Алгоритм составления списка вершин LWPOLYLINE

> kos
Спасибо. А ведь эта функция пожалуй поинтереснее будет. Она и первую и последнюю вершины возвращает. Или nil, если вершины закончились.

(setq vla:obj (vlax-ename->vla-object (car (entsel)))
      n 0
      l nil)
(while (setq p (vlax-curve-getPointAtParam vla:obj n))
  (setq l (cons p l)
        n (1+ n))
)
(princ l)

Re: Алгоритм составления списка вершин LWPOLYLINE

Кстати, что такое "параметр" для кривой так нигде и не прочитал. Что он равен целому значению (точнее вещественное с нулевой дробной частью) получил эмпирическим путем.
______________
Удачи.

Re: Алгоритм составления списка вершин LWPOLYLINE

(Поиск не помог)

Не поверю.Была такая тема где-то
2-3 месяца назад и предложен идеальный вариант.

Re: Алгоритм составления списка вершин LWPOLYLINE

> Эдуард
:)
Да весь форум просто пестрит функциями, из всего многообразия я остановился для себя на более-менее компактной сборной солянке приблизительно такой:

(defun LINEVERTEXES (LINENAME / LINEVRTXLIST VRTXNAME)
  (cond
    ((= (cdr (assoc '0 (entget LINENAME))) "LWPOLYLINE")
     (mapcar 'cdr (vl-remove-if-not '(lambda (x) (= (car x) 10)) (entget LINENAME)))
     )
    ((= (cdr (assoc '0 (entget LINENAME))) "LINE")
     (list (cdr (assoc 10 (entget LINENAME))) (cdr (assoc 11 (entget LINENAME))))
     )
    ((= (cdr (assoc '0 (entget LINENAME))) "POLYLINE")
     (setq VRTXNAME (entnext LINENAME))
     (while VRTXNAME
       (if (= (cdr (assoc '0 (entget VRTXNAME))) "VERTEX")
     (setq LINEVRTXLIST (append LINEVRTXLIST (list (cdr (assoc '10 (entget VRTXNAME))))))
     ) ;_ end of if
       (setq VRTXNAME (entnext VRTXNAME))
       ) ;_ end of while
     LINEVRTXLIST
     )
    ) ;_ end of cond
  ) ;_ end of defun

Re: Алгоритм составления списка вершин LWPOLYLINE

> kos
Да, про параметр почти ничего нет, однако, заметил вот что. Целые или с нулевой дробной частью - это действительно вершины (для полилинии). А присутствие ненулевой дробной части определяет положение точки на сегменте, принимая длину сегмента равной 1. Таким образом, если параметр равен 1.5, то получаем точку на середине второго от начала сегмента полилинии.
Однако, мой алгоритм [VK (2003-12-29 18:30:46)] несколько не универсален. Упорно отказывается определять последнюю вершину 2d полилинии. И хотя vlax-curve-getendparam возвращает для нее правильное (с нулевой дробной частью) значение, все равно, vlax-curve-getPointAtParam возвращает nil для этого параметра. С чего бы это? Может быть, применение этих функций корректно только для сплайнов, на которых сделаны примеры в хелпе? Опять загадки.....

Re: Алгоритм составления списка вершин LWPOLYLINE

to Едуард@DMS

> DMS
Хм... По поиску запускал "вершины LWPOLYLINE" - ничего похожего... А что надо было задать для поиска? (Алгоритм получения вершин POLYLINE труда не вызвал)
DMS - обратите внимание - я начинающий.  Но Ваш пример просто не работает... С "лету" я его не переделаю. Пример из AfroLisp - прост и доходчив.

Re: Алгоритм составления списка вершин LWPOLYLINE

VK пишет:

vlax-curve-getPointAtParam возвращает nil для этого параметра

Не знаю, все работает как часики. Нумерация вершин начинается с 0. Может здесь собака порылась?
______________
Удачи.

Re: Алгоритм составления списка вершин LWPOLYLINE

> Петр
Можно было искать "вершины полилинии" с
http://www.autocad.ru/search_forum.htm
по встроеному, долистав до раздела LISP, или через YANDEX результаты почти теже.
Наверное, Вы правы, прошу прощения, мой пример просто не работает - работать будет так:

(LINEVERTEXES (car (entsel)))

только сначала следует загрузить саму функцию :)

Re: Алгоритм составления списка вершин LWPOLYLINE

> kos
На LWPOLILYNE вопросов нет. Все верно, работает как часики...
Траблы возникают именно с 2D POLYLINE, той, которая создается с PLINETYPE=0.
Начало нумераци здесь учтено. Вот примерчик. 2D полилиния, состоящая из двух вершин. Очевидно, при значении параметра равном 0.0, должна быть возвращена координата начала (1 вершина). И она возвращается. А при значении параметра равном 1.0 должна быть возвращена координата конца (2 вершина). Однако, возвращается nil, несмотря на то что, как я уже писал, vlax-curve-getendparam для этой полилинии возвращает значение, равное 1.0.

_$ (setq vla:obj (vlax-ename->vla-object (car (entsel))))
#<VLA-OBJECT IAcadPolyline 00f728d4>
_$ (vlax-curve-getendparam vla:obj)
1.0
_$ (vlax-curve-getPointAtParam vla:obj (vlax-curve-getendparam vla:obj))
nil
_$ 

Re: Алгоритм составления списка вершин LWPOLYLINE

Буду настаивать: все работает. Только что попробовал. Тикает...
______________
Удачи.

Re: Алгоритм составления списка вершин LWPOLYLINE

Еще вариант, правда несколько не удобный:

(setq vla:obj (vlax-ename->vla-object (car (entsel))))
(vlax-safearray->list (vlax-variant-value (vla-get-coordinates vla:obj)))

Все "тройки" представлены одним списком.

Re: Алгоритм составления списка вершин LWPOLYLINE

> VK
Здорово, но не для объекта "LINE" :(

Re: Алгоритм составления списка вершин LWPOLYLINE

Да, уж.... при попытке vla-get-coordinates оказывается, что у отрезка нет координат. А параметр в vlax-curve-getPointAtParam трактуется похоже как расстояние от начала.
Ну и бардак....

Re: Алгоритм составления списка вершин LWPOLYLINE

> kos
Не понимаю, почему у меня не получается с 2D .... то что описывал в VK (2003-12-30 14:05:57)
Если не трудно, прошу отмылить примерчик Ваших тикающих dwg и lsp.

Re: Алгоритм составления списка вершин LWPOLYLINE

DMS пишет:

Здорово, но не для объекта "LINE" :(

VK пишет:

...оказывается, что у отрезка нет координат.

Нет! Стоит посмотреть на список свойств объекта LINE в объектной модели. Там есть StartPoint и EndPoint - эти две точки определяют геометрию отрезка. Не может их быть больше...
______________
Удачи.