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

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

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

Ответ
Поиск в этой теме
Непрочитано 17.09.2021, 16:11 #1
Как получить кажущиеся точки пересечения двух полилиний?
Kwartoshka
 
Регистрация: 29.03.2021
Сообщений: 2

Всем привет! Нашел на просторах форума решение похожей задачи, в которой точки ставятся в месте действительного пересечения.

Код:
[Выделить все]
;;Для изменения имени блока ищем строчку ниже
;;  (setq blk "BLK") ;_имя блока для вставки
(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)))))))
(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
(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))
          )
    )
  (reverse OutList)
  )
(defun Insert (pt Nme)
  (entmakex (list (cons 0 "INSERT")
                  (cons 2 Nme)
                  (cons 10 pt))))
(defun Point (pt)
  (entmakex (list (cons 0 "POINT")
                  (cons 10 pt))))

(defun C:POLYPOINT ()
  (mapcar
    '(lambda (pt)
       (point pt)
     )
    (mip_MakeUniqueMembersOfList
      (all-pt
	(vl-remove-if
	  'listp
	  (mapcar
	    'cadr
	    (ssnamex
	      (ssget '((0 . "*POLYLINE")
		      )
	      )
	    )
	  )
	)
      )
    )
  )
)
(defun C:POLYBLOCK ( / blk)
  (setq blk "BLK") ;_имя блока для вставки
  (mapcar
    '(lambda (pt)
       (Insert pt blk)
     )
    (mip_MakeUniqueMembersOfList
      (all-pt
	(vl-remove-if
	  'listp
	  (mapcar
	    'cadr
	    (ssnamex
	      (ssget '((0 . "*POLYLINE")
		      )
	      )
	    )
	  )
	)
      )
    )
  )
)
(princ "\ntype POLYBLOCK or POLYPOINT")(princ)
Я в программировании совсем 0, умею только запускать лиспы. Подскажите, как сделать так, чтобы точки ставились в местах кажущегося пересечения двух линий (одна находится на уровне 0, другая на произвольном).
Просмотров: 801
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Как получить кажущиеся точки пересечения двух полилиний?

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Соединение двух полилиний Тигра AutoCAD 55 29.11.2022 04:35
Как легко можно получить линию пересечения пластин? liik Advance Steel 3 18.10.2018 10:09
Выбор средней точки между двух точек без доп пстроений ssn AutoCAD 12 02.10.2018 09:14
Чем лучше получить значение из текста и вставить его в Z координату точки Rozman Программирование 12 09.11.2017 23:34
Как у концов двух полилиний сделать одинаковую координату Y? Ruslan88 AutoCAD 3 19.08.2015 15:52