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

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

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

Ответ
Поиск в этой теме
Непрочитано 27.12.2022, 17:52
Как добавить привязки перпендикуляра
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
 
Автор темы   Непрочитано 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