Author Topic: Grread distance on cursor  (Read 6237 times)

0 Members and 1 Guest are viewing this topic.

cadplayer

  • Bull Frog
  • Posts: 390
  • Autocad Civil3d, OpenDCL.Runtime, LISP, .NET (C#)
Grread distance on cursor
« on: March 16, 2012, 08:41:29 AM »
Im trying to understand opportunities with grread. I want to have a routin to get distans from two pick points on mousecursor

Lee Mac

  • Seagull
  • Posts: 12906
  • London, England
Re: Grread distance on cursor
« Reply #1 on: March 16, 2012, 08:55:24 AM »
You might be interested in this:

http://www.theswamp.org/index.php?topic=37553.0

cadplayer

  • Bull Frog
  • Posts: 390
  • Autocad Civil3d, OpenDCL.Runtime, LISP, .NET (C#)
Re: Grread distance on cursor
« Reply #2 on: March 16, 2012, 09:17:03 AM »
Yes I have seen it. It's a great tool. I was wondering is it possible without vektor definition. I´m not realy understand this part.

;its usually practice
(setq di (distance
      (getpoint "\nfirst point")
      (getpoint "\nsecond point")
      )
      )

; its wrong thinking

(setq di (setq p1 (cadr (grread))
          p2 (cadr (grread))
          )
         )

Lee Mac

  • Seagull
  • Posts: 12906
  • London, England
Re: Grread distance on cursor
« Reply #3 on: March 16, 2012, 09:21:04 AM »

cadplayer

  • Bull Frog
  • Posts: 390
  • Autocad Civil3d, OpenDCL.Runtime, LISP, .NET (C#)
Re: Grread distance on cursor
« Reply #4 on: March 16, 2012, 09:34:40 AM »
Code: [Select]
(setq di (distance
   (getpoint "\nfirst point")
   (getpoint "\nsecond point")
   )
      )


(setq di (setq p1 (cadr (grread))
       p2 (cadr (grread))
    )
      )

cadplayer

  • Bull Frog
  • Posts: 390
  • Autocad Civil3d, OpenDCL.Runtime, LISP, .NET (C#)
Re: Grread distance on cursor
« Reply #5 on: March 16, 2012, 02:43:52 PM »
Maybe I have to ask otherwise, why it is good to use grread or even it have getpoint.

@Lee
It looks like nice - especially var v. How was you thinking as you done it (very interesting  :-o) ?
Is it only way to display moving mouse cursor


irneb

  • Water Moccasin
  • Posts: 1794
  • ACad R9-2016, Revit Arch 6-2016
Re: Grread distance on cursor
« Reply #6 on: March 18, 2012, 04:48:09 AM »
Unfortunately in normal lisp (i.e. not extended by some custom DotNet / ARX) grread is the only way to get hold of the mouse position as it moves. The problem with grread is it can't be called while something else is called. E.g. if you use getpoint you can't have grread work at the same time.

So if you have grread, you can't use OSnaps in the normal way. You can of course get the point from grread when the button is clicked and then perform an osnap on that point to get a similar effect. But it wouldn't be as interactive as the getpoint function would be - the user wouldn't see which snap point will get chosen before it's actually chosen. So in highly cluttered drawings it could very easily pick the wrong "intersection" or "endpoint", or whatever else.
Common sense - the curse in disguise. Because if you have it, you have to live with those that don't.

cadplayer

  • Bull Frog
  • Posts: 390
  • Autocad Civil3d, OpenDCL.Runtime, LISP, .NET (C#)
Re: Grread distance on cursor
« Reply #7 on: March 19, 2012, 06:25:56 AM »
I try it grread with while, now I get text in all points on screen

I only need text if I finished grread. Can I build it in grread ?

Quote
  (vl-load-com)
 (setq pt (getpoint "\nP1 !"))
  (while
    (member
      (car
   (setq ptgr (grread 't 5 0)))
      '(5 2))
    (entmake
      (list
   '(0 . "TEXT")
         (cons 10 (mapcar '+ pt '(0.1 0.1)))
   '(40 . 2.5)
         (cons 1 (strcat "Distance=" di))
        '(50 . 0.0)
        '(71 . 0)
        '(72 . 0)
        '(11 0.0 0.0 0.0)
        '(210 0.0 0.0 1.0)
        '(73 . 0)
   )
      )
    (setq obj (entlast))
    (vla-move (vlax-ename->vla-object obj)
         (vlax-3d-Point pt)
         (vlax-3d-Point (cadr ptgr)))
    (vla-put-TextString
      (vlax-ename->vla-object obj)
      (strcat "Distance=" (setq di (rtos (distance pt (cadr ptgr))2 3))))
    )




Stefan

  • Bull Frog
  • Posts: 319
  • The most I miss IRL is the Undo button
Re: Grread distance on cursor
« Reply #8 on: March 19, 2012, 08:11:25 AM »
entmake is called repeatedly under the while loop, so it creates multiple text objects.
Try this
Code: [Select]
(if
    (setq pt (getpoint "\nP1 !"))
     (while
       (member (car (setq ptgr (grread 't 5 0))) '(5 2))
        (if text
          (progn
            (vlax-put text 'InsertionPoint (mapcar '+ (cadr ptgr) '(0.1 0.1 0.0)))
            (vlax-put text 'TextString (strcat "Distance=" (rtos (distance pt (cadr ptgr)))))
            (redraw)
            (grdraw pt (cadr ptgr) 7 1)
          )
          (setq text
            (vlax-ename->vla-object
              (entmakex
                (list
                  '(0 . "TEXT")
                  (cons 10 (mapcar '+ pt '(0.1 0.1 0.0)))
                  '(40 . 2.5)
                  (cons 1 (strcat "Distance=" (rtos (distance pt (cadr ptgr)))))
                  '(50 . 0.0)
                  '(71 . 0)
                  '(72 . 0)
                  '(11 0.0 0.0 0.0)
                  '(210 0.0 0.0 1.0)
                  '(73 . 0)
                )
              )
            )
          )
        )
     )
  )
Also, you may want to reconsider conditional statement in while loop since code 2 in grread will return a list like (2 12) so your code (and mine) will exit with an error.

cadplayer

  • Bull Frog
  • Posts: 390
  • Autocad Civil3d, OpenDCL.Runtime, LISP, .NET (C#)
Re: Grread distance on cursor
« Reply #9 on: March 19, 2012, 08:37:55 AM »
Yes Stefan, it works perfekt... Your construction is much better and logical than my.
In the vlide-help I can´t find all vl- functions. What I need to understand visual lisp better? Have you tip, where I can find all functions  :realmad:
Grread is also a mystery with all parameters, but now I have a example to test it more

Lee Mac

  • Seagull
  • Posts: 12906
  • London, England
Re: Grread distance on cursor
« Reply #10 on: March 19, 2012, 08:46:15 AM »

cadplayer

  • Bull Frog
  • Posts: 390
  • Autocad Civil3d, OpenDCL.Runtime, LISP, .NET (C#)
Re: Grread distance on cursor
« Reply #11 on: March 20, 2012, 07:51:05 AM »
Thanks, I tryed so much to get result and solution how grread works - I can´t find my case in examples. So I think now to try a easy examples: I want to show coordinates from grreadpoint dynamical on cursor and than I pick a point should be come coordinates on screen. Thats was question in the beginning why Lee use vektors of sign   :|

Quote

(while
  (not
    (and
      (car (getpoint "\nP1 ! "))
      (setq gr (grread 5))(= (car gr) 5)
      (setq obj  (entmakex
         (list
           '(0 . "TEXT")
           (cons 10 (cadr gr))
           '(40 . 0.15)
           (cons 1 (strcat (rtos (car (cadr gr)) 2 2) "," (rtos (cadr (cadr gr)) 2 2)))
           '(50 . 0.0)
           '(11 0.0 0.0 0.0)
           '(210 0.0 0.0 1.0)
           '(71 . 0)'(72 . 0)'(73 . 0)
           )
       )
   )

)))


chlh_jd

  • Guest
Re: Grread distance on cursor
« Reply #12 on: March 20, 2012, 01:20:21 PM »
Perhaps this will be help , You can change the distance text align the line by yourself .
Another way by deer Highflybird . http://bbs.mjtd.com/forum.php?mod=viewthread&tid=90447
Code: [Select]
(defun foo (fpt / del_ss add_solid add_text dis_ss pt olderr loop)
  ;;info YAD's 'INFO.LSP'
  ;;by GSLS(SS) 2011-3-20
  (defun myerr (msg)
    (del_ss ss)
    (setq *error* olderr)
    (if msg
      (princ msg)
    )
    (*error* nil)
    (redraw)
  )
  (defun del_ss (ss / n)
    (setq n -1)
    (repeat (sslength ss)
      (entdel (ssname ss (setq n (1+ n))))
    )
  )
  (defun add_solid (p1 p2 p3 p4)
    (entmakex (list (cons 0 "SOLID")
    (cons 100 "AcDbEntity")
    (cons 62 1)
    (cons 100 "AcDbTrace")
    (cons 10 p1)
    (cons 11 p2)
    (cons 12 p3)
    (cons 13 p4)
    (cons 210 (trans (getvar "viewdir") 1 0))
      )
    )
  )
  (defun add_text (pt h txt)
    (entmakex (list (cons 0 "TEXT")
    (cons 100 "AcDbEntity")
    (cons 62 2)
    (cons 100 "AcDbText")
    (cons 10 pt)
    (cons 40 h)
    (cons 1 txt)
    (cons 50 0.0)
    (cons 72 0)
    (cons 73 0)
    (cons 210 (trans (getvar "viewdir") 1 0))
      )
    )
  )
  (defun dis_ss (fpt pt / dis str h high width ang)
    (setq dis (distance fpt pt)
  str (rtos dis 2 3)
  ss (ssadd)
  h (/ (getvar "viewsize") 60)
  high (* 1.7 h)
  width (* 1. h (strlen str))
  ang (angle (trans (getvar "viewctr") 1 2) (trans pt 1 2))
  pt (trans (mapcar '+ pt (getvar "target")) 1 2)
  ang (cond
  ((>= (/ pi 2) ang 0)
   (list
     (list (- (car pt) width) (- (cadr pt) high) (caddr pt))
     (list (- (car pt) width) (cadr pt) (caddr pt))
   )
  )
  ((>= pi ang (/ pi 2))
   (list
     (list (+ (car pt) width) (- (cadr pt) high) (caddr pt))
     pt
   )
  )
  ((>= (+ pi (/ pi 2)) ang pi)
   (list
     (list (+ (car pt) width) (+ (cadr pt) high) (caddr pt))
     (list (car pt) (+ (cadr pt) high) (caddr pt))
   )
  )
  ((>= (* 2 pi) ang (+ pi (/ pi 2)))
   (list
     (list (- (car pt) width) (+ (cadr pt) high) (caddr pt))
     (list (- (car pt) width) (+ (cadr pt) high) (caddr pt))
   )
  )
)
    )
    (ssadd (add_solid pt
      (list (caar ang) (cadr pt) (caddr pt))
      (list (car pt) (cadar ang) (caddr pt))
      (car ang)
   )
   ss
    )
    (setq pt (cadr ang)
  pt (list (+ (car pt) (* 0.5 h)) (cadr pt) (caddr pt))
    )
    (ssadd (add_text
     (setq pt (list (car pt) (- (cadr pt) (* 1.6 h)) (caddr pt)))
     h
     str
   )
   ss
    )
  )
  (setq olderr *error*
*error* myerr
ss (ssadd)
loop T
pt fpt
  )
  (setvar "cmdecho" 0)
  (setvar "osmode" 0)
  (setvar "fillmode" 1)
  (while loop
    (setq gr (grread T 8))
    (cond
      ((or (= (car gr) 12) (= (car gr) 5))
       (if (equal (cadr gr) pt)
nil
(progn
   (del_ss ss)
   (setq pt (cadr gr))
   (redraw)
   (grdraw fpt pt 7 1)
   (dis_ss fpt pt)
)
       )
      )
      ((= (car gr) 3)
       (del_ss ss)
       (setq pt (cadr gr))
       (dis_ss fpt pt)
       (setq loop nil)
      )
      (T (setq loop nil))
    )
  ) 
  (myerr nil)
  pt
)
;;;test
(defun c:test (/ p1 p2)
  (setq p1 (getpoint "\nSelect first point :")
  )
  (setq p2 (foo p1))
  (if p2
    (entmake (list (cons 0 "LINE")
   (cons 10 p1)
   (cons 11 p2)
   (cons 62 3)
     )
    )
  )
  (princ)
)


« Last Edit: March 20, 2012, 01:26:06 PM by chlh_jd »

CADmium

  • Newt
  • Posts: 33
Re: Grread distance on cursor
« Reply #13 on: March 21, 2012, 08:41:27 AM »
Have a look to this Link  :-D
"Bei 99% aller Probleme ist die umfassende Beschreibung des Problems bereits mehr als die Hälfte der Lösung desselben."

cadplayer

  • Bull Frog
  • Posts: 390
  • Autocad Civil3d, OpenDCL.Runtime, LISP, .NET (C#)
Re: Grread distance on cursor
« Reply #14 on: March 21, 2012, 10:13:59 AM »
Big brother is watching you... cadmium :wink:
It´s funny to see world are small. Japan, german and english language in a small treat but Autolisp is more important  he,he,he :lol: