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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Помогите вытащить из полилинии все координаты вершин

Помогите вытащить из полилинии все координаты вершин

Ответ
Поиск в этой теме
Непрочитано 09.03.2011, 15:53 #1
Помогите вытащить из полилинии все координаты вершин
Zaghim
 
Регистрация: 01.07.2010
Сообщений: 521

Друзья, есть полилиния, длиннющая с кучей точек (вершин). Как вытащить список ее свойств понятно, вопросов нет. А как вот дальше имея в списке координаты XYZ под номером 10 и имея их в достаточном кол-ве вытаскивать их по порядку, ну скажем, в файл. Т.е., проще говоря, имеем прямоугольник, нарисованный полилинией, получили список в котором разная батва и 4 списка под номером 10 с координатами и дальше по порядку из всего списка вытащили только координаты. Вот... С линией понятно, там два номера начала и конца 10 и 11 вытащили - узнали, а тут не догоню, номера одинаковые.... помогите плиз
Просмотров: 21609
 
Непрочитано 09.03.2011, 16:04
1 | #2
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,840


в цикле, либо рекурсивной функцией проходишь по списку и делаешь необходимые действия с каждым эелементом.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 09.03.2011, 16:14
1 | #3
VH_


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


Список координат X и Y вершин плоской полилинии:
Код:
[Выделить все]
(mapcar 'cdr (vl-remove-if-not '(lambda (x) (= (car x) 10)) (entget <entity name>)))
"Координата Z" плоской полилинии хранится <отдельно> в группе с кодом 38.
VH_ вне форума  
 
Непрочитано 09.03.2011, 16:15
1 | #4
Лиспер


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


Вот хлебом не корми, дай рекурсию забацать
Код:
[Выделить все]
                                            ;|
*    Функция получения координат легкой полилинии (LWPOLYLINE) в WCS. Возвращает
* список 3Д-точек
*    Автор: BOZ (http://www.autocad.ru/cgi-bin/f1/board.cgi?t=26461HC)
|;
(defun lwpoly_vert (lwpoly / plinee elev vnv)
  (setq	plinee (entget lwpoly)
	elev   (cdr (assoc 38 plinee))
	vnv    (cdr (assoc 210 plinee))
	) ;_ end of setq
  (mapcar
    (function (lambda (x) (trans (list (cadr x) (caddr x) elev) vnv 0)))
    (vl-remove-if-not (function (lambda (x) (= (car x) 10))) plinee)
    ) ;_ end of mapcar
  ) ;_ end of defun
__________________
(/= RegDate StartReadDate)
Лиспер вне форума  
 
Автор темы   Непрочитано 09.03.2011, 16:27
#5
Zaghim


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


VH_, а как пользоваться вашим кодом?
Zaghim вне форума  
 
Непрочитано 09.03.2011, 16:38
1 | #6
VH_


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


Вместо <entity name> надо выполнить вызов <какой-нибудь> функции, возвращающей 'имя примитива' (либо подставить символ, если Вы с ним связали 'имя примитива'). Или вместо (entget <entity name>) подставить вызов функции, возвращающий список свойств примитива (либо символ, если Вы с ним связали список свойств примитива).
Еще более занятно использовать <рекурсивные> (mapcar) и (vl-remove-if-not) и изображать при этом смайлики.
VH_ вне форума  
 
Непрочитано 09.03.2011, 16:38
1 | #7
CB

Конструирование в области нефтеразведки
 
Регистрация: 10.02.2006
Гомель
Сообщений: 321


Код:
[Выделить все]
 (mapcar 'cdr (vl-remove-if-not '(lambda (x) (= (car x) 10)) (entget (car (entsel)))))
__________________
Никогда не спорьте с дураками - они опустят Вас до своего уровня и победят за счет опыта
CB вне форума  
 
Автор темы   Непрочитано 09.03.2011, 17:00
#8
Zaghim


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


СВ, круто, вот так работает... А как теперь все это дергать по одной паре координат? Мне это нужно воткнуть в файл...как в файл записывать знаю, нужен просто цикл вытаскивания пар)
Zaghim вне форума  
 
Непрочитано 09.03.2011, 17:05
1 | #9
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,840


