eyeofnewt555 Posted May 26, 2016 Posted May 26, 2016 Hey guys! Do y'all know of a LISP that will label a hatch based on its name? Similar to what AlanJT did here with block name->mleader. Bonus points if you can get it to work with AlanJT's code, so I only need one command to label my blocks and hatches. And if this isn't possible, then is there a LISP for populating an mleader with a palette display description? Any help would be great! Thanks. Quote
Lee Mac Posted May 26, 2016 Posted May 26, 2016 Try the following, quickly written code: (defun c:hbml ( / blk ent enx str ) (setq blk (vla-get-blocks (vla-get-activedocument (vlax-get-acad-object)))) (while (progn (setvar 'errno 0) (setq ent (car (entsel "\nSelect block or hatch: "))) (cond ( (= 7 (getvar 'errno)) (princ "\nMissed, try again.") ) ( (null ent) nil) ( (= "INSERT" (cdr (assoc 0 (setq enx (entget ent))))) (if (= "" (setq str (vla-get-comments (vla-item blk (vla-get-name (vlax-ename->vla-object ent)))))) (princ "\nSelected block has no description.") ) ) ( (= "HATCH" (cdr (assoc 0 enx))) (setq str (cdr (assoc 2 enx))) nil ) ) ) ) (if ent (vl-cmdf "_.mleader" "\\" "\\" str)) (princ) ) (vl-load-com) (princ) Quote
eyeofnewt555 Posted May 26, 2016 Author Posted May 26, 2016 Oh my gosh, THE Lee Mac responded to me And you combined it with the block->mleader lisp! If I can bother you once more--is there a way to combine it with this (block name->mleader) lisp, rather than the block description->mleader? Sorry I just figured out how to link to specific posts in a thread. For blocks, having the leader automatically begin at the block's insertion point is handy (one click instead of two), but I'm not sure where it would start for hatches. Thank you so much, Lee Mac! Quote
broncos15 Posted May 26, 2016 Posted May 26, 2016 Hint: Look at the vlax-get-property portion of the code. Quote
eyeofnewt555 Posted May 26, 2016 Author Posted May 26, 2016 Broncos15, unfortunately, I'm super new to lisps. I tried making sense of it, but it's still a foreign language to me. But thanks for the hint! Quote
Grrr Posted May 26, 2016 Posted May 26, 2016 Quickly modified LM's code, here you go: (defun c:hbml ( / blk ent enx str ) (setq blk (vla-get-blocks (vla-get-activedocument (vlax-get-acad-object)))) (while (progn (setvar 'errno 0) (setq ent (car (entsel "\nSelect block or hatch: "))) (cond ( (= 7 (getvar 'errno)) (princ "\nMissed, try again.") ) ( (null ent) nil) ( (= "INSERT" (cdr (assoc 0 (setq enx (entget ent))))) (if (= "" (setq str (vla-get-effectivename (vlax-ename->vla-object ent)))) (princ "\nCannot find block's name.") ) ) ( (= "HATCH" (cdr (assoc 0 enx))) (setq str (cdr (assoc 2 enx))) nil ) ) ) ) (if ent (vl-cmdf "_.mleader" "\\" "\\" str)) (princ) ) (vl-load-com) (princ) Quote
eyeofnewt555 Posted May 26, 2016 Author Posted May 26, 2016 Grrr, thanks a ton! Sooo, do you know how I would make it so the multileader originates at the block insertion point? Just makes for one less click. Also, is there a way to make it work like most native commands where you can select the object first and then run the command on it? Thanks! Quote
Grrr Posted May 26, 2016 Posted May 26, 2016 Grrr, thanks a ton! Sooo, do you know how I would make it so the multileader originates at the block insertion point? Just makes for one less click. Also, is there a way to make it work like most native commands where you can select the object first and then run the command on it? Thanks! Sure: (defun c:hbml ( / SelectedFirst blk ent enx str inspt bbox mn mx MC ) (setq blk (vla-get-blocks (vla-get-activedocument (vlax-get-acad-object)))) (if (and (setq SelectedFirst (ssget "_I")) (= (sslength SelectedFirst) 1) ) (sssetfirst nil nil) ) (if SelectedFirst (progn (setq ent (ssname SelectedFirst 0)) (cond ( (= "INSERT" (cdr (assoc 0 (setq enx (entget ent))))) (setq str (vla-get-effectivename (vlax-ename->vla-object ent))) (setq inspt (cdr (assoc 10 enx))) (command "_.mleader" inspt "\\" str) ) ( (= "HATCH" (cdr (assoc 0 enx))) (setq str (cdr (assoc 2 enx))) nil (setq bbox (vla-getboundingbox (vlax-ename->vla-object ent) 'mn 'mx)) (setq MC (mapcar '(lambda (x1 x2) (/ (+ x1 x2) 2.0)) (trans (vlax-safearray->list mn) 0 1) (trans (vlax-safearray->list mx) 0 1) )) (command "_.mleader" MC "\\" str) ) ) ) ; progn TRUE (progn (while ; false (progn (setvar 'errno 0) (setq ent (car (entsel "\nSelect block or hatch: "))) (cond ( (= 7 (getvar 'errno)) (princ "\nMissed, try again.") ) ( (null ent) nil) ( (= "INSERT" (cdr (assoc 0 (setq enx (entget ent))))) (if (= "" (setq str (vla-get-effectivename (vlax-ename->vla-object ent)))) (princ "\nCannot find block's name.") ) ) ( (= "HATCH" (cdr (assoc 0 enx))) (setq str (cdr (assoc 2 enx))) nil ) ) ) ) ; while (cond ( (= "INSERT" (cdr (assoc 0 (setq enx (entget ent))))) (setq inspt (cdr (assoc 10 enx))) (vl-cmdf "_.mleader" inspt "\\" str) ) ( (= "HATCH" (cdr (assoc 0 enx))) (setq bbox (vla-getboundingbox (vlax-ename->vla-object ent) 'mn 'mx)) (setq MC (mapcar '(lambda (x1 x2) (/ (+ x1 x2) 2.0)) (trans (vlax-safearray->list mn) 0 1) (trans (vlax-safearray->list mx) 0 1) )) (vl-cmdf "_.mleader" MC "\\" str) ) ) ); progn FALSE );if (princ) ) (vl-load-com) (princ) I'm a hobby coder, so it might need some professional eye check. Quote
Lee Mac Posted May 26, 2016 Posted May 26, 2016 Oh my gosh, THE Lee Mac responded to me And you combined it with the block->mleader lisp! You're most welcome; thank you for your adulation. If I can bother you once more--is there a way to combine it with this (block name->mleader) lisp, rather than the block description->mleader? Sorry I just figured out how to link to specific posts in a thread. do you know how I would make it so the multileader originates at the block insertion point? Just makes for one less click. Also, is there a way to make it work like most native commands where you can select the object first and then run the command on it? This should fulfil your requests: (defun c:hbml ( / enx sel ) (if (setq sel (ssget "_+.:E:S" '((0 . "INSERT,HATCH")))) (progn (command "_.mleader") (if (= "INSERT" (cdr (assoc 0 (setq enx (entget (ssname sel 0)))))) (command "_non" (trans (cdr (assoc 10 enx)) (cdr (assoc -1 enx)) 1)) (command "\\") ) (command "\\" (cdr (assoc 2 enx))) ) ) (princ) ) @Grrr, try right-clicking at the single-selection prompt Quote
Grrr Posted May 26, 2016 Posted May 26, 2016 Well theres no need to mention that Lee Mac is the best (almost everything I learnt is from him). Anyway I would use vla-get-effectivename method in his code (assuming he was lazy to write it in) This code is useless for me, but I follow Tharwat's advice to practice on people's requests. Quote
Tharwat Posted May 26, 2016 Posted May 26, 2016 Anyway I would use vla-get-effectivename method in his code (assuming he was lazy to write it in) This code is useless for me, but I follow Tharwat's advice to practice on people's requests. That was a good try indeed and no one was born a master so we all learn from our and other's mistakes. So throw the dust away from you and keep on walking forward to reach the peak. Quote
eyeofnewt555 Posted May 26, 2016 Author Posted May 26, 2016 Lee Mac, you are amazing. Thank you so much. It's gonna be a huge help around the office. Quote
Lee Mac Posted May 26, 2016 Posted May 26, 2016 Lee Mac, you are amazing. Thank you so much. It's gonna be a huge help around the office. Excellent, glad to hear it Quote
eyeofnewt555 Posted January 18, 2017 Author Posted January 18, 2017 Alright, MacMaster, hopefully this is the final modification request. We recently switched our process and now it would be handy to have almost exactly this lisp (from post #9), but with some slight changes. The block mleader now needs to populate from the block's description, rather than name. So very similar to the first bit of code you wrote (post #2), but with the multileader automatically starting at the insertion point. I promise I did try fiddling with the code to make it work myself, but I've got miles to go before I can really make sense of the magic you do. Quote
Dien nguyen Posted August 22, 2023 Posted August 22, 2023 On 5/26/2016 at 11:47 PM, Lee Mac said: You're most welcome; thank you for your adulation. This should fulfil your requests: (defun c:hbml ( / enx sel ) (if (setq sel (ssget "_+.:E:S" '((0 . "INSERT,HATCH")))) (progn (command "_.mleader") (if (= "INSERT" (cdr (assoc 0 (setq enx (entget (ssname sel 0)))))) (command "_non" (trans (cdr (assoc 10 enx)) (cdr (assoc -1 enx)) 1)) (command "\\") ) (command "\\" (cdr (assoc 2 enx))) ) ) (princ) ) @Grrr, try right-clicking at the single-selection prompt I found this lisp to be great, can anyone help add the area below? for example the picture below: Quote
BIGAL Posted August 22, 2023 Posted August 22, 2023 Look at this line (setq str (cdr (assoc 2 enx))) nil You will Have to convert the enx to a VL object then can get the property Area and convert to a string (setq str (rtos area 2 3)) you can add superscript 2. Quote
Dien nguyen Posted August 23, 2023 Posted August 23, 2023 On 8/22/2023 at 1:44 PM, BIGAL said: Look at this line (setq str (cdr (assoc 2 enx))) nil You will Have to convert the enx to a VL object then can get the property Area and convert to a string (setq str (rtos area 2 3)) you can add superscript 2. Can you be more specific? I'm new to lisp. And you can adjust on this lisp to add area and make the multileader originates at the pick point. (defun c:hbml ( / enx sel ) (if (setq sel (ssget "_+.:E:S" '((0 . "INSERT,HATCH")))) (progn (command "_.mleader") (if (= "INSERT" (cdr (assoc 0 (setq enx (entget (ssname sel 0)))))) (command "_non" (trans (cdr (assoc 10 enx)) (cdr (assoc -1 enx)) 1)) (command "\\") ) (command "\\" (cdr (assoc 2 enx))) ) ) (princ) ) Quote
Kajanthan Posted August 23, 2023 Posted August 23, 2023 (defun C:hbml (/ pnt qty obj lst) (setq sset (car (entsel))) (setq obj (vlax-ename->vla-object sset)) (setq 1st (vla-get-area obj)) (setq qty (strcat "Area = " (rtos 1st 2 3))) (if (and (setq pnt (getpoint "\nPick Leader Base point: ")) (setq pnt (trans pnt 1 0)) ) (command "_.mleader" "_none" pnt PAUSE qty) ) (princ) ) try this. 3 hours ago, Dien nguyen said: Can you be more specific? I'm new to lisp. And you can adjust on this lisp to add area and make the multileader originates at the pick point. (defun c:hbml ( / enx sel ) (if (setq sel (ssget "_+.:E:S" '((0 . "INSERT,HATCH")))) (progn (command "_.mleader") (if (= "INSERT" (cdr (assoc 0 (setq enx (entget (ssname sel 0)))))) (command "_non" (trans (cdr (assoc 10 enx)) (cdr (assoc -1 enx)) 1)) (command "\\") ) (command "\\" (cdr (assoc 2 enx))) ) ) (princ) ) 1 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.