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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Получить список точек перелома полилинии (Lisp/VBA)

Получить список точек перелома полилинии (Lisp/VBA)

Ответ
Поиск в этой теме
Непрочитано 22.03.2011, 17:58 #1
Получить список точек перелома полилинии (Lisp/VBA)
mephis
 
Регистрация: 03.03.2011
Сообщений: 13

Нужно получить список точек перелома полилинии от первой до последней. Желательно на Лиспе. Как это делается, или, если несложно, прошу функцию. Заранее спасибо.
На рисунке показана цель.

Миниатюры
Нажмите на изображение для увеличения
Название: polyline.JPG
Просмотров: 117
Размер:	8.3 Кб
ID:	55984  

Просмотров: 6398
 
Непрочитано 22.03.2011, 18:05
#2
Кулик Алексей aka kpblc
Moderator

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


Список вершин, что ли? Ну так не проблема...
Если в системе координат объекта - то совсем просто:
Код:
[Выделить все]
 (mapcar 'cdr (vl-remove-if-not '(lambda(x)(=(car x) 10)) (entget (car (entsel "\nSelect lwpline : ")))))
Если полилиния 3D или она не в мировой системе координат, то код усложняется. Надо?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 22.03.2011, 18:26
#3
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,990
<phrase 1= Отправить сообщение для VVA с помощью Skype™


Для WCS не намного сложнее _kpblc-conv-ent-pline-vertex-to-wcs
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 22.03.2011, 18:32
#4
Кулик Алексей aka kpblc
Moderator

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


Спасибо, но мне было лениво искать
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 22.03.2011, 18:42
#5
mephis


 
Регистрация: 03.03.2011
Сообщений: 13
<phrase 1=


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Список вершин, что ли? Ну так не проблема...
Если в системе координат объекта - то совсем просто:
Код:
[Выделить все]
 (mapcar 'cdr (vl-remove-if-not '(lambda(x)(=(car x) 10)) (entget (car (entsel "\nSelect lwpline : ")))))
Если полилиния 3D или она не в мировой системе координат, то код усложняется. Надо?
большое спасибо.
да, желательно и этот вариант
mephis вне форума  
 
Непрочитано 22.03.2011, 18:47
#6
Кулик Алексей aka kpblc
Moderator

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


Ну так какая полилиния-то? Обычная или 3D? Для обычной (несглаженной) - см.№3
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 22.03.2011, 18:49
#7
mephis


 
Регистрация: 03.03.2011
Сообщений: 13
<phrase 1=


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Ну так какая полилиния-то? Обычная или 3D? Для обычной (несглаженной) - см.№3
3D полилиния
mephis вне форума  
 
Непрочитано 22.03.2011, 18:58
#8
Кулик Алексей aka kpblc
Moderator

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


Код:
[Выделить все]
 (vl-load-com)

