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

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

Координата Z из полилинии

Ответ
Поиск в этой теме
Непрочитано 09.09.2010, 12:58 #1
Координата Z из полилинии
Zaghim
 
Регистрация: 01.07.2010
Сообщений: 521

Подскажите, как получить на лиспе координату 3д полилинии в переменную?
Как получить из обычной линии понятно
(SETQ s_l_2 (ENTGET (ENTLAST)))
(SETQ fp_l_2 (CDR (ASSOC 10 s_l_2)))
(SETQ ep_l_2 (CDR (ASSOC 11 s_l_2)))
координаты начала точки и конца и оттуда уже достаем любую нужную координату...а здесь 10 - все нули...
Просмотров: 3438
 
Непрочитано 09.09.2010, 13:03
#2
Дима_

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


Код:
[Выделить все]
(defun pltolist (obj / tmp); возращает список координат вершин полилинии
(if (= (cod 0 obj) "LWPOLYLINE")
(mapcar '(lambda (x) (trans (append (cdr x) (list (cod 38 obj))) (cod 210 obj) 0)) (vl-remove-if-not '(lambda (x) (= (car x) 10)) (entget obj)))
);end of if
);end of pltolist
(defun cod (cd obj) ; возращает код cd примитива obj.
(if (and obj (= (type obj) 'ename))
(cdr (assoc cd (entget obj)))
));end of cod
изучи внимательно
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 09.09.2010, 13:13
#3
Zaghim


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


Я делаю вот так
(defun C:Prop ( / )
(setq lob (entget (car (entsel "Выберите линию"))))
(SETQ e_lob (CDR (ASSOC 38 lob)))
(setq c_lob (CDR (ASSOC 210 lob)))
)
Но в переменной с_lob у меня сидит вот такой список (0.0 0.0 1.0) - последняя единица не то, что нужно...
Zaghim вне форума  
 
Непрочитано 09.09.2010, 13:21
#4
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,996


Polylines and Blocks
Пример отсюда
Код:
[Выделить все]
(defun getCoord  (pl / pl)
  (vl-load-com)
  
  (or (eq 'VLA-OBJECT (type pl))
      (setq pl (vlax-ename->vla-object pl)))

  (if (eq "AcDbPolyline" (vla-get-ObjectName pl))
    (vlax-list->2D-point
      (vlax-get pl 'Coordinates)) nil))

(defun vlax-list->2D-point  (lst)
  (if lst
    (cons (list (car lst) (cadr lst))
          (vlax-list->2D-point (cddr lst)))))

(defun c:vWrite  (/ oFile en)

  (setq oFile (open
                (strcat (getvar "DWGPREFIX")
                        (substr (getvar "DWGNAME") 1
                                (- (strlen (getvar "DWGNAME")) 4)) ".txt") "w"))

  (while (setq en (car (entsel "\nSelect Polyline: ")))
    (foreach x (getCoord en)
      (write-line (strcat (rtos (car x)) (chr 44) (rtos (cadr x))) oFile))
    (write-line "" oFile))

  (close oFile)
  (princ))
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 09.09.2010, 13:23
1 | #5
CB

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


Код:
[Выделить все]
(setq pl (vlax-ename->vla-object (car (entsel "\nВыберите pline: "))))
(vlax-safearray->list
(vlax-variant-value (vla-get-coordinates pl)))
CB вне форума  
 
Автор темы   Непрочитано 09.09.2010, 13:24
#6
Zaghim


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


Как все сложно...а можно без ВЛиспа? На АвтоЛиспе никак нельзя?

CB - Спасибо чувак, то что нужно!!!!!!!! хоть и не без влиспа))) но не суть, СПАСИБО!!!

Но все-таки, как сие сделать на автолиспе?
Я хочу сделать так, выбрал я объект
(setq lob (entget (car (entsel "Выберите линию"))))
Затем посмотрю 3д это полилиния или lw, и, исходя из этого, сделаю либо
(SETQ e_lob (CDR (ASSOC 38 lob))) - получу elevation
либо
???????????????????????? - получу координату оси Z!

Последний раз редактировалось Zaghim, 09.09.2010 в 13:34.
Zaghim вне форума  
 
Непрочитано 09.09.2010, 13:35
1 | #7
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,996


Цитата:
Сообщение от Zaghim Посмотреть сообщение
На АвтоЛиспе никак нельзя?
Посмотри ссылку Polylines and Blocks из #4. Там все подробно с комментариями написано и дан пример команды c:coord
Вот перевод на русский. Немного коряво, но суть понятна. Перевод кодов не читать, а смотреть на оригинальные
Цитата:
???????????????????????? - получу координату оси Z!
Это как это. В 3D полилинии каждая вершина может иметь разную координату Z
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 09.09.2010, 13:44
#8
KSI


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


И чего там сложного? Вытащить группу, в которой записаны координаты. И вытащить из списка нужную координату.
Код:
[Выделить все]
(setq id_prim (car (entsel)))
(setq coord_x (nth 1 (assoc 10 (entget id_prim))))
(setq coord_y (nth 2 (assoc 10 (entget id_prim))))
(setq coord_z (nth 3 (assoc 10 (entget id_prim))))
KSI вне форума  
 
Автор темы   Непрочитано 09.09.2010, 14:33
#9
Zaghim


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


KSI, а теперь попробуй нарисуй полилинию и выполни свою команду))
Если бы все так просто было я бы не писал.

VVA - вот оно)))))) теперь 100% в яблочко!!! МЕГАРЕСПЕКТ)))

