Author Topic: Looking for Layer state Lisp  (Read 5418 times)

0 Members and 1 Guest are viewing this topic.

AVCAD

  • Guest
Looking for Layer state Lisp
« on: June 29, 2007, 11:11:09 AM »
Hi again...

I am looking for a lisp or routine that will search the currently opened drawing for all layers that are Frozen/Off or Not Printable and make sure that just those layers are:

OFF
LOCKED
NOT PRINTABLE
FROZEN
COLOR CYAN

anyone have anything like this?

LE

  • Guest
Re: Looking for Layer state Lisp
« Reply #1 on: June 29, 2007, 11:14:00 AM »
here is something I used some time ago... hope will help you (no idea if it is complete):

Code: [Select]
;;..............................
;; (rcmd-setLayer <string> <int> <string> <t or nil>)
(defun rcmd-setLayer  (layer_name lcolor ltype plot / vla_layer)
  ;; layer name exist?
  (if (not
(vl-catch-all-error-p
  (setq
    vla_layer (vl-catch-all-apply
'vla-item
(list (vla-get-layers (rcmd-thisDwg))
      layer_name)))))
    (progn

      ;; thaw
      (if (/= :vlax-false (vla-get-freeze vla_layer))
(vla-put-freeze vla_layer :vlax-false))
      ;; unlock
      (if (= :vlax-true (vla-get-lock vla_layer))
(vla-put-lock vla_layer :vlax-false))
      ;; turn on
      (if (/= :vlax-true (vla-get-layerOn vla_layer))
(vla-put-layerOn vla_layer :vlax-true))

      (vla-put-color vla_layer lcolor)

      ;; load the linetype
      (if (not
    (vl-catch-all-error-p
      (setq
vla_ltype
(vl-catch-all-apply
   'vla-item
   (list (vla-get-lineTypes (rcmd-thisDwg))
ltype)))))
(vla-put-lineType vla_layer (vla-get-name vla_ltype))
(progn (vla-load (vla-get-lineTypes (rcmd-thisDwg))
ltype
"acad.lin")
       (vla-put-lineType vla_layer ltype)))

      ;; t = non-plottable
      (if plot
(vla-put-plottable vla_layer :vlax-false))

      ;; set active
      (vla-put-activeLayer (rcmd-thisDwg) vla_layer))
    ;; make the layer
    (if (not
  (vl-catch-all-error-p
    (setq
      vla_layer (vl-catch-all-apply
  'vla-add
  (list (vla-get-layers (rcmd-thisDwg))
layer_name)))))
      (progn
(vla-put-color vla_layer lcolor)

;; load the linetype
(if (not
      (vl-catch-all-error-p
(setq
  vla_ltype
   (vl-catch-all-apply
     'vla-item
     (list (vla-get-lineTypes (rcmd-thisDwg))
   ltype)))))
  (vla-put-lineType vla_layer (vla-get-name vla_ltype))
  (progn (vla-load (vla-get-lineTypes (rcmd-thisDwg))
   ltype
   "acad.lin")
(vla-put-lineType vla_layer ltype)))

(if plot
  (vla-put-plottable vla_layer :vlax-false))

;; set active
(vla-put-activeLayer (rcmd-thisDwg) vla_layer)))))

;;..............................
(defun rcmd-delete-layerState  (lman_obj state_name)
  (if (vl-catch-all-error-p
(vl-catch-all-apply
  'vla-delete
  (list lman_obj state_name)))
    nil
    T))

;;..............................
(defun rcmd-save-layerState  (lman_obj state_name layer_property)
  (if (vl-catch-all-error-p
(vl-catch-all-apply
  'vla-save
  (list lman_obj state_name layer_property)))
    nil
    T))

(defun rcmd-LayerGetObject (ProgId / Result)
   (setq result
      (vla-getinterfaceobject
         (vlax-get-acad-object)
         (strcat ProgId "." (substr (getvar "acadver") 1 2))))
   (if (not result)
      (setq result
         (vla-getinterfaceobject
            (vlax-get-acad-object)
            progid)))
   result)

;;..............................
;;; "AutoCAD.AcadLayerStateManager.16"
(defun rcmd-set-layerState  (layer_state_name)

  ;; ajuste para A2004
;;;  (setq :rcm_layer_state_manager
;;; (vla-getInterfaceObject
;;;    (vlax-get-acad-object)
;;;    (strcat "AutoCAD.AcadLayerStateManager"
;;;    (cond
;;;      ;; A2000i o' A2002
;;;      ((or (eq (getvar "acadver") "15.05")
;;;   (eq (getvar "acadver") "15.06"))
;;;       "")
;;;      ;; A2004
;;;      ((eq (getvar "acadver") "16.0") ".16")))))

  (setq :rcm_layer_state_manager (rcmd-LayerGetObject "AutoCAD.AcadLayerStateManager"))

  (vla-setDataBase
    :rcm_layer_state_manager
    (vla-get-dataBase (rcmd-thisDwg)))

  (rcmd-delete-layerState
    :rcm_layer_state_manager
    layer_state_name)

  (rcmd-save-layerState
    :rcm_layer_state_manager
    layer_state_name
    aclsall))

;;..............................
(defun rcmd-get-state-names  (/ names dict obj)
  (setq dict (vla-getExtensionDictionary
       (vla-get-layers (rcmd-thisDwg))))
  (if (not
(vl-catch-all-error-p
  (setq obj
(vl-catch-all-apply
   (function (lambda () (vla-item dict "ACAD_LAYERSTATES")))))))
    (vlax-for n obj
      (setq names (cons (strcase (vla-get-name n)) names))))
  (if names
    (acad_strLsort names)))