(mapcar 'F(x) lst) - где F(x) - твоя функция записи с аргументом пара
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 09.03.2011, 17:35
1 | #10
KSI


 
Регистрация: 19.03.2004
Калининград
Сообщений: 1,842


Я пишу попроще, так как в программировании не силён.
Безо всякой рекурсии можно вот так.

Код:
[Выделить все]
  (defun lwpolyline_coord ()
    (setq name_pline (getstring T "Name polyline: "))
    (print name_pline id_file)
    (setq vert_kol (cdr (assoc 90 (entget id_prim))))
    (setq coord_z (cdr (assoc 38 (entget id_prim))))
    (setq f_vert (assoc 10 (entget id_prim)))
    (setq sp_vert (member f_vert (entget id_prim)))
    (setq i 1)
    (while (<= i vert_kol)
      (setq coord_x (nth 1 (assoc 10 sp_vert)))
      (setq coord_y (nth 2 (assoc 10 sp_vert)))
      (setq coord_xyz (strcat "x=" (rtos coord_x) " y=" (rtos coord_y) " z=" (rtos coord_z)))
      (print coord_xyz id_file)
      (setq sp_vert (cddr (cddr sp_vert)))
      (setq i (+ i 1))
    )
    (print " " id_file)
  ) ; end defun lwpolyline_coord


  (setq id_prim (car (entsel)))
  (while (= id_prim nil)
    (setq id_prim (car (entsel)))
  )
  (setq id_file (open (getfiled "Select Text File" "C:/" "txt" 1) "a"))
  (while (/= id_prim nil)
    (if (= "POINT" (cdr (assoc 0 (entget id_prim)))) (point_coord))
    (if (= "POLYLINE" (cdr (assoc 0 (entget id_prim)))) (polyline_coord))
    (if (= "LWPOLYLINE" (cdr (assoc 0 (entget id_prim)))) (lwpolyline_coord))
    (setq id_prim (car (entsel)))
  )
  (close id_file)
KSI вне форума  
 
Непрочитано 09.03.2011, 18:31
1 | #11
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,787


Мне вот только интересно - координаты вершин надо получать в системе координат объекта или в мировой?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 09.03.2011, 20:16
1 | #12
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


Цитата:
Сообщение от Zaghim Посмотреть сообщение
А как теперь все это дергать по одной паре координат? Мне это нужно воткнуть в файл...
никак не надо дергать, хранить можно и в таком виде:
Код:
[Выделить все]
 (vl-princ-to-string
	(vlax-safearray->list
	  (vlax-variant-value
		(vla-get-Coordinates
		  (vlax-ename->vla-object (car (entsel "\nУкажите полилинию")))))))
gomer вне форума  
 
Автор темы   Непрочитано 09.03.2011, 22:58
#13
Zaghim


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


Координаты нужно в мировой системе координат! Дергать тоже нужно, так как мне нужно это информацию скинуть в файл, в примерно такой виде:

объект1
координата Х координата У
10 10
25 14
Zaghim вне форума  
 
Непрочитано 09.03.2011, 23:08
1 | #14
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,787


Если в мировой, то без Z будет не обойтись
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 09.03.2011, 23:47
#15
Zaghim


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


Можно и с Z, я не обижусь)
Zaghim вне форума  
 
Непрочитано 10.03.2011, 00:14
1 | #16
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,840


Цитата:
Сообщение от Zaghim Посмотреть сообщение
Координаты нужно в мировой системе координат! Дергать тоже нужно, так как мне нужно это информацию скинуть в файл, в примерно такой виде:
Примерно так (не проверял) - строку в файл записать осилишь?
Код:
[Выделить все]
 (defun list-point->string (lst)
((lambda (frec) (strcat "X\tY\tZ\n" (frec lst)))
 (lambda (lst)
   (if lst (strcat (rtos (caar lst)) "\t"
                   (rtos (cadar lst)) "\t"
                   (rtos (caddar lst)) "\n"
                   (frec (cdr lst)))
           ""))))
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 10.03.2011, 09:22
#17
Zaghim


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


Дима_, ваш код нужно запускать в цикле или он сразу все делает?)) В файл запишу)

Вообще как-то пропустил код от KSI, а у него как раз то, что нужно!!!!!!!!!!!!!! Спасибо всем огромное и особенно KSI!!!!!

Последний раз редактировалось Zaghim, 10.03.2011 в 09:40.
Zaghim вне форума  
 
Непрочитано 05.12.2018, 16:21
#18
zastroishik


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



Прошли года и леты, с тех пор как эта тема закрыта, но вот я набрел на нее и, будучи ламером в лиспе, начал изучать его на основе кода KSI.
Так вот, как мне кажется, я обнаружил в нем ошибку - в 14-той строке должно быть

Код:
[Выделить все]
 (setq sp_vert (cdddr (cddr sp_vert)))
а иначе происходит задвоение через каждые 4 точки.
Запинайте, если не прав.
zastroishik вне форума  
 
Непрочитано 06.08.2021, 13:08
#19
gaz_nevada


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


