dwg.ru forum rss xml
| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны |  Справка по форуму |

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

Новые команды для работы с полилинией

Версия для печати
 
Ответ
Опции темы Поиск в этой теме
Непрочитано 14.09.2006, 13:30 3 |
Новые команды для работы с полилинией
VVA
 
Инженер LISP
 
Минск
Регистрация: 11.05.2005
Сообщений: 6,684
Отправить сообщение для VVA с помощью ICQ Отправить сообщение для VVA с помощью Skype™

VVA вне форума Вставить имя

Данный набор программ является коллективным продуктом участников форумов autocad.ru и dwg.ru с моими доработками.
Захотелось собрать все программы для работы с полилиниями воедино и оформить как полагается.

=========== Доступные команды PLTOOLS=================
Редакция 17.06.2014
PL-JOIN -Объединение выбранных полилиний
PL-VFI -вставка вершин в выбранной полилинии в местах пересечения с
указанными полилиниями, линиями, дугами
PL-JOIN3D -Объединение 3D полилиний
PL-A2L -Замена линейного сегмента в полилинии дуговым сегментом.
PL-L2A -Замена дугового сегмента в полилинии линейным сегментом.
PL-DIV -Разбивает выбранный сегмент полилинии на указанное количество
сегментов или через указанное расстояние
PL-DIVAll -Разбивает все сегменты полилинии на указанное количество
сегментов или через указанное расстояние
PL-VxAdd -Добавляет новую вершину к полилинии
ENTREVS -Реверс объекта
ENTREV -Реверс объектов (множественный выбор)
PL-CW -Реверс выбранных полилиний по часовой стрелке
PL-CCW -Реверс выбранных полилиний против часовой стрелки
PL-VxRdc -Удаление вершин полилиний, которые лежат на одной прямой
PL-VxDel -Удаление выбранной вершины
pl-VxOpt -Удаление совпадающих вершин из полилинии
PL-NoArc -Аппроксимация дуговых сегментов полилинии
PL-Clone -Построение полилинии путем копирования ее сегментов
PL-VxMove -Перемещение вершин полилинии
PL-Vx1 -Изменение начала полилинии
ConvTo2d -Преобразование линейных объектов в 2D полилинии
ConvTo3d -Преобразование линейных объектов в 3D полилинии
MPL -Построение средней линии Более продвинутая версия Rollin_Ball.lsp Find MidBoundary between two polylines.
R3P -Прямоугольгик по 3-м точкам
PL-P90 -Рисование перпендикулярных друг к другу сегментов полилинии
PL-CSE -Объединение 2d полилиний по примитиву
PL-SgWidth -Изменить ширину сегмента полилинии

Реверс дуговых сегментов полилинии из #79
На дуговых сегментах полилинии тип линий может быть "вверх тормашками", причем реверс не помогает. Этот артефакт можно побороть, если в полилинии включить "генерацию типа линий".

Панели, лисп и инструкции здесь http://dwg.ru/dnl/607
Обсуждаем, критикуем, предлагаем

Миниатюры
Нажмите на изображение для увеличения
Название: plrevers.jpg
Просмотров: 6701
Размер:	30.3 Кб
ID:	21079  


Последний раз редактировалось VVA, 20.07.2015 в 19:42. Причина: Реверс дуговых сегментов полилинии
Просмотров: 247790
 
Непрочитано 22.06.2018, 11:49
#581
Nike

Шаражпроектхалтурмонтаж
 
Регистрация: 29.10.2004
Талды-Париж
Сообщений: 5,721


Хочу избавиться от лишнего ручного щелчка.
Вот что надо:
Миниатюры
Нажмите на изображение для увеличения
Название: 1.gif
Просмотров: 43
Размер:	59.6 Кб
ID:	203792  
Nike на форуме вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 22.06.2018, 11:54
#582
koMon


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


Offtop:
Цитата:
Сообщение от Сергей812 Посмотреть сообщение
впадает в панику и ступор?)

Offtop: скорее в иронический чёрный сарказм)))

Цитата:
Сообщение от Nike Посмотреть сообщение
А можно ли программно зацепить среднюю ручку сегмента полилинии для последующего его смещения
я думаю, что сегмент можно выбрать и тащить его также можно, вопрос только как сделать грамотное слежение?) grread обрубает привязки.

опа. так тут тащить ничего по ходу не нужно будет..

