3dwannab Posted December 3, 2015 Share Posted December 3, 2015 (edited) Hi all, good day. I have this script below which copies along the x and y axis with two separate commands. CX and CY. 2 issues. I need it to regen every time I copy (There's a bug when I copy leaders at the moment) (command ".regen") has no effect. Copy multiple, After first copy the restraint no longer take effect. Thanks for any help. ;;----------------------------------------------------------------------;; (defun c:CX () (setq ss (ssget)) (command "._copy" ss "" "M" pause ".yz" "@" pause) (command ".regen") (setq ss nil);; add this line to clean the selection (princ) ) (defun c:CY () (setq ss (ssget)) (command "._copy" ss "" "M" pause ".xz" "@" pause) (command ".regen") (setq ss nil);; add this line to clean the selection (princ) ) ;;----------------------------------------------------------------------;; (vl-load-com) (princ (strcat "\n:: Lock_Copy_X&Y.lsp loaded ::" "\n:: Invoke by typing 'CX' (Copy on X-axis) or 'CY' (Copy on Y-axis) ::" ) ) (princ) ;;----------------------------------------------------------------------;; ;; End of File ;; ;;----------------------------------------------------------------------;; GOT IT ANSWERED HERE (POST NO.4) by Roy_043: http://www.cadtutor.net/forum/showthread.php?94798-Copy-on-X-axis-only-and-Y-axis-only&p=699099&viewfull=1#post699099 Edited March 14, 2018 by 3dwannab Quote Link to comment Share on other sites More sharing options...
3dwannab Posted March 13, 2018 Author Share Posted March 13, 2018 Just giving this a little bump Thanks. Quote Link to comment Share on other sites More sharing options...
BIGAL Posted March 14, 2018 Share Posted March 14, 2018 Hit you in the face message (Alert ":: Lock_Copy_X&Y.lsp loaded ::\n\n\n:: Invoke by typing 'CX' (Copy on X-axis) or 'CY' (Copy on Y-axis) ::" ) 2nd suggestion (defun c:CX ( / ss) this localises ss so no need for set nil If this is something your doing a lot you could use a smart reactor I would just type x100 it would then ask for objects and move accordingly type any number after the X x234 x45-6 there is a reason for 45-6 as the period causes an error in the routine. ; Enter the filet radius as part of a command line entry f100 offset O234 circle c123-45 ; note - is used for decimal point ; original code and methology by Alan H ; assistance and code that worked by Lee-Mac ; OCT 2015 ( (lambda nil (vl-load-com) (foreach obj (cdar (vlr-reactors :vlr-command-reactor)) (if (= "fillet-reactor" (vlr-data obj)) (vlr-remove obj) ) ) (vlr-command-reactor "fillet-reactor" '((:vlr-unknowncommand . fillet-reactor-callback))) ) ) (defun filletrad ( / rad) (setq rad (distof (substr com 2) 2)) (if (<= 0.0 rad) (progn (setvar 'filletrad rad) (vla-sendcommand fillet-reactor-acdoc "_.fillet ") ) ) ) (defun makecirc ( / rad radd) (setq rad (distof (substr com 2) 2)) (if (<= 0.0 rad) (progn (setvar 'circlerad rad) (setq pt (getpoint "Pick centre pt")) (vla-sendcommand fillet-reactor-acdoc "_.Circle !pt ") ) ) ) (defun offdist ( / dist) (setq dist (distof (substr com 2) 2)) (if (<= 0.0 dist) (progn (setvar 'offsetdist dist) (vla-sendcommand fillet-reactor-acdoc "_.Offset ") ) ) ) (defun pipeoff ( / dist) (setq dist (distof (substr com 2) 2)) (if (<= 0.0 dist) (progn (setq poff (strcat "P" (rtos dist 2 0))) (if (not poff)(load "Pipe offsets")) (vla-sendcommand fillet-reactor-acdoc poff) ) ) ) (defun projopen ( / Proj year) (setq year (atoi (substr com 2 4))) (if (< year 2014) (setq projno (strcat "EXPLORER \\\\cogg.local\\fs\\LCFC3\\DESIGN\\DATA\\" (substr com 2 4) " Projects\\" (substr com 2) "[url="file://\\Design\\"]\\Design\\[/url]")) (setq projno (strcat "EXPLORER P:\\" (rtos year 2 0) " Projects\\" (substr com 2) "[url="file://\\Design\\"]\\Design\\[/url]")) ) (vla-sendcommand fillet-reactor-acdoc (STARTAPP projno)) ) (defun fillet-reactor-callback ( obj com ) (setq com (vl-string-translate "-" "." (strcase (car com)))) (cond ( (and (wcmatch com "~*[~F.0-9]*") (wcmatch com "F*") (wcmatch com "~F*F*") (wcmatch com "~*.*.*") ) ; and (filletrad) ) ( (and (wcmatch com "~*[~C.0-9]*") (wcmatch com "C*") (wcmatch com "~C*C*") (wcmatch com "~*.*.*") ) ;and (makecirc) ) ( (and (wcmatch com "~*[~O.0-9]*") (wcmatch com "O*") (wcmatch com "~O*O*") (wcmatch com "~*.*.*") ) ; and (offdist) ) ( (and (wcmatch com "~*[~D.0-9]*") (wcmatch com "D*") (wcmatch com "~D*D*") (wcmatch com "~*.*.*") ) ; and (projopen) ) ( (and (wcmatch com "~*[~P.0-9]*") (wcmatch com "P*") (wcmatch com "~P*P*") (wcmatch com "~*.*.*") ) ; and (pipeoff) ) ) ; master cond ) ; defun (or fillet-reactor-acdoc (setq fillet-reactor-acdoc (vla-get-activedocument (vlax-get-acad-object))) ) Quote Link to comment Share on other sites More sharing options...
Roy_043 Posted March 14, 2018 Share Posted March 14, 2018 When using the _Multiple option of the _Copy command you obviously cannot rely on a fixed number of arguments for the command function. (defun c:test ( / ss) (setq ss (ssget)) (command "._copy" ss "" "_multiple" pause) (while (/= 0 (getvar 'cmdactive)) (command ".yz" "@" pause) ) (princ) ) Quote Link to comment Share on other sites More sharing options...
FranknBeans Posted March 14, 2018 Share Posted March 14, 2018 why not use the copy command normally with ortho mode on? Quote Link to comment Share on other sites More sharing options...
3dwannab Posted March 14, 2018 Author Share Posted March 14, 2018 why not use the copy command normally with ortho mode on? Because see this. I have so many uses for it. Try snapping perpendicular to a point in x or y. Why did AD add-in a point filters for x, y & z if they didn't want us to use it? When using the _Multiple option of the _Copy command you obviously cannot rely on a fixed number of arguments for the command function. (defun c:test ( / ss) (setq ss (ssget)) (command "._copy" ss "" "_multiple" pause) (while (/= 0 (getvar 'cmdactive)) (command ".yz" "@" pause) ) (princ) ) This worked absolutly perfect. Thank you. Neat trick with the while. I'll keep this in mind. Hit you in the face message (Alert ":: Lock_Copy_X&Y.lsp loaded ::\n\n\n:: Invoke by typing 'CX' (Copy on X-axis) or 'CY' (Copy on Y-axis) ::" ) 2nd suggestion (defun c:CX ( / ss) this localises ss so no need for set nil If this is something your doing a lot you could use a smart reactor I would just type x100 it would then ask for objects and move accordingly type any number after the X x234 x45-6 there is a reason for 45-6 as the period causes an error in the routine. ; Enter the filet radius as part of a command line entry f100 offset O234 circle c123-45 ; note - is used for decimal point ; original code and methology by Alan H ; assistance and code that worked by Lee-Mac ; OCT 2015 ( (lambda nil (vl-load-com) (foreach obj (cdar (vlr-reactors :vlr-command-reactor)) (if (= "fillet-reactor" (vlr-data obj)) (vlr-remove obj) ) ) (vlr-command-reactor "fillet-reactor" '((:vlr-unknowncommand . fillet-reactor-callback))) ) ) (defun filletrad ( / rad) (setq rad (distof (substr com 2) 2)) (if (<= 0.0 rad) (progn (setvar 'filletrad rad) (vla-sendcommand fillet-reactor-acdoc "_.fillet ") ) ) ) (defun makecirc ( / rad radd) (setq rad (distof (substr com 2) 2)) (if (<= 0.0 rad) (progn (setvar 'circlerad rad) (setq pt (getpoint "Pick centre pt")) (vla-sendcommand fillet-reactor-acdoc "_.Circle !pt ") ) ) ) (defun offdist ( / dist) (setq dist (distof (substr com 2) 2)) (if (<= 0.0 dist) (progn (setvar 'offsetdist dist) (vla-sendcommand fillet-reactor-acdoc "_.Offset ") ) ) ) (defun pipeoff ( / dist) (setq dist (distof (substr com 2) 2)) (if (<= 0.0 dist) (progn (setq poff (strcat "P" (rtos dist 2 0))) (if (not poff)(load "Pipe offsets")) (vla-sendcommand fillet-reactor-acdoc poff) ) ) ) (defun projopen ( / Proj year) (setq year (atoi (substr com 2 4))) (if (< year 2014) (setq projno (strcat "EXPLORER \\\\cogg.local\\fs\\LCFC3\\DESIGN\\DATA\\" (substr com 2 4) " Projects\\" (substr com 2) "[url="file://\\Design\\"]\\Design\\[/url]")) (setq projno (strcat "EXPLORER P:\\" (rtos year 2 0) " Projects\\" (substr com 2) "[url="file://\\Design\\"]\\Design\\[/url]")) ) (vla-sendcommand fillet-reactor-acdoc (STARTAPP projno)) ) (defun fillet-reactor-callback ( obj com ) (setq com (vl-string-translate "-" "." (strcase (car com)))) (cond ( (and (wcmatch com "~*[~F.0-9]*") (wcmatch com "F*") (wcmatch com "~F*F*") (wcmatch com "~*.*.*") ) ; and (filletrad) ) ( (and (wcmatch com "~*[~C.0-9]*") (wcmatch com "C*") (wcmatch com "~C*C*") (wcmatch com "~*.*.*") ) ;and (makecirc) ) ( (and (wcmatch com "~*[~O.0-9]*") (wcmatch com "O*") (wcmatch com "~O*O*") (wcmatch com "~*.*.*") ) ; and (offdist) ) ( (and (wcmatch com "~*[~D.0-9]*") (wcmatch com "D*") (wcmatch com "~D*D*") (wcmatch com "~*.*.*") ) ; and (projopen) ) ( (and (wcmatch com "~*[~P.0-9]*") (wcmatch com "P*") (wcmatch com "~P*P*") (wcmatch com "~*.*.*") ) ; and (pipeoff) ) ) ; master cond ) ; defun (or fillet-reactor-acdoc (setq fillet-reactor-acdoc (vla-get-activedocument (vlax-get-acad-object))) ) Thanks. I didn't look into reactor as Roy_043 anwswered. Thanks Here's my CX and CY command. Thanks again Roy_043. ;;----------------------------------------------------------------------;; ; Answer on how to fix multiple copy by Roy_043 14.03.2018: http://www.cadtutor.net/forum/showthread.php?94798-Copy-on-X-axis-only-and-Y-axis-only&p=699099&viewfull=1#post699099 ; Credit to Roy_043 (defun c:CX ( / ss) (setq ss (ssget)) (command "._copy" ss "" "_multiple" pause) (while (/= 0 (getvar 'cmdactive)) (command ".yz" "@" pause) ) (princ) ) (defun c:CY ( / ss) (setq ss (ssget)) (command "._copy" ss "" "_multiple" pause) (while (/= 0 (getvar 'cmdactive)) (command ".xz" "@" pause) ) (princ) ) ;;----------------------------------------------------------------------;; (vl-load-com) (princ (strcat "\n:: Lock_Copy_X&Y.lsp loaded ::" "\n:: Invoke by typing 'CX' (Copy on X-axis) or 'CY' (Copy on Y-axis) ::" ) ) (princ) ;;----------------------------------------------------------------------;; ;; End of File ;; ;;----------------------------------------------------------------------;; Quote Link to comment Share on other sites More sharing options...
DraftPunk Posted April 12, 2018 Share Posted April 12, 2018 Great Lisp! I just started to started studying autolisp programming, I'll try to modify including "CZ" function and "CXY", "CXZ", "CYZ". Do you think that it'll work also for the move just replacing the _copy with _move? Thanks a lot! Quote Link to comment Share on other sites More sharing options...
3dwannab Posted April 12, 2018 Author Share Posted April 12, 2018 Here's my move LISP. ;;----------------------------------------------------------------------;; (defun c:MX ( / ss) (setq *error* SS:error) (SS:startundo) (setq cmde (getvar "cmdecho")) (setq os (getvar "osmode")) (setq orthom (getvar "orthomode")) (setvar 'cmdecho 0) (setvar 'osmode 83) (setvar 'orthomode 1) (setq ss (ssget)) (command "._move" ss "" pause ".yz" "@" pause) (setq ss nil) (*error* nil) (princ) ) (defun c:MY ( / ss) (setq *error* SS:error) (SS:startundo) (setq cmde (getvar "cmdecho")) (setq os (getvar "osmode")) (setq orthom (getvar "orthomode")) (setvar 'cmdecho 0) (setvar 'osmode 83) (setvar 'orthomode 1) (setq ss (ssget)) (command "._move" ss "" pause ".xz" "@" pause) (setq ss nil) (*error* nil) (princ) ) (defun SS:error (errmsg) (and acDoc (vla-EndUndoMark acDoc)) (and errmsg (not (wcmatch (strcase errmsg) "*CANCEL*,*EXIT*")) (princ (strcat "\n<< Error: " errmsg " >>")) ) (setvar 'cmdecho cmde) (setvar 'osmode os) (setvar 'orthomode orthom) ) (defun SS:startundo () (setq acDoc (vla-get-ActiveDocument (vlax-get-acad-object))) (or (vla-EndUndoMark acDoc) (vla-StartUndoMark acDoc)) ) (vl-load-com) (princ (strcat "\nLock_Move_X&Y.lsp loaded" "\nInvoke by typing 'MX' (Move on X-axis) or 'MY' (Move on Y-axis)" ) ) (princ) ;;----------------------------------------------------------------------;; ;; End of File ;; ;;----------------------------------------------------------------------;; Quote Link to comment Share on other sites More sharing options...
3dwannab Posted April 12, 2018 Author Share Posted April 12, 2018 (edited) Here's my stretch one with other goodies in there. ; Stretch All X (defun c:SX ( / ss) (setq *error* SS:error) (SS:startundo) (setq cmde (getvar "cmdecho")) (setq os (getvar "osmode")) (setq orthom (getvar "orthomode")) (setvar 'cmdecho 0) (setvar 'osmode 83) (setvar 'orthomode 1) (progn (setq ss (last (ssgetfirst))) (if (not ss) (setq ss (ssget)) ) (if ss (progn (command "._stretch" ss "" PAUSE ".yz" "@") (setq ss nil) ) (princ "\nUser Cancelled Command") ) ) (*error* nil) (princ) ) ; Stretch All Y (defun c:SY ( / ss) (setq *error* SS:error) (SS:startundo) (setq cmde (getvar "cmdecho")) (setq os (getvar "osmode")) (setq orthom (getvar "orthomode")) (setvar 'cmdecho 0) (setvar 'osmode 83) (setvar 'orthomode 1) (progn (setq ss (last (ssgetfirst))) (if (not ss) (setq ss (ssget)) ) (if ss (progn (command "._stretch" ss "" PAUSE ".xz" "@") (setq ss nil) ) (princ "\nUser Cancelled Command") ) ) (*error* nil) (princ) ) ; Stretch All MLeaders (defun c:SL ( / ss) (setq *error* SS:error) (SS:startundo) (setq cmde (getvar "cmdecho")) (setq os (getvar "osmode")) (setq orthom (getvar "orthomode")) (setvar 'cmdecho 0) (setvar 'osmode 0) (setvar 'orthomode 1) (progn (setq ss (last (ssgetfirst))) (if (not ss) (setq ss (ssget '((0 . "MULTILEADER")))) ) (if ss (progn (command "_.stretch" ss "" "_non" PAUSE "_non" PAUSE) (setq ss nil) ) (princ "\nUser Cancelled Command") ) ) (*error* nil) (princ) ) ; Stretch All Leaders X (defun c:SLX ( / ss) (setq *error* SS:error) (SS:startundo) (setq cmde (getvar "cmdecho")) (setq os (getvar "osmode")) (setq orthom (getvar "orthomode")) (setvar 'cmdecho 0) (setvar 'osmode 83) (setvar 'orthomode 1) (progn (setq ss (last (ssgetfirst))) (if (not ss) (setq ss (ssget '((0 . "MULTILEADER")))) ) (if ss (progn (command "._stretch" ss "" PAUSE ".yz" "@") (setq ss nil) ) (princ "\nUser Cancelled Command") ) ) (*error* nil) (princ) ) ; Stretch All Leaders Y (defun c:SLY ( / ss) (setq *error* SS:error) (SS:startundo) (setq cmde (getvar "cmdecho")) (setq os (getvar "osmode")) (setq orthom (getvar "orthomode")) (setvar 'cmdecho 0) (setvar 'osmode 83) (setvar 'orthomode 1) (progn (setq ss (last (ssgetfirst))) (if (not ss) (setq ss (ssget '((0 . "MULTILEADER")))) ) (if ss (progn (command "._stretch" ss "" PAUSE ".xz" "@") (setq ss nil) ) (princ "\nUser Cancelled Command") ) ) (*error* nil) (princ) ) ; Stretch Important (defun c:SIM ( / ss) (setq *error* SS:error) (SS:startundo) (setq cmde (getvar "cmdecho")) (setq os (getvar "osmode")) (setq orthom (getvar "orthomode")) (setvar 'cmdecho 0) (setvar 'osmode 83) (setvar 'orthomode 1) (progn (setq ss (last (ssgetfirst))) (if (not ss) (setq ss (ssget '((0 . "~HATCH") (0 . "~TEXT") (0 . "~MTEXT") (8 . "~*text") (8 . "~*note") (8 . "~*dim")))) ) (if ss (progn (command "_.stretch" ss "" PAUSE PAUSE) (setq ss nil) ) (princ "\nUser Cancelled Command") ) ) (*error* nil) (princ) ) ; Stretch dims only (defun c:SD ( / ss) (setq *error* SS:error) (SS:startundo) (setq cmde (getvar "cmdecho")) (setq os (getvar "osmode")) (setq orthom (getvar "orthomode")) (setvar 'cmdecho 0) (setvar 'osmode 83) (setvar 'orthomode 1) (progn (setq ss (last (ssgetfirst))) (if (not ss) (setq ss (ssget '((0 . "DIMENSION")))) ) (if ss (progn (command "_.stretch" ss "" PAUSE PAUSE) (setq ss nil) ) (princ "\nUser Cancelled Command") ) ) (*error* nil) (princ) ) (defun SS:error (errmsg) (and acDoc (vla-EndUndoMark acDoc)) (and errmsg (not (wcmatch (strcase errmsg) "*CANCEL*,*EXIT*")) (princ (strcat "\n<< Error: " errmsg " >>")) ) (setvar 'cmdecho cmde) (setvar 'osmode os) (setvar 'orthomode orthom) ) (defun SS:startundo () (setq acDoc (vla-get-ActiveDocument (vlax-get-acad-object))) (or (vla-EndUndoMark acDoc) (vla-StartUndoMark acDoc)) ) (vl-load-com) (princ (strcat "\n3dwannab_Stretch_Commands.lsp Loaded" "\nInvoke by typing 'S*'" ) ) (princ) ;;----------------------------------------------------------------------;; ;; End of File ;; ;;----------------------------------------------------------------------;; Edited April 12, 2018 by 3dwannab Quote Link to comment Share on other sites More sharing options...
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.