boretskiy Posted June 17 Share Posted June 17 (edited) I'm trying to run the command "_pline" of the selected line type through Lisp, which would be entered onto a specific layer, and upon completion the current one would be returned layer. I'm a novice in programming, I try but in vain. Maybe someone can fix it? I would be very grateful. (defun C:gass ( / cl ) (if (not (tblsearch "LTYPE" "GASs") (command "_-linetype" "_l" "GASs" "truba.lin" "_s" "GASs" "") (if (/= (getvar "CELTYPE") "GASs")(setvar "CELTYPE" "GASs")) (setq cl (getvar "CLAYER" "0")) (command "_-layer" "_m" "PIPELINES" "") (command "_pline") (while (= (getvar "cmdactive") 1)(command pause)) (setvar "CLAYER" cl)))) (C:gass) ;; ;; (defun C:feces( / cl ) (if (not (tblsearch "LTYPE" "Sewerage") (command "_-linetype" "_l" "Sewerage" "truba.lin" "_s" "Sewerage" "") (if (/= (getvar "CELTYPE") "Sewerage")(setvar "CELTYPE" "Sewerage")) (setq cl (getvar "CLAYER" "0")) (command "_-layer" "_m" "SEWERAGE" "") (command "_pline") (while (= (getvar "cmdactive") 1)(command pause)) (setvar "CLAYER" cl)))) (C:feces) Edited June 17 by SLW210 Added Code Tags! Quote Link to comment Share on other sites More sharing options...
SLW210 Posted June 17 Share Posted June 17 Please use Code Tags (<> in the editor toolbar) in the future. Quote Link to comment Share on other sites More sharing options...
dexus Posted June 17 Share Posted June 17 (edited) (defun c:gass ( / cl clt ltypename layername) (setq ltypename "GASs") (setq layername "PIPELINES") (setq clt (getvar "CELTYPE")) ; Get active linetype (if (not (tblsearch "LTYPE" ltypename)) ; If linetype does not exist (command "_-linetype" "_l" ltypename "truba.lin" "_s" ltypename "") ; Create it ) (if (/= (getvar "CELTYPE") ltypename) ; If linetype is not active (setvar "CELTYPE" ltypename) ; Activate it ) (setq cl (getvar "clayer")) ; Get active layer (if (not (tblsearch "LTYPE" layername)) ; If layer does not exist (command "_-layer" "_m" layername "") ; Create it ) (if (/= (getvar "CLAYER") layername) ; If layer is not active (setvar "CLAYER" layername) ; Activate it ) (command "_pline") ; Start command (while (= (getvar "cmdactive") 1) ; As long as command is active, pause (command "\\") ) (setvar "CELTYPE" clt) ; Activate it (setvar "CLAYER" cl) ; Reset layer to what it was before this function ) I've added some comments, hopefully this makes it more clear what is happening. And it would make a nice challenge to fix the second one yourself Edited June 17 by dexus 1 Quote Link to comment Share on other sites More sharing options...
mhupp Posted June 18 Share Posted June 18 (defun c:gass ( / var vals) (setq var (list "CELTYPE" "CLAYER") val (mapcar 'getvar var) ) (if (not (tblsearch "LTYPE" "GASs")) ;idk if this will error if existing so left this check in but could prob take it out also (command "_-linetype" "_l" "GASs" "truba.lin" "_s" "GASs" "") ) (setvar 'celtype "GASs") (entmake '((0 . "LAYER") (100 . "AcDbSymbolTableRecord") (100 . "AcDbLayerTableRecord") (2 . "PIPELINES") (70 . 0) (62 . 1) (290 . 0))) ;change 62 to the coler you want (setvar 'clayer "PIPELINES") (command "_pline") (while (= (getvar "cmdactive") 1) (command "\\") ) (mapcar 'setvar var vals) (princ) ) @dexus added a mapcar to set an return variables Maybe someone can correct me but I don't check for current layer just issue the change. Also try not to use command when possible entmake for the layer. @boretskiy if statements in lisp only run the first two lines of code. (if condition then-part [else-part] ) to run multiple lines of code you would have to wrap them with (progn You also need to match up ( ) for the code to even load. I recommend getting notepad++ it will color code things for you so its easier to track down (defun C:gass ( / cl ) (if (not (tblsearch "LTYPE" "GASs")) (command "_-linetype" "_l" "GASs" "truba.lin" "_s" "GASs" "") ;if true do this ;false isn't needed to run ) ... (defun C:gass ( / cl ) (if (not (tblsearch "LTYPE" "GASs")) (command "_-linetype" "_l" "GASs" "truba.lin" "_s" "GASs" "") ;if true do this (progn (prompt "\nGASs line Type already in the drawing") (setvar 'celtype "GASs") ) ) ... Also don't have commands outside of functions (C:feces) (C:Gass) this calls the command when the lisp is loaded. Seeing its needs user input it would just wait their until you cancel the command. its not needed to close a function. 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.