Последний раз редактировалось koMon, 22.06.2018 в 12:00.
koMon вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 22.06.2018, 12:11
#583
Сергей812


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


ну если под данную задачу - то тут от щелчка не избавишься) Тут скорее указывается полилиния и затем блоки в цикле - а дальше уже вычисляется проекция середины геометрии блока на полилинию и добавляются вершины между найденными для "петли" кабеля.

----- добавлено через ~5 ч. -----
Offtop:
Цитата:
Сообщение от koMon Посмотреть сообщение
прозвучало так, как будто компилятор C# штатно встроен в автокад)
вы не поверите - не то что в акад, а в сам windows компилятор встроен)
Сергей812 на форуме вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 22.06.2018, 22:07
#584
koMon


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


Offtop:
Цитата:
Сообщение от Сергей812 Посмотреть сообщение
вы не поверите - не то что в акад, а в сам windows компилятор встроен)

не поверю, боюсь что эта встройка обеспечивается лишь после инсталяции Visual Studio

Цитата:
Сообщение от Сергей812 Посмотреть сообщение
Тут скорее указывается полилиния и затем блоки
Nike, я бы так и делал бы
koMon вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 09.07.2018, 11:37
#585
Frigate

КИП, АСУ ТП, слаботочка
 
Регистрация: 02.09.2010
Москва-Тюмень
Сообщений: 420


Цитата:
Сообщение от koMon Посмотреть сообщение
выбор вершин секрамкой. уточнение - выбираются конечно же полилинии.
Здорово! огромное спасибо!

А можете немного подправить, чтобы полилинии выделялись отдельно, а запрос на секрамку шел уже потом? А то выделяются все полилинии, и нужные и ненужные.
Еще одна просьба - если у выделенной полилинии вершина не лежит внутри секрамки, такую полилинию нужно исключить из набора.


И вопрос всем - покажите как использовать эту прогу, находясь в пользовательской системе координат. Надоело каждый раз переключаться в WCS.

Последний раз редактировалось Frigate, 09.07.2018 в 12:07.
Frigate вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 09.07.2018, 17:15
#586
koMon


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


Цитата:
Сообщение от Frigate Посмотреть сообщение
А можете немного подправить…
Цитата:
Сообщение от Frigate Посмотреть сообщение
Еще одна просьба…
Цитата:
Сообщение от Frigate Посмотреть сообщение
И вопрос всем…
Обрабатываются, только предварительно или выбранные после запуска команды полилинии. Размер опоясывающей рамки меняется движением мыши, перемещение опоясчвающей рамки - однократное нажатие пробела, возврат к изменению размера - однократное нажатие пробела.

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

;															 MOVE_MULTIPLE_VERTEX

;															  koMon, 16.07.2018

;***************************************************************************************************************************************************

(alert "\tКоманда  MOVE_MULTIPLE_VERTEX позволяет переместить
	несколько вершин выбранных предварительно или
	после запуска команды полилиний в выбранную точку.
	Нужные вершины опоясываются рамкой, изменение
	размера которой осуществляется движением мыши.
	Однократное нажатие пробела позволяет переместить
	рамку в другое место. Последующее однократное
	нажатие пробела возвращает рамку в режим изменения
	размера. Если внутри рамки нет вершин полилиний,
	она переключается в режим перемещения.

	\t\t\t\tkoMon, 16.07.2018"
)
(princ)

;***************************************************************************************************************************************************

																(vl-load-com)

;***************************************************************************************************************************************************

