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

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

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

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

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

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

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

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


Список вершин, что ли? Ну так не проблема...
Если в системе координат объекта - то совсем просто:
Код:
[Выделить все]
 (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,996


Для 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
С.-Петербург
Сообщений: 40,411


Спасибо, но мне было лениво искать
__________________
Моя библиотека 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
С.-Петербург
Сообщений: 40,411


Ну так какая полилиния-то? Обычная или 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
С.-Петербург
Сообщений: 40,411


Код:
[Выделить все]
 (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,839


Так вывод у тебя меняется не в функции, а в свойствах объекта (потому, что она показывает точки относительно текущей ПСК).
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 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
С.-Петербург
Сообщений: 40,411


Полилиния или 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,839


Цитата:
Сообщение от 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
С.-Петербург
Сообщений: 40,411


Так ты и так получишь список вершин. Выбирай нужную по номеру, меняй как хочешь а потом обратно подставляй в полилинию. В чем вопрос-то?
__________________
Моя библиотека 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
С.-Петербург
Сообщений: 40,411


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

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


Да, если не трудно. спс. (я заметил, что ты часто используешь в своих решениях vla-"приставку")
Как вытащить первую координату вершины я понял (
Код:
[Выделить все]
 (setq xy (car xy_v))
      (setq x (car xy))
      (setq y (cadr xy))
, где xy_v список координат вершин полилинии),
но мне пока не понятно как вытащить все по-порядку, (потом я изменяю координаты(различные математические действия)), и создать новый список с новыми координатами?
__________________
AutoCAD Civil 3D 2012г. 32-разрядная.

Последний раз редактировалось Pavel_GP, 14.10.2015 в 15:51.
Pavel_GP вне форума  
 
Непрочитано 14.10.2015, 16:03
1 | #22
Кулик Алексей aka kpblc
Moderator

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


Примерно так:
Код:
[Выделить все]
 (defun test (/ _kpblc-conv-list-to-2dpoints _kpblc-conv-vla-to-list ent bit coords idx)
  (defun _kpblc-conv-list-to-2dpoints (lst / res)
    (cond
      ((not lst)
       nil
       )
      (t
       (setq res (cons (list (car lst)
                             (if (cadr lst)
                               (cadr lst)
                               0.
                               ) ;_ end of if
                             ) ;_ end of list
                       (_kpblc-conv-list-to-2dpoints (cddr lst))
                       ) ;_ end of cons
             ) ;_ end of setq
       )
      ) ;_ end of cond
    res
    ) ;_ end of defun

  (defun _kpblc-conv-vla-to-list (value / res)
    (cond
      ((listp value)
       (mapcar (function _kpblc-conv-vla-to-list) value)
       )
      ((= (type value) 'variant)
       (_kpblc-conv-vla-to-list (vlax-variant-value value))
       )
      ((= (type value) 'safearray)
       (if (>= (vlax-safearray-get-u-bound value 1) 0)
         (_kpblc-conv-vla-to-list (vlax-safearray->list value))
         ) ;_ end of if
       )
      ((and (= (type value) 'vla-object)
            (vlax-property-available-p value 'count)
            ) ;_ end of and
       (vlax-for sub value
         (setq res (cons sub res))
         ) ;_ end of vlax-for
       ) ;_ end of cond
      (t value)
      ) ;_ end of cond
    ) ;_ end of defun

  (if (and (= (type (setq ent (vl-catch-all-apply
                                (function
                                  (lambda ()
                                    (car (entsel "\nSelect LWPolyline <Cancel> : "))
                                    ) ;_ end of LAMBDA
                                  ) ;_ end of function
                                ) ;_ end of VL-CATCH-ALL-APPLY
                          ) ;_ end of setq
                    ) ;_ end of type
              'ename
              ) ;_ end of =
           (setq ent (vlax-ename->vla-object ent))
           (= (vla-get-objectname ent) "AcDbPolyline")
           ) ;_ end of and
    (progn
      (setq bit 0
            idx 0
            ) ;_ end of setq
      (foreach vertex (_kpblc-conv-list-to-2dpoints (_kpblc-conv-vla-to-list (vla-get-coordinates ent)))
;;; Здесь ты делаешь то, что считаешь нужным
        (setq coords (cons (cond
                             ((= bit 0) (list (+ (car vertex) 10.) (cadr vertex)))
                             ((= bit 1) (list (car vertex) (+ (cadr vertex) 10.)))
                             ((= bit 2) (list (- (car vertex) 10.) (cadr vertex)))
                             ((= bit 3) (list (car vertex) (- (cadr vertex) 10.)))
                             ) ;_ end of cond
                           coords
                           ) ;_ end of cons
              bit    (if (> bit 2)
                       0
                       (1+ bit)
                       ) ;_ end of if
              ) ;_ end of setq
        ) ;_ end of foreach
      (setq coords (apply (function append) (reverse coords)))
;;; И теперь чохом назначаешь все координаты в полилинию
      (vla-put-coordinates ent
                           (vlax-make-variant
                             (vlax-safearray-fill
                               (vlax-make-safearray
                                 vlax-vbdouble
                                 (cons 0 (1- (length coords)))
                                 ) ;_ end of vlax-make-safearray
                               coords
                               ) ;_ end of vlax-safearray-fill
                             ) ;_ end of vlax-make-variant
                           ) ;_ end of vla-put-Coordinates
      (vla-update ent)
      ) ;_ end of progn
    ) ;_ end of if
  ) ;_ end of defun
----- добавлено через 16 сек. -----
Это как пример, учти!
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 14.10.2015, 16:51
#23
Pavel_GP

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


Спс за труды, вопросики:
Поясни по коду:
1. Где список координат, а именно X и Y?
2. Куда вставить формулу (функция), которая изменяет каждую координату вершины полилинии? Плз примерчик простой (+ -)
Код:
[Выделить все]
 ;;; Здесь ты делаешь то, что считаешь нужным
        (setq coords (cons (cond
                             ((= bit 0) (list (+ (car vertex) 10.) (cadr vertex)))
                             ((= bit 1) (list (car vertex) (+ (cadr vertex) 10.)))
                             ((= bit 2) (list (- (car vertex) 10.) (cadr vertex)))
                             ((= bit 3) (list (car vertex) (- (cadr vertex) 10.)))
                             ) ;_ end of cond
                           coords
                           ) ;_ end of cons
              bit    (if (> bit 2)
                       0
                       (1+ bit)
                       ) ;_ end of if
              ) ;_ end of setq
        ) ;_ end of foreach
      (setq coords (apply (function append) (reverse coords)))
- это пример?
3. Где список в котором будут находиться новые координаты?
4. Где в коде кол-во вершин полилинии?
5. Пояснения добавь плз в код
Сложноват для меня код, вот поэтому много вопросов
Благодарен.
__________________
AutoCAD Civil 3D 2012г. 32-разрядная.

Последний раз редактировалось Pavel_GP, 14.10.2015 в 16:59.
Pavel_GP вне форума  
 
Непрочитано 14.10.2015, 16:59
#24
Кулик Алексей aka kpblc
Moderator

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


Список начальных координат нигде не сохраняется. Он получается динамически:
Код:
[Выделить все]
(_kpblc-conv-list-to-2dpoints ; 3. Список чисел преобразовываем в список координат
 (_kpblc-conv-vla-to-list ; 2. Преобразовываем его в список чисел
  (vla-get-coordinates ent))) ; 1. Получаем variant-массив координат
Цитата:
Сообщение от Pavel_GP Посмотреть сообщение
Где список в котором будут находиться новые координаты?
Хранится в coords

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

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


Думаю лучше тут, вопрос всё таки про вершины полилинии. В той теме там на простых примерах, а тут vla-семейства, и тут никто не побеспокоит, а с другой стороны посмотреть если можешь перенеси наш диалог в ту тему. спс.
Завтра буду на работе и там разберу.

Пысы перешел в тему "Научите лиспу на примере" http://forum.dwg.ru/showthread.php?t=22894&page=137
__________________
AutoCAD Civil 3D 2012г. 32-разрядная.

Последний раз редактировалось Pavel_GP, 15.10.2015 в 09:43.
Pavel_GP вне форума  
Ответ
Вернуться   Форум 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