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

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

Как получить точки пересечения двух полилиний?

Ответ
Поиск в этой теме
Непрочитано 14.07.2009, 22:27 #1
Как получить точки пересечения двух полилиний?
Mozgunov
 
Начинающий проектировщик
 
Санкт-Петербург
Регистрация: 07.02.2008
Сообщений: 443

Как при помощи автолиспа получить массив точек пересечения двух полилиний? Собственно заголовок и являяется вопросом. Подскажите хотя бы напрвление в котором нужно искать. Спасибо!
Просмотров: 13183
 
Непрочитано 15.07.2009, 00:10
#2
Дима_

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


Держи:
Код:
[Выделить все]
(defun intersect (obj1 obj2 / tmp x y)
(setq tmp 
(vlax-variant-value (apply 'vla-intersectwith
(reverse (cons acExtendNone (mapcar 'vlax-ename->vla-object (list obj1 obj2)))))))
(if (> (vlax-safearray-get-u-bound tmp 1) 0)
(vl-remove nil (mapcar '(lambda (z / ret) 
(if y (setq ret (list x y z) x nil y nil) (if x (setq y z) (setq x z))) ret) 
(vlax-safearray->list tmp)))
);end of if
);end of intersect
пример: (intersect (entlast) (entnext))
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 15.07.2009, 09:31
#3
Юта


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


А как получить точки пересечения одной полилинии, указанной юзером (находящейся неважно в каком слое) и других линий (полилиний), находящихся в слое "triangulate"?
Юта вне форума  
 
Непрочитано 15.07.2009, 09:50
#4
Кулик Алексей aka kpblc
Moderator

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


Код:
[Выделить все]
(defun get-intersections (/                              _kpblc-list-dublicates-remove  _kpblc-conv-selset-to-ename
                          _kpblc-conv-list-to-3dpoints   _kpblc-conv-ent-to-ename       _kpblc-conv-ent-to-vla
                          _kpblc-conv-vla-to-list        selset1                        selset2
                          )

  (defun _kpblc-list-dublicates-remove (lst / result)
                                       ;|
*    Функция исключения дубликатов элементов списка 
*    Параметры вызова:
*	lst	обрабатываемый список
*    Возвращаемое значение: список без дубликатов соседних элементов
*    Примеры вызова:
(_kpblc-list-dublicates-remove '((0.0 0.0 0.0) (10.0 0.0 0.0) (10.0 0.0 0.0) (0.0 0.0 0.0)) nil)
((0.0 0.0 0.0) (10.0 0.0 0.0) (0.0 0.0 0.0))
|;
    (foreach x lst
      (if (not (member x result))
        (setq result (cons x result))
        ) ;_ end of if
      ) ;_ end of foreach
    (reverse result)
    ) ;_ end of defun

  (defun _kpblc-conv-selset-to-ename (selset / tab item)
                                     ;|
*    Преобразование набора, полученного через ssget, в список ename-представлени
* примитивов.
*    Параметры вызова:
	selset	набор примитивов
*    Примеры вызова:
(_kpblc-conv-selset-to-ename (ssget))
|;
    (cond
      ((not selset) nil)
      ((= (type selset) 'pickset)
       (repeat (setq tab  nil
                     item (sslength selset)
                     ) ;_ end setq
         (setq tab (cons (ssname selset (setq item (1- item))) tab))
         ) ;_ end repeat
       )
      ((= (type selset) 'vla-object)
       (_kpblc-conv-vla-to-list selset)
       )
      ((listp selset) selset)
      ) ;_ end of cond
    ) ;_ end of defun

  (defun _kpblc-conv-list-to-3dpoints (lst / res)
                                      ;|
*    Функция конвертации списка чисел в список 3-мерных точек.
*    Параметры вызова:
*	lst	список чисел
*    Примеры вызова:
(_kpblc-conv-list-to-3dpoints '(1 2 3 4 5 6)) ;-> ((1 2 3) (4 5 6))
(_kpblc-conv-list-to-3dpoints '(1 2 3 4 5))   ;-> ((1 2 3) (4 5 0.))
|;
    (cond
      ((not lst)
       nil
       )
      (t
       (setq res (cons (list (car lst)
                             (if (cadr lst)
                               (cadr lst)
                               0.
                               ) ;_ end of if
                             (if (caddr lst)
                               (caddr lst)
                               0.
                               ) ;_ end of if
                             ) ;_ end of list
                       (_kpblc-conv-list-to-3dpoints (cdddr lst))
                       ) ;_ end of cons
             ) ;_ end of setq
       )
      ) ;_ end of cond
    res
    ) ;_ end of defun

  (defun _kpblc-conv-ent-to-ename (ent_value /)
                                  ;|
*    Функция преобразования полученного значения в ename
*    Параметры вызова:
*	ent_value	значение, которое надо преобразовать в примитив. Может
*			быть именем примитива, vla-указателем или просто
*			списком.
*			Если не принадлежит ни одному из указанных типов,
*			возвращается nil
*    Примеры вызова:
(_kpblc-conv-ent-to-ename (entlast))
(_kpblc-conv-ent-to-ename (vlax-ename->vla-object (entlast)))
|;
    (cond
      ((= (type ent_value) 'vla-object)
       (vlax-vla-object->ename ent_value)
       )
      ((= (type ent_value) 'ename) ent_value)
      ((= (type ent_value) 'str) (handent ent_value))
      ((= (type ent_value) 'list) (cdr (assoc -1 ent_value)))
      (t nil)
      ) ;_ end of cond
    ) ;_ end of defun

  (defun _kpblc-conv-ent-to-vla (ent_value / res)
                                ;|
*    Функция преобразования полученного значения в vla-указатель.
*    Параметры вызова:
*	ent_value	значение, которое надо преобразовать в указатель. Может
*			быть именем примитива, vla-указателем или просто
*			списком.
*			Если не принадлежит ни одному из указанных типов,
*			возвращается nil
*    Примеры вызова:
(_kpblc-conv-ent-to-vla (entlast))
(_kpblc-conv-ent-to-vla (vlax-ename->vla-object (entlast)))
|;
    (cond
      ((= (type ent_value) 'vla-object) ent_value)
      ((= (type ent_value) 'ename) (vlax-ename->vla-object ent_value))
      ((setq res (_kpblc-conv-ent-to-ename ent_value))
       (vlax-ename->vla-object res)
       )
      ) ;_ end of cond
    ) ;_ end of defun

  (defun _kpblc-conv-vla-to-list (value / res)
                                 ;|
*    Преобразовывает vlax-variant или vlax-safearray в список.
|;
    (cond
      ((listp value)
       (mapcar '_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 (member (type value) (list 'ename 'str 'vla-object))
            (setq value (_kpblc-conv-ent-to-vla value))
            (and (= (type value) 'vla-object)
                 (vlax-property-available-p value 'count)
                 ) ;_ end of and
            ) ;_ end of and
       (vlax-for sub (_kpblc-conv-ent-to-vla value)
         (setq res (cons sub res))
         ) ;_ end of vlax-for
       )
      (t value)
      ) ;_ end of cond
    ) ;_ end of defun

  (if (and (= (type (setq selset1 (vl-catch-all-apply
                                    (function
                                      (lambda ()
                                        (ssget)
                                        ) ;_ end of lambda
                                      ) ;_ end of function
                                    ) ;_ end of vl-catch-all-apply
                          ) ;_ end of setq
                    ) ;_ end of type
              'pickset
              ) ;_ end of =
           (= (type (setq selset2 (vl-catch-all-apply
                                    (function
                                      (lambda ()
                                        (ssget)
                                        ) ;_ end of lambda
                                      ) ;_ end of function
                                    ) ;_ end of vl-catch-all-apply
                          ) ;_ end of setq
                    ) ;_ end of type
              'pickset
              ) ;_ end of =
           ) ;_ end of and
    (progn
      (foreach item (mapcar (function vlax-ename->vla-object) (_kpblc-conv-selset-to-ename selset1))
        (foreach sub (mapcar (function vlax-ename->vla-object) (_kpblc-conv-selset-to-ename selset2))
          (setq res (append res
                            (_kpblc-conv-list-to-3dpoints
                              (_kpblc-conv-vla-to-list
                                (vla-intersectwith item sub acextendnone)
                                ) ;_ end of _kpblc-conv-vla-to-list
                              ) ;_ end of _kpblc-conv-list-to-3dpoints
                            ) ;_ end of append
                ) ;_ end of setq
          ) ;_ end of foreach
        ) ;_ end of foreach
      ) ;_ end of progn
    ) ;_ end of if
  (_kpblc-list-dublicates-remove res)
  ) ;_ end of defun
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 15.07.2009, 09:55
#5
Юта


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


Спасибо! Буду пробовать.
Поражаюсь быстроте написания кода!!!
___
Проверила. Не работает
после указания полилинии программа выдает "nil"

Последний раз редактировалось Юта, 15.07.2009 в 10:10. Причина: Добавление
Юта вне форума  
 
Непрочитано 15.07.2009, 10:11
#6
Victor


 
Регистрация: 14.06.2009
Бат-Ям
Сообщений: 295


У неё же там не полилинии а фэйсы какие-то.
А потом она скажет точки надо бы по высоте проинтерполировать.
А потом скажет а нехило бы их подписать текстами.
Victor вне форума  
 
Непрочитано 15.07.2009, 10:16
#7
Кулик Алексей aka kpblc
Moderator

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


Юта, я проверял на полилиниях, гарантированно пересекающихся. Работало. Короче, образец в студию.
Victor, а такие "хотелки" уже, как говорится, "за отдельную плату"
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 15.07.2009, 10:29
#8
Юта


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


В файле по точкам, имеющим разную высоту (имитирующим съемку рельефа) построены типа триангуляционные линии (желтым цветом).
Надо проставить точки на пересечениях этих линий и одной из линий белого цвета, по моему выбору. Причем эти точки должны иметь координату Z такую же, как на линиях "triangulate" в местах пересечения.

Victor, у блондинок не фейсы, а формы. Это раз.
Во-вторых, интерполировать не надо, уже есть программка, спасибо гуру от автокада.
И в-третьих, а что, "жаба давит" поделиться кодом, если просят?
(прошу принять эти претензии с улыбкой. Типа я совсем не обиделась).
Вложения
Тип файла: dwg
DWG 2004
Точечки.dwg (38.9 Кб, 1572 просмотров)

Последний раз редактировалось Юта, 15.07.2009 в 10:34.
Юта вне форума  
 
Непрочитано 15.07.2009, 10:33
#9
Кулик Алексей aka kpblc
Moderator

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


Код проверяет истинное, а не "кажущееся" пересечение. У тебя в файле полилинии лежат на разных уровнях - вот и все. При таких условиях надо предварительно "плющить" чертеж (кстати, для какой системы координат?), вычислять точки пересечений, потом вычислять ближайшую проекцию этой точки на нужную (кстати, как ее определить?) полилинию/кривую и добавлять в результат. Долго, муторно, и без гарантий корректности работы. Подобное я как-то делал на cadtutor.net, но искать и модифицировать сейчас нет возможности.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 15.07.2009, 10:39
#10
Юта


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


Но вручную-то точки ставятся без проблем. И на нужную высоту.
Юта вне форума  
 
Непрочитано 15.07.2009, 10:50
#11
Кулик Алексей aka kpblc
Moderator

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


Прааально. В режиме "кажущегося пересечения".
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 15.07.2009, 11:11
#12
Victor


 
Регистрация: 14.06.2009
Бат-Ям
Сообщений: 295


Э-ээ. Я как бы не о ваших формах а о вашем файле "Котлован". Там не полилинии а 3D face.
Victor вне форума  
 
Непрочитано 15.07.2009, 11:14
#13
Дима_

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


То Юта, что-бы сделать то что Вы хотите, надо - написать процедуру нахождения кажущегося пересечения двух линий (аналог inters), но с учетом вектора просмотра, ну или хотя-бы по вектору '(0 0 1) - то есть ограничиться просмотром сверху в мировой системе координат - что вобщем не сложно. После нахождения этой точки ее еще надо спроецировать на линию, пот тем-же вектором просмотра - что тоже в общем не сложно в случае с просмотром сверху '(0 0 1) и плоским рассположением координат линии (z pt1 = z pt2), но с произвольным углом как просмотра, так и линии в пространстве "процедурка" в принципе не очень большая - но на все проверки день убить надо, а так как еще ясно, что после этого еще что-то понадобиться - возиться с этим просто лень. Хотели-же в паралельном посте изучать лисп - вот отличный пример, заодно и пространственное мышление оживите, ну а если, что конкретное не получаеться, либо не понятно как делать - то сюда - подскажем.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 15.07.2009, 11:22
#14
Юта


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


Victor, да поняла я всё. Просто скаламбурила.
Дима_, Кулик Алексей, спасибо за разъяснение. Видимо придется потренироваться в создании 3D модели. Такие коды пока мне не под силу.
Юта вне форума  
 
Непрочитано 15.07.2009, 11:35
#15
Дима_

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


Вам понадобяться (как минимум) разобраться с dxf кодами полилиний и 3d face и понять принцип работы (inters...) и (trans...), да и вобще что такое единичный вектор направления.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 15.07.2009, 22:13
#16
Mozgunov

Начинающий проектировщик
 
Регистрация: 07.02.2008
Санкт-Петербург
Сообщений: 443
<phrase 1=


Алексей, Дмитрий Спасибо за коды. Дмитрий не получилось воспользоваться кодом. Что я неправильно делаю?
Код:
[Выделить все]
(defun intersect (obj1 obj2 / tmp x y)
(setq tmp 
(vlax-variant-value (apply 'vla-intersectwith
(reverse (cons acExtendNone (mapcar 'vlax-ename->vla-object (list obj1 obj2)))))))
(if (> (vlax-safearray-get-u-bound tmp 1) 0)
(vl-remove nil (mapcar '(lambda (z / ret) 
(if y (setq ret (list x y z) x nil y nil) (if x (setq y z) (setq x z))) ret) 
(vlax-safearray->list tmp)))
);end of if
);end of intersect

(setq obj1 (entsel "Укажите объект") )
(setq obj2 (entsel "Укажите объект") )

(intersect (obj1) (obj2))
скобочки убрал всё равно не помогает ( (obj1) (obj2)

Последний раз редактировалось Mozgunov, 15.07.2009 в 22:19.
Mozgunov вне форума  
 
Непрочитано 15.07.2009, 22:26
#17
VVA

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


Mozgunov,
Код:
[Выделить все]
(setq obj1 (car(entsel "Укажите объект")))
(setq obj2 (car(entsel "Укажите объект")))
(intersect obj1 obj2)
*Добавлено*
Здесь найдешь очень много полезных функций.
В том числе и
Цитата:
VxGetInters - Returns all intersection points between two objects
VxGetBlockInters-Returns all intersection points between a block and an object
__________________
Как использовать код на Лиспе читаем здесь

Последний раз редактировалось VVA, 15.07.2009 в 22:32.
VVA вне форума  
 
Автор темы   Непрочитано 15.07.2009, 22:54
#18
Mozgunov

Начинающий проектировщик
 
Регистрация: 07.02.2008
Санкт-Петербург
Сообщений: 443
<phrase 1=


VVA, попробовал сделать так как вы говорите, всё равно не работает:no function definition: nil
Mozgunov вне форума  
 
Непрочитано 15.07.2009, 22:57
#19
Дима_

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


попробуй вести перед запуском (vl-load-com)
p.s. Да и вообще отучайтесь в лиспе от лишних переменных
Код:
[Выделить все]
(intersect (car (entsel)) (car (entsel)))
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 15.07.2009, 23:03
#20
Mozgunov

Начинающий проектировщик
 
Регистрация: 07.02.2008
Санкт-Петербург
Сообщений: 443
<phrase 1=


Код:
[Выделить все]
(vl-load-com)
(defun intersect (obj1 obj2 / tmp x y)
(setq tmp 
(vlax-variant-value (apply 'vla-intersectwith
(reverse (cons acExtendNone (mapcar 'vlax-ename->vla-object (list obj1 obj2)))))))
(if (> (vlax-safearray-get-u-bound tmp 1) 0)
(vl-remove nil (mapcar '(lambda (z / ret) 
(if y (setq ret (list x y z) x nil y nil) (if x (setq y z) (setq x z))) ret) 
(vlax-safearray->list tmp)))
);end of if
);end of intersect

(setq obj1 (car(entsel "Укажите объект")))
(setq obj2 (car(entsel "Укажите объект")))
(intersect obj1 obj2)
Всё равно не получается.
Mozgunov вне форума  
 
Непрочитано 15.07.2009, 23:07
#21
Кулик Алексей aka kpblc
Moderator

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


Mozgunov, а запрашиваемые объекты точно пересекаются?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 15.07.2009, 23:11
#22
Дима_

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


после неудачного результата что выдает каманда (list obj1 obj2)
to крыс - если не пересекаються должно вернуть nil
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 15.07.2009, 23:14
#23
Mozgunov

Начинающий проектировщик
 
Регистрация: 07.02.2008
Санкт-Петербург
Сообщений: 443
<phrase 1=


Да. Точно пересекаются.
_______________________

Дима_ Выдаёт (<Имя объекта: 7efab390> <Имя объекта: 7efab410>), но ошибки нет уже.

Листинг команд:
Код:
[Выделить все]
Команда: *Прервано*
Команда: *Прервано*
Команда: appload poliline.lsp успешно загружено.
Команда: Укажите объектУкажите объект
Команда:
Команда: (list obj1 obj2)
(<Имя объекта: 7efab410> <Имя объекта: 7efab390>)
Миниатюры
Нажмите на изображение для увеличения
Название: poliline.JPG
Просмотров: 94
Размер:	8.4 Кб
ID:	23620  
Вложения
Тип файла: dwg
DWG 2007
poliline.dwg (75.4 Кб, 1633 просмотров)

Последний раз редактировалось Mozgunov, 15.07.2009 в 23:20.
Mozgunov вне форума  
 
Непрочитано 15.07.2009, 23:29
#24
Дима_

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


Так работает или нет? У меня с твоим файлом работает. что возращает (type intersect)
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 15.07.2009, 23:39
#25
Mozgunov

Начинающий проектировщик
 
Регистрация: 07.02.2008
Санкт-Петербург
Сообщений: 443
<phrase 1=


Выполняется функция но ничего не возвращает. Перезапустил autocad попробовал снова. Вот что получилось:
Код:
[Выделить все]
Команда: appload
poliline.lsp успешно загружено.
Команда: Укажите объектУкажите объект
Команда:
Команда: (type intersect)
SUBR
Команда: !obj1
<Имя объекта: 7efab410>
Команда: !obj2
<Имя объекта: 7efab390>
Извиняюсь за запудривание мозгов Всё работает! Спасибо большое! :
Цитата:
Команда: (intersect obj1 obj2)
((1583.41 1028.29 0.0) (1943.99 1020.82 0.0) (2259.39 1245.07 0.0))
Mozgunov вне форума  
 
Непрочитано 15.07.2009, 23:43
#26
Дима_

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


приведи лог (intersect obj1 obj2)
p.s. напиши в чем проблема была - вдруг не ты один такой - чтоб другие тоже знали.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 15.07.2009, 23:53
#27
Mozgunov

Начинающий проектировщик
 
Регистрация: 07.02.2008
Санкт-Петербург
Сообщений: 443
<phrase 1=


Проблема в том что я не умею пользоваться функциями
Если вызывать функцию (intersect obj1 obj2) то возвращается три списка (точки пересечения полилиний)
Я делал так:
Код:
[Выделить все]
(vl-load-com)
(defun intersect (obj1 obj2 / tmp x y)
(setq tmp 
(vlax-variant-value (apply 'vla-intersectwith
(reverse (cons acExtendNone (mapcar 'vlax-ename->vla-object (list obj1 obj2)))))))
(if (> (vlax-safearray-get-u-bound tmp 1) 0)
(vl-remove nil (mapcar '(lambda (z / ret) 
(if y (setq ret (list x y z) x nil y nil) (if x (setq y z) (setq x z))) ret) 
(vlax-safearray->list tmp)))
);end of if
);end of intersect

(setq obj1 (car(entsel "Укажите объект")))
(setq obj2 (car(entsel "Укажите объект")))

(setq rez (intersect obj1 obj2) )
Потом проверял переменную !rez и получал значение nil. Почему в неё не помещается результат выполнения функции?
Mozgunov вне форума  
 
Непрочитано 16.07.2009, 09:30
#28
VVA

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


удалено
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 16.07.2009, 13:05
#29
Дима_

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


(intersect) возращает nil если объекты не пересекаються, (что возращает команда (setq rez (Intersect obj1 obj2)), то и лежит в rez. Проверить можно, например (list rez).
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 17.07.2009, 01:26
#30
Mozgunov

Начинающий проектировщик
 
Регистрация: 07.02.2008
Санкт-Петербург
Сообщений: 443
<phrase 1=


Дима_, Всё работает прекрасно!!! Я проверел вызывав функцию через командную строку () . Я про то, что в том виде в котором я записал скрипт последний результат вычисления это не присваивание переменной rez списка, а что-то другое, вообщем мне ещё разбираться и разбираться, даже с вашей вункцией.... А так всё работает! Большое спасибо за грамотный и своевременный ответ!
Mozgunov вне форума  
 
Непрочитано 17.07.2009, 08:11
#31
Малявка


 
Регистрация: 28.02.2007
Егорьевск Моск.обл.
Сообщений: 206


У меня вот такой код работает (взято отсюда же, с форума):
Код:
[Выделить все]
;Определение точек пересечения двух примитивов

(defun c:int (/ adoc ent1 ent2 int_lst res _kpblc-conv-list-to-3dpoints)

  (defun _kpblc-conv-list-to-3dpoints (lst / res)
                                      ;|
*    Функция конвертации списка чисел в список 3-мерных точек.
*    Параметры вызова:
*	lst	список чисел
*    Примеры вызова:
(_kpblc-conv-list-to-3dpoints '(1 2 3 4 5 6)) ;-> ((1 2 3) (4 5 6))
(_kpblc-conv-list-to-3dpoints '(1 2 3 4 5))   ;-> ((1 2 3) (4 5 0.))
|;
    (cond
      ((not lst)
       nil
       )
      (t
       (setq res (cons (list (car lst)
                             (if (cadr lst)
                               (cadr lst)
                               0.
                               ) ;_ end of if
                             (if (caddr lst)
                               (caddr lst)
                               0.
                               ) ;_ end of if
                             ) ;_ end of list
                       (_kpblc-conv-list-to-3dpoints (cdddr lst))
                       ) ;_ end of cons
             ) ;_ end of setq
       )
      ) ;_ end of cond
    res
    ) ;_ end of defun

  (vl-load-com)
  (if (and (not (vl-catch-all-error-p
                  (vl-catch-all-apply
                    '(lambda ()
                       (setq ent1
                              (car
                                (entsel
                                  "\nУкажите примитив 1 (кроме блока и внешней ссылки) <Отмена> : "
                                  ) ;_ end of entsel
                                ) ;_ end of car
                             ) ;_ end of setq
                       ) ;_ end of lambda
                    ) ;_ end of vl-catch-all-apply
                  ) ;_ end of vl-catch-all-error-p
                ) ;_ end of not
           ent1
           (not (member (cdr (assoc 0 (entget ent1))) '("INSERT")))
           (not (vl-catch-all-error-p
                  (vl-catch-all-apply
                    '(lambda ()
                       (setq ent2
                              (car
                                (entsel
                                  "\nУкажите примитив 2 (кроме блока и внешней ссылки) <Отмена> : "
                                  ) ;_ end of entsel
                                ) ;_ end of car
                             ) ;_ end of setq
                       ) ;_ end of lambda
                    ) ;_ end of vl-catch-all-apply
                  ) ;_ end of vl-catch-all-error-p
                ) ;_ end of not
           ent2
           (not (member (cdr (assoc 0 (entget ent2))) '("INSERT")))
           ) ;_ end of and
    (progn
      (if (> (vlax-safearray-get-u-bound
               (setq int_lst (vlax-variant-value
                               (vla-intersectwith
                                 (vlax-ename->vla-object ent1)
                                 (vlax-ename->vla-object ent2)
                                 acextendnone
                                 ) ;_ end of vla-IntersectWith
                               ) ;_ end of vlax-variant-value
                     ) ;_ end of setq
               1
               ) ;_ end of vlax-safearray-get-u-bound
             ) ;_ end of >
        (setq res (_kpblc-conv-list-to-3dpoints (vlax-safearray->list int_lst)))
        ) ;_ end of if
      ) ;_ end of progn
    ) ;_ end of if
  res
  ) ;_ end of defun
С полилиниями работает на ура.

Последний раз редактировалось Малявка, 17.07.2009 в 09:15. Причина: Редактирование кода для "читабельности"
Малявка вне форума  
 
Непрочитано 28.05.2012, 15:37
#32
aburvalg


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


Цитата:
Сообщение от Дима_ Посмотреть сообщение
Держи:
Код:
[Выделить все]
(defun intersect (obj1 obj2 / tmp x y)
(setq tmp 
(vlax-variant-value (apply 'vla-intersectwith
(reverse (cons acExtendNone (mapcar 'vlax-ename->vla-object (list obj1 obj2)))))))
(if (> (vlax-safearray-get-u-bound tmp 1) 0)
(vl-remove nil (mapcar '(lambda (z / ret) 
(if y (setq ret (list x y z) x nil y nil) (if x (setq y z) (setq x z))) ret) 
(vlax-safearray->list tmp)))
);end of if
);end of intersect
пример: (intersect (entlast) (entnext))
спасибо большое. замечательно всё работает.
aburvalg вне форума  
 
Непрочитано 14.06.2013, 17:33
#33
АлексЮстасу

топограф, технолог
 
Блог
 
Регистрация: 24.05.2009
Москва
Сообщений: 3,041


А если не двух полилиний, а множества полилиний, у которых нужно найти точки пересечения?
В идеале получить либо множество примитивов-точек в точках пересечений, либо вставить блоки в них. Список координат этих точек тоже неплохо.
Offtop: Мне мерещится, что нечто подобное я на форуме уже видел, но найти пока не получается.
АлексЮстасу вне форума  
 
Непрочитано 16.06.2013, 17:31
#34
VVA

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


АлексЮстасу, Уточни задачу. Есть набор, состоящий из полилиний. Нужно найти точки пересечения полилиний каждой с каждой? И просто вывести список всех возможных точек? Если несколько полилиний пересекаются в одной точке, то в результирующем списке точка пересечения должна присутствовать только один раз или нет?
__________________
Как использовать код на Лиспе читаем здесь

Последний раз редактировалось VVA, 17.06.2013 в 01:09.
VVA вне форума  
 
Непрочитано 16.06.2013, 21:22
#35
АлексЮстасу

топограф, технолог
 
Блог
 
Регистрация: 24.05.2009
Москва
Сообщений: 3,041


Цитата:
Сообщение от VVA Посмотреть сообщение
АлексЮстасу, Уточни задачу. Есть набор, состоящий из полилиний. Нужно найти точки пересечения полилиний каждой с каждой? И просто вывести список всех возможных точек? Если несколько полилиний пересекаются в одной точке в результирующем списке точка пересечения должна присутствовать только один раз или нет?
Да, все именно так. Или не список координат точек, а сразу примитивы-точки или указанные блоки по одной штуке на одно пересечение, вне зависимости от числа пересекающихся в любой из точек линий.
АлексЮстасу вне форума  
 
Непрочитано 16.06.2013, 22:50
1 | #36
Дима_

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


не проверяя как-то так -
Код:
[Выделить все]
 (defun all-pt (lst)
  ((lambda (frec) (apply 'append (frec lst)))
   (lambda (lst)
      (if (cdr lst)
	      (cons (apply 'append (mapcar '(lambda (x) (intersect (car lst) x)) (cdr lst)))
		        (frec (cdr lst)))))))
запустить - что-то вроде (all-pt (vl-remove-if 'listp (mapcar 'cadr (ssnamex (ssget)))))
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 17.06.2013, 01:07
2 | #37
VVA

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


3 команды: POLYBLOCK и POLYPOINT и POLYPOINTVX . Об описании блока и режиме отображения точек нужно позаботиться заранее и самостоятельно
Использовал ф-цию all-pt из поста выше. Она рекурсивная. Надеюсь, количество обрабатываемых полилиний будет в разумных для нее (рекурсии) пределах
Отличие POLYPOINT от POLYPOINTVX. POLYPOINT - ставит точки во всех пересечениях полилиний
POLYPOINTVX - не ставит точки в точках общих вершин выбранных полилиний (см. пост #40)

Код:
[Выделить все]
;;Для изменения имени блока ищем строчку ниже
;;  (setq blk "BLK") ;_имя блока для вставки
;;Отличие POLYPOINT от POLYPOINTVX. POLYPOINT - ставит точки во всех пересечениях полилиний
;; POLYPOINTVX - не ставит точки в точках общих вершин выбранных полилиний
;;опубликовано - https://forum.dwg.ru/showpost.php?p=1108065&postcount=37

(vl-load-com)
(defun all-pt (lst)
  ((lambda (frec) (apply 'append (frec lst)))
    (lambda (lst)
      (if (cdr lst)
        (cons
          (apply 'append
                 (mapcar '(lambda (x) (intersect (car lst) x)) (cdr lst))
          ) ;_ end of apply
          (frec (cdr lst))
        ) ;_ end of cons
      ) ;_ end of if
    ) ;_ end of lambda
  )
) ;_ end of defun
(defun intersect (obj1 obj2 / tmp x y)
  (setq tmp
         (vlax-variant-value
           (apply 'vla-intersectwith
                  (reverse
                    (cons acextendnone
                          (mapcar 'vlax-ename->vla-object (list obj1 obj2))
                    ) ;_ end of cons
                  ) ;_ end of reverse
           ) ;_ end of apply
         ) ;_ end of vlax-variant-value
  ) ;_ end of setq
  (if (> (vlax-safearray-get-u-bound tmp 1) 0)
    (vl-remove nil
               (mapcar '(lambda (z / ret)
                          (if y
                            (setq ret (list x y z)
                                  x   nil
                                  y   nil
                            ) ;_ end of setq
                            (if x
                              (setq y z)
                              (setq x z)
                            ) ;_ end of if
                          ) ;_ end of if
                          ret
                        ) ;_ end of lambda
                       (vlax-safearray->list tmp)
               ) ;_ end of mapcar
    ) ;_ end of vl-remove
  )                                               ;end of if
)                                                 ;end of intersect
(defun mip_MakeUniqueMembersOfList (lst / OutList head)
;;;Удаляет одинаковые (дубликаты) элементы из списка
;;; На основе http://www.theswamp.org/index.php?topic=19128.0
;;; Изменено для сравнения вещественных чисел (equal ... 1e-6)

  (while lst
    (setq head    (car lst)
          OutList (cons head OutList)
          lst     (vl-remove-if '(lambda (pt) (equal pt head 1e-6)) (cdr lst))
    ) ;_ end of setq
  ) ;_ end of while
  (reverse OutList)
) ;_ end of defun
(defun Insert (pt Nme)
  (entmakex (list (cons 0 "INSERT")
                  (cons 2 Nme)
                  (cons 10 pt)
            ) ;_ end of list
  ) ;_ end of entmakex
) ;_ end of defun
(defun Point (pt)
  (entmakex (list (cons 0 "POINT")
                  (cons 10 pt)
            ) ;_ end of list
  ) ;_ end of entmakex
) ;_ end of defun

(defun C:POLYPOINT ()
  (mapcar
    '(lambda (pt)
       (point pt)
     ) ;_ end of lambda
    (mip_MakeUniqueMembersOfList
      (all-pt
        (vl-remove-if
          'listp
          (mapcar
            'cadr
            (ssnamex
              (ssget '((0 . "*POLYLINE")
                      )
              ) ;_ end of ssget
            ) ;_ end of ssnamex
          ) ;_ end of mapcar
        ) ;_ end of vl-remove-if
      ) ;_ end of all-pt
    ) ;_ end of mip_MakeUniqueMembersOfList
  ) ;_ end of mapcar
  (princ)
) ;_ end of defun
(defun C:POLYPOINTVX (/ lst plst)
  (setq lst (vl-remove-if
              'listp
              (mapcar
                'cadr
                (ssnamex
                  (ssget '((0 . "*POLYLINE")
                          )
                  ) ;_ end of ssget
                ) ;_ end of ssnamex
              ) ;_ end of mapcar
            ) ;_ end of vl-remove-if
  ) ;_ end of setq
  (setq plst (mapcar '(lambda (e) (polycoord e)) lst))
  (setq lst (all-pt lst))
  (mapcar
    '(lambda (pt)
       (if pt
         (point pt)
       ) ;_ end of if
     ) ;_ end of lambda
    (mip_MakeUniqueMembersOfList
      (mapcar
        '(lambda (p f)
           (if f
             nil
             p
           ) ;_ end of if
         ) ;_ end of lambda
        lst
        (mapcar
          '(lambda (l1) (apply 'and l1))
          (mapcar
            '(lambda (pt)
               (mapcar
                 '(lambda (x)
                    (vl-remove-if-not '(lambda (a) (equal a pt 1e-6)) x)
                  ) ;_ end of lambda
                 plst
               ) ;_ end of mapcar
             ) ;_ end of lambda
            lst
          ) ;_ end of mapcar
        ) ;_ end of mapcar
      ) ;_ end of mapcar

    ) ;_ end of mip_MakeUniqueMembersOfList
  ) ;_ end of mapcar
  (princ)
) ;_ end of defun
(defun polycoord (en / i l)
  (setq en (vlax-ename->vla-object en))
  (repeat (setq i (fix (1+ (vlax-curve-getendparam en))))
    (setq l
           (cons (trans (vlax-curve-getpointatparam en (setq i (1- i))) 0 1)
                 l
           ) ;_ end of cons
    ) ;_ end of setq
  ) ;_ end of repeat
  l
) ;_ end of defun
(defun C:POLYBLOCK (/ blk)
  (setq blk "BLK") ;_имя блока для вставки
  (mapcar
    '(lambda (pt)
       (Insert pt blk)
     ) ;_ end of lambda
    (mip_MakeUniqueMembersOfList
      (all-pt
        (vl-remove-if
          'listp
          (mapcar
            'cadr
            (ssnamex
              (ssget '((0 . "*POLYLINE")
                      )
              ) ;_ end of ssget
            ) ;_ end of ssnamex
          ) ;_ end of mapcar
        ) ;_ end of vl-remove-if
      ) ;_ end of all-pt
    ) ;_ end of mip_MakeUniqueMembersOfList
  ) ;_ end of mapcar
  (princ)
) ;_ end of defun
(princ "\ntype POLYBLOCK, POLYPOINT or POLYPOINTVX")
(princ)
__________________
Как использовать код на Лиспе читаем здесь

Последний раз редактировалось VVA, 31.08.2023 в 18:17.
VVA вне форума  
 
Непрочитано 17.06.2013, 02:04
#38
АлексЮстасу

топограф, технолог
 
Блог
 
Регистрация: 24.05.2009
Москва
Сообщений: 3,041


Цитата:
Сообщение от Дима_ Посмотреть сообщение
не проверяя как-то так -
Код:
запустить - что-то вроде (all-pt (vl-remove-if 'listp (mapcar 'cadr (ssnamex (ssget)))))
Цитата:
Сообщение от VVA Посмотреть сообщение
2 команды: POLYBLOCK и POLYPOINT. Об описании блока и режиме отображения точек нужно позаботиться заранее и самостоятельно
Использовал ф-цию all-pt из поста выше. Она рекурсивная. Надеюсь, количество обрабатываемых полилиний будет в разумных для нее (рекурсии) пределах
Спасибо!
Пардон за невежество, это лисп?
И как указать, что именно этот блок (если их в файле несколько описано разных)?
Сейчас POLYBLOCK отвечает:
Цитата:
Команда: POLYBLOCK
Выберите объекты: Противоположный угол: найдено: 5
Выберите объекты:
(nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil)
А POLYPOINT исправно наставила точек.

Последний раз редактировалось АлексЮстасу, 17.06.2013 в 02:12.
АлексЮстасу вне форума  
 
Непрочитано 17.06.2013, 11:11
1 | #39
VVA

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


АлексЮстасу,
Добавил в #37 указание в начало кода.
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 30.08.2023, 12:43
#40
Vict0r

Инвентаризация з/у
 
Регистрация: 30.03.2006
Брянск
Сообщений: 20


Цитата:
Сообщение от VVA Посмотреть сообщение
2 команды: POLYBLOCK и POLYPOINT.
Можете как-то поправить, чтобы "point" не ставились в точках общих вершин выбранных полилиний? Только если хотя бы у одной их проверяемых в месте пересечения нет вершины?
Vict0r вне форума  
 
Непрочитано 31.08.2023, 17:17
1 | #41
VVA

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


Удалено. не так понял

----- добавлено через ~59 мин. -----
Обновил пост #37. Добавил команду POLYPOINTVX
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 01.09.2023, 18:07
#42
Vict0r

Инвентаризация з/у
 
Регистрация: 30.03.2006
Брянск
Сообщений: 20


Цитата:
Сообщение от VVA Посмотреть сообщение
Удалено. не так понял

----- добавлено через ~59 мин. -----
Обновил пост #37. Добавил команду POLYPOINTVX
Спасибо за оперативную помощь!
Протестил POLYPOINTVX, работает только если выбранных линий две,
если больше, то работает с 3-й и остальными линиями как POLYPOINT,
в желтом круге не должно быть точки:
Миниатюры
Нажмите на изображение для увеличения
Название: polypointvx.png
Просмотров: 21
Размер:	8.0 Кб
ID:	258437  
Vict0r вне форума  
 
Непрочитано 03.09.2023, 09:38
#43
VVA

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


Да, удаляются точки общие для всех выбранных полилиний. Пока не могу придумать алгоритм для для общих точек 2х и более полилиний
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Как получить точки пересечения двух полилиний?

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Тела пересекаются, как нарисовать контур пересечения BM60 AutoCAD 12 08.09.2008 11:09
координаты вершин выбранной полилинии на VB? как получить ssv22 Программирование 5 17.07.2008 00:01
как получить путь к сетевому текстовому файлу Victorovich Программирование 3 30.06.2008 15:47
Объединение двух 3D полилиний Рyslan AutoCAD 12 22.05.2008 13:14