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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > примитив polyline и подпримитивы, не могу "достучаться

примитив polyline и подпримитивы, не могу "достучаться

Ответ
Поиск в этой теме
Непрочитано 12.08.2006, 12:56 #1
примитив polyline и подпримитивы, не могу "достучаться
Edpr
 
студент
 
Киргизия
Регистрация: 11.08.2006
Сообщений: 3

Потратил весь день на поиск информации, как работать с подпримитивами полилинии. НИчего не нашел В хваленой книге Полещука "..разработка и адаптация..." тоже ничего нету.
Прошу помочь мне разобраться.... Допустим мне нужно выбрать какую-то полилинию и собрать координаты всех вершин. Я пытался так:

(defun c:dpl()
(setq Pl(ssget))
(setq PlN(ssname pl 0))
(setq PlIf(entget Pln))
(setq plv(entnext))
(setq vplst nil)
(setq vplst (list vplst)); список содержащий координаты вершин полилинии
(repeat (cdr(assoc 90 plif))
(setq PlV(entnext plv))
(setq plvif(entget plv))
(setq vcr(cadr(assoc 10 plvif)))
(setq vcr (list vcr))
(setq vplist (list vplist))
(setq vplst (cons vcr vplst))

);end repeat
)

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

Вот чем я руководствовался

Функция entnext позволяет перейти в рисунке к следующему примитиву (подпримитиву):

(entnext [<примитив>])

В качестве единственного аргумента функции entnext может выступать ранее полученное имя примитива текущего рисунка. Если функция вызывается без аргумента, то она возвращает имя первого неудаленного примитива в базе рисунка. При наличии аргумента функция возвращает имя следующего примитива, либо nil, если база графических объектов рисунка исчерпана.

Пример:

(setq el (entnext)) — возвращает имя первого неудаленного примитива;

(setq e2 (entnext е2)) — возвращает имя примитива, следующего за e1;

(setq еЗ (entnext еЗ)) — возвращает имя примитива, следующего за e2.
Просмотров: 4410
 
Непрочитано 12.08.2006, 13:20 Re: примитив polyline и подпримитивы, не могу "достучат
#2
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,413
Отправить сообщение для Александр Ривилис с помощью Skype™


Цитата:
Сообщение от Edpr
...НИчего не нашел В хваленой книге Полещюка "..разработка и адаптация..." тоже ничего нету...
Хамишь, студент! Потрудись исправить фамилию Николая Николаевича! :evil:
А по существу у тебя написана полная ерунда.
1) Полилинии в AutoCAD бывают нескольких типов. Первый - LWPOLYLINE - это единый примитив (без подпримитивов) и все вершины содержаться в нем (см. группу 10)
2) Есть еще примитив POLYLINE, который имеет подпримитивы - VERTEX (вершины)
Цитата:
Сообщение от Edpr
Пример:

(setq e1 (entnext)) — возвращает имя первого неудаленного примитива;

(setq e2 (entnext е2)) — возвращает имя примитива, следующего за e1;

(setq еЗ (entnext еЗ)) — возвращает имя примитива, следующего за e2.
А может будешь повнимательней и напишешь:
(setq e1 (entnext))
(setq e2 (entnext e1))
(setq e3 (entnext e2))
:?:
А вообще чтобы не учить тебя программированию на VLisp - поставь печать каждого из полученных в твоей функции значений и поймешь где у тебя "не так" - уж слишком много ошибок.
Александр Ривилис вне форума  
 
Автор темы   Непрочитано 12.08.2006, 16:30
#3
Edpr

студент
 
Регистрация: 11.08.2006
Киргизия
Сообщений: 3


фамилию исправил....хамством это не назову..скорее опечатка, а насчет книги, я много читал про его издания в и-нете. У нас ее немго по труднее достать ис тоит она не копейки, и очень уж я удивился когда в главе VLisp, одним из немногих листингов я встретил, листинг который рисует штамп. Вот и все, я кроме подробного описания Setq, больше ничего нету. Куча таблиц без разъяснений...может просто это издание было таким..но не думаю что начинающий или продолжающий программист на лиспе мог от тудова что нибудь подчерпнуть
Edpr вне форума  
 
Автор темы   Непрочитано 12.08.2006, 16:38
#4
Edpr

студент
 
Регистрация: 11.08.2006
Киргизия
Сообщений: 3


К сожалению о примитиве LWpolyline я ничего не знаю. У меня стоит AutoDesk Map, на команду полилиния он действительно создает примитив LWpolyline. И как тогда работать с этим примитивом, среди функций VLispa я нашел тока работающие от начальной точки vla объекта. Что мне делать?!
Edpr вне форума  
 
Непрочитано 12.08.2006, 20:45
#5
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,413
Отправить сообщение для Александр Ривилис с помощью Skype™


