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

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

Создание неполной копии полилинии с указанием вершин

Ответ
Поиск в этой теме
Непрочитано 12.01.2023, 12:48 #1
Создание неполной копии полилинии с указанием вершин
Sege
 
Санкт-Петебург
Регистрация: 05.07.2007
Сообщений: 108

Коллеги!

Возможно, уже есть готовая лиспина.

Задача такая. Есть полилиния, которая имеет определенной кол-во вершин. Требуется создать неполной "дубликат" указанной полилинии по 2-м опорным вершинам в существующей полилинии. Т.е. указываем стартовую вершину (она не обязательно может быть 1-й), указываем конечную вершину (аналогично не обязательно последней) в существующей полилинии -> создается дубликат указанной части полилинии, ограниченной указанными вершинами.
Просмотров: 1488
 
Непрочитано 12.01.2023, 12:52
#2
Кулик Алексей aka kpblc
Moderator

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


А штатные средства "не катят"? Скопировать полилинию, потом _.break (дважды). Ну или _trim
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 12.01.2023, 13:13
#3
Sege


 
Регистрация: 05.07.2007
Санкт-Петебург
Сообщений: 108


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
А штатные средства "не катят"? Скопировать полилинию, потом _.break (дважды). Ну или _trim
Фишка break - это то что он после разрыва оставляет разорванную линию (т.е. в итоге на чертеже получается 3 полилинии)

Примерно понимаю как реализовать:
- получаем от пользователя координаты 2-х точек на вершине полилинии-донора
- формируем список из координат всех вершин полилинии-донора
- находим в этом списке первую ранее указанную точку
- находим в этом списке вторую ранее указанную точку
- удаляем из списка все что левее и правее этих точек
- строим полилинию с модифицированным списком

----- добавлено через ~10 мин. -----
Алексей, я смотрел в твоей PLTOOLS функцию PL-CLONE, однако она требует последовательного указания всех сегментов ) Практически то что нужно, однако хочется за 2 шага для пользователя это сделать )
Sege вне форума  
 
Непрочитано 12.01.2023, 14:38
| 1 #4
Кулик Алексей aka kpblc
Moderator

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


PLTOOLS - Не моя разработка.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 12.01.2023, 15:52
1 | #5
koMon


 
Блог
 
Регистрация: 26.09.2017
Сообщений: 1,680


в модели, LWPL

