马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
这是fools前辈的程序,但是在捕捉圆心的时候会出错,那位大神帮忙看看,优化一下谢谢!
http://bbs.xdcad.net/forum.php?m ... &fromuid=764086
- ;; grread+osnap+grvecs
- ;; Rewritten by Fools @ TheSwamp.org
- ;;
- ;; Use (grread) to get original point
- ;; Use (osnap) to calculate accurate point
- ;; Use (grvecs) to show AutosnapMarker
- ;; No return , just show the method
- (defun c:gg(/ autosnapmarkercolor autosnapmarkersize bold distperpixel draftobj drag get_osmode ghostpt lst_osmode str_osmode time ypy_drawvecs ypy_getgrvecs ypy_strparse)
- ;; CAB 10/5/2006
- ;; Fools change a little about "," (3/3/2007)
- ;;
- ;; function to return the current osmode setting in the form of a string
- ;; if (getvar "osmode") = 175
- ;; (get_osmode) returns "_end,_mid,_cen,_nod,_int,_per"
- (defun get_osmode (/ cur_mode mode$)
- (setq mode$ "")
- (if (< 0 (setq cur_mode (getvar "osmode")) 16383)
- (mapcar
- (function
- (lambda (x)
- (if (not (zerop (logand cur_mode (car x))))
- (if (zerop (strlen mode$))
- (setq mode$ (cadr x))
- (setq mode$ (strcat mode$ "," (cadr x)))
- )
- )
- )
- )
- '((1 "_end") (2 "_mid") (4 "_cen") (8 "_nod") (16 "_qua") (32 "_int") (64 "_ins") (128 "_per") (256 "_tan") (512 "_nea") (1024 "_qui") (2048 "_app") (4096 "_ext") (8192 "_par"))
- )
- )
- mode$
- )
- ;;My functions
- (defun ypy_strparse (str delim / ptr lst)
- (while (setq ptr (vl-string-search delim str))
- (setq lst (cons (substr str 1 ptr) lst))
- (setq str (substr str (+ ptr 2)))
- )
- (reverse (cons str lst))
- )
- (defun ypy_getgrvecs (pt dragpt lst / KEY)
- (setq key T)
- (while (and key lst)
- (if (EQUAL (osnap dragpt (car lst)) pt 1E-6)
- (setq key nil)
- (setq lst (cdr lst))
- )
- )
- (cdr (assoc (car lst)
- '(("_end"
- ((-1 1) (-1 -1))
- ((-1 -1) (1 -1))
- ((1 -1) (1 1))
- ((1 1) (-1 1))
- ) ;square
- ("_mid"
- ((0 1.414) (-1.225 -0.707))
- ((-1.225 -0.707) (1.225 -0.707))
- ((1.225 -0.707) (0 1.414))
- ) ;triangle
- ("_cen"
- ((0 1) (-0.707 0.707))
- ((-0.707 0.707) (-1 0))
- ((-1 0) (-0.707 -0.707))
- ((-0.707 -0.707) (0 -1))
- ((0 -1) (0.707 -0.707))
- ((0.707 -0.707) (1 0))
- ((1 0) (0.707 0.707))
- ((0.707 0.707) (0 1))
- ) ;circle
- ("_nod"
- ((0 1) (-0.707 0.707))
- ((-0.707 0.707) (-1 0))
- ((-1 0) (-0.707 -0.707))
- ((-0.707 -0.707) (0 -1))
- ((0 -1) (0.707 -0.707))
- ((0.707 -0.707) (1 0))
- ((1 0) (0.707 0.707))
- ((0.707 0.707) (0 1))
- ((-1 1) (1 -1))
- ((-1 -1) (1 1))
- ) ;circle+cross
- ("_qua"
- ((0 1.414) (-1.414 0))
- ((-1.414 0) (0 -1.414))
- ((0 -1.414) (1.414 0))
- ((1.414 0) (0 1.414))
- ) ;square rotate 45
- ("_int"
- ((-1 1) (1 -1))
- ((-1 -1) (1 1))
- ((1 0.859) (-0.859 -1))
- ((-1 0.859) (0.859 -1))
- ((0.859 1) (-1 -0.859))
- ((-0.859 1) (1 -0.859))
- ) ;cross
- ("_ins"
- ((-1 1) (-1 -0.1))
- ((-1 -0.1) (0 -0.1))
- ((0 -0.1) (0 -1.0))
- ((0 -1.0) (1 -1))
- ((1 -1) (1 0.1))
- ((1 0.1) (0 0.1))
- ((0 0.1) (0 1.0))
- ((0 1.0) (-1 1))
- ) ;two squares
- ("_per"
- ((-1 1) (-1 -1))
- ((-1 -1) (1 -1))
- ((0 -1) (0 0))
- ((0 0) (-1 0))
- ) ;half square
- ("_tan"
- ((0 1) (-0.707 0.707))
- ((-0.707 0.707) (-1 0))
- ((-1 0) (-0.707 -0.707))
- ((-0.707 -0.707) (0 -1))
- ((0 -1) (0.707 -0.707))
- ((0.707 -0.707) (1 0))
- ((1 0) (0.707 0.707))
- ((0.707 0.707) (0 1))
- ((1 1) (-1 1))
- ) ;circle+line
- ("_nea"
- ((-1 1) (1 -1))
- ((1 -1) (-1 -1))
- ((-1 -1) (1 1))
- ((1 1) (-1 1))
- ) ;two triangle
- ("_qui") ; ???
- ("_app"
- ((-1 1) (-1 -1))
- ((-1 -1) (1 -1))
- ((1 -1) (1 1))
- ((1 1) (-1 1))
- ((-1 1) (1 -1))
- ((-1 -1) (1 1))
- ) ;square+cross
- ("_ext"
- ((0.1 0) (0.13 0))
- ((0.2 0) (0.23 0))
- ((0.3 0) (0.33 0))
- ) ;three points
- ("_par" ((0 1) (-1 -1)) ((1 1) (0 -1))) ;two lines
- )
- )
- )
- )
- ;;Use grvecs
- (defun ypy_drawvecs (Pt Vecs Size Color / lst matrix)
- ;;no Z axis
- (setq matrix (list (list Size 0.0 0.0 (car pt))
- (list 0.0 Size 0.0 (cadr pt))
- (list 0.0 0.0 1.0 0.0)
- (list 0.0 0.0 0.0 1.0)
- )
- )
- (setq lst (mapcar 'cons
- (mapcar (function (lambda (x) Color)) Vecs)
- Vecs
- )
- )
- (grvecs (apply 'append lst) matrix)
- )
- ;;****************************
- ;; Main Routine starts here
- ;;****************************
- (vl-load-com)
- (setq time T)
- (setq str_osmode (get_osmode))
- (setq lst_osmode (ypy_strparse str_osmode ","))
- ;(setq draftobj (vla-get-Drafting
- ; (vla-get-Preferences (vlax-get-acad-object))
- ; )
- ;)
- ;(setq autosnapmarkersize (vla-get-autosnapmarkersize draftobj))
- ;(setq autosnapmarkercolor (vla-get-autosnapmarkercolor draftobj))
- (setq autosnapmarkersize (atoi (getenv "AutoSnapSize")) autosnapmarkercolor (atoi (getenv "AutoSnapColor")))
- (while time
- (setq drag (grread T 15 0)) ;;Can change like (grread (setq drag (grread T 1 1)))
- (cond
- ((= (car drag) 5)
- (redraw)
- (setq fm-get-gr drag drag (cadr drag))
- (if (or (zerop (strlen str_osmode)) (null (setq ghostpt (osnap drag str_osmode))))
- (setq ghostpt drag)
- ;;Beacuse of mouse middle button scroll , calculate "distperpixel" every time
- (progn (setq distperpixel (/ (getvar "VIEWSIZE") (cadr (getvar "SCREENSIZE"))))
- ;;bold
- (setq bold (mapcar '* (list distperpixel distperpixel distperpixel) (list (+ autosnapmarkersize 0.5) autosnapmarkersize (- autosnapmarkersize 0.5))))
- (foreach item bold
- (ypy_drawvecs ghostpt (ypy_getgrvecs ghostpt drag lst_osmode) item autosnapmarkercolor))
- )
- )
- )
- ((= (car drag) 3)
- (if (null (setq ghostpt (osnap (cadr drag) (get_osmode))))
- (setq ghostpt (cadr drag))
- )
- (redraw)
- (setq time nil)
- )
- )
- (print fm-get-gr)
- )
- (prin1) ;can return ghostpt if want
- )
|