rkent Posted October 15, 2010 Share Posted October 15, 2010 I cobbled this together from a few other lisp routines and from what little I know to make this work. Of course it could be made much, much better. I have no error trapping, I don't know the newer vlisp commands, etc. (DeFun C:OFFM ( / clayer ENTITY) ; change OFFM to any name you like that doesn't already exist (SetVar "CmdEcho" 0) (INITGET "G g S s B b U u") ; add a unique letter for each material you add (SETQ MatType (strcase (getkword "\nGypboard Stud Brick stUcco..? "))) (COND ((= MatType "B") ;set this letter to match one of the choices three lines above, B = brick (SETQ layernam "BRICK") ;change BRICK to a layer name you would use, repeat for those below (SETQ offsetdista "2.5") ;change to offset distance for brick, repeat for those below (SETQ layercolor "1") ;set color to what you would want, repeat for those below ) ((= MatType "G") (SETQ layernam "GYPSUM") (SETQ offsetdista "5/8") (SETQ layercolor "4") ) ((= MatType "S") (SETQ layernam "STUD") (SETQ offsetdista "3.5") (SETQ layercolor "2") ) ((= MatType "U") (SETQ layernam "STUCCO") (SETQ offsetdista "1") (SETQ layercolor "3") ) );close cond (COMMAND ".LAYER" "make" LAYERNAM "color" layercolor "" "") (Command ".OFFSET" offsetdista pause pause "") (SetQ ENTITY (EntLast) ENTITY (EntGet ENTITY) ENTITY (SubSt (Cons 8 layernam) (Assoc 8 ENTITY) ENTITY) ) (EntMod ENTITY) (SetVar "CmdEcho" ECHO) (PrinC) ) Quote Link to comment Share on other sites More sharing options...
alanjt Posted October 15, 2010 Share Posted October 15, 2010 (edited) Waiting on the wife to finish project runway, I decided to have a little fun with this. I embedded the material prompt into the selection (also gives you the option to change material at any point in time. The functionality should mirror the Offset command pretty close. (defun c:OffM (/ *error* _layer _sel cmd ent pnt eLast entity) ;; Alan J. Thompson, 10.14.10 (defun *error* (msg) (redraw) (and cmd (setvar 'cmdecho cmd)) (if (and msg (not (wcmatch (strcase msg) "*BREAK*,*CANCEL*,*QUIT*,"))) (princ (strcat "\nError: " msg)) ) ) (defun _layer (name color) (or (tblsearch "LAYER" name) (entmake (list '(0 . "LAYER") '(100 . "AcDbSymbolTableRecord") '(100 . "AcDbLayerTableRecord") (cons 2 name) '(70 . 0) (cons 62 color) ) ) ) ) (defun _sel (/ e g) (setvar 'errno 0) (while (and (not g) (/= 52 (getvar 'errno))) (initget 0 "Brick Gypsum Stud stUcco") (setq e (entsel (strcat "\nSelect object to offset as material [brick/Gypsum/Stud/stUcco] <" (cond (*OffM:Mat*) ((setq *OffM:Mat* "Brick")) ) ">: " ) ) ) (cond ((and (listp e) (eq (type (car e)) 'ENAME)) (setq g (cond ((eq 4 (logand 4 (cdr (assoc 70 (entget (tblobjname "LAYER" (cdr (assoc 8 (entget (car e)))))))) ) ) (prompt "\nThe object is on a locked layer.") ) ((not (member (cdr (assoc 0 (entget (car e)))) '("ARC" "CIRCLE" "ELLIPSE" "LINE" "LWPOLYLINE" "SPLINE" "XLINE") ) ) (prompt "\nCannot offset that object.") ) ((car e)) ) ) ) ((eq (type e) 'STR) (setq *OffM:Mat* e)) ((setq g (eq 52 (getvar 'errno))) nil) ((eq 7 (getvar 'errno)) (setq g (prompt "\nMissed, try again."))) ) ) ) (setq cmd (getvar 'cmdecho)) (setvar 'cmdecho 0) (while (and (setq ent (_sel)) (not (redraw ent 3)) (setq pnt (getpoint "\nSpecify point on side to offset: ")) ) (redraw) (setq eLast (entlast)) (command "_.offset" (cond ((eq *OffM:Mat* "Brick") (_layer (strcase *OffM:Mat*) 1) 2.5) ((eq *OffM:Mat* "Gypsum") (_layer (strcase *OffM:Mat*) 4) 0.625) ((eq *OffM:Mat* "Stud") (_layer (strcase *OffM:Mat*) 2) 3.5) ((eq *OffM:Mat* "stUcco") (_layer (strcase *OffM:Mat*) 3) 1.) ) ent "_non" pnt "" ) (or (equal eLast (cdr (assoc -1 (setq entity (entget (entlast)))))) (entmod (subst (cons 8 *OffM:Mat*) (assoc 8 entity) entity)) ) ) (*error* nil) (princ) ) Edited October 15, 2010 by alanjt Quote Link to comment Share on other sites More sharing options...
David Bethel Posted October 15, 2010 Share Posted October 15, 2010 I think I would try something like this: [b][color=BLACK]([/color][/b]defun c:offm-db [b][color=FUCHSIA]([/color][/b]/ data MatType fe ed[b][color=FUCHSIA])[/color][/b] [b][color=FUCHSIA]([/color][/b]setq data '[b][color=NAVY]([/color][/b][b][color=MAROON]([/color][/b][color=#2f4f4f]"Brick"[/color] 2.5 1[b][color=MAROON])[/color][/b] [b][color=MAROON]([/color][/b][color=#2f4f4f]"Stud"[/color] 3.5 2[b][color=MAROON])[/color][/b] [b][color=MAROON]([/color][/b][color=#2f4f4f]"Gypsum"[/color] 0.625 4[b][color=MAROON])[/color][/b] [b][color=MAROON]([/color][/b][color=#2f4f4f]"stUcco"[/color] 1.0 3[b][color=MAROON])[/color][/b][b][color=NAVY])[/color][/b][b][color=FUCHSIA])[/color][/b] [b][color=FUCHSIA]([/color][/b]initget 1 [color=#2f4f4f]"Gypsum Stud Brick stUcco"[/color][b][color=FUCHSIA])[/color][/b] [b][color=FUCHSIA]([/color][/b]setq MatType [b][color=NAVY]([/color][/b]getkword [color=#2f4f4f]"\nMaterial - Gypsum/Stud/Brick/stUcco: "[/color][b][color=NAVY])[/color][/b][b][color=FUCHSIA])[/color][/b] [b][color=FUCHSIA]([/color][/b]setvar [color=#2f4f4f]"OFFSETDIST"[/color] [b][color=NAVY]([/color][/b]nth 1 [b][color=MAROON]([/color][/b]assoc MatType data[b][color=MAROON])[/color][/b][b][color=NAVY])[/color][/b][b][color=FUCHSIA])[/color][/b] [b][color=FUCHSIA]([/color][/b]setvar [color=#2f4f4f]"CMDECHO"[/color] 1[b][color=FUCHSIA])[/color][/b] [b][color=FUCHSIA]([/color][/b]setq fe [b][color=NAVY]([/color][/b]entlast[b][color=NAVY])[/color][/b][b][color=FUCHSIA])[/color][/b] [b][color=FUCHSIA]([/color][/b]while [b][color=NAVY]([/color][/b]eq fe [b][color=MAROON]([/color][/b]entlast[b][color=MAROON])[/color][/b][b][color=NAVY])[/color][/b] [b][color=NAVY]([/color][/b]command [color=#2f4f4f]"_.OFFSET"[/color] [color=#2f4f4f]""[/color] pause pause [color=#2f4f4f]""[/color][b][color=NAVY])[/color][/b][b][color=FUCHSIA])[/color][/b] [b][color=FUCHSIA]([/color][/b]setvar [color=#2f4f4f]"CMDECHO"[/color] 0[b][color=FUCHSIA])[/color][/b] [b][color=FUCHSIA]([/color][/b]setq ed [b][color=NAVY]([/color][/b]entget [b][color=MAROON]([/color][/b]entlast[b][color=MAROON])[/color][/b][b][color=NAVY])[/color][/b][b][color=FUCHSIA])[/color][/b] [b][color=FUCHSIA]([/color][/b]entmod [b][color=NAVY]([/color][/b]subst [b][color=MAROON]([/color][/b]cons 8 MatType[b][color=MAROON])[/color][/b] [b][color=MAROON]([/color][/b]assoc 8 ed[b][color=MAROON])[/color][/b] ed[b][color=NAVY])[/color][/b][b][color=FUCHSIA])[/color][/b] [b][color=FUCHSIA]([/color][/b]command [color=#2f4f4f]"_.LAYER"[/color] [color=#2f4f4f]"_C"[/color] [b][color=NAVY]([/color][/b]itoa [b][color=MAROON]([/color][/b]nth 2 [b][color=GREEN]([/color][/b]assoc MatType data[b][color=GREEN])[/color][/b][b][color=MAROON])[/color][/b][b][color=NAVY])[/color][/b] MatType [color=#2f4f4f]""[/color][b][color=FUCHSIA])[/color][/b] [b][color=FUCHSIA]([/color][/b]prin1[b][color=FUCHSIA])[/color][/b][b][color=BLACK])[/color][/b] The String name in the data list must match the material and the layer name. The data list atoms would be Layer/Material OffSetDist Color_Number -David Quote Link to comment Share on other sites More sharing options...
David Bethel Posted October 15, 2010 Share Posted October 15, 2010 This would make everything a bit more dynamic: [b][color=BLACK]([/color][/b]defun c:offm-db [b][color=FUCHSIA]([/color][/b]/ data istr MatType fe ed[b][color=FUCHSIA])[/color][/b] [b][color=FUCHSIA]([/color][/b]setq data '[b][color=NAVY]([/color][/b][b][color=MAROON]([/color][/b][color=#2f4f4f]"Brick"[/color] 2.5 1[b][color=MAROON])[/color][/b] [b][color=MAROON]([/color][/b][color=#2f4f4f]"Stud"[/color] 3.5 2[b][color=MAROON])[/color][/b] [b][color=MAROON]([/color][/b][color=#2f4f4f]"Gypsum"[/color] 0.625 4[b][color=MAROON])[/color][/b] [b][color=MAROON]([/color][/b][color=#2f4f4f]"stUcco"[/color] 1.0 3[b][color=MAROON])[/color][/b][b][color=NAVY])[/color][/b][b][color=FUCHSIA])[/color][/b] [b][color=FUCHSIA]([/color][/b]setq istr [b][color=NAVY]([/color][/b]apply 'strcat [b][color=MAROON]([/color][/b]mapcar '[b][color=GREEN]([/color][/b]lambda [b][color=BLUE]([/color][/b]s[b][color=BLUE])[/color][/b] [b][color=BLUE]([/color][/b]strcat s [color=#2f4f4f]" "[/color][b][color=BLUE])[/color][/b][b][color=GREEN])[/color][/b] [b][color=GREEN]([/color][/b]mapcar 'car data[b][color=GREEN])[/color][/b][b][color=MAROON])[/color][/b][b][color=NAVY])[/color][/b][b][color=FUCHSIA])[/color][/b] [b][color=FUCHSIA]([/color][/b]initget 1 istr[b][color=FUCHSIA])[/color][/b] [b][color=FUCHSIA]([/color][/b]setq MatType [b][color=NAVY]([/color][/b]getkword [b][color=MAROON]([/color][/b]strcat [color=#2f4f4f]"\nMaterial - "[/color] istr [color=#2f4f4f]": "[/color][b][color=MAROON])[/color][/b][b][color=NAVY])[/color][/b][b][color=FUCHSIA])[/color][/b] [b][color=FUCHSIA]([/color][/b]setvar [color=#2f4f4f]"OFFSETDIST"[/color] [b][color=NAVY]([/color][/b]nth 1 [b][color=MAROON]([/color][/b]assoc MatType data[b][color=MAROON])[/color][/b][b][color=NAVY])[/color][/b][b][color=FUCHSIA])[/color][/b] [b][color=FUCHSIA]([/color][/b]setvar [color=#2f4f4f]"CMDECHO"[/color] 1[b][color=FUCHSIA])[/color][/b] [b][color=FUCHSIA]([/color][/b]setq fe [b][color=NAVY]([/color][/b]entlast[b][color=NAVY])[/color][/b][b][color=FUCHSIA])[/color][/b] [b][color=FUCHSIA]([/color][/b]while [b][color=NAVY]([/color][/b]eq fe [b][color=MAROON]([/color][/b]entlast[b][color=MAROON])[/color][/b][b][color=NAVY])[/color][/b] [b][color=NAVY]([/color][/b]command [color=#2f4f4f]"_.OFFSET"[/color] [color=#2f4f4f]""[/color] pause pause [color=#2f4f4f]""[/color][b][color=NAVY])[/color][/b][b][color=FUCHSIA])[/color][/b] [b][color=FUCHSIA]([/color][/b]setvar [color=#2f4f4f]"CMDECHO"[/color] 0[b][color=FUCHSIA])[/color][/b] [b][color=FUCHSIA]([/color][/b]setq ed [b][color=NAVY]([/color][/b]entget [b][color=MAROON]([/color][/b]entlast[b][color=MAROON])[/color][/b][b][color=NAVY])[/color][/b][b][color=FUCHSIA])[/color][/b] [b][color=FUCHSIA]([/color][/b]entmod [b][color=NAVY]([/color][/b]subst [b][color=MAROON]([/color][/b]cons 8 MatType[b][color=MAROON])[/color][/b] [b][color=MAROON]([/color][/b]assoc 8 ed[b][color=MAROON])[/color][/b] ed[b][color=NAVY])[/color][/b][b][color=FUCHSIA])[/color][/b] [b][color=FUCHSIA]([/color][/b]command [color=#2f4f4f]"_.LAYER"[/color] [color=#2f4f4f]"_C"[/color] [b][color=NAVY]([/color][/b]itoa [b][color=MAROON]([/color][/b]nth 2 [b][color=GREEN]([/color][/b]assoc MatType data[b][color=GREEN])[/color][/b][b][color=MAROON])[/color][/b][b][color=NAVY])[/color][/b] MatType [color=#2f4f4f]""[/color][b][color=FUCHSIA])[/color][/b] [b][color=FUCHSIA]([/color][/b]prin1[b][color=FUCHSIA])[/color][/b][b][color=BLACK])[/color][/b] -David Quote Link to comment Share on other sites More sharing options...
rkent Posted October 15, 2010 Author Share Posted October 15, 2010 Those are both very nice. How do your routines know to use the single letter for the material? Alan, I like that yours stays in the program so you can change to other materials. Thanks Quote Link to comment Share on other sites More sharing options...
Lee Mac Posted October 16, 2010 Share Posted October 16, 2010 Hi RKent, To answer your question I would advise you read the VLIDE Help docs on the initget function Quote Link to comment Share on other sites More sharing options...
BIGAL Posted October 17, 2010 Share Posted October 17, 2010 Not sure but I think what you are doing is defining wall settings. It is possible to have a master file.txt that contains all your layer settings and the code as say you are drawing a wall auto changes to the correct layer. This was done so a client could choose layer names but the code always worked. The offsets were done via a master dialouge for new or by picking existing walls which measured the offsets. Also if you ran a wall routine and no settings it would ask you then as well. This saved hard coding and as you add more programs there consistant. txt file you change progname to what you want 1234567890123456789012345678901234567890 Newname Progname Col Line Type brick--1 brick--1 1 continuous ceiling--2 ceiling--2 6 continuous ceiling--3 ceiling--3 6 continuous wall--2 wall--2 4 center door--2 door--2 3 continuous door--3 door--3 4 continuous here is the lisp out of a roof program (setq lay_search roof--2) (setq lay_colour roof--2col) (setq l_type roof--2lin) (lay_miss) lay-miss sets all the parameters for the 75 programs. You could add a offset as well Brick 110 gap 50 Stud 90 Quote Link to comment Share on other sites More sharing options...
alanjt Posted October 18, 2010 Share Posted October 18, 2010 Those are both very nice. How do your routines know to use the single letter for the material?Alan, I like that yours stays in the program so you can change to other materials. Thanks Yeah, I was wanting to give that option and completely remove the material choice option as an additional prompt. Quote Link to comment Share on other sites More sharing options...
rkent Posted October 19, 2010 Author Share Posted October 19, 2010 Hi RKent, To answer your question I would advise you read the VLIDE Help docs on the initget function Got it, I think. In this case the entsel had to follow the initget. Quote Link to comment Share on other sites More sharing options...
alanjt Posted October 19, 2010 Share Posted October 19, 2010 Got it, I think. In this case the entsel had to follow the initget. correct...... 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.