;;  OL.LSP                                            ;  Scot Harris  7-1-11
;;   Offset command where new object can be directed to another layer.
;;   Options include keyboard entry, setting to Current layer, Selecting an
;;   object on the screen, or setting to None (source).
;;   USEROL is the gremlin.

(defun c:OL ( / a b p1 p2 )
 (defun *error* (msg) (if osm (setvar "OSMODE" osm))
  (setq a nil b nil p1 nil p2 nil osm nil)(princ) );end**
 (defun OL_PRINC ( a1 / ) (princ (strcat "\n Destination layer: " a1)) );endOL_PRINC
 (if (or (not USEROL) (= USEROL "")) (setq USEROL (getvar "CLAYER")) )
 (if (<= (getvar "OFFSETDIST") 0.0) (setvar "OFFSETDIST" 1.0) )
 (initget 128 "Current Select None")
 (setq a (getkword (strcat
  "Offset to Layer - Enter layer name or [Current/Select/None] <" USEROL ">: ")))
 (cond
  ( (not a) (OL_PRINC USEROL) )
  ( (= a "Current") (OL_PRINC (setq USEROL (getvar "CLAYER"))) )
  ( (= a "Select")
     (if (setq a (cdr (assoc 8 (entget (car (entsel "\nSelect an object: "))))))
      (OL_PRINC (setq USEROL a))) )
  ( (= a "None") (OL_PRINC (setq USEROL "None")) )
  ( (tblsearch "layer" a) (OL_PRINC (setq USEROL a)) )
  (a (princ (strcat "\nCannot find layer \"" a "\"."))
     (OL_PRINC (setq USEROL "None")) )
 );cond
 (initget "Through")
 (setq b (getreal (strcat
  "\nSpecify offset distance or [Through] <" (rtos (getvar "OFFSETDIST")) ">: ")))
 (cond
  ( (not b) (princ) )
  ( (= b "Through") (graphscr)
     (setvar "OFFSETDIST" (distance
      (setq p1 (getpoint "\nSpecify first point: "))
      (getpoint p1 "\nSpecify second point: ") )) )
  (b (setvar "OFFSETDIST" b) )
 );cond
 (setq osm (getvar "OSMODE"))(setvar "OSMODE" 512) ;nea
 (setq p1 (getpoint "\nSelect object to offset: "))
 (while (and p1 (not (ssget p1))) (setq p1 (getpoint "\nSelect object to offset: ")) );while
 (while (and p1 (setq p2 (getpoint p1 "\nSpecify point on side to offset: ")))
  (setvar "CMDECHO" 0)
  (command ".offset" "" p1 p2 "")
  (if (/= USEROL "None") (command ".chprop" "L" "" "la" USEROL "") )
  (setvar "CMDECHO" 1)
  (setq p1 (getpoint "\nSelect object to offset: "))
  (while (and p1 (not (ssget p1))) (setq p1 (getpoint "\nSelect object to offset: ")) );while
 );while
 (setvar "OSMODE" osm)
 (setq a nil b nil p1 nil p2 nil osm nil)(princ)
);endOL
