Jump to content

Recommended Posts

Posted
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))
   )
   )
   )
   )
 )
 
 )

  • Replies 20
  • Created
  • Last Reply

Top Posters In This Topic

  • highflybird

    7

  • marko_ribar

    5

  • ReMark

    4

  • dbroada

    2

Top Posters In This Topic

Posted Images

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.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • Create New...