lucas3 Posted May 13, 2014 Posted May 13, 2014 To go with Dynamic graphic you will loose the snap objects , so here it goes below [ATTACH=CONFIG]48721[/ATTACH] I think can use this Function, grread with osnap. ;;;gxl-Ge-grread 自定义带捕捉的GrRead函数 ;;;参数:GR_MODE = 函数GrRead的参数表 如: (list [track] [allkeys [curtype]),参数个数按需要设置,可为nil ;;; STARTPT = 基点,计算垂足点、正交模式等坐标的基点,若为nil,则基点默认为系统变量LastPoint值 ;;; SS = 捕捉避开的物体,可以是选择集或图元名 (DEFUN gxl-Ge-grread (GR_MODE STARTPT SS / GET_OSMODE GETGRVECS DRAWVECS TIME F3 F8 STR_OSMODE LST_OSMODE DRAFTOBJ AUTOSNAPMARKERSIZE AUTOSNAPMARKERCOLOR DRAG DRAGMODE GHOSTPT X0 Y0 X1 Y1 Z1 DISTPERPIXEL BOLD ) ;;;================================================================== ;;gxl-Sel-ReDrawSel 重画选择集中的对象,Sel 为选择集或图元名 mode 为方式码 ;;;重画选择集中的对象,mode 为方式码, ;;;方式码 1 在屏幕重画该选择集对象 ;;;方式码 2 隐藏该选择集对象 ;;;方式码 3 “醒目显示”该选择集对象 ;;;方式码 4 取消“醒目显示”该选择集对象 ;;;================================================================== (defun gxl-Sel-ReDrawSel (Sel mode / m n) (if sel (progn (cond ((= 'pickset (type Sel)) (setq m (sslength Sel) n 0) (repeat m (redraw (ssname Sel n) mode) (setq n (1+ n)) ) ) ((= 'ename (type Sel)) (redraw Sel mode) ) ) ) ) ) ;defun gxl-Sel-ReDrawSel ;;;分列字串 (defun gxl-StrParse ( str del / pos lst ) (while (setq pos (vl-string-search del str)) (setq lst (cons (substr str 1 pos) lst) str (substr str (+ pos 1 (strlen del)))) ) (if (= " " Del) (vl-remove "" (reverse (cons str lst))) (reverse (cons str lst)) ) ) ;;;返回捕捉模式字串 (DEFUN get_osmode (/ cur_mode mode$) (SETQ mode$ "") (IF (< 0 (SETQ cur_mode (GETVAR "osmode")) 16384) (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$ ) ;;;返回捕捉标记Vecs (DEFUN 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)) ) ;正方形 ("_mid" ((0 1.414) (-1.225 -0.707)) ((-1.225 -0.707) (1.225 -0.707)) ((1.225 -0.707) (0 1.414)) ) ;三角形 ("_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)) ) ;圆 ("_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)) ) ;圆+十字交叉 ("_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)) ) ;旋转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)) ) ;十字交叉 ("_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)) ) ;两个正方形 ("_per" ((-1 1) (-1 -1)) ((-1 -1) (1 -1)) ((0 -1) (0 0)) ((0 0) (-1 0)) ) ;半个正方形 ("_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)) ) ;园+线 ("_nea" ((-1 1) (1 -1)) ((1 -1) (-1 -1)) ((-1 -1) (1 1)) ((1 1) (-1 1)) ) ;两个三角形 ("_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)) ) ;正方形+十字交叉 ("_ext" ((0.1 0) (0.13 0)) ((0.2 0) (0.23 0)) ((0.3 0) (0.33 0)) ) ;三个点 ("_par" ((0 1) (-1 -1)) ((1 1) (0 -1))) ;两条线 ) ) ) ) ;;绘制捕捉标记 (DEFUN DrawVecs (Pt Vecs Size Color / lst xdir) (setq xdir (getvar 'ucsxdir)) (setq vecs (mapcar '(lambda (x) (mapcar '(lambda (a) (setq a (trans a 0 xdir)) (setq a (list (caddr a) (car a))) (list (+ (car pt) (* size (car a))) (+ (cadr pt) (* size (cadr a))))) x)) vecs)) (SETQ lst (MAPCAR 'CONS (MAPCAR (FUNCTION (LAMBDA (x) Color)) Vecs) Vecs ) ) (GRVECS (APPLY 'APPEND lst)) ) ;;;主程序开始 (VL-LOAD-COM) (if STARTPT (setvar 'lastpoint STARTPT) (setq STARTPT (getvar 'lastpoint)) ) (SETQ time T) (setq F3 (getvar "osmode")) (setq F8 (getvar "ORTHOMODE")) (SETQ str_osmode (get_osmode)) (SETQ lst_osmode (gxl-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 drag (apply 'GRREAD GR_mode)) ;_ 执行Gread函数 (setq dragmode (car drag)) (COND ((equal drag '(2 6));F3切换捕捉开关 (if (< f3 16384) (progn (setq f3 (+ f3 16384))(prompt "\n<对象捕捉 关>")) (progn (setq f3 (- f3 16384))(prompt "\n<对象捕捉 开>")) ) (setvar "OSMODE" f3)(redraw) ) ((equal drag '(2 15));F8切换正交开关 (if (= f8 0) (progn(setq f8 1)(prompt "\n<正交 开>")) (progn(setq f8 0)(prompt "\n<正交 关>")) ) (setvar "orthomode" f8)(redraw) ) ((= dragmode 5) (REDRAW) (GXL-SEL-REDRAWSEL ss 2) ;_ 隐藏选择集 (SETQ drag (CADR drag)) (IF (or (zerop (strlen str_osmode)) (null (SETQ ghostpt (OSNAP drag str_osmode))) ) ;;;此处修改正交模式下坐标 (if (and startpt (= 1 f8) (/= 2 (car drag))) (progn (setq x0 (car startpt) y0 (cadr startpt) x1 (car drag) y1 (cadr drag) z1 (caddr drag) ) (if (> (abs (- x0 x1)) (abs (- y0 y1))) (setq ghostpt (list x1 y0 z1)) (setq ghostpt (list x0 y1 z1)) ) ) (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 (DrawVecs ghostpt (GetGrvecs ghostpt drag lst_osmode) item AutoSnapMarkerColor ) ) ) ) (GXL-SEL-REDRAWSEL ss 1) ;_ 显示选择集 ) ((or (= dragmode 3) (= dragmode 12) ) (GXL-SEL-REDRAWSEL ss 2) ;_ 隐藏选择集 (IF (Null (SETQ ghostpt (OSNAP (CADR drag) (get_osmode)))) ;;;此处修改正交模式下坐标 (if (and startpt (= 1 f8) (/= 2 (car drag))) (progn (setq x0 (car startpt) y0 (cadr startpt) x1 (caadr drag) y1 (cadadr drag) z1 (caddar (cdr drag)) ) (if (> (abs (- x0 x1)) (abs (- y0 y1))) (setq ghostpt (list x1 y0 z1)) (setq ghostpt (list x0 y1 z1)) ) ) (SETQ ghostpt (CADR drag)) ) ) (REDRAW) (GXL-SEL-REDRAWSEL ss 1) ;_ 显示选择集 (SETQ time nil) ) (t ;;;此处修改正交模式下坐标 (if (and startpt (= 1 f8) (/= 2 (car drag))) (progn (setq x0 (car startpt) y0 (cadr startpt) x1 (caadr drag) y1 (cadadr drag) z1 (caddar (cdr drag)) ) (if (> (abs (- x0 x1)) (abs (- y0 y1))) (setq ghostpt (list x1 y0 z1)) (setq ghostpt (list x0 y1 z1)) ) ) (SETQ ghostpt (CADR drag)) ) (REDRAW) ) ) ; ) (list dragmode ghostpt) ) ;;;TEST1,Dynamic MOVE (defun c:tt(/ ss pt p oldpt) (princ "\nChoose a moving object: ") (while (not (setq ss (ssget)))) (setq pt (getpoint "\n Selection basis points")) (if (null pt) (setq oldpt (getvar 'lastpoint)) (setq oldpt pt)) (while (/= 3 (car (setq gr (GXL-GE-GRREAD '(t 7 2) pt ss)))) ;_ 将移动的选择集排除在捕捉目标之外 (if (= 'list (type (setq p (cadr gr)))) (progn (grdraw pt p 1) (command "move" ss "" oldpt p) (setq oldpt p) ) ) ) ) ;;;Test2 (defun c:test (/ en gr p enl) (while (not (setq p (GETPOINT "\npoint:")))) (while (/= 3 (car (setq gr (GXL-GE-GRREAD '(t 7 2) p en)))) ;_ 将直线排除在捕捉目标之外 (if (= 'list (type (cadr gr))) (progn (if en (progn (entmod (subst (cons 11 (trans (cadr gr) 1 0)) (assoc 11 enl) enl)) ) (progn (vla-ADDLINE (vla-get-ModelSpace (vla-get-ActiveDocument (vlax-get-acad-object))) (vlax-3d-point (trans p 1 0)) (vlax-3d-point (trans (cadr gr) 1 0))) (setq en (entlast) enl (entget en)) ) ) ) ) ) ) Quote
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.