Добрый день. Большая благодарность всем в этой ветке за полезную информацию. Не владею LISP, методом "тыка" подправил следующий код под интересующую меня форму вывода во внешний файл:
Код:
[Выделить все]
  (defun lwpolyline_coord ()
    (setq name_pline (getstring T "Name polyline: "))
    (print name_pline id_file)
    (setq vert_kol (cdr (assoc 90 (entget id_prim))))
    (setq coord_z (cdr (assoc 38 (entget id_prim))))
    (setq f_vert (assoc 10 (entget id_prim)))
    (setq sp_vert (member f_vert (entget id_prim)))
    (setq i 1)
    (while (<= i vert_kol)
      (setq coord_x (nth 1 (assoc 10 sp_vert)))
      (setq coord_y (nth 2 (assoc 10 sp_vert)))
      (setq coord_xyz (strcat "x=" (rtos coord_x) " y=" (rtos coord_y) " z=" (rtos coord_z)))
      (print coord_xyz id_file)
      (setq sp_vert (cdddr (cddr sp_vert)))
      (setq i (+ i 1))
    )
    (print " " id_file)
  ) ; end defun lwpolyline_coord


  (setq id_prim (car (entsel)))
  (while (= id_prim nil)
    (setq id_prim (car (entsel)))
  )
  (setq id_file (open (getfiled "Select Text File" "C:/" "txt" 1) "a"))
  (while (/= id_prim nil)
    (if (= "POINT" (cdr (assoc 0 (entget id_prim)))) (point_coord))
    (if (= "POLYLINE" (cdr (assoc 0 (entget id_prim)))) (polyline_coord))
    (if (= "LWPOLYLINE" (cdr (assoc 0 (entget id_prim)))) (lwpolyline_coord))
    (setq id_prim (car (entsel)))
  )
  (close id_file)
Но осталось 2 момента, в которых прошу помощи, кому не сложно:
1. нужно вводить название полилинии ДО, а не ПОСЛЕ ее выборки
2. нужно перекрасить полилинию после ее выборки в другой (скажем, красный) цвет

Заранее благодарен за помощь.

Последний раз редактировалось gaz_nevada, 06.08.2021 в 13:18.
gaz_nevada вне форума  
 
Непрочитано 28.08.2021, 16:55
#20
oleg_marshinov


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


Но осталось 2 момента, в которых прошу помощи, кому не сложно:
1. нужно вводить название полилинии ДО, а не ПОСЛЕ ее выборки
2. нужно перекрасить полилинию после ее выборки в другой (скажем, красный) цвет

Заранее благодарен за помощь.[/quote]

Код:
[Выделить все]
 
 (defun C:lwpolyline_coord ()
(setq id_file (open (getfiled "Select Text File" "C:/" "txt" 1) "a"))
;;; КОД ОСОБО ИСПРАВЛЯТЬ НЕ СТАЛ, ОСТАВИЛ ВСЕ КАК ЕСТЬ , НО ТАК ТО СМЕШНО ПОЛУЧИЛОСЬ ))))

(setq num (getint "ВВЕДИТЕ ЦВЕТ "))
 
    (setq id_prim (car (entsel)))  
    (while (/= id_prim nil)
      
   (setq name_pline (getstring T "Name polyline: "))
   (print name_pline id_file)  
    



   
    (setq vert_kol (cdr (assoc 90 (entget id_prim))))
    (setq coord_z (cdr (assoc 38 (entget id_prim))))
    (setq f_vert (assoc 10 (entget id_prim)))
    (setq sp_vert (member f_vert (entget id_prim)))
    (setq i 1)
    (while (<= i vert_kol)
      (setq coord_x (nth 1 (assoc 10 sp_vert)))
      (setq coord_y (nth 2 (assoc 10 sp_vert)))
      (setq coord_xyz (strcat "x=" (rtos coord_x) " y=" (rtos coord_y) " z=" (rtos coord_z)))
      (print coord_xyz id_file)
      (setq sp_vert (cdddr (cddr sp_vert)))
      (setq i (+ i 1))
    )
      (entmod (subst (cons 62 num) (assoc 62 (entget id_prim)) (entget  id_prim)))
(setq id_prim (car (entsel)))
    
      ); WHILE
    (print " " id_file)

	

  (close id_file)

    
  ) ; end defun lwpolyline_coord
(alert "ФУНКЦИЯ ЗАГРУЖАЕТСЯ 1  РАЗ  , ДАЛЕЕ ВЫЗЫВАЕТС КОМАНДОЙ lwpolyline_coord, РАБОТАЕТ ПОКА ВЫБИРАЮТ ПОЛИЛИНИЮ , ТОК КОГДА ВВОД ИМЕНИ ВПЕРЕД ПЕРСТАВИЛ ФИГНЯ ВЫХОДИТ ИМЯ ПРОСИТ ДАЛЕЕЕ НЕ РАБОТАЕТ, ЦВЕТ МЕНЯЕТ ТОЛЬКО ЕСЛИ ОН БЫЛ НЕ ПО СЛОЮ, ТАМ НЕТ ГРУППЫ ТОГДА DXF")
;;;(lwpolyline_coord) 


oleg_marshinov вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Помогите вытащить из полилинии все координаты вершин

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Интерполяция отметок вершин полилинии между двумя заданными точками Кочетков Андрей Программирование 7 22.07.2019 20:14
Помогите с привязкой границ участка, есть географические координаты. Baurzhan_971 Прочее. Архитектура и строительство 2 12.12.2010 16:00
Преобразование координат вершин полилинии из мировой системы координат в текущую молодой человек Программирование 1 16.01.2010 22:57
координаты вершин выбранной полилинии на VB? как получить ssv22 Программирование 5 17.07.2008 00:01
Изменение отметки Z вершин полилинии Mazai Программирование 5 27.05.2008 03:35