Последний раз редактировалось Zaghim, 09.09.2010 в 14:47.
Zaghim вне форума  
 
Непрочитано 09.09.2010, 15:28
#10
KSI


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


Zaghim, это приведено для примера.
А я вытягивал, и для 3d-полилинии и для LW-полилинии у всех вершин.
Тоже нет ничего сложного, хотя я и не великий программист.
Для LW-полилинии делал обработку списка описания примитива в цикле, с удалением обработанной группы. И цикл до тех пор, пока имеется группа 10.
Для 3d-полилинии в цикле обработка примитивов VERTEX, применяя (entnext), пока не дойдем до примитива SEQEND.
Вот пожалуйста, написано более 10 лет назад:
Код:
[Выделить все]
;; For AutoCAD R13
;; Координаты вершин 3DPolyline, LwPolyline и Point в текстовый файл.
;; 

(defun C:FCOORD ()

  (defun point_coord ()
    (setq name_point (getstring T "Name point: "))
    (setq coord_x (nth 1 (assoc 10 (entget id_prim))))
    (setq coord_y (nth 2 (assoc 10 (entget id_prim))))
    (setq coord_z (nth 3 (assoc 10 (entget id_prim))))
    (setq coord_xyz (strcat name_point " x=" (rtos coord_x) " y=" (rtos coord_y) " z=" (rtos coord_z)))
    (print coord_xyz id_file)
  ) ; end defun point_coord

  (defun polyline_coord ()
    (setq name_pline (getstring T "Name polyline: "))
    (print name_pline id_file)
    (while (/= "SEQEND" (cdr (assoc 0 (entget (entnext id_prim)))))
      (setq id_prim (entnext id_prim))
      (setq coord_x (nth 1 (assoc 10 (entget id_prim))))
      (setq coord_y (nth 2 (assoc 10 (entget id_prim))))
      (setq coord_z (nth 3 (assoc 10 (entget id_prim))))
      (setq coord_xyz (strcat "x=" (rtos coord_x) " y=" (rtos coord_y) " z=" (rtos coord_z)))
      (print coord_xyz id_file)
    )
    (print " " id_file)
  ) ; end defun polyline_coord

  (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.09.2010, 15:53
#11
Zaghim


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


У меня получилось так:
Код:
[Выделить все]
(setq lob (entget (car (entsel "Выберите линию"))))
  (setq n_lob (cdr (assoc 0 lob)))
  (if (equal n_lob "LWPOLYLINE")
    (setq e_lob (cdr (assoc 38 lob)))
    (progn
      (setq lob1 (entget (entnext (cdr (car lob)))))
      (setq e_lob (cdr (assoc 10 lob1)))
      (setq e_lob (nth 2 e_lob))
    )
  )
Zaghim вне форума  
 
Непрочитано 09.09.2010, 15:59
#12
Кулик Алексей aka kpblc
Moderator

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


Код:
[Выделить все]
;|
*    Функция получения координат легкой полилинии (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
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Координата Z из полилинии



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Новые команды для работы с полилинией VVA Программирование 647 18.09.2023 11:16
lisp: Длина по полилинии до точки vosh LISP 19 15.07.2013 15:10
как преобразовать полилинии с шириной в полилинии с весом идентичным ширине? Vadym AutoCAD 28 05.07.2010 21:14
выноски к полилинии gizmo_zx Программирование 6 01.03.2010 12:17