GroundWolf61 Posted January 21, 2022 Posted January 21, 2022 Hi everybody, I need help. I cant figure out how to get the ent name form a block in a layout. Each layout has a titleblock ("SAL-TEKENBLAD_TITELBLOK" is the EffectiveName) and i want to make a list of all the layouts with the ent names. THX, GW61 (vlax-for LYT (vla-get-layouts (vla-get-activedocument (vlax-get-acad-object))) (setq ENT (vlax-vla-object->ename (vla-item (vla-get-blocks LYT) "SAL-TEKENBLAD_TITELBLOK"))) (setq NAM (vla-get-name lyt)) (setq LST (cons (list NAM ENT) LST)) );end vlax-for Quote
mhupp Posted January 21, 2022 Posted January 21, 2022 I Usually just use ssget to get ent name of stuff. (if (setq SS (ssget "X" '((0 . "INSERT") (2 . "SAL-TEKENBLAD_TITELBLOK")))) (foreach blk (vl-remove-if 'listp (mapcar 'cadr (ssnamex SS))) This will get you a selection set of all SAL-TEKENBLAD_TITELBLOK in the drawing. If you want to get a particular titleblock you can further limit it down to a specific layout. by adding (410 . "Tab Name") (setq SS (ssget "X" '((0 . "INSERT") (2 . "SAL-TEKENBLAD_TITELBLOK") (410 . "Sheet 3")))) 1 Quote
Steven P Posted January 21, 2022 Posted January 21, 2022 (edited) This will create a selection set of a named block, see the answer from Lee Mac (setq ss (ssget "_X" '((0 . "INSERT") (2 . "SAL-TEKENBLAD_TITELBLOK")))) Then to get the entity name (setq entname (ssname ss 0)) And to get the entity description (setq MyEnt (entget (ssname ss 0))) -Edit- Mhupp was typing as I was.... good idea to add in in case the block is also on other tabs Edited January 21, 2022 by Steven P Quote
GroundWolf61 Posted January 21, 2022 Author Posted January 21, 2022 3 minutes ago, mhupp said: I Usually just use ssget to get ent name of stuff. (if (setq SS (ssget "X" '((0 . "INSERT") (2 . "SAL-TEKENBLAD_TITELBLOK")))) (foreach blk (vl-remove-if 'listp (mapcar 'cadr (ssnamex SS))) This will get you a selection set of all SAL-TEKENBLAD_TITELBLOK in the drawing. If you want to get a particular titleblock you can further limit it down to a specific layout. by adding (410 . "Tab Name") (setq SS (ssget "X" '((0 . "INSERT") (2 . "SAL-TEKENBLAD_TITELBLOK") (410 . "Sheet 3")))) i need it in visual lisp but thx so i can change de active doc my goal is to get all layouts and ent names title blocks form every open dwg Quote
mhupp Posted January 21, 2022 Posted January 21, 2022 54 minutes ago, GroundWolf61 said: i need it in visual lisp but thx Look at what ronjonp is doing here then. will prob need to do a wcmatch for the titleblock name. Quote
Linh Posted January 21, 2022 Posted January 21, 2022 (edited) Since in the intial post, you mention "EffectiveName", in case your title block is dynamic block, you need more complicate routines. Working with multiple drawing also not simple, especially, in lisp. Anyway I think you should solve the issue with a given parameter as an AcadDocument first. Not ActiveDocument, but an AcadDocument. Another issue is your code: this one is wrong: the layout doesn't have Blocks collection property to get any named item from it: (vla-item (vla-get-blocks LYT) "SAL-TEKENBLAD_TITELBLOK") Instead, a layout has Block property and you got to loop through all the AcadEntity drawn in the layout via that block to find the right inserted block reference. Edited January 21, 2022 by Linh Quote
Steven P Posted January 21, 2022 Posted January 21, 2022 Just a question, for my curiosity, how are you looping through the open drawings? Quote
GroundWolf61 Posted January 21, 2022 Author Posted January 21, 2022 (edited) 58 minutes ago, Steven P said: Just a question, for my curiosity, how are you looping through the open drawings? Edited January 21, 2022 by GroundWolf61 Quote
GroundWolf61 Posted January 21, 2022 Author Posted January 21, 2022 57 minutes ago, Steven P said: Just a question, for my curiosity, how are you looping through the open drawings? (defun C:SVLAY(/) (HB:SV_LAYOUT) );end defun (defun HB:SV_LAYOUT ( / DWG NDWG LST NLST L NL DL DL_LST) (foreach DWG (HB:SV_DWG_LIST) (setq NDWG DWG) (setq LST (getdrawinglayouts NDWG)) (setq NLST (vl-remove (nth 0 LST) LST)) (foreach L NLST (setq NL L) (setq DL (list NDWG NL)) (setq DL_LST (cons DL DL_LST)) );end foreach );end foreach DL_LST );end defun HB:SV_LAYOUT (defun HB:SV_DWG_LIST ( / obj ACdocuments doccount i pathlist item path) (vl-load-com) (setq obj (vlax-get-acad-object)) (setq ACdocuments (vla-get-documents obj)) (setq doccount (vla-get-count acdocuments)) (setq i 0) (setq pathlist'()) (repeat doccount (setq item (vla-item acdocuments i)) (setq path (vla-get-fullname item)) (if (/= "" path) (setq pathlist (cons path pathlist)) );end if (setq i (+ i 1)) );end repeat pathlist );end defun HB:SV_DWG_LIST (defun getdrawinglayouts ( dwg / doc idx rtn ) (if (setq doc (LM:getdocumentobject dwg)) (progn (vlax-for lyt (vla-get-layouts doc) (setq rtn (cons (vla-get-name lyt) rtn) idx (cons (vla-get-taborder lyt) idx) ) ) (vlax-release-object doc) (mapcar '(lambda ( n ) (nth n rtn)) (vl-sort-i idx '<)) ) ) ) (defun LM:getdocumentobject ( dwg / app dbx dwl err vrs ) (cond ( (not (setq dwg (findfile dwg))) nil) ( (cdr (assoc (strcase dwg) (vlax-for doc (vla-get-documents (setq app (vlax-get-acad-object))) (setq dwl (cons (cons (strcase (vla-get-fullname doc)) doc) dwl)) ) ) ) ) ( (progn (setq dbx (vl-catch-all-apply 'vla-getinterfaceobject (list app (if (< (setq vrs (atoi (getvar 'acadver))) 16) "objectdbx.axdbdocument" (strcat "objectdbx.axdbdocument." (itoa vrs)) ) ) ) ) (or (null dbx) (vl-catch-all-error-p dbx)) ) (prompt "\nUnable to interface with ObjectDBX.") ) ( (vl-catch-all-error-p (setq err (vl-catch-all-apply 'vla-open (list dbx dwg)))) (prompt (strcat "\n" (vl-catch-all-error-message err))) ) ( dbx ) ) ) (vl-load-com) (princ) 1 Quote
Steven P Posted January 21, 2022 Posted January 21, 2022 Nice.... The reason I asked was that I haven't seen an effective way to have an open drawing interrogate or modify another open drawing. You can use a script on any closed drawings (there are some examples out there), some like scriptwriter, Lee Macs. or Jeff Saunters will do it all in the background and you can write a script to open, operate on and close a drawing - and here you can use any LISP commands you want, but I have struggled to find a way to do that on an open drawing by LISP - the problem being that LISPS run on the drawing that started them off, and once you move from that the LISP won't keep running in the next drawing. Depending what you want to do once you have the title block info I would be tempted to do it all on closed drawings, select the ones you want and do it all with a script (scriptwriter, Lee Mac, Jeff Saunter, or mine (below) should all be able to do that) 1 Quote
Linh Posted January 21, 2022 Posted January 21, 2022 (edited) HB:SV_DWG_LIST loops through the documents collection, get the document object, don't grab it but take the drawing path only. Then, with the drawing path, Lee Mac function is used to get the document object back. It is like you get the number, then you divide it to 2.5848, then using a function to get back the number by multiply with that 2.5848 Edited January 21, 2022 by Linh 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.