Visual LISP, AutoLISP and General Customization
cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

freeze layer without opening the drawing

8 REPLIES 8
Reply
Message 1 of 9
a7v1n
2355 Views, 8 Replies

freeze layer without opening the drawing

hi. is there any way to freeze a layer without opening the drawing in lisp? thanks...
8 REPLIES 8
Message 2 of 9
Anonymous
in reply to: a7v1n

How can you run your AutoLisp program if not in AutoCAD? You will want to look into a script files to try to do this.
Message 3 of 9
rogerio_brazil
in reply to: a7v1n

Moved above to make sense... Edited by: Rogerio_Brazil on Apr 24, 2010 10:13 AM
Message 4 of 9
rogerio_brazil
in reply to: a7v1n

This may be possible with OjectDBX + autolisp.

However, we must examine how.

Changing text, for example, is possible but it's complicated, at least for me.

I'll try to find something.

:)

Rogerio

Later...

Below a simple code to do this using "Ps_Bolt" layer name as example:

{code}
;Code base extracted from here:
;;http://discussion.autodesk.com/forums/thread.jspa?messageID=5544265
;;and here:
;;http://discussion.autodesk.com/forums/thread.jspa?messageID=1193220
;; Thanks for share the code

(defun c:fl (/ file1 odbx);Freeze Layer
(vl-load-com)
;------------------------------------------------
(setq file1 (getfiled "Select a drawing" "" "dwg" 0))
(setq odbx (vla-GetInterfaceObject (vlax-get-ACAD-Object)
(strcat "ObjectDBX.AxDbDocument." (substr (getvar "acadver") 1 2))));;set Objectdbx version
(setq layer_name "Ps_Bolt")
(vlax-invoke-method odbx (quote Open) file1)
(vlax-for layerx (vla-get-Layers odbx)
(if (= layer_name (vla-get-name layerx))
(vla-put-freeze layerx :vlax-true)))
(vlax-invoke-method odbx (quote SaveAs) file1)
(vlax-release-object odbx)
(princ))
{code}

and more sophisticated, but gives an error that I could not fix (I try to fix it later, but I accept corrections - thanks):

; Error: ActiveX Server returned the following error message: unknown name: ActiveLayer

{code}
(defun c:fl1 (/ file1 odbx layer_name);Freeze Layer
(vl-load-com)
;------------------------------------------------
(setq file1 (getfiled "Select a drawing" "" "dwg" 0))
(setq odbx (vla-GetInterfaceObject (vlax-get-ACAD-Object)
(strcat "ObjectDBX.AxDbDocument." (substr (getvar "acadver") 1 2))));;set Objectdbx version
(setq layer_name "Ps_Bolt")
(vlax-invoke-method odbx (quote Open) file1)
; by Luiz Esquivel below
(vlax-for layer (setq layers (vla-get-layers odbx))
(if (and (not (vl-catch-all-error-p
;; get the layer as vla-object
(setq vla_layer (vl-catch-all-apply
'vla-item
(list layers layer_name)))))
;; not the active layer
(not (equal (vla-get-activelayer odbx) vla_layer)))
(if ;; if layer thaw?
(eq (vla-get-freeze vla_layer) :vlax-false)
;; freeze
(vla-put-freeze vla_layer :vlax-true)
; by Luiz Esquivel above
)
)
)
;------------------------------------------------
(vlax-invoke-method odbx (quote SaveAs) file1)
(vlax-release-object odbx)
(princ))
{code}

:)

Rogerio Edited by: Rogerio_Brazil on Apr 24, 2010 10:18 AM
Message 5 of 9
Anonymous
in reply to: a7v1n

Hi Rogerio,

The reason you get an error message when asking for the ActiveLayer
proprerty of an OBDX document is because there's no such thing as "Active".
An OBDX file resides in memory only. Nothing is "Active". You can only
modify the database of objects available.

wrote in message news:6379755@discussion.autodesk.com...
This may be possible with OjectDBX + autolisp.

However, we must examine how.

Changing text, for example, is possible but it's complicated, at least for
me.

I'll try to find something.

:)

Rogerio

Later...

Below a simple code to do this using "Ps_Bolt" layer name as example:

{code}
;Code base extracted from here:
;;http://discussion.autodesk.com/forums/thread.jspa?messageID=5544265
;;and here:
;;http://discussion.autodesk.com/forums/thread.jspa?messageID=1193220
;; Thanks for share the code

