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

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

Функции в AutoLISP

Ответ
Поиск в этой теме
Непрочитано 13.10.2006, 23:54 #1
Функции в AutoLISP
Briz06
 
Украина
Регистрация: 13.10.2006
Сообщений: 9

Помогите "чайнику". Есть отрезок, проходящий через точки pt1 и pt2. Есть окружность радиусом R и центром в точке pt3. Как найти точку пересечения? Или может в AutoLISP это нельзя сделать?
Зарание благодарю за помощь.
Просмотров: 3475
 
Непрочитано 14.10.2006, 11:35
#2
Евгений А.

Армспорт
 
Регистрация: 18.07.2006
Ейск
Сообщений: 355


Конечно можно! Наверняка таких програм полно на форуме, вот например моя:

Код:
[Выделить все]
(defun c:per (/ intersect o1 o2)
   (vl-load-com)
   (if (setq intersect
	       (vla-IntersectWith
		  (setq	o1 (vlax-ename->vla-object
			      (car (entsel "\nОбъект 1?\r"))
			      ) ;_ конец vlax-ename->vla-object
			) ;_ конец setq
		  (progn
		     (while (equal
			       (setq o2	(vlax-ename->vla-object
					   (car (entsel "Объект 2?\r"))
					   ) ;_ конец vlax-ename->vla-object
				     ) ;_ конец setq
			       o1
			       ) ;_ конец equal
			(princ "Уже выбран !!! Повторите\n")
			) ;_ конец while
		     o2
		     ) ;_ конец progn
		  acExtendNone
		  ) ;_ конец vla-IntersectWith
	     ) ;_ конец setq
      (progn
	 (princ "Пересечение = ")
	 (princ	(vlax-safearray->list
		   (vlax-variant-value
		      intersect
		      ) ;_ конец vlax-variant-value
		   ) ;_ конец vlax-safearray->list
		) ;_ конец princ
	 ) ;_ конец progn
      (princ "Пересечение не найдено !!!")
      ) ;_ конец if
   (princ "\n")
   (princ)
   ) ;_ конец defun
[/code]
Евгений А. вне форума  
 
Непрочитано 14.10.2006, 11:53
#3
CB

Конструирование в области нефтеразведки
 
Регистрация: 10.02.2006
Гомель
Сообщений: 321


Например:
http://www.autocad.ru/cgi-bin/f1/board.cgi?t=28555dH
http://www.autocad.ru/cgi-bin/f1/board.cgi?t=3592Sy
http://www.autocad.ru/cgi-bin/f1/board.cgi?t=3861aT
CB вне форума  
 
Непрочитано 14.10.2006, 11:59
#4
fixo

Lisp/VBA/VB.NET Hobbyist
 
Регистрация: 24.03.2005
Славен Град Петров
Сообщений: 367


Вариант с вычислением точек:

Код:
[Выделить все]
 ;; written by Oleg (jr.) 2004
 (defun IntLineWCircle (p1 p2 pc rad / ang ch lp p4 pa pe perp ps pt1 pt2 pts)
 (setq ang (angle p1 p2)
       perp (+ ang (/ pi 2))
       p4 (polar pc perp 1.0)
       pa (inters p1 p2 pc p4 nil)
       lp (distance pa pc)
       ch (sqrt (abs (- (* rad rad) (* lp lp))))
       pt1 (polar pa ang ch)
       pt2 (polar pa (+ ang pi) ch)
 )

  (if (equal ang (angle pa p1) 1e-05)
    (progn
    (setq ps p1
	  pe p2))
    (progn
    (setq ps p2
	  pe p1)))
  (if (and (equal rad (distance pc pt1) 1e-05)
	   (>= (distance pa ps) ch)
	   (>= (distance pc ps) rad))
           (setq pts (cons pt1 pts)))
  (if (and (equal rad (distance pc pt2) 1e-05)
	   (>= (distance pa pe) ch)
	   (>= (distance pc pe) rad))    
           (setq pts (cons pt2 pts)))
  pts
  
  )

; TesT :
(defun c:test()
  (setq p1 (getpoint "\nSpecify first point of line: \n")
	p2 (getpoint p1 "\nSpecify second point: \n")
	pc (getpoint p2 "\nSpecify center point for circle: \n")
	rad (getreal "\nSpecify radii of circle : \n"))
  (setvar "cmdecho" 0)
  (setvar "osmode" 0)
  (if (not (setq ll (IntLineWCircle p1 p2 pc rad)))
    (alert "No intersection found")      
    (foreach p ll (command "sphere" p 10.0)))
  (setvar "cmdecho" 1)
  (setvar "osmode" 703))
(C:test)
Fatty

~'J'~
fixo вне форума  
 
Автор темы   Непрочитано 14.10.2006, 13:25 Всем огромное спасибо
#5
Briz06


 
Регистрация: 13.10.2006
Украина
Сообщений: 9


Всем огромное спасибо.
Briz06 вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Функции в AutoLISP

Размещение рекламы