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

Вернуться   Форум 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 вне форума  
Ответ
Вернуться   Форум 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