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

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

LISP. Расширение возможностей команды FILLET

Ответ
Поиск в этой теме
Непрочитано 15.09.2011, 11:17 #1
LISP. Расширение возможностей команды FILLET
GRIFEL
 
пенсионер-конструктор
 
Калуга
Регистрация: 11.02.2011
Сообщений: 68

Команда F на базе FILLET обеспечивает дополнительные возможности скругления элементов контуров :

1. при указании зоны пересечения линий - не требуется указание сопрягаемой линии
2. при указании дуги сопряжения двух линий - изменяет радиус сопряжения
3. при захвате радиуса полилинии - изменяет только указанный радиус
4. при захвате линейного фрагмента полилинии - изменяет все радиусы
5. тип элемента при указании определяет не требуя дополнительных опций
6. дает возможность замены радиуса на фаску

Приложенный код не идеален - мой уровень любительский - не ругайте , помогите довести до ума .....

Вложения
Тип файла: lsp f.lsp (6.3 Кб, 289 просмотров)

Просмотров: 4624
 
Непрочитано 07.10.2013, 14:53
#2
Руслан82


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


Спасибо большое, GRIFEL.
Программа помогла.
Руслан82 вне форума  
 
Непрочитано 07.10.2013, 17:50
#3
Alan

CAD
 
Регистрация: 28.08.2003
Киев
Сообщений: 1,834
<phrase 1=


Цитата:
Сообщение от GRIFEL Посмотреть сообщение
Приложенный код не идеален - мой уровень любительский - не ругайте , помогите довести до ума .....
Если хотите чтобы команда работала и под локализованной версией, добавляйте подчёркивание и к Опциям
Например,
(command "_.ucs" "_w")
(COMMAND "_.CHAMFER" "_p" e)
(command "_.fillet" "_p" e)
__________________
По теории майский жук летать не может.
Но он этого не знает. И летает...
Alan вне форума  
 
Непрочитано 07.10.2013, 18:00
#4
Кулик Алексей aka kpblc
Moderator

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


НЕ помешает еще и обработчик ошибок (как минимум); метки начала и конца отмены...
И еще один момент: в английской версии AutoCAD 2013 могу в запрос выводиться иероглифы.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 14.04.2014, 11:46
#5
Alex II


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


А есть ли вариант делать сопряжение не указывая радиус (не вбивая с клавиатуры), а указывая (вбивая с клавиатуры) дину дуги, которая должна получиться. Просто очен часто требуеться сделать сопряжение двух линий, где должна получиться дуга определенной длины, а радиус неважен
Alex II вне форума  
 
Непрочитано 21.04.2014, 12:12
#6
skkkk


 
Регистрация: 20.03.2008
Сообщений: 2,680


Alex II, насколько я знаю, стандартными средствами - нет. Лиспом - пожалуй.
Геометрически вычисляем радиус сопряжения, разделив длину дуги на угол между сегментами в радианах. Назначаем системной переменной FILLETRAD значение этого радиуса и вызываем команду _fillet (всё программно). В идеале наша функция должна бы работать так: вводим длину дуги, указываем вершину - примыкающие к вершине сегменты сопрягаются с рассчитанным радиусом. Но команда _fillet не слишком дружелюбна при обращении к ней из лиспа, поэтому помимо двух действий (тех, что в идеале) добавляется еще два клика по смежным сегментам (стандартное поведение _fillet). Чтобы добиться идеала, нужно перерисовывать полилинию без участия _fillet, а это тянет за собой много геометрической аналитики и проверок, на что временем сейчас я не располагаю. Поэтому ниже простой и топорный вариант решения:
Код:
[Выделить все]
 (defun C:TEST ( / dist ent crv pt_pick vertex_param vertex_pt pt1 pt2 ang radius)
	(vl-load-com)
	(while (null dist)
		(setq dist (getdist (strcat "\nВведите длину дуги: " (if *dist* (strcat "<" (vl-princ-to-string *dist*) ">") ""))))
		(if (null dist) (setq dist *dist*))
	)
	(while (null ent)
		(setq ent (entsel "\nУкажите полилинию вблизи нужной вершины: "))
		(if (and ent (not (wcmatch (cdr (assoc 0 (entget (car ent)))) "*POLYLINE")))
			(progn 
				(princ "\Это не полилиния!")
				(setq ent nil)
			)
		)
	)
	(setq *dist* dist 
		  crv (vlax-ename->vla-object (car ent))
		  pt_pick (vlax-curve-getClosestPointTo crv (cadr ent))
		  vertex_param (atoi (rtos (vlax-curve-getParamAtPoint crv pt_pick) 2 0))
		  vertex_pt (vlax-curve-getPointAtParam crv vertex_param)
		  pt1 (vlax-curve-getPointAtParam crv (- vertex_param 0.5)) 
		  pt2 (vlax-curve-getPointAtParam crv (+ vertex_param 0.5)) 
		  ang (abs (- (angle pt2 vertex_pt) (angle vertex_pt pt1)))
	)	  
	(if (> ang pi)(setq ang (- (* pi 2) ang)))	  
	(setq radius (/ dist ang))
	(setvar "FILLETRAD" radius)
	(vl-cmdf  "_fillet")
)

