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

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

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

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

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

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

Просмотров: 6425
 
Непрочитано 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
С.-Петербург
Сообщений: 39,843


Примерно так:
Код:
[Выделить все]
 (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
С.-Петербург
Сообщений: 39,843


Список начальных координат нигде не сохраняется. Он получается динамически:
Код:
[Выделить все]
(_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