Код:
[Выделить все]
 (defun c:partial_clone_pline (/ pline_object clone_start_point clone_end_point clone_start_parameter clone_end_parameter
							 	clone_parameter_list clone_vertices_raw_list clone_bulge_list pline_clone_object vertex_index
							 )
	(setq pline_object (vlax-ename->vla-object (car (entsel "\nВыберите полилинию: ")))
		  clone_start_point (trans (osnap (getpoint "\nТочка начала клонируемой полилинии: ") "_endp") 1 0)
		  clone_end_point (trans (osnap (getpoint "\nТочка конца клонируемой полилинии: ")  "_endp") 1 0)
		  clone_start_parameter (fix (vlax-curve-getparamatpoint pline_object clone_start_point))
		  clone_end_parameter (fix (vlax-curve-getparamatpoint pline_object clone_end_point))
		  clone_parameter_list (vl-sort (list clone_start_parameter clone_end_parameter) '<)
		  clone_start_parameter (1- (car clone_parameter_list))
		  clone_end_parameter (cadr clone_parameter_list)
		  clone_parameter_list nil
	)
	(repeat (abs (- clone_end_parameter clone_start_parameter))
		(setq clone_parameter_list (append clone_parameter_list (list (setq clone_start_parameter (1+ clone_start_parameter)))))
	)
	(foreach parameter clone_parameter_list
		(setq clone_vertices_raw_list (append clone_vertices_raw_list (reverse (cdr (reverse (vlax-curve-getpointatparam pline_object parameter))))))
		(setq clone_bulge_list (append clone_bulge_list (list (vla-getbulge pline_object parameter))))
	)
	(vlax-safearray-fill (setq pline_vertices_array (vlax-make-safearray vlax-vbdouble (cons 1 (length clone_vertices_raw_list))))
												    clone_vertices_raw_list
	)
	(setq pline_clone_object (vla-addlightweightpolyline (vla-get-modelspace (vla-get-activedocument (vlax-get-acad-object))) pline_vertices_array))
	(vla-put-color pline_clone_object 1)
	(setq vertex_index -1)
	(foreach bulge clone_bulge_list
		(vla-setbulge pline_clone_object (setq vertex_index (1+ vertex_index)) bulge)
	)
)
__________________
K Lisp
koMon вне форума  
 
Автор темы   Непрочитано 12.01.2023, 16:46
#6
Sege


 
Регистрация: 05.07.2007
Санкт-Петебург
Сообщений: 108


У меня примерно так получилось:

Код:
[Выделить все]
 

(defun delete_end(list)                      
  (cond ((null (cdr list)) 
     nil)                        
    (t 
     (cons (car list) 
           (delete_end (cdr list)))))
		   )

(defun add (thing lst) (append lst (list thing)))

(defun C:npline()
(setq new_lst nil)
(setq ent (car (entsel "\nSelect polyline: ")))
(setq pt_lst (mapcar 'cdr (vl-remove-if-not '(lambda (a) (= (car a) 10)) (entget ent))))
(setq startPt (delete_end (getpoint "Pick the start point")))
(setq endPt (delete_end (getpoint "Pick the end point")))
(setq startPos (vl-position startPt pt_lst) 
	  endPos (vl-position endPt pt_lst) 
)
(setq new_lst (list (nth startPos pt_lst)))
(setq k (+ 1 startPos))
(while (< k (+ 1 endPos))
(setq new_lst (add (nth k pt_lst) new_lst))  
(setq k (+ 1 k))
)
(command "_.pline")
(mapcar 'command new_lst)
(command "")
)

Последний раз редактировалось Sege, 13.01.2023 в 09:09.
Sege вне форума  
 
Непрочитано 12.01.2023, 20:03
#7
koMon


 
Блог
 
Регистрация: 26.09.2017
Сообщений: 1,680


без функции delete_end не заведётся
__________________
K Lisp
koMon вне форума  
 
Непрочитано 13.01.2023, 03:05
1 | #8
SetQ

конструктор
 
Регистрация: 21.07.2007
Петрозаводск
Сообщений: 1,982


Вариант с помощью команды BREAK:
Код:
[Выделить все]
 ;;; Partial copy of the polyline
(defun C:pcpline (/ ent obj pt1 pt2 pt0 ptN par1 par2 par0 parN tmp)
  (setq
    ent	 (car (entsel "\nSelect polyline: "))
    pt1	 (getpoint "\nPick the 1 point")
    pt2	 (getpoint "\nPick the 2 point")
    obj	 (vlax-ename->vla-object ent)
    pt0	 (vlax-curve-getStartPoint obj)
    ptN	 (vlax-curve-getEndPoint obj)
    par0 (vlax-curve-getStartParam obj)
    par1 (vlax-curve-getParamAtPoint obj (trans pt1 1 0))
    par2 (vlax-curve-getParamAtPoint obj (trans pt2 1 0))
    parN (vlax-curve-getEndParam obj)
  )
  (if (> par1 par2)
    (setq tmp pt1
	  pt1 pt2
	  pt2 tmp
	  tmp nil
    )
  )
  (vla-copy obj)
  (command "_draworder" ent "" "_a" (entlast) "")
  (command "_break" ent pt1 (trans pt0 0 1))
  (command "_break" ent pt2 (trans ptN 0 1))
  (vla-put-color obj 1)
  (prin1)
)
----- добавлено через ~3 ч. -----
Цитата:
Сообщение от Sege Посмотреть сообщение
Фишка break - это то что он после разрыва оставляет разорванную линию (т.е. в итоге на чертеже получается 3 полилинии)
Если одна из точек разрыва - первая или последняя точка полилинии, то сносит участок начисто, без остатка.

Последний раз редактировалось SetQ, 13.01.2023 в 03:11.
SetQ на форуме  
 
Автор темы   Непрочитано 13.01.2023, 08:25
#9
Sege


 
Регистрация: 05.07.2007
Санкт-Петебург
Сообщений: 108


Цитата:
Сообщение от koMon Посмотреть сообщение
без функции delete_end не заведётся
Добавил. Хотя можно и без нее: это координата Z просто удаляется )
Sege вне форума  
 
Непрочитано 13.01.2023, 09:02
#10
koMon


 
Блог
 
Регистрация: 26.09.2017
Сообщений: 1,680


Цитата:
Сообщение от Sege Посмотреть сообщение
Добавил.
ну это... ботанический огород... (reverse (cdr (reverse
Цитата:
Сообщение от Sege Посмотреть сообщение
Хотя можно и без нее
можно ... искать в списке... и не найти)
там кстати ещё defun не замыкается, и дуговые сегменты побоку...
__________________
K Lisp
koMon вне форума  
 
Автор темы   Непрочитано 13.01.2023, 09:08
#11
Sege


 
Регистрация: 05.07.2007
Санкт-Петебург
Сообщений: 108


Цитата:
Сообщение от koMon Посмотреть сообщение
ну это... ботанический огород... (reverse (cdr (reverse
можно ... искать в списке... и не найти)
Ну тогда можно вообще проще: (list (nth 0 startPt) (nth 1 startPt))
Sege вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Создание неполной копии полилинии с указанием вершин

Размещение рекламы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Визуальное "подсвечивание" вершин полилинии San-Miguel AutoCAD 6 26.05.2021 15:55
Интерполяция отметок вершин полилинии между двумя заданными точками Кочетков Андрей Программирование 7 22.07.2019 20:14
LISP. Удаление совпадающих вершин в полилинии (вариант). Пример использования. Profan Готовые программы 4 17.09.2018 06:41
Как увеличить точность отображения координат вершин полилинии ? swkx Программирование 8 25.04.2013 15:27
Изменение отметки Z вершин полилинии Mazai Программирование 5 27.05.2008 03:35