The Jester Posted Thursday at 10:12 PM Posted Thursday at 10:12 PM (edited) CAD Version: Carlson Survey 2025 w/ IntelliCAD 12.1 Experience: Novice With a new drawing, I can get the below LISP to run once... ; ADJOINER LABELS (defun c:AT () (SETQ CL (GETVAR "CLAYER")) (command "LAYER" "S" "PROP_ADJ_TXT" "") (setq DS (getvar 'dimscale)) (SETQ TW (* DS 2.5)) (setq pt (getpoint "\nPick label location: ")) (setq l1 (getstring T "\nType line 1 of 3 adjoiner info: ")) (setq l2 (getstring T "\nType line 2 of 3 adjoiner info: ")) (setq l3 (getstring T "\nType line 3 of 3 adjoiner info: ")) (COMMAND "MTEXT" "_non" Pt "J" "MC" "S" "L100" "W" TW l1 l2 l3 "") (SETVAR "CLAYER" CL) (C:MDO)) but when I attempt to run it a second time (and so on), I receive the following error: LISP Error in function: lsp_defatom_ex(): Duplicate key Uknown exception thrown. :error#0variable definition failed :error#0 I can close the drawing and reopen it, and again, it will allow me to run the LISP once, then fail all the times after. The "duplicate key" within the error leads to believe the LISP is being cached in memory; but I don't know if that is the case, and if so, how do I clear it. Edited yesterday at 10:45 AM by fuccaro adding CODE tags Quote
devitg Posted yesterday at 10:55 AM Posted yesterday at 10:55 AM @The Jester what (C:MDO)) Stand or mean for ? Quote
The Jester Posted yesterday at 02:18 PM Author Posted yesterday at 02:18 PM (edited) On 11/22/2024 at 5:55 AM, devitg said: @The Jester what (C:MDO)) Stand or mean for ? I was shown this by a coworker that wrote LISP routines for AutoCAD 2004. He didn't explain how it works or what it stands for, but many of his LISPs ended this way. He has since passed. I have used the following as well, with the results being the same (it works once, then fails with the same error until the drawing is closed and reopened). ; ADJOINER LABELS (defun c:AT () (SETQ CL (GETVAR "CLAYER")) (command "LAYER" "S" "PROP_ADJ_TXT" "") (setq DS (getvar 'dimscale)) (SETQ TW (* DS 2.5)) (setq pt (getpoint "\nPick label location: ")) (setq l1 (getstring T "\nType line 1 of 3 adjoiner info: ")) (setq l2 (getstring T "\nType line 2 of 3 adjoiner info: ")) (setq l3 (getstring T "\nType line 3 of 3 adjoiner info: ")) (COMMAND "MTEXT" "_non" Pt "J" "MC" "S" "L100" "W" TW l1 l2 l3 "") (SETVAR "CLAYER" CL) (princ) ) Edited 9 hours ago by SLW210 Added Code Tags!! Quote
Steven P Posted yesterday at 02:34 PM Posted yesterday at 02:34 PM (edited) A lot of errors "runs once but afterwards there is an error" are due to localising variables. A local variable is one that is only used in that routine, global is saved away and can be used on any routine while that drawing is open. To reduce these define the variable as local for example: (defun c:AT ( / CL DS) localises your variables CL and DS - their values at the end of the routine won't appear in other LISPs or the next time you run this one. Second comment is the last line (C:MDO) is calling another LISP to run - I suspect the problem might be in there, do you have a copy of that you an share? Last comment, you might want to put in a check that the layer, Prop_Adj_Txt exists, create it if it doesn't (something to do that should be easy to find online) Edited yesterday at 02:45 PM by Steven P Quote
The Jester Posted yesterday at 04:47 PM Author Posted yesterday at 04:47 PM 1 hour ago, Steven P said: A lot of errors "runs once but afterwards there is an error" are due to localising variables. A local variable is one that is only used in that routine, global is saved away and can be used on any routine while that drawing is open. To reduce these define the variable as local for example: (defun c:AT ( / CL DS) localises your variables CL and DS - their values at the end of the routine won't appear in other LISPs or the next time you run this one. Second comment is the last line (C:MDO) is calling another LISP to run - I suspect the problem might be in there, do you have a copy of that you an share? Last comment, you might want to put in a check that the layer, Prop_Adj_Txt exists, create it if it doesn't (something to do that should be easy to find online) Thank you Steven. The addition of the ( / CL DS) resolved the issue. As for the second comment, I started the current batch of routines from scratch, and thus far, have not referred any routines to MDO...with that said, I changed the end of this routine back to MDO and it still works. I am not advanced enough to understand how or why, but it works. I have been doing some research online, but the answer still eludes me. As for the final comment, I have a list of all the available layers that I keep open and refer to often. Again, thank you for solution. 1 Quote
SLW210 Posted 9 hours ago Posted 9 hours ago Please use Code Tags for your code. (<> in the editor toolbar) Quote
Steven P Posted 8 hours ago Posted 8 hours ago Excellent, LISP is a frustrating journey at times but can be rewarding too when something works right (and better when it saves enough time to grab an extra coffee break in the day) Always good to get feedback if something works out right (many don't, we assume it is working after due to no more questions) - keep asking if you need more advice and help For (C:MDO) - you might have a LISP file from your ex colleague which is automatically loaded and contains this. Lee Mac has a routine getsyntax which will list all routines contained within a file (Lee Mac is an excellent resource, whether it is a complete routine or work out how they work in other functions). See also he threat "Command Table Creating" from earlier today - I've posted a LISP in there, if all the LISP files are in a single location this should also find the routine also. However if MDO doesn't cause any errors then that is just a nice to know thing. 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.