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

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

Как добавить привязки перпендикуляра

Ответ
Поиск в этой теме
Непрочитано 27.12.2022, 17:52 #1
Как добавить привязки перпендикуляра
Ingpro
 
Регистрация: 11.07.2022
Сообщений: 775

Всем доброго дня и с наступающим!
Программа строит линии перпендикулярные к выбранной ("POLYLINE" "ARC" "LINE" "CIRCLE" "ELLIPSE") .
Как можно добавить в лисп включение привязки (к конточке, к середине, к пересечению, к квадранту)? Спасибо.
Код:
[Выделить все]
 ;;; Draw perpendicular line
;;; Alan J. Thompson, 10.15.09
(defun c:LPer (/ #Ent #Read)
(and
(setq #Ent (car (entsel "\nSelect curve: ")))
(vl-position (cdr (assoc 0 (entget #Ent))) '("LWPOLYLINE" "ARC" "LINE" "CIRCLE" "ELLIPSE"))
(while (not (eq 25 (car (setq #Read (grread T 15 0)))))
(princ "\rSpecify point for line: ")
(redraw)
(if (vl-consp (cadr #Read))
(grdraw (vlax-curve-getclosestpointto #Ent (trans (cadr #Read) 1 0) T)


(trans (cadr #Read) 1 0) 1 ) ;_ grdraw
) ;_ if
(if (eq 3 (car #Read))
(entmake (list '(0 . "LINE")
(cons 10 (vlax-curve-getclosestpointto #Ent (trans (cadr #Read) 1 0) T))
(cons 11 (trans (cadr #Read) 1 0))
) ;_ list
) ;_ entmake
) ;_ if
) ;_ while
) ;_ and
(redraw)
(princ)
) ;_ defun
Просмотров: 3375
 
Непрочитано 27.12.2022, 19:01
#2
Krieger

инженер (КМ)
 
Регистрация: 30.10.2004
Красноярск
Сообщений: 3,837


По-моему, в grdraw никак, только если свою такую функцию как-то сочинить.

Можно просто использовать xline и перед указкой первой точки выбрать привязку - перпендикуляр и указать на кривую, тогда первая точка будет бегать по кривой перпендикулярно, а на второй будут работать все остальные привязки. В принципе, можно и в LISP облачить.
__________________
Делай хорошо, плохо само получится.
Krieger вне форума  
 
Непрочитано 27.12.2022, 19:53
#3
zenon

Остекляем!!! Алюминим!!!
 
Регистрация: 21.02.2005
Москва
Сообщений: 3,925
<phrase 1=


может это поможет
http://www.lee-mac.com/objectalign.html
__________________
Мы можем делать быстро, качественно и недорого, выбирайте любые 2 условия.:search:
zenon вне форума  
 
Автор темы   Непрочитано 27.12.2022, 21:03
#4
Ingpro


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


Цитата:
Сообщение от zenon Посмотреть сообщение
может это поможет
http://www.lee-mac.com/objectalign.html
Это совсем другое, objectalign выравнивает выбранные объекты по выбранной кривой, кстати тоже без привязок...
Ingpro вне форума  
 
Непрочитано 27.12.2022, 21:06
1 | #5
Кулик Алексей aka kpblc
Moderator

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


Попробуй использовать getpoint - интерактивности не будет, но (возможно) будет результат.

----- добавлено через ~26 мин. -----
Если решишься использовать библиотеку:
Код:
[Выделить все]
 (defun per (/ selset point)
  (if (setq selset (car (_kpblc-conv-selset-to-ename
                          (_kpblc-selset-msg
                            "Select curve"
                            (function (lambda () (ssget "_+.:S:E" '((0 . "*LINE,ARC,CIRCLE,ELLIPSE")))))
                          ) ;_ end of _kpblc-selset-msg
                        ) ;_ end of _kpblc-conv-selset-to-ename
                   ) ;_ end of car
      ) ;_ end of setq
    (progn
      (while (and (= (type (setq point (vl-catch-all-apply (function (lambda () (getpoint "\nPick point <Cancel> : ")))))
                     ) ;_ end of type
                     'list
                  ) ;_ end of =
                  point
             ) ;_ end of and
        (entmake (list '(0 . "LINE")
                       (cons 10 point)
                       (cons 11 (vlax-curve-getclosestpointto selset point))
                 ) ;_ end of list
        ) ;_ end of entmake
      ) ;_ end of while
    ) ;_ end of progn
  ) ;_ end of if
) ;_ end of defun
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 27.12.2022, 23:52
#6
===AAA===


 
Регистрация: 15.08.2005
г. Норильск
Сообщений: 627


Сорри, а что означает конструкция "_+." в параметрах ssget ?

"подчерк" - понятно, "точка" - видимо, тоже самое, что и в командах
(или нет?), а вот "плюсик" - теряюсь в догадках.

Сам такую конструкцию не сооружал ни разу... Вдруг и мне пригодится? :-)
__________________
Счастливо, Алексей!
===AAA=== вне форума  
 
Непрочитано 28.12.2022, 00:14
#7
Сергей812


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


плюсик
Сергей812 вне форума  
 
Автор темы   Непрочитано 28.12.2022, 12:35
#8
Ingpro


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Если решишься использовать библиотеку:
Код:
[Выделить все]
(defun per
Алексей, Вы супер, спасибо! Работает и без библиотеки. Если укажешь точку привязки, перпендикуляр ставится к ней, не указываешь точку привязки, перпендикуляр ставится в произвольном месте. В одном сеансе можно поставить несколько перпендикуляров...
Ingpro вне форума  
 
Автор темы   Непрочитано 28.12.2022, 15:54
#9
Ingpro


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


Чё-то с привязками не очень корректно работает...
Алексей, если не слишком, немного уточню, можно перпендикуляр начинать строить из точки,
которая расположена на линии, к которой строится перпендикуляр.
Т.е. когда мы строим отрезок перпендикулярный к линии (обычным способом), то ведем отрезок и ловим привязку "перпендикуляр" на линии. Хотелось бы наоборот, на линии выбрать точку и строить от неё перпендикуляр. Спасибо.
Миниатюры
Нажмите на изображение для увеличения
Название: 2022-12-28_15-51-46.png
Просмотров: 59
Размер:	9.6 Кб
ID:	252304  Нажмите на изображение для увеличения
Название: 2022-12-28_15-50-33.png
Просмотров: 51
Размер:	15.1 Кб
ID:	252305  Нажмите на изображение для увеличения
Название: 2022-12-28_15-33-05.png
Просмотров: 38
Размер:	7.4 Кб
ID:	252306  
Ingpro вне форума  
 
Непрочитано 28.12.2022, 16:30
1 | #10
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,616


В C# можно попросить у автокада ближайшую точку.... но в общем виде: по имеющемся координатам линии получаете уравнения прямой, из этого уравнения, меняя местами коэффициенты при неизвестных получаете уравнение перпендикулярной прямой, а там по имеющимся коэффициентам и координатам одной точки найдете коэффициент С и потом надо просто найти точку пересечения двух прямых и проверить ее принадлежность отрезку...
Написал пояснение наверное длине, чем это все в коде воплотить =) , Вот тут есть все формулы: https://ru.wikipedia.org/wiki/%D0%9F...BC%D0%B0%D1%8F
Boxa вне форума  
 
Автор темы   Непрочитано 28.12.2022, 16:36
#11
Ingpro


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


Цитата:
Сообщение от Boxa Посмотреть сообщение
Вот тут есть все формулы
Boxa, спасибо. Наверное, не смогу эти формулы куда надо вставить...
Ingpro вне форума  
 
Непрочитано 28.12.2022, 17:12
2 | #12
Krieger

инженер (КМ)
 
Регистрация: 30.10.2004
Красноярск
Сообщений: 3,837


А _xline чем не устроил?

https://youtu.be/A1dPvuZhSsU
__________________
Делай хорошо, плохо само получится.
Krieger вне форума  
 
Автор темы   Непрочитано 28.12.2022, 18:42
#13
Ingpro


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


Цитата:
Сообщение от Krieger Посмотреть сообщение
А _xline чем не устроил?
https://youtu.be/A1dPvuZhSsU
Задача наоборот: перпендикуляр строится от линии, точнее от точки привязки на этой же линии...
Ingpro вне форума  
 
Непрочитано 28.12.2022, 18:43
#14
Кулик Алексей aka kpblc
Moderator

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


На видео все показано )))
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 28.12.2022, 18:49
#15
Krieger

инженер (КМ)
 
Регистрация: 30.10.2004
Красноярск
Сообщений: 3,837


Ну дык и тыкай по линии:

https://youtu.be/nO-GQijBcmY
__________________
Делай хорошо, плохо само получится.
Krieger вне форума  
 
Автор темы   Непрочитано 28.12.2022, 19:35
#16
Ingpro


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


Цитата:
Сообщение от Krieger Посмотреть сообщение
Ну дык и тыкай по линии:
https://youtu.be/nO-GQijBcmY
Эти бесконечные двухсторонние перпендикуляры неудобны...

Последний раз редактировалось Ingpro, 05.02.2023 в 15:22.
Ingpro вне форума  
 
Непрочитано 28.12.2022, 19:52
#17
Krieger

инженер (КМ)
 
Регистрация: 30.10.2004
Красноярск
Сообщений: 3,837


Цитата:
Сообщение от Ingpro Посмотреть сообщение
Подозреваю, что "per xline" (и где он?) не на лисп?..
Ну и эти бесконечные двухсторонние перпендикуляры неудобны... имхо...
Это не лисп, _xline - это штатная команда автокада. Зачем изобретать велосипед, если и так работает? Почему не удобны? Обрежь. А как определить их конечность? А как по одной точке на кривой можно сделать что-то кроме прямой?
Я уже писал, что далее это можно сварганить в лисп. Сначала строится прямая перпендикулярная кривой (известна первая точка на кривой), еще одной точкой определяется конечность на этой прямой, получаем вторую точку - строим отрезок по двум точкам, удаляем прямую. И визуалити есть, и привязки работают и отрезок построили.
__________________
Делай хорошо, плохо само получится.
Krieger вне форума  
 
Непрочитано 28.12.2022, 19:52
#18
Кулик Алексей aka kpblc
Moderator

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


Потом в крайнем случае _trim (возможно, с опцией _f)
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 28.12.2022, 21:06
#19
Ingpro


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


Цитата:
Сообщение от Krieger Посмотреть сообщение
_xline - это штатная команда автокада
_xline (ПРЯМАЯ) не совсем то, что в лиспе.

Последний раз редактировалось Ingpro, 05.02.2023 в 15:23.
Ingpro вне форума  
 
Непрочитано 30.12.2022, 10:51
1 | 1 #20
koMon


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


Цитата:
Сообщение от Ingpro Посмотреть сообщение
Задача наоборот: перпендикуляр строится от линии, точнее от точки привязки на этой же линии...
Код:
[Выделить все]
 
(setq curve_not_selected t)
(while curve_not_selected
	(setq origin_point_perpendicular (getpoint "\Точка на кривой: "))
	(if (setq nentselp_data (nentselp origin_point_perpendicular))
			(progn
				(setq curve_object (vlax-ename->vla-object (car nentselp_data))
		  			  1st_derivative (vlax-curve-getfirstderiv curve_object (vlax-curve-getparamatpoint curve_object (trans origin_point_perpendicular 1 0)))
		  			  1st_derivative_angle (angle (trans '(0 0 0) 0 1) (trans 1st_derivative 0 1))
		  			  target_direction_point (getpoint origin_point_perpendicular "\nНаправление перпендикуляра: ")
		  			  target_direction (angle origin_point_perpendicular target_direction_point)
		  			  normalized_target_direction (if (< (- (angle origin_point_perpendicular target_direction_point) 1st_derivative_angle) 0)
		  														(+ (- target_direction 1st_derivative_angle) (* 2 pi))
		  														(- target_direction 1st_derivative_angle)
		  											  )
				)
				(setq target_distance (if (> pi normalized_target_direction) +100 -100))
				(command "_line" "_non" origin_point_perpendicular "_non" (polar origin_point_perpendicular (+ (* 0.5 pi) 1st_derivative_angle) target_distance) "")
				(setq curve_not_selected nil)
			)
	)
)

__________________
K Lisp

Последний раз редактировалось koMon, 30.12.2022 в 14:35.
koMon вне форума  
 
Автор темы   Непрочитано 30.12.2022, 17:56
#21
Ingpro


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


Комоn, спасибо, только какой командой вызывать, или, если это часть кода, то куда добавить?..
Ingpro вне форума  
 
Непрочитано 30.12.2022, 19:59
#22
koMon


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


нужно в самом начале добавить, например:
(defun c:set_perpendicular ()
и в самом конце закрывающую скобку
) .
__________________
K Lisp
koMon вне форума  
 
Автор темы   Непрочитано 30.12.2022, 20:35
#23
Ingpro


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


Цитата:
Сообщение от koMon Посмотреть сообщение
нужно в самом начале добавить, например:
(defun c:set_perpendicular ()
и в самом конце закрывающую скобку
) .
Код:
[Выделить все]
 (defun c:set_perpendicular ()
(setq curve_not_selected t)
	(while curve_not_selected
	    (setq origin_point_perpendicular (getpoint "\Точка на кривой: "))
	    (if (setq nentselp_data (nentselp origin_point_perpendicular))
	            (progn
	                (setq curve_object (vlax-ename->vla-object (car nentselp_data))
	                      1st_derivative (vlax-curve-getfirstderiv curve_object (vlax-curve-getparamatpoint curve_object (trans origin_point_perpendicular 1 0)))
	                      1st_derivative_angle (angle (trans '(0 0 0) 0 1) (trans 1st_derivative 0 1))
	                      target_direction_point (getpoint origin_point_perpendicular "\nНаправление перпендикуляра: ")
	                      target_direction (angle origin_point_perpendicular target_direction_point)
	                      normalized_target_direction (if (< (- (angle origin_point_perpendicular target_direction_point) 1st_derivative_angle) 0)
	                                                                (+ (- target_direction 1st_derivative_angle) (* 2 pi))
	                                                                (- target_direction 1st_derivative_angle)
	                                                      )
	                )
	                (setq target_distance (if (> pi normalized_target_direction) +100 -100))
	                (command "_line" "_non" origin_point_perpendicular "_non" (polar origin_point_perpendicular (+ (* 0.5 pi) 1st_derivative_angle) target_distance) "")
	                (setq curve_not_selected nil)
	            )
	    )
	)
(princ)
)
Вот так добавляю, вызываю команду, привязка к линии есть, а сам перпендикуляр не строится...
В КС пишет: "Команда: SET_PERPENDICULAR
Точка на кривой:
Направление перпендикуляра: _line
Первая точка: _non
Следующая точка или [оТменить]: _non
Следующая точка или [оТменить]:
Команда: nil"
А перпендикуляр может быть только от кривой? От линии, полилинии, круга... нет?..

Последний раз редактировалось Ingpro, 30.12.2022 в 23:37. Причина: в код добавлен (princ)
Ingpro вне форума  
 
Непрочитано 30.12.2022, 21:22
1 | #24
koMon


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


к любой кривой...и прямой...

----- добавлено через ~8 мин. -----
м. б. размеры гигантские, перпендикуляр просто не виден. он рисуется отрезком в 100 единиц.

----- добавлено через ~9 мин. -----
и перед последней закрывающей скобкой хорошо бы добавить
(princ)
чтобы не выводить nil.
__________________
K Lisp
koMon вне форума  
 
Автор темы   Непрочитано 30.12.2022, 23:30
#25
Ingpro


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


Да, действительно, рисуются отрезком в 100 ед. и к любой кривой...и прямой...
Эту строку
Код:
[Выделить все]
 (setq target_distance (if (> pi normalized_target_direction) +100 -100))
можно заменить, например, на
Код:
[Выделить все]
 (setq target_distance (if (> pi normalized_target_direction) +500 -500))
koMon, огромная Вам благодарность, успехов в Новом Году!
А фиксированная длина перпендикуляра - это неизменно? Или возможно указать первую и последнюю точку?..

Последний раз редактировалось Ingpro, 30.12.2022 в 23:41.
Ingpro вне форума  
 
Непрочитано 03.01.2023, 22:10
#26
koMon


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


Цитата:
Сообщение от Ingpro Посмотреть сообщение
Или возможно указать первую и последнюю точку?..
возможно...
Код:
[Выделить все]
 
(defun c:set_perpendicular (/ model_space_object curve_selected origin_point_perpendicular nentselp_data curve_object 1st_derivative 1st_derivative_angle
							  xline_object 2nd_point_perpendicular 2nd_point_perpendicular_direction normalized_2nd_point_perpendicular_direction
			   			   )
	(setq model_space_object (vla-get-modelspace (vla-get-activedocument (vlax-get-acad-object))))
	(while (not curve_selected)
		(setq origin_point_perpendicular (getpoint "\Точка на кривой (первая точка перпендикуляра): "))
		(if (setq nentselp_data (nentselp origin_point_perpendicular))
				(progn
					(setq curve_object (vlax-ename->vla-object (car nentselp_data))
			  		      1st_derivative (vlax-curve-getfirstderiv curve_object (vlax-curve-getparamatpoint curve_object (trans origin_point_perpendicular 1 0)))
			  		      1st_derivative_angle (angle (trans '(0 0 0) 0 1) (trans 1st_derivative 0 1))
					      xline_object (vla-addxline model_space_object
					  	      			 			(vlax-3d-point (trans origin_point_perpendicular 1 0))
					  	      			 			(vlax-3d-point (trans (polar origin_point_perpendicular (+ (* 0.5 pi) 1st_derivative_angle) 1) 1 0))
							   		   )
					)
					(vla-put-color xline_object 1)
					(setq 2nd_point_perpendicular (vl-catch-all-apply 'getpoint (list origin_point_perpendicular "\nВторая точка перпендикуляра: ")))
					(if (or
							(null 2nd_point_perpendicular)
							(vl-catch-all-error-p 2nd_point_perpendicular)
						)
							(setq curve_selected t)
							(progn
				  				(setq 2nd_point_perpendicular_direction (angle origin_point_perpendicular 2nd_point_perpendicular)
			  					      normalized_2nd_point_perpendicular_direction (if (< (- (angle origin_point_perpendicular 2nd_point_perpendicular) 1st_derivative_angle) 0)
			  																				(+ (- 2nd_point_perpendicular_direction 1st_derivative_angle) (* 2 pi))
			  																				(- 2nd_point_perpendicular_direction 1st_derivative_angle)
			  											   						   )
				    			)
				  				(if (or
								      	(equal (* 0.5 pi) normalized_2nd_point_perpendicular_direction 1e-6)
								  		(equal (* 1.5 pi) normalized_2nd_point_perpendicular_direction 1e-6)
								    )
				  					(vla-addline model_space_object
												(vlax-3d-point (trans origin_point_perpendicular 1 0))
												(vlax-3d-point (trans 2nd_point_perpendicular 1 0))
									)
								  	(vla-addline model_space_object
												(vlax-3d-point (trans origin_point_perpendicular 1 0))
												(vlax-3d-point (trans (polar origin_point_perpendicular
																	  		 (+ (* 0.5 pi) 1st_derivative_angle)
																	  		 (if (> pi normalized_2nd_point_perpendicular_direction)
																	  		 		(distance origin_point_perpendicular 2nd_point_perpendicular)
																	  		 		(* -1 (distance origin_point_perpendicular 2nd_point_perpendicular))
																	  		 )
																	  )
																1 0
															   )
												)
									)
				  				)
				  				(vla-erase xline_object)
								(setq curve_selected t)
						)
					)
				)
		)
	)
  	(princ)
)
__________________
K Lisp

Последний раз редактировалось koMon, 09.01.2023 в 09:41.
koMon вне форума  
 
Автор темы   Непрочитано 04.01.2023, 09:18
#27
Ingpro


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


koMon, не удалось протестировать лисп из поста #26...
; ошибка: неверно сформированный список на входе
Неизвестная команда...
Лисп из поста #23 отлично работает...
Ingpro вне форума  
 
Непрочитано 04.01.2023, 09:55
#28
koMon


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


лисп любит парность скобок в коде, копируемом ч/з буфер обмена)

Offtop: у меня была знакомая. любой гаджет и программа, которые попадали ей в руки превращались в кирпич и постоянно висли)))
Вложения
Тип файла: lsp Set_Perpendicular.lsp (3.1 Кб, 9 просмотров)
__________________
K Lisp

Последний раз редактировалось koMon, 09.01.2023 в 09:41.
koMon вне форума  
 
Автор темы   Непрочитано 04.01.2023, 10:21
#29
Ingpro


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


Цитата:
Сообщение от koMon Посмотреть сообщение
лисп любит парность скобок в коде, копируемом ч/з буфер обмена)
Спасибо, koMon, буду знать, теперь работает. Очень удобно пользоваться.

Последний раз редактировалось Ingpro, 04.01.2023 в 10:26.
Ingpro вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Как добавить привязки перпендикуляра



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
В Сапфире 2017 пропадают объектные привязки zz07 Лира / Лира-САПР 0 04.10.2021 21:11
Как добавить вершину в существующую мультивыноску? kp+ AutoCAD 8 07.06.2018 13:49
Привязки появляются непонятно где axoxlova AutoCAD 2 04.02.2018 13:39
Предложение по автоматизации привязки растра Neznayka Программирование 7 27.01.2012 12:17
SoliWorks - точки привязки raskat-heli SolidWorks 14 25.11.2011 23:21