Jump to content

Need help cleaning up code, or start over


rkent

Recommended Posts

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)
)

Link to comment
Share on other sites

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 by alanjt
Link to comment
Share on other sites

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

Link to comment
Share on other sites

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

Link to comment
Share on other sites

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

Link to comment
Share on other sites

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

Link to comment
Share on other sites

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.
Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...