AutoCAD Electrical’s “project-wide utilities” command has an option to process a script file against each drawing in the active AutoCAD Electrical project. You set up the script file and then enter its name in the box as shown in the utility’s dialog:
But, little known… instead of entering a script file name, you can enter a one-line AutoLISP function in this edit box (cannot browse to it!). Instead of launching a script file against each drawing in the project, the utility will apply this Lisp function against each drawing in the project set ( ! ). Neat and clean. No need to create a separate script file with the Lisp function embedded in it… just enter the single-line lisp function and off you go.
Example – Lisp utility to work-around Model/Paper space Mtext cross-reference issue
A user noticed a strange issue with his Paper space schematics created with AutoCAD Electrical. Whenever he would scoot a child component on a drawing that had its parent on some other drawing, the Mtext-based cross-reference annotation for the parent would disappear. He enlisted some help from N8 Consultants and discovered that AutoCAD Electrical was mistakenly pushing the new cross-reference Mtext out to Model space instead of the active Paper space tab.
Autodesk support was notified. But, in the meantime, the temporary work-around was to create a little AutoLISP utility that checks all cross-reference Mtext annotation on the active drawing and makes sure that it matches up with the “space” of the parent.
The complication is that this AutoLISP function needed to be run periodically against a lot of drawings (i.e. all schematic drawings in the active project). Launching it, one drawing at a time, was not something to look forward to.
The solution was to use AutoCAD Electrical’s “Project Wide Utilities” command as described above. But to keep it really simple, N8 set it up so that the user could enter in a one-line lisp function in the edit box normally reserved for a script file’s name. Launching the Project-Wide Utilities command then ran this lisp function against each selected dwg in the project set.
Setting up the Lisp function to auto-run as soon as it loads
This made it really simple. Here is the full “Paper space Cross-reference checker” utility. Note the two lines tacked on to the very end of the function…
; 13-Aug-2009 Nate Holt, http://n8consultants.com ; ------- P A P E R S P A C E _ X R E F . L S P ----- ; Process block inserts. Look for cross-ref Mtext tied via Xdata pointer. Make sure Mtext is in ; same space as the parent block insert. Work-around for problem with ACE2009, ACE2010 (and ; perhaps others) when parent is on a layout tab and insert/move related child on some other ; drawing. Cross-ref Mtext back on the parent sometimes ending up incorrectly pushed out to ; Model space even through the parent is in Paper space. (defun c:paperspace_xref ( / ss ix slen parent_ed en mtext_ed newed hdl parent_410 mtext_410) ; Process all block inserts (setq ss (ssget "_X" '((0 . "INSERT")))) (if (/= ss nil) (progn (setq slen (sslength ss)) (setq ix 0) (while (< ix slen) (setq en (ssname ss ix)) ; get next block insert instance ; Look for pointer to graphical cross-reference Mtext. This is carried as Xdata on ; the parent component and points to the "handle" of the cross-ref Mtext entity. (if (setq hdl (c:wd_get_1005_xdata en "VIA_WD_XREF_G")) (progn ; okay, found block insert instance that points at Mtext (if (handent hdl) ; valid handle, Mtext not deleted (progn ; Open the Mtext entity (setq mtext_ed (entget (handent hdl))) ; Open the block insert entity (setq parent_ed (entget en)) ; Get the "space" each is in (setq mtext_410 (cdr (assoc 410 mtext_ed))) (setq parent_410 (cdr (assoc 410 parent_ed))) (if (/= mtext_410 parent_410) (progn ; Problem. Try to force ; the Mtext entity into the same space as ; the parent. Adjust the 410 and 67 subrecords. (setq newed (subst (assoc 410 parent_ed)(assoc 410 mtext_ed) mtext_ed)) ; 67 carries a value of 1 if paper space, 0 or missing if in model space (if (AND (assoc 67 parent_ed) (assoc 67 mtext_ed)) (progn ; 67 subrecords different (setq newed (subst (assoc 67 parent_ed)(assoc 67 mtext_ed) newed)) (entmod newed) ; update the Mtext entity (princ "\nMoved Mtext hdl ") (princ hdl) (princ " from ") (princ (cdr (assoc 410 mtext_ed))) (princ " to ") (princ (cdr (assoc 410 parent_ed))) ) ) ) ) ) ) ) ) (setq ix (1+ ix)) ) ) ) (setq ss nil) ; release the selection set (princ) ; quiet return ) ; Set up to auto-run this function as soon as it is loaded (c:paperspace_xref) (princ)
We don’t have to APPLOAD this lisp utility to make it run. We can do the same thing on the command line with a “(load …)” lisp function (tested on ACE2009 and ACE2010)
Let’s say that our above utility’s full file name is “c:/temp/paperspace_xref.lsp”. Here is how we reference it in the Project-Wide Utilities edit box (shown in yellow in the screen-shot).
We enter (load “c:/temp/paperspace_xref.lsp”) in the edit box. But we need to use forward slashes (or double backslashes) in the file’s name.
Hit OK. Select drawings to process… and that’s it. We don’t have to APPLOAD the function or embed it into a script file or add it to a Startup Suite of functions. We just reference it here in the “(load <filename>)” line and we’re good to go.