;;..............................
(defun rcmd-restore-layerState (layer_state_name)
  (if (and :rcm_layer_state_manager
   (vl-position
     (strcase layer_state_name)
     (rcmd-get-state-names)))
    (progn (vla-restore :rcm_layer_state_manager layer_state_name)
   (rcmd-delete-layerState
     :rcm_layer_state_manager
     layer_state_name)
   (vlax-release-object :rcm_layer_state_manager)
   (setq :rcm_layer_state_manager nil))))

LE

  • Guest
Re: Looking for Layer state Lisp
« Reply #2 on: June 29, 2007, 11:15:05 AM »
some more...

Code: [Select]
;;..............................
(defun rcmd-thaw-unLock-turnOn (layer_name / vla_layer)
  (if (not
(vl-catch-all-error-p
  (setq
    vla_layer (vl-catch-all-apply
'vla-item
(list (vla-get-layers (rcmd-thisDwg))
      layer_name)))))
    (progn
      ;; thaw
      (if (/= :vlax-false (vla-get-freeze vla_layer))
(vla-put-freeze vla_layer :vlax-false))
      ;; unlock
      (if (= :vlax-true (vla-get-lock vla_layer))
(vla-put-lock vla_layer :vlax-false))
      ;; turn on
      (if (/= :vlax-true (vla-get-layerOn vla_layer))
(vla-put-layerOn vla_layer :vlax-true)))))

;;..............................
(defun rcmd-thaw-unLock-turnOn-all  ()
  (vlax-for vlaLayer  (vla-get-layers (rcmd-thisDwg))
    ;; thaw
    (if (/= :vlax-false (vla-get-freeze vlaLayer))
      (vla-put-freeze vlaLayer :vlax-false))
    ;; unlock
    (if (= :vlax-true (vla-get-lock vlaLayer))
      (vla-put-lock vlaLayer :vlax-false))
    ;; turn on
    (if (/= :vlax-true (vla-get-layerOn vlaLayer))
      (vla-put-layerOn vlaLayer :vlax-true))))

;;..............................
(defun rcmd-unLock-all ()
  (vlax-for vlaLayer  (vla-get-layers (rcmd-thisDwg))
    ;; unlock
    (if (= :vlax-true (vla-get-lock vlaLayer))
      (vla-put-lock vlaLayer :vlax-false))))

;;..............................
(defun rcmd-thaw-all  ()
  (vlax-for vlaLayer  (vla-get-layers (rcmd-thisDwg))
    ;; thaw
    (if (/= :vlax-false (vla-get-freeze vlaLayer))
      (vla-put-freeze vlaLayer :vlax-false))))

;;..............................
(defun rcmd-turnOn-all ()
  (vlax-for vlaLayer  (vla-get-layers (rcmd-thisDwg))
    ;; turn on
    (if (/= :vlax-true (vla-get-layerOn vlaLayer))
      (vla-put-layerOn vlaLayer :vlax-true))))

AVCAD

  • Guest
Re: Looking for Layer state Lisp
« Reply #3 on: June 29, 2007, 11:54:31 AM »
sorry i don't understand...are these multiple programs or are they all 1 big program?

LE

  • Guest
Re: Looking for Layer state Lisp
« Reply #4 on: June 29, 2007, 11:59:29 AM »
Those are functions that you can use and adapt them for your needs, if I have time, I will try to provide an skeleton....

ronjonp

  • Needs a day job
  • Posts: 7529
Re: Looking for Layer state Lisp
« Reply #5 on: June 29, 2007, 12:20:01 PM »
Give this a whirl:

Code: [Select]
(defun c:layerschtuff (/)
  (vlax-map-collection
    (vla-get-layers
      (vla-get-activedocument (vlax-get-acad-object))
    )
    '(lambda (x)
       (if (or (= (vla-get-layeron x) :vlax-false)
       (= (vla-get-freeze x) :vlax-true)
       (= (vla-get-plottable x) :vlax-false)
   )
(progn
   (vl-catch-all-error-p
     (vl-catch-all-apply 'vla-put-freeze (list x :vlax-true))
   )
   (vla-put-layeron x :vlax-false)
   (vla-put-lock x :vlax-true)
   (vla-put-plottable x :vlax-false)
   (vla-put-color x 4)
)
       )
     )
  )
  (princ)
)
« Last Edit: July 01, 2007, 12:42:41 PM by ronjonp »

Windows 11 x64 - AutoCAD /C3D 2023

Custom Build PC

AVCAD

  • Guest
Re: Looking for Layer state Lisp
« Reply #6 on: June 29, 2007, 05:31:38 PM »
works perfectly, thanks

FengK

  • Guest
Re: Looking for Layer state Lisp
« Reply #7 on: June 30, 2007, 04:45:33 AM »
ronjonp, can i ask why you change the layer name case?

ronjonp

  • Needs a day job
  • Posts: 7529
Re: Looking for Layer state Lisp
« Reply #8 on: July 01, 2007, 12:40:53 PM »
Oops  :oops: I pulled that from one of my routines....I guess the answer would be attributed to a small amount of OCD.  :-D I took that portion out.

Ron
« Last Edit: July 01, 2007, 12:42:07 PM by ronjonp »

Windows 11 x64 - AutoCAD /C3D 2023

Custom Build PC