bluebravo Posted June 5, 2017 Posted June 5, 2017 Goal: LISP that copies selected objects to existing layer, using layer name shortcuts. Example: 1. Select objects 2. "CX" (Lisp command) asks for layer to copy into 3. "1CC" (Shortcut) Copies to actual layer name 1_COLS-CONT OR "2CC" copies to actual layer name 2_COLS-CONT, etc. I have the following LISP to start, and I just need to add all of the conditions for accepting a layer name shortcut and changing the layer to the corresponding one. I have a large number of layers, and so one lisp command for each seems too much. I understand that I would need multiple if conditions, but I need help with the actual code (fairly new to lisp). Thank you for your time! ;FILENAME cx.LSP ;THIS LISP ROUTINE copies selected objects in place then prompts ;the user to change the layer of previus objects selected. ;BY Ryan 3/5/02 (defun c:cx() (setq ss1 (ssget)) (setq laycx (getstring "Destination layer for copy: ")) (command "_copy" "P" "" "@" "@") (command "_chprop" "P" "" "la" laycx "") ) Quote
guitarguy1685 Posted June 6, 2017 Posted June 6, 2017 (edited) Here is my attempt. I didn't add any error handler, undo points, or control echo. I also made some changes in the command line. *edit* I also did not include any Layer Check/Create function. (defun c:cx( / ss1 laycx Layer ) (setq ss1 (ssget)) (setq laycx (strcase (getstring "\nDestination layer for copy: "))) (cond ;;add as many conditions as you like. ((= laycx "1CC") (setq Layer "1_COLS-CONT")) ((= laycx "2CC") (setq Layer "2_COLS-CONT")) ) (command "_copy" ss1 "" "@" "@") (command "_chprop" "P" "" "la" Layer "") (princ) ) Edited June 6, 2017 by guitarguy1685 additional information. Quote
Lee Mac Posted June 6, 2017 Posted June 6, 2017 I would suggest the following: ([color=BLUE]defun[/color] c:cx ( [color=BLUE]/[/color] abr idx lay sel ) ([color=BLUE]setq[/color] abr '( ([color=MAROON]"1CC"[/color] . [color=MAROON]"1_COLS-CONT"[/color]) ([color=MAROON]"2CC"[/color] . [color=MAROON]"2_COLS-CONT"[/color]) ) ) ([color=BLUE]if[/color] ([color=BLUE]setq[/color] sel ([color=BLUE]ssget[/color] [color=MAROON]"_:L"[/color])) ([color=BLUE]progn[/color] ([color=BLUE]initget[/color] (LM:lst->str ([color=BLUE]mapcar[/color] '[color=BLUE]car[/color] abr) [color=MAROON]" "[/color])) ([color=BLUE]setq[/color] lay ([color=BLUE]cond[/color] ( ([color=BLUE]cdr[/color] ([color=BLUE]assoc[/color] ([color=BLUE]getkword[/color] ([color=BLUE]strcat[/color] [color=MAROON]"\nLayer shortcut ["[/color] (LM:lst->str ([color=BLUE]mapcar[/color] '[color=BLUE]car[/color] abr) [color=MAROON]"/"[/color]) [color=MAROON]"] <"[/color] ([color=BLUE]caar[/color] abr) [color=MAROON]">: "[/color])) abr))) ( ([color=BLUE]cdar[/color] abr)) ) ) ([color=BLUE]if[/color] ([color=BLUE]not[/color] ([color=BLUE]tblsearch[/color] [color=MAROON]"layer"[/color] lay)) ([color=BLUE]entmake[/color] ([color=BLUE]list[/color] '(000 . [color=MAROON]"LAYER"[/color]) '(100 . [color=MAROON]"AcDbSymbolTableRecord"[/color]) '(100 . [color=MAROON]"AcDbLayerTableRecord"[/color]) '(070 . 0) ([color=BLUE]cons[/color] 2 lay) ) ) ) ([color=BLUE]repeat[/color] ([color=BLUE]setq[/color] idx ([color=BLUE]sslength[/color] sel)) ([color=BLUE]vla-put-layer[/color] ([color=BLUE]vla-copy[/color] ([color=BLUE]vlax-ename->vla-object[/color] ([color=BLUE]ssname[/color] sel ([color=BLUE]setq[/color] idx ([color=BLUE]1-[/color] idx))))) lay) ) ) ) ([color=BLUE]princ[/color]) ) [color=GREEN];; List to String - Lee Mac[/color] [color=GREEN];; Concatenates each string in a supplied list, separated by a given delimiter[/color] [color=GREEN];; lst - [lst] List of strings to concatenate[/color] [color=GREEN];; del - [str] Delimiter string to separate each item[/color] ([color=BLUE]defun[/color] LM:lst->str ( lst del ) ([color=BLUE]if[/color] ([color=BLUE]cdr[/color] lst) ([color=BLUE]strcat[/color] ([color=BLUE]car[/color] lst) del (LM:lst->str ([color=BLUE]cdr[/color] lst) del)) ([color=BLUE]car[/color] lst) ) ) ([color=BLUE]vl-load-com[/color]) ([color=BLUE]princ[/color]) Quote
bluebravo Posted June 7, 2017 Author Posted June 7, 2017 Thanks for the reply guitarguy! Your edit works well, except that if I enter an unavailable shortcut it copies the objects to the 0 layer. I know you did mention there is no 'error handler', but it would be really useful to avoid unwanted duplicates. Thank you for your time! Quote
bluebravo Posted June 7, 2017 Author Posted June 7, 2017 Thanks for the reply Lee Mac! The lisp really meets my needs, but I do have another request. I find the dynamic list feature really cool, except there will be at least 200 shortcuts/layers and so the list would be too long. Could you please tell me how to suppress the display of the list? Everything else I really like, especially the 'Invalid option'. Thank you for your time! Quote
BIGAL Posted June 8, 2017 Posted June 8, 2017 You could make a CSV text file with two items "shortcut,new layer name" and just read the file it could have as many lines as you like, Lee has a read csv so can get at the two items then just (if (= shortcut fileshortcut)(setq layname newlay)) post if you need an example. Quote
BIGAL Posted June 8, 2017 Posted June 8, 2017 Just thinking a bit more I was involved in a commercial product and we got round the layer problem by providing a user interface if you drew a particular object like say a wall the software knew what layers to put everthing on, so no layer problems. It had a text file in the back end for layer names. It sounds like your random drafting then fixing up, rather than trying to control as you create. Maybe use the same idea. I have posted some reactor code which could do what you want type 1CC 2CC etc and it knows you want to draw on layer 1_COLS-CONT. http://www.cadtutor.net/forum/showthread.php?93661-Lisp-for-fillet-radius./page3 Quote
bluebravo Posted June 9, 2017 Author Posted June 9, 2017 Thanks for the reply bigal! At this point, I am most comfortable implementing Lee Mac's solution. Except for that dynamic list I cannot figure out how to suppress/remove, it meets our current needs. However, I will look into your suggestions for future lisp developments Thank you for your time Quote
guitarguy1685 Posted June 9, 2017 Posted June 9, 2017 Take this line ( (cdr (assoc (getkword (strcat "\nLayer shortcut [" (LM:lst->str (mapcar 'car abr) "/") "] <" (caar abr) ">: ")) abr))) Change it to this. ( (cdr (assoc (getkword (strcat "\nLayer shortcut: <" (caar abr) ">: ")) abr))) That should suppress all the layer names. Quote
BIGAL Posted June 12, 2017 Posted June 12, 2017 (edited) Have a look at this post it can be changed to work with layers as you want so no need for multiple shortcuts looking at other code I would use "L" then your shortcut L1CC" You can though use 1 if you want or 2 or 3 etc. http://www.cadtutor.net/forum/showthread.php?100895-turn-macro-script-to-a-lisp-for-insert-block-from-another-drawing Edited June 13, 2017 by BIGAL link added 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.