Author Topic: Need help! why right-click can't to cancel ?  (Read 1254 times)

0 Members and 1 Guest are viewing this topic.

Rosamund

  • Guest
Need help! why right-click can't to cancel ?
« on: November 10, 2016, 04:47:19 AM »
Hi guys !

I use this Lisp to  draw datum symbol.   Prompt  "left-click to confirm / right-click to cancel" ,But I right-click , can't to cancel !
Thank for any help !


Code: [Select]
(defun apolar ( pto ang len )
  (polar pto (/ (* ang pi) 180) len)
)

(defun vlp ( pt )
  (cond
   ((= (type pt) 'LIST) (vlax-3d-point pt) )
   ((= (type pt) 'VARIANT) (vlax-safearray->list (vlax-variant-value pt)) )
   ((= (type pt) 'SAFEARRAY) (vlax-safearray->list pt) )
  )
)

(defun vob ( ob )
  (if (= (type ob) 'ENAME) (vlax-ename->vla-object ob) (vlax-vla-object->ename ob) )
)

(defun Vla-AddPlin( pts / lis dou mod )
  (setq lis (apply 'append (mapcar '(lambda (x) (list (car x) (cadr x))) pts)))
  (setq dou (vlax-make-safearray vlax-vbdouble (cons 0 (1- (* 2 (length pts))))))
  (setq lis (vlax-make-variant (vlax-safearray-fill dou lis)))
  (setq mod (vla-get-modelspace (vla-get-activedocument (vlax-get-acad-object))))
  (vla-addlightweightpolyline mod lis)
)

(defun str->lst ( str pat / )
  (setq @lst '() #pn (strlen pat) #n 0)
  (while (< (+ #n #pn) (strlen str))
   (setq #n (vl-string-search pat str #n) #n (+ #n #pn))
   (setq #sn (vl-string-search "%" (substr str (+ #n 1))))
   (setq @lst (cons (substr str (+ #n 1) #sn) @lst))
  )
  (reverse @lst)
)

(defun dimfh-checkobject ( / @ol1 @ol2 )
  (setq @obj (entget &obj) &obj (vob &obj))
  (setq @ol1 (list "AcDb3PointAngularDimension" "AcDb2LineAngularDimension"))
  (setq @ol1 (append @ol1 (list "AcDbRotatedDimension" "AcDbAlignedDimension")))
  (setq @ol2 (list "AcDbPolyline" "AcDbLine" "AcDbCircle" "AcDbArc" "AcDbSpline"))
  (cond
   ((member (vla-get-objectname &obj) @ol1) (setq #mod (dimfh-countpoint)) )
   ((member (vla-get-objectname &obj) @ol2) (setq #mod 1) )
   (T (setq #mod (dimfh-getpoint 2)) )
  )
  (dimfh-action)
)

(defun c:fh ( / ^input #j1 #mod &obj #cm #os #la #ur &b1 &t1 ~obj @obj @p3 @p4 @p31 @p32 @p41 @p42 #an1 #an2 #an )
  (setq #cm (getvar "cmdecho") #os (getvar "osmode") #la (getvar "clayer"))
  (setq #ur (getvar "cursorsize") #uc (getvar "ucsorg"))
  (setvar "cmdecho" 0) (setvar "osmode" 0)
(defun *error* ( msg )
(if (and &b1 (not (vlax-erased-p &b1))) (vla-erase &b1) )
 (princ "*cancel*") (setq *error* nil) (dimfh-resetting)
)
  (if (null vlax-dump-object) (vl-load-com) )
  (if (null &mod)
   (setq &mod (vla-get-modelspace (vla-get-activedocument (vlax-get-acad-object))))
  )
  (if (null (tblsearch "BLOCK" "$B-C1")) (dimfh-makeblock) )
  (if (null (tblsearch "LAYER" "DIM"))
   (progn
    (setq &la (vla-add (vla-get-layers (vla-get-activedocument (vlax-get-acad-object))) "DIM"))
    (vla-put-color &la 6) (vla-put-linetype &la "Continuous") (vla-put-Lineweight &la 15)
   )
  )
  (setvar "clayer" "DIM") (setvar "cursorsize" 5) (command "_.ucs" "W")
  (dimfh-toolbar) (while ^kw (dimfh-toolbar) ) (dimfh-resetting)
)

(defun dimfh-toolbar ( )
  (if (null %tx) (setq %tx "A") ) (if (null #sc) (setq #sc 1.0) )
  (princ "\n[Draw Datum symbol] Current setting: ") (initget "G T S")
  (princ (strcat "Symbol = " %tx " , Scale = " (rtos #sc 2 2) " "))
  (setq ^kw (entsel "\nChoose object OR [Choose basic point(G)/Choose Symbol(T)/Scale Set(S)]: <Choose basic point> "))
  (cond
   ((member ^kw (list nil "G" "g")) (progn (setq ^kw nil) (dimfh-getpoint 1) ) )
   ((member ^kw (list "S" "s")) (progn (setq ^kw T) (dimfh-inputscale) ) )
   ((member ^kw (list "T" "t")) (progn (setq ^kw T) (dimfh-inputstring) ) )
   (T (progn (setq &obj (car ^kw) ^kw nil) (dimfh-checkobject) ) )
  )
)

(defun dimfh-inputstring ( )
  (initget "S") (setq ^tx (getstring (strcat "\nPlease Enter New Text OR [Extract text.(S)]: <" %tx "> ")))
  (cond
   ((member ^tx (list "s" "S")) (dimfh-textselect) )
   ((null ^tx) (setq ^tx %tx) )
  )
  (setq %tx (strcase ^tx))
)

(defun dimfh-textselect ( )
  (if (setq ^tx (entsel (strcat "\nChoose Text object: <" %tx ">")))
   (progn
    (setq ^tx (car ^tx) @tx (entget ^tx) #tx (cdr (assoc 0 @tx)))
    (cond
     ((= #tx "TOLERANCE") (setq ^tx (str->lst (cdr (assoc 1 @tx)) "%%v")) )
     ((= (cdr (assoc 0 @tx)) "TEXT") (setq ^tx (list (cdr (assoc 2 @tx)))) )
     (T (setq ^tx nil) )
    )
    (foreach txl ^tx
     (if (and (> (ascii txl) 64) (< (ascii txl) 91))
      (setq ^tx txl)
     )
    )
   )
  )
  (if (/= (type ^tx) 'STR)
   (progn
    (princ "\n**Text not fetched!**") (setq ^tx %tx)
   )
  )
)

(defun dimfh-inputscale ( )
  (if (setq ^sc (getreal (strcat "\nEnter the new scale: <" (rtos #sc) "> ")))
   (setq #sc ^sc)
  )
)

(defun dimfh-resetting ( )
  (setvar "clayer" #la) (setvar "osmode" #os) (setvar "cursorsize" #ur)
  (if (not (equal #uc (list 0 0 0) 0.001)) (command "_.ucs" "o" #uc) )
  (setvar "cmdecho" #cm) (princ)
)

(defun dimfh-getpoint ( #st / @p3 @p4 )
  (setvar "osmode" #os) (setvar "cursorsize" #ur)
  (if (= #st 2) (setq %st "The object can not take the points automatically") (setq %st "") )
  (if (setq @p3 (getpoint (strcat "\n" %st "Select the basic point: ")))
   (if (setq @p4 (getangle @p3 "\nPlease select the direction or enter the angle: "))
    (progn
     (if (= (type @p4) 'LIST)
      (setq #ang (angle @p3 @p4))
      (setq #ang (/ (* @p4 180) pi))
     )
     (dimfh-insertblock)
     (vla-put-insertionpoint &b1 (vlp @p3))
     (vla-put-rotation &b1 (- #ang (* pi 0.5)))
     (vla-put-rotation &t1 0)
     (setq %tx (chr (1+ (ascii %tx))))
    )
   )
  )
  nil
)

(defun dimfh-action ( )
  (princ "\n>[left-click to confirm / right-click to cancel]<")
  (while #mod
   (dimfh-insertblock) (setq @jj (grread 1 4 0) #j1 (car @jj) #j2 (cadr @jj))
   (cond
    ((= #j1 12) (setq #mod (vla-erase &b1)) )
    ((= #j1  3) (setq %tx (chr (1+ (ascii %tx))) #mod nil) )
    ((= #j1  5) (dimfh-move) )
   )
  )
)

(defun dimfh-makeblock ( / &l1 &l2 &ci &at )
  (setvar "clayer" "0") (setvar "cecolor" "bylayer") (setvar "celtype" "bylayer")
  (setq &l1 (vla-addline &mod (vlp (list -1 0 0)) (vlp (list 1 0 0))))
  (setq &l2 (vla-addline &mod (vlp (list 0 0 0)) (vlp (list 0 1 0))))
  (setq &ci (vla-addcircle &mod (vlp (list 0 2 0)) 1))
  (setq &at (vla-addattribute &mod 1 acattributemodepreset "" (vlp (list 0 2 0)) "NUM" ""))
  (vla-put-alignment &at 4) (vla-put-TextAlignmentPoint &at (vlp (list 0 2 0)))
  (command "_.block" "$B-C1" (list 0 0 0) (vob &l1) (vob &l2) (vob &ci) (vob &at) "")
)

(defun dimfh-insertblock ( )
  (if (or (null &b1) (/= (type &b1) 'VLA-OBJECT) (vlax-erased-p &b1))
   (progn
    (setq &b1 (vla-insertblock &mod (vlp (list 0 0 0)) "$B-C1" #sc #sc #sc 0))
    (setq &t1 (car (vlp (vla-getattributes &b1))))
    (vla-put-color &b1 256) (vla-put-textstring &t1 %tx)
   )
  )
)

(defun dimfh-countpoint ( / p10 p11 p12 p13 p14 p15 p16 )
  (setq p10 (cdr (assoc 10 @obj)) p11 (cdr (assoc 11 @obj)) p13 (cdr (assoc 13 @obj)))
  (setq p14 (cdr (assoc 14 @obj)) p15 (cdr (assoc 15 @obj)) p16 (cdr (assoc 16 @obj)))
  (cond
   ((= (vla-get-objectname &obj) "AcDbRotatedDimension")
    (progn
     (setq @p4 (inters p10 p11 p13 (polar p13 (angle p14 p10) 2) nil))
     (setq @p3 p10 #an1 (angle @p3 p14) #an2 (angle @p4 p13))
    )
   )
   ((= (vla-get-objectname &obj) "AcDbAlignedDimension")
    (progn
     (setq @p4 (inters p10 p11 p13 (polar p13 (angle p14 p10) 2) nil))
     (setq @p3 p10 #an1 (angle @p3 p14) #an2 (angle @p4 p13))
    )
   )
   ((= (vla-get-objectname &obj) "AcDb3PointAngularDimension")
    (progn
     (setq @p3 (polar p15 (angle p15 p13) (distance p11 p15)))
     (setq @p4 (polar p15 (angle p15 p14) (distance p11 p15)))
     (setq #an1 (angle @p3 p15) #an2 (angle @p4 p15))
    )
   )
   ((= (vla-get-objectname &obj) "AcDb2LineAngularDimension")
    (progn
     (setq p17 (inters p10 p15 p13 p14 nil))
     (setq #an1 (if (equal p10 p17 0.001) (angle p17 p15) (angle p17 p10) ) )
     (setq #an2 (if (equal p13 p17 0.001) (angle p17 p14) (angle p17 p13) ) )
     (setq @p3 (polar p17 #an1 (distance p17 p16)))
     (setq @p4 (polar p17 #an2 (distance p17 p16)))
    )
   )
  )
  (setq @p31 (polar @p3 (+ #an1 (* pi 0.5)) 1) @p32 (polar @p3 (+ #an1 (* pi 1.5)) 1))
  (setq @p41 (polar @p4 (+ #an2 (* pi 0.5)) 1) @p42 (polar @p4 (+ #an2 (* pi 1.5)) 1))
  0
)

(defun dimfh-move ( )
  (cond
   ((= #mod 0)
    (if (< (distance @p3 #j2) (distance @p4 #j2))
     (if (< (distance @p31 #j2) (distance @p32 #j2))
      (setq @pc1 @p3 #an (angle @p31 @p3))
      (setq @pc1 @p3 #an (angle @p32 @p3))
     )
     (if (< (distance @p41 #j2) (distance @p42 #j2))
      (setq @pc1 @p4 #an (angle @p41 @p4))
      (setq @pc1 @p4 #an (angle @p42 @p4))
     )
    )
   )
   ((= #mod 1)
    (setq @pc1 (vlax-curve-getclosestpointto &obj #j2) #an (angle #j2 @pc1))
   )
  )
  (vla-put-insertionpoint &b1 (vlp (polar @pc1 (+ #an pi) 0.5)))
  (vla-put-rotation &b1 (+ #an (/ pi 2)))
  (vla-put-rotation &t1 0)
)


roy_043

  • Water Moccasin
  • Posts: 1895
  • BricsCAD 18
Re: Need help! why right-click can't to cancel ?
« Reply #1 on: November 10, 2016, 05:12:45 AM »
Try changing:
Code: [Select]
(grread 1 4 0)To
Code: [Select]
(grread 1 6 0)

ribarm

  • Gator
  • Posts: 3310
  • Marko Ribar, architect
Re: Need help! why right-click can't to cancel ?
« Reply #2 on: November 10, 2016, 08:24:19 AM »
(defun dimfh-action ( )
  (princ "\n>[left-click to confirm / right-click to cancel]<")
  (while #mod
   (dimfh-insertblock) (setq @jj (grread 1 6 0) #j1 (car @jj) #j2 (cadr @jj))
   (cond
    ((or (= #j1 11) (= #j1 25)) (setq #mod (vla-erase &b1)) )
    ((= #j1  3) (setq %tx (chr (1+ (ascii %tx))) #mod nil) )
    ((= #j1  5) (dimfh-move) )
   )
  )
)
Marko Ribar, d.i.a. (graduated engineer of architecture)

:)

M.R. on Youtube

Rosamund

  • Guest
Re: Need help! why right-click can't to cancel ?
« Reply #3 on: November 11, 2016, 03:18:34 AM »
Thank you for your help !   ribarm's answer is a perfect solution to my problem.