(defun c:Move_Multiple_Vertex ( /
									Coordinates_List Coordinates_List_Modified Crossing_Point_1 Crossing_Point_2 Current_Pline
									Entering_Crossing_Point_2 Move_Vertex_To_Point Nearest_Point
									Pline_Parameter Pline_Point_At_Parameter Points_List Point_Of_Interest
									Rect_Data Rect_Height Rect_Width Selecting_Plines Space_Pressed
									ssget_plines Gread_Data Plines_Pickset Plines_Pickset_Index
									Document_Object Getpoint_Data
							  )
	(setq selecting_plines t
		  acad_Object (vlax-get-acad-object)
	      document_object (vla-get-ActiveDocument acad_Object)
		  vlax_executed (vla-startUndoMark document_object)
	)

	;***************************************************************************************

	(defun ssget_plines ( / selecting_plines)
		(setq selecting_plines t)
		(while selecting_plines
			(setq plines_pickset (vl-catch-all-apply 'ssget (list '((0 . "LWPOLYLINE")))))
			(cond
				(
					(= 'PICKSET (type plines_pickset))
						(setq selecting_plines nil)
				)
				(
					(or
						(= 'VL-CATCH-ALL-APPLY-ERROR (type plines_pickset))
				        t
					)
				)
			)
		)
	)

	;***************************************************************************************

	(if (cadr (ssgetfirst))
		(progn
			(setq plines_pickset (cadr (ssgetfirst))
				  plines_pickset_index 0
			)
			(while (ssname plines_pickset plines_pickset_index)
				(if (not (equal '(0 . "LWPOLYLINE") (assoc 0 (entget (ssname plines_pickset plines_pickset_index)))))
					(ssdel (ssname plines_pickset plines_pickset_index) plines_pickset)
				)
				(setq plines_pickset_index (1+ plines_pickset_index))
			)
			(if (= 0 (sslength plines_pickset))
				(progn
					(sssetfirst nil)
					(ssget_plines)
				)
			)
		)
		(ssget_plines)
	)
	(sssetfirst nil plines_pickset)
	(setq crossing_point_1 (progn
		  							(while
		  						  			(or
		  						  				(not (setq getpoint_data (vl-catch-all-apply 'getpoint (list "\nВыберите рамкой вершины для перемещения: "))))
								  				(= 'VL-CATCH-ALL-APPLY-ERROR (type getpoint_data))
								  			)
									)
									getpoint_data
							)
		  crossing_point_2 nil
		  entering_crossing_point_2 t
		  space_pressed nil
	)
	(while entering_crossing_point_2
		(setq error_ocurred (if (vl-catch-all-error-p (setq gread_data (vl-catch-all-apply 'grread (list t 8 0)))) t nil))
    	(cond
			(
				error_ocurred
			)
			(
			   	(= 5 (car gread_data))
					(if crossing_point_2
						(grvecs (append (list 256) (cdr rect_data)))	;erasing color of holding frame
					)
					(setq crossing_point_2 (cadr gread_data))
					(if space_pressed
						(setq crossing_point_1 (list (- (car crossing_point_2) rect_width)
												   	 (- (cadr crossing_point_2) rect_height)
											   )
						)
					)
					(setq rect_data (list 256	;initial holding frame color
								  		  (list (car crossing_point_1) (cadr crossing_point_1))
								  		  (list (car crossing_point_1) (cadr crossing_point_2))

			       				  		  (list (car crossing_point_1) (cadr crossing_point_2))
			       				  		  (list (car crossing_point_2) (cadr crossing_point_2))

			       				  		  (list (car crossing_point_2) (cadr crossing_point_2))
			       				  		  (list (car crossing_point_2) (cadr crossing_point_1))

			       				  		  (list (car crossing_point_2) (cadr crossing_point_1))
			       				  		  (list (car crossing_point_1) (cadr crossing_point_1))
							 		)
					)
					(grvecs rect_data)
			)
			(
			 	(= 3 (car gread_data))
					(setq plines_pickset_index 0)
					(while (and
								(< plines_pickset_index (sslength plines_pickset))
								entering_crossing_point_2
							)
								(setq point_of_interest (polar crossing_point_1 (angle crossing_point_1 crossing_point_2) (/ (distance crossing_point_1 crossing_point_2) 2.0))
									  current_pline (vlax-ename->vla-object (ssname plines_pickset plines_pickset_index))
									  nearest_Point (vlax-curve-getClosestPointTo current_pline (trans point_of_interest 1 0))
									  pline_parameter (atoi (rtos (vlax-curve-getParamAtPoint current_pline nearest_Point) 2 0))
									  pline_point_at_parameter (trans (vlax-curve-getpointatparam current_pline pline_parameter) 0 1)
								)
								(if (and
										(>= (car pline_point_at_parameter) (min (car crossing_point_1) (car crossing_point_2)))
										(<= (car pline_point_at_parameter) (max (car crossing_point_1) (car crossing_point_2)))
										(>= (cadr pline_point_at_parameter) (min (cadr crossing_point_1) (cadr crossing_point_2)))
										(<= (cadr pline_point_at_parameter) (max (cadr crossing_point_1) (cadr crossing_point_2)))
									)
										(progn
											(setq entering_crossing_point_2 nil)
											(grvecs (append (list 256) (cdr rect_data)))	;erasing color of holding frame
										)
								)
								(setq plines_pickset_index (1+ plines_pickset_index))
					)
					(if entering_crossing_point_2
						(setq space_pressed t
							  rect_width (- (car crossing_point_2) (car crossing_point_1))
							  rect_height (- (cadr crossing_point_2) (cadr crossing_point_1))
						)
					)
			)
			(
				(equal gread_data (quote (2 32)))
					(if (null space_pressed)
						(setq space_pressed t
							  rect_width (- (car crossing_point_2) (car crossing_point_1))
							  rect_height (- (cadr crossing_point_2) (cadr crossing_point_1))
						)
						(setq space_pressed nil)
					)
			)
			(
			 	t
			)
		)
	)
	(setq point_of_interest (polar crossing_point_1 (angle crossing_point_1 crossing_point_2) (/ (distance crossing_point_1 crossing_point_2) 2.0))
		  move_vertex_to_Point
		  						(progn
		  								(while
		  							  			(or
		  							  				(not (setq getpoint_data (vl-catch-all-apply 'getpoint (list point_of_interest "\nУкажите точку для перемещения выбранных вершин: "))))
									  				(= 'VL-CATCH-ALL-APPLY-ERROR (type getpoint_data))
									  			)
										)
										getpoint getpoint_data
								)
	)
	(while (> (sslength plines_pickset) 0)
		(setq current_pline (vlax-ename->vla-object (ssname plines_pickset 0))
			  nearest_Point (vlax-curve-getClosestPointTo current_pline (trans point_of_interest 1 0))
			  pline_parameter (atoi (rtos (vlax-curve-getParamAtPoint current_pline nearest_Point) 2 0))
			  pline_point_at_parameter (trans (vlax-curve-getpointatparam current_pline pline_parameter) 0 1)
		)
		(if (and
				(>= (car pline_point_at_parameter) (min (car crossing_point_1) (car crossing_point_2)))
				(<= (car pline_point_at_parameter) (max (car crossing_point_1) (car crossing_point_2)))
				(>= (cadr pline_point_at_parameter) (min (cadr crossing_point_1) (cadr crossing_point_2)))
				(<= (cadr pline_point_at_parameter) (max (cadr crossing_point_1) (cadr crossing_point_2)))
			)
				(progn
					(setq coordinates_list (vlax-get current_pline 'coordinates)
						  points_list '()
					)
					(while (cddr coordinates_list)
	  					(setq points_list (cons (list (car coordinates_list) (cadr coordinates_list)) points_list)
	  						  coordinates_list (cddr coordinates_list)
	  					)
        			)
  					(setq points_list (reverse (cons (list (car coordinates_list) (cadr coordinates_list)) points_list))
  						  coordinates_list_modified '()
					)
  					(foreach pline_point (subst (list (car (trans move_vertex_to_Point 1 0)) (cadr (trans move_vertex_to_Point 1 0))) (nth pline_parameter points_list) points_list)
						(setq coordinates_list_modified (append coordinates_list_modified pline_point))
					)
  					(vl-catch-all-apply 'vlax-put (list current_pline 'coordinates coordinates_list_modified))
				)
		)
		(setq plines_pickset (ssdel (ssname plines_pickset 0) plines_pickset))
	)
	(vla-EndUndoMark document_object)
	(princ)
)

;***************************************************************************************************************************************************
Вложения
Тип файла: lsp move_multiple_vertex.lsp (9.1 Кб, 0 просмотров)

Последний раз редактировалось koMon, 16.07.2018 в 11:51. Причина: Модификация выбора полилиний, рамки для опоясывания вершин
koMon вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 13.07.2018, 18:06
#587
koMon


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


GIFы
Миниатюры
Нажмите на изображение для увеличения
Название: MMV_1.gif
Просмотров: 22
Размер:	1.38 Мб
ID:	204439  Нажмите на изображение для увеличения
Название: MMV_2.gif
Просмотров: 20
Размер:	1.82 Мб
ID:	204440  
koMon вне форума вставить имя Обратить внимание модератора на это сообщение  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Новые команды для работы с полилинией

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

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

Быстрый переход

|| Главная || Каталог САПР || Тендеры || Публикации || Объявления || Биржа труда || Download || Галерея ||
|| Библиотека || Кунсткамера || Каталог предприятий || Контакты || Файлообменник || Блоги ||