(defun c:fl (/ file1 odbx);Freeze Layer
(vl-load-com)
;------------------------------------------------
(setq file1 (getfiled "Select a drawing" "" "dwg" 0))
(setq odbx (vla-GetInterfaceObject (vlax-get-ACAD-Object)
(strcat "ObjectDBX.AxDbDocument." (substr (getvar "acadver") 1 2))));;set
Objectdbx version
(setq layer_name "Ps_Bolt")
(vlax-invoke-method odbx (quote Open) file1)
(vlax-for layerx (vla-get-Layers odbx)
(if (= layer_name (vla-get-name layerx))
(vla-put-freeze layerx :vlax-true)))
(vlax-invoke-method odbx (quote SaveAs) file1)
(vlax-release-object odbx)
(princ))
{code}

and more sophisticated, but gives an error that I could not fix (I try to
fix it later, but I accept corrections - thanks):

; Error: ActiveX Server returned the following error message: unknown name:
ActiveLayer

{code}
(defun c:fl1 (/ file1 odbx layer_name);Freeze Layer
(vl-load-com)
;------------------------------------------------
(setq file1 (getfiled "Select a drawing" "" "dwg" 0))
(setq odbx (vla-GetInterfaceObject (vlax-get-ACAD-Object)
(strcat "ObjectDBX.AxDbDocument." (substr (getvar "acadver") 1 2))));;set
Objectdbx version
(setq layer_name "Ps_Bolt")
(vlax-invoke-method odbx (quote Open) file1)
; by Luiz Esquivel below
(vlax-for layer (setq layers (vla-get-layers odbx))
(if (and (not (vl-catch-all-error-p
;; get the layer as vla-object
(setq vla_layer (vl-catch-all-apply
'vla-item
(list layers layer_name)))))
;; not the active layer
(not (equal (vla-get-activelayer odbx) vla_layer)))
(if ;; if layer thaw?
(eq (vla-get-freeze vla_layer) :vlax-false)
;; freeze
(vla-put-freeze vla_layer :vlax-true)
; by Luiz Esquivel above
)
)
)
;------------------------------------------------
(vlax-invoke-method odbx (quote SaveAs) file1)
(vlax-release-object odbx)
(princ))
{code}

:)

Rogerio

Edited by: Rogerio_Brazil on Apr 24, 2010 10:18 AM
Message 6 of 9
rogerio_brazil
in reply to: a7v1n

Hi Joe,

Thanks for your explanation.
Message 7 of 9
Anonymous
in reply to: a7v1n

i bet if you explained "why?" we could suggest alternatives







"a7v1n" wrote in message news:6379671@discussion.autodesk.com...
hi. is there any way to freeze a layer without opening the drawing in lisp?
thanks...
Message 8 of 9
millermin
in reply to: a7v1n

hi. thanks for you program. but i can't run in my computer. i fixed them and run well now.

 

;; this program can turn off the layer you enter.

(defun c:lof ()       
(vl-load-com)
(setq dwgfile (getfiled "Select a drawing" "" "dwg" 0))
(setq lay (getstring "\nENTER A LAYER TO TURN OFF:"))
(setq cadver(substr (getvar "acadver") 1 2))                       ;; get cad version No.
(setq id (strcat "objectdbx.AxDbDocument." cadver))           ;; creat prog id
(setq dbx(vlax-create-object id))                                         ;; creat dbx object
(vla-open dbx dwgfile)
(setq layers (vla-get-layers dbx))                 ;; get layer collection set from dbx
           (if (not (vl-catch-all-error-p
               (setq vlay(vl-catch-all-apply 'vla-item (list layers lay)))))       ;; fild the specified layer in collection   
               (if (eq (vla-get-layeron vlay) :vlax-true)                          ;; check layer status         
                   (vla-put-layeron vlay :vlax-false)  
                )   
                (print "THE LAYER NOT FOUND  ! ")
             )
(vla-saveas dbx dwgfile)  
(vlax-release-object dbx)
(prin1)
)

 

Message 9 of 9
tiago.vazDUZEP
in reply to: millermin

That worked mint, thank you.

But is there anyway to make it to select multiple drawings and turn a layers in common on them off?

 

Cheers

Can't find what you're looking for? Ask the community or share your knowledge.

Post to forums  

Autodesk Design & Make Report

”Boost