Jump to content

Recommended Posts

Posted

Hi, how exit the loop using the right mouse button. I know that the command returns nil but can not keep this knowledge to use.

Please modifications of this simple example.

(prompt "\nmbo")
(defun c:mbo (/ ent pnt osm)
 (while
   (if (setq ent (entsel "\nSelect object: "))
     (progn
(if (= (cdr (assoc 0 (entget (car ent)))) "CIRCLE")
  (progn
    (if (= (cdr (assoc 62 (entget (car ent)))) 1)
      (progn
	(setq pnt (cdr (assoc 10 (entget (car ent)))))
	(setq osm (getvar "osmode"))
	(setvar "osmode" 0)
	(command "_move" ent "" pnt pause)
	(setvar "osmode" osm)
	);progn
      (princ "\n*** Wrong color circle ***")
      );if
    );progn
  (princ "\n*** This is not a circle ***")
  );if
);progn
     (princ "\n*** Nothing selected ***")
     );if
   );while
 (princ)
 )

Posted (edited)

Simple fix will work if you pick nothing as well.

 

(defun c:mbo (/ ent pnt osm)
 (while (/= (setq ent (entsel "\nSelect object: ")) nil)
   
(if (= (cdr (assoc 0 (entget (car ent)))) "CIRCLE")

Edited by BIGAL
Posted

Or

 

 (while (setq ent (entsel "\nSelect object: "))
   (if	ent
     (progn

Posted

There is no need for if function nor progn function since while function would behave like if function but continuously till it returns nil .

 

eg.

 

(while(setq ent (entsel "\nSelect object: "))
   ;; do your stuff here ;;
)

Posted

The following is my preferred technique - I find this approach cleaner and it also accounts for a missed pick:

(defun c:mbo ( / ent enx )
   (while
       (progn
           (setvar 'errno 0)
           (setq ent (car (entsel "\nSelect object: ")))
           (cond
               (   (= 7 (getvar 'errno))
                   (princ "\nMissed, try again.") ;; Stay in loop
               )
               (   (null ent)
                   nil ;; Exit loop
               )
               (   (/= "CIRCLE" (cdr (assoc 0 (setq enx (entget ent)))))
                   (princ "\nSelected object is not a circle.") ;; Stay in loop
               )
               (   (/= 1 (cdr (assoc 62 enx)))
                   (princ "\nSelected circle colour property not set to red.") ;; Stay in loop
               )
               (   (command "_.move" ent "" "_non" (trans (cdr (assoc 10 enx)) ent 1) "\\")) ;; Exit loop
           )
       )
   )
   (princ)
)

Posted

Lots of ways for this.

 

I prefer ssget calls :

 

[b][color=BLACK]([/color][/b]while
 [b][color=FUCHSIA]([/color][/b]and [b][color=NAVY]([/color][/b]setq ss [b][color=MAROON]([/color][/b]ssget [b][color=GREEN]([/color][/b]list [b][color=BLUE]([/color][/b]cons 0 [color=#2f4f4f]"CIRCLE"[/color][b][color=BLUE])[/color][/b]
                            [b][color=BLUE]([/color][/b]cons 62 1[b][color=BLUE])[/color][/b]
                            [b][color=BLUE]([/color][/b]cons 210 [b][color=RED]([/color][/b]trans '[b][color=PURPLE]([/color][/b]0 0 1[b][color=PURPLE])[/color][/b] 1 0[b][color=RED])[/color][/b][b][color=BLUE])[/color][/b]
                      [b][color=GREEN])[/color][/b][b][color=MAROON])[/color][/b][b][color=NAVY])[/color][/b]
      [b][color=NAVY]([/color][/b]= [b][color=MAROON]([/color][/b]sslength ss[b][color=MAROON])[/color][/b] 1[b][color=NAVY])[/color][/b]
      [b][color=NAVY]([/color][/b]setq en [b][color=MAROON]([/color][/b]ssname ss 0[b][color=MAROON])[/color][/b]
            ed [b][color=MAROON]([/color][/b]entget en[b][color=MAROON])[/color][/b]
            ce [b][color=MAROON]([/color][/b]cdr [b][color=GREEN]([/color][/b]assoc 10 ed[b][color=GREEN])[/color][/b][b][color=MAROON])[/color][/b][b][color=NAVY])[/color][/b][b][color=FUCHSIA])[/color][/b]
 [b][color=FUCHSIA]([/color][/b]initget 1[b][color=FUCHSIA])[/color][/b]
 [b][color=FUCHSIA]([/color][/b]setq p2 [b][color=NAVY]([/color][/b]getpoint ce [color=#2f4f4f]"\nNew Center Point:   "[/color][b][color=NAVY])[/color][/b][b][color=FUCHSIA])[/color][/b]
 [b][color=FUCHSIA]([/color][/b]command [color=#2f4f4f]"_.MOVE"[/color] en [color=#2f4f4f]""[/color] ce [color=#2f4f4f]"_non"[/color] p2[b][color=FUCHSIA])[/color][/b]
 [b][color=FUCHSIA]([/color][/b]redraw[b][color=FUCHSIA])[/color][/b][b][color=BLACK])[/color][/b]

 

 

-David

Posted

Thanks.

Lee your version is perfect.

If you can not exit the loop when you select the red circle.

(defun c:mbo ( / ent enx )
   (while
       (progn
           (setvar 'errno 0)
           (setq ent (car (entsel "\nSelect object: ")))
           (cond
               (   (= 7 (getvar 'errno))
                   (princ "\nMissed, try again.") ;; Stay in loop
               )
               (   (null ent)
                   nil ;; Exit loop
               )
               (   (/= "CIRCLE" (cdr (assoc 0 (setq enx (entget ent)))))
                   (princ "\nSelected object is not a circle.") ;; Stay in loop
               )
               (   (/= 1 (cdr (assoc 62 enx)))
                   (princ "\nSelected circle colour property not set to red.") ;; Stay in loop
               )
               (   (command "_.move" ent "" "_non" (trans (cdr (assoc 10 enx)) ent 1) "\\")) ;; [color="red"]Exit loop -> Stay in loop[/color]
           )
       )
   )
   (princ)
)

Posted

You're welcome Kowal - to stay in the loop (and perform other commands), you could use the following:

(defun c:mbo ( / ent enx )
   (while
       (progn
           (setvar 'errno 0)
           (setq ent (car (entsel "\nSelect object: ")))
           (cond
               (   (= 7 (getvar 'errno))
                   (princ "\nMissed, try again.") ;; Stay in loop
               )
               (   (null ent)
                   nil ;; Exit loop
               )
               (   (/= "CIRCLE" (cdr (assoc 0 (setq enx (entget ent)))))
                   (princ "\nSelected object is not a circle.") ;; Stay in loop
               )
               (   (/= 1 (cdr (assoc 62 enx)))
                   (princ "\nSelected circle colour property not set to red.") ;; Stay in loop
               )
               (   t
                   (command "_.move" ent "" "_non" (trans (cdr (assoc 10 enx)) ent 1) "\\")
                   ;; < Additional operations >
                   t ;; Stay in loop
               )
           )
       )
   )
   (princ)
)

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...