Хотя пришла в голову идея на запрос сегментов командой _fillet отсылать точки через (vla-SendCommand). Вроде работает чётко:
Код:
[Выделить все]
 (defun C:TEST ( / dist ent crv pt_pick vertex_param vertex_pt ang prmpt radius)
	(vl-load-com)
	
	(while (null dist)
		(setq dist (getdist (strcat "\nВведите длину дуги: " (if *dist* (strcat "<" (vl-princ-to-string *dist*) ">") ""))))
		(if (null dist) (setq dist *dist*))
	)
	(while (null ent)
		(setq ent (entsel (strcat (if prmpt prmpt "")
								  "\nУкажите полилинию вблизи нужной "
								  (if prmpt "НЕ КРАЙНЕЙ" "не крайней")
								  " вершины: "))
		)
		(if (and ent (not (wcmatch (cdr (assoc 0 (entget (car ent)))) "*POLYLINE")))
			(progn 
				(princ "\Это не полилиния!")
				(setq ent nil)
			)
		)
		(setq *dist* dist 
			  crv (vlax-ename->vla-object (car ent))
			  pt_pick (vlax-curve-getClosestPointTo crv (cadr ent))
			  vertex_param (atoi (rtos (vlax-curve-getParamAtPoint crv pt_pick) 2 0))
			  vertex_pt (vlax-curve-getPointAtParam crv vertex_param)
			  pt1 (vlax-curve-getPointAtParam crv (- vertex_param 0.5)) 
			  pt2 (vlax-curve-getPointAtParam crv (+ vertex_param 0.5)) 
		)
		(if (and pt1 pt2)
			(setq ang (abs (- (angle pt2 vertex_pt) (angle vertex_pt pt1))))
			(setq prmpt "\nЭта вершина является крайней" ent nil)
		)
	)
	(if (> ang pi)(setq ang (- (* pi 2) ang)))	  
	(setq radius (/ dist ang))
	(setvar "FILLETRAD" radius)
	(command  "_fillet")
	(vla-SendCommand (vla-get-ActiveDocument (vlax-get-acad-object))  "!pt1 !pt2 ")
)

Последний раз редактировалось skkkk, 21.04.2014 в 13:41.
skkkk вне форума  
 
Непрочитано 21.04.2014, 18:49
#7
Alex II


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


да, вобще супер, прямо то, что надо. А то задолбался все время в ручнуя подгонять или перещитывать каждый раз. Огромнейшее спасибо!!!!!
Alex II вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > LISP. Расширение возможностей команды FILLET



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Lisp. Редактирование элемента во внешней ссылке без команды _refedit молодой человек LISP 8 08.04.2011 23:00
Вызов команды внешнего приложения из lisp больше 4 раз Andrej2 LISP 5 22.09.2009 15:35
Запуск Lisp команды в новом документе BlackHarp LISP 1 26.03.2009 23:06
Использование команды mtext в lisp gool LISP 2 17.09.2008 12:57
Странное поведение команды FILLET - не продолжает, а двигает I.Van AutoCAD 2 08.08.2007 09:29