(defun _dwgru-get-3dpline-coords (ent / fun_conv-list-to-3d res)
                                 ;|
*  Возвращает список 3D-координат вершин 3D-полилинии. Контроль типа параметра
* не выполняется
*    Параметры вызова:
ent -> ename или vla-указатель на обрабатываемый примитив
*    Примеры вызова:
(_dwgru-get-3dpline-coords (car (entsel "\nSelect 3dpline : ")))
|;

  (defun fun_conv-list-to-3d (lst / res)
    (cond
      ((not lst) nil)
      ((< (length lst) 3)
       (setq res lst)
       )
      (t
       (setq res (cons (list (car lst) (cadr lst) (caddr lst))
                       (fun_conv-list-to-3d (cdddr lst))
                       ) ;_ end of cons
             ) ;_ end of setq
       )
      ) ;_ end of cond
    ) ;_ end of defun

  (cond
    ((= (type ent) 'ename)
     (setq res (_dwgru-get-3dpline-coords (vlax-ename->vla-object ent)))
     )
    ((= (type ent) 'vla-object)
     (setq res (fun_conv-list-to-3d
                 (vlax-safearray->list
                   (vlax-variant-value
                     (vla-get-coordinates ent)
                     ) ;_ end of vlax-variant-value
                   ) ;_ end of vlax-safearray->list
                 ) ;_ end of fun_conv-list-to-3d
           ) ;_ end of setq
     )
    ) ;_ end of cond
  ) ;_ end of defun
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 23.03.2011, 19:21
#9
mephis


 
Регистрация: 03.03.2011
Сообщений: 13
<phrase 1=


Большое спасибо
mephis вне форума  
 
Непрочитано 23.04.2011, 20:35
#10
AVK


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


Можно ли еще дополнительно вытащить радиус кривизны сегмента полилинии?
AVK вне форума  
 
Автор темы   Непрочитано 13.12.2011, 15:35
#11
mephis


 
Регистрация: 03.03.2011
Сообщений: 13
<phrase 1=


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Код:
[Выделить все]
 (vl-load-com)

(defun _dwgru-get-3dpline-coords (ent / fun_conv-list-to-3d res)
                                 ;|
*  Возвращает список 3D-координат вершин 3D-полилинии. Контроль типа параметра
* не выполняется
*    Параметры вызова:
ent -> ename или vla-указатель на обрабатываемый примитив
*    Примеры вызова:
(_dwgru-get-3dpline-coords (car (entsel "\nSelect 3dpline : ")))
|;

  (defun fun_conv-list-to-3d (lst / res)
    (cond
      ((not lst) nil)
      ((< (length lst) 3)
       (setq res lst)
       )
      (t
       (setq res (cons (list (car lst) (cadr lst) (caddr lst))
                       (fun_conv-list-to-3d (cdddr lst))
                       ) ;_ end of cons
             ) ;_ end of setq
       )
      ) ;_ end of cond
    ) ;_ end of defun

  (cond
    ((= (type ent) 'ename)
     (setq res (_dwgru-get-3dpline-coords (vlax-ename->vla-object ent)))
     )
    ((= (type ent) 'vla-object)
     (setq res (fun_conv-list-to-3d
                 (vlax-safearray->list
                   (vlax-variant-value
                     (vla-get-coordinates ent)
                     ) ;_ end of vlax-variant-value
                   ) ;_ end of vlax-safearray->list
                 ) ;_ end of fun_conv-list-to-3d
           ) ;_ end of setq
     )
    ) ;_ end of cond
  ) ;_ end of defun
когда я меняю ПСК, функция начинает выдавать совсем другой список точек, нежели я вижу в свойствах объекта. почему так?
mephis вне форума  
 
Непрочитано 13.12.2011, 15:42
#12
Дима_

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


Так вывод у тебя меняется не в функции, а в свойствах объекта (потому, что она показывает точки относительно текущей ПСК).
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 13.12.2011, 15:54
#13
mephis


 
Регистрация: 03.03.2011
Сообщений: 13
<phrase 1=


Цитата:
Сообщение от Дима_ Посмотреть сообщение
Так вывод у тебя меняется не в функции, а в свойствах объекта (потому, что она показывает точки относительно текущей ПСК).
я строю полилинию в определенной плоскости, относительно МСК она может лежать как угодно. потом я перемещаю ПСК в эту плоскость так, что полилиния лежит в координатах x,y этой новой ПСК.
как получить точки относительно новой пск?
mephis вне форума  
 
Непрочитано 13.12.2011, 15:56
#14
Кулик Алексей aka kpblc
Moderator

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


Полилиния или 3D-полилиния?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 13.12.2011, 16:01
#15
mephis


 
Регистрация: 03.03.2011
Сообщений: 13
<phrase 1=


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Полилиния или 3D-полилиния?
3д полилиния
mephis вне форума  
 
Непрочитано 13.12.2011, 17:27
#16
Дима_

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


Цитата:
Сообщение от mephis Посмотреть сообщение
как получить точки относительно новой пск?
Преобразовать координаты мз мировой системы с текущие пск - см. help функции trans
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 14.10.2015, 09:59
#17
Pavel_GP

Инженер-гидрограф
 
Регистрация: 15.09.2011
г.г. Ленинград
Сообщений: 170


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Код:
[Выделить все]
 (mapcar 'cdr (vl-remove-if-not '(lambda(x)(=(car x) 10)) (entget (car (entsel "\nSelect lwpline : ")))))
Привет. Прошло уже почти 4 года, но тема опять актуальна.
Можешь доделать свое решение, так чтобы я мог после выбора полилинии (простой) , с множеством вершин, редактировать координаты этих вершин с каждой отдельно (но это потом в коде)?
Благодарен.
__________________
AutoCAD Civil 3D 2012г. 32-разрядная.
Pavel_GP вне форума  
 
Непрочитано 14.10.2015, 10:29
#18
Кулик Алексей aka kpblc
Moderator

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


Так ты и так получишь список вершин. Выбирай нужную по номеру, меняй как хочешь а потом обратно подставляй в полилинию. В чем вопрос-то?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 14.10.2015, 12:12
#19
Pavel_GP

Инженер-гидрограф
 
Регистрация: 15.09.2011
г.г. Ленинград
Сообщений: 170


Для подсчета кол-ва вершин в полилинии, проверь код плз (код не мой), но применим к твоему решению.
Код:
[Выделить все]
 (defun C:off_test (/)
;;;получение координат вершин полилинии
  (setq	xy_v (mapcar 'cdr
		    (vl-remove-if-not
		      '(lambda (x) (= (car x) 10))
		      (entget (car (entsel "\nВыбрать полилинию : ")))
		    )
	    )
  )
  ;;;кол-во вершин
(defun our-v (w)
  (if (null w) 0 (1+ (our-v (cdr w)))))

(our-v '(a b c d))

(our-v '())
  (setq v_n (our-v xy_v))
)					;end off_test
или возможен вариант проще?
Твой ответ понятен, нужно циклом брать, чтоб у каждой точки менять координату.
__________________
AutoCAD Civil 3D 2012г. 32-разрядная.
Pavel_GP вне форума  
 
Непрочитано 14.10.2015, 15:33
#20
Кулик Алексей aka kpblc
Moderator

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


Мне часто приходится работать с неактивным документом или с описаниями блоков, поэтому я предпочитаю ActiveX-подход. Вариант кода предоставлять?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Получить список точек перелома полилинии (Lisp/VBA)

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
LISP получить список установленных в системе (векторных) шрифтов или хотя бы узнать, установлен ли указанный Ax3 LISP 9 08.02.2011 14:11
Программно получить список системных переменных (без вывода в текстовый файл) Ax3 Программирование 3 27.12.2010 16:29
Получить список блоков в чертеже DonVik Программирование 6 27.08.2008 15:08
Помощь по Лире Серега М Лира / Лира-САПР 52 28.05.2007 02:47
Команда _pline и список точек переменной длины Fogel Программирование 8 19.01.2007 14:08