Цитата:
Сообщение от Edpr
...хамством это не назову..скорее опечатка...
Слово "хамство" относилось не к опечатке в фамилии, а к термину "хваленый". Для того чтобы иметь право что-то критиковать нужно что-то знать и уметь. Судя по заданным вопросам - ни первого, ни второго пока нет. В упомянутой книге, т.к. она посвящена всем (или почти всем) средствам разработки под AutoCAD, посвященная VisualLisp часть достаточно небольшая. Для изучения VisualLisp скорее подошла бы другая книга: Н.Н.Полещук, П.В.Лоскутов. "AutoLISP и Visual LISP в среде AutoCAD"
А по теме вопроса - т.к. у тебя LWPOLYLINE, то для получения ее вершин ты должен просмотреть все группы 10 в ней (в отличие от POLYLINE в LWPOLYLINE есть несколько групп 10, каждая из которых - очередная вершина полилинии).
Запусти в командной строке (entget(car(entsel))) и изучай полученный список.
Вот небольшой примерчик:
Код:
[Выделить все]
(defun c:dpl ( / pl pll plv) 
 (if (and (setq pl (car (entsel "\nВыберите полилинию:")))
          (setq pll (entget pl))
          (= (cdr (assoc 0 pll)) "LWPOLYLINE")) (progn
    (foreach x pll
     (if (= (car x) 10) (setq plv (cons (cdr x) plv))) 
    )
    (setq plv (reverse plv)) 
    (princ "\nВершины полилинии: ") (princ plv)
 )) 
)
В действительности все намного сложнее, т.к. нужно учитывать систему координат ( т.е. вектор выдавливания - группа 210 ) и уровень ( группа 38 ).
Александр Ривилис вне форума  
 
Непрочитано 12.08.2006, 22:21
#6
fixo

Lisp/VBA/VB.NET Hobbyist
 
Регистрация: 24.03.2005
Славен Град Петров
Сообщений: 367


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

Fatty

~'J'~
fixo вне форума  
 
Непрочитано 15.08.2006, 11:25
#7
Zouss


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


2 Александр Ривилис, спасибо за ценнейшую информацию касательно LWpoly, тем не менее вопрос - при чем тут 210 и 38 группы, если ваш код даёт координаты вершин в WCS? Насколько я понимаю эти координаты не будут меняться при изменении данных групп...
Zouss вне форума  
 
Непрочитано 15.08.2006, 12:48
#8
Лентяй

Project Engineer
 
Регистрация: 05.01.2005
Лос Анджелес
Сообщений: 1,392


Zouss,
Держите прогу, ибо у сеня сегодня день варенья и посему аз есмь добр днесь.
Код:
[Выделить все]
;;;Собирает инфу о вершинах полилиний;;;
(defun crs (n)
  (vlax-safearray->list (vlax-variant-value (vla-get-coordinate pl (1- n))))
);crs
;
(defun c:VxColl (/ adoc util pl lst n)
  (vl-load-com)
  (setq adoc (vla-get-activedocument (vlax-get-acad-object))
        util (vla-get-utility adoc))
  (vla-getEntity util 'pl nil "Выбери полилинию: ")
  (if (wcmatch (vla-get-ObjectName pl) "*Polyline") (progn
    (if (vl-catch-all-error-p (vl-catch-all-apply '(lambda ()
      (setq n (vla-getInteger util "Веедите номер вершины или <ENTER> для всех: ")))))
      (progn
        (setq n (/ (length (vlax-get pl 'Coordinates)) (if (= (vla-get-ObjectName pl) "AcDbPolyline") 2 3)))
        (while (> n 0)
          (setq lst (cons (list n (crs n)) lst)
                n (1- n))));progn
      (setq lst (crs n)));if
    (print lst));progn
    (alert "Это не полилиня!"));if
);end
Лентяй вне форума  
 
Непрочитано 15.08.2006, 13:46
#9
Zouss


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


мои поздравления
и благодарности (буду пользовать данный код при любой возможности с вознесением славословий в адрес персоны автора)
Zouss вне форума  
 
Непрочитано 15.08.2006, 13:54
#10
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,413
Отправить сообщение для Александр Ривилис с помощью Skype™


Цитата:
Сообщение от Zouss
2 Александр Ривилис, спасибо за ценнейшую информацию касательно LWpoly, тем не менее вопрос - при чем тут 210 и 38 группы, если ваш код даёт координаты вершин в WCS? Насколько я понимаю эти координаты не будут меняться при изменении данных групп...
Мой код дает вершины в OCS (системе координат объекта, т.е. полилинии) Внимательно прочитайте описание DXF-групп для примитива LWPOLYLINE.
Александр Ривилис вне форума  
 
Непрочитано 15.08.2006, 16:07
#11
Zouss


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


да не суть важно какая система координат (насколько я помню транслировать можно) - 210 группа никоим образом на координаты воршин не влияет, тем более что в общем случае она не обязана совпадать с направлением оси Z OCS
Zouss вне форума  
 
Непрочитано 15.08.2006, 18:28
#12
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,413
Отправить сообщение для Александр Ривилис с помощью Skype™


Цитата:
Сообщение от Zouss
... 210 группа никоим образом на координаты воршин не влияет, тем более что в общем случае она не обязана совпадать с направлением оси Z OCS ...
Обязана! Поменяйте группу 210 и посмотрите куда "улетит" эта полилиния. При том, что группы 10 останутся теми же. Поэтому еще раз подчеркну, что моя функция возвращает вершины в OCS а не в WCS.
Александр Ривилис вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > примитив polyline и подпримитивы, не могу "достучаться