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

Command | If layer is frozen : thaw it and vice versa

9 REPLIES 9
SOLVED
Reply
Message 1 of 10
Troispistols
3192 Views, 9 Replies

Command | If layer is frozen : thaw it and vice versa

Hi, I found and modify a lisp routine that I've found, I would like to know if it is on the right track. Also to mention that I don't  really understand all the mechanics of it but first, here's what I want to achieve :

 

I have a  Layer named "Arch - Niveau 1"

I would like to enter in the command prompt  "a1"

It would read if the layer is frozen or thawed and if it is frozen, it will thaw it (? sorry bad english)

And if the layer is thawed, it would freeze it

 

That's it!

 

What could be added is:

To check up if the layer exists and if not, create it.

Would do the same for 2 other layer named "Arch - Niveau 2" command "a2"   and  "Arch - Niveau 3" command "a3". Is it clear?

 

Now the lisp I've found and modified is this:


(defun c:a1 (/ lay ldef flag)
  (setq layn "Arch - Niveau 1")

  (command "_.LAYER")
  (if (not (tblsearch "LAYER" layn))
      (command "_Make" layn)
      (progn
        (setq ldef (tblsearch "LAYER" layn)
              flag (cdr (assoc 70 ldef)))
        (and (= (logand flag  1)  1)
             (command "_Thaw" layn))
        ))
  (command "")
)

 This lisp looks if it exists, if not, create it and only thaw the layer.

 

I'm not sure I want to understand all the mechanics because I'm not enough familiar with the "not", the "progn" the "flag", "and" and "logand"  (!!!!)

 

Thanks a lot !

 

9 REPLIES 9
Message 2 of 10
Kent1Cooper
in reply to: Troispistols


@Troispistols wrote:

.... 

I have a  Layer named "Arch - Niveau 1"

I would like to enter in the command prompt  "a1"

It would read if the layer is frozen or thawed and if it is frozen, it will thaw it ... And if the layer is thawed, it would freeze it

.... 

What could be added is:

To check up if the layer exists and if not, create it.

Would do the same for 2 other layer named "Arch - Niveau 2" command "a2"   and  "Arch - Niveau 3" command "a3". .... 


Here's a pretty efficient way to thaw a Layer [with its name in the 'layn' variable] if it's frozen or Freeze it if it's thawed:

 

(setq layobj (vlax-ename->vla-object (tblobjname "Layer" layn)))

(vlax-put layobj 'Freeze (1- (abs (vlax-get layobj 'Freeze))))

 

It finds the Freeze property assigned to that Layer as converted to a VLA object, and if it's 0 [thawed], makes it -1 [frozen], or if it's -1, makes it 0.

 

So, you could define all three commands together, by putting this into a .lsp file:

 

(defun LFTTM (layn / layobj); = Layer Freeze-Thaw Toggle or Make [sub-routine]

  (if (tblsearch "Layer" layn)

    (progn ; then -- freeze/thaw toggle it

      (setq layobj (vlax-ename->vla-object (tblobjname "Layer" layn)))

      (vlax-put layobj 'Freeze (1- (abs (vlax-get layobj 'Freeze))))

    ); progn

    (command "_.layer" "_make" layn ""); else - make it

); defun

(defun C:a1 ()

  (LFTTM "Arch - Niveau 1")

)

(defun C:a2 ()

  (LFTTM "Arch - Niveau 2")

)

(defun C:a3 ()

  (LFTTM "Arch - Niveau 3")

)

Kent Cooper, AIA
Message 3 of 10
Troispistols
in reply to: Kent1Cooper

OK thanks, but I can't make it work the lisp I create :

(defun LFTTM (layn / layobj); = Layer Freeze-Thaw Toggle or Make [sub-routine]
  (if (tblsearch "Layer" layn)
    (progn ; then -- freeze/thaw toggle it
      (setq layobj (vlax-ename->vla-object (tblobjname "Layer" layn)))
      (vlax-put layobj 'Freeze (1- (abs (vlax-get layobj 'Freeze))))
    ); progn
    (command "_.layer" "_make" layn ""); else - make it
); defun

(defun C:a11 ()
  (LFTTM "Arch - Niveau 1")
)
(defun C:a22 ()
  (LFTTM "Arch - Niveau 2")
)
(defun C:a33 ()
  (LFTTM "Arch - Niveau 3")
)
)

 

 

When I hit "a11" and the layer is already frozen, it answer me:

 

Command: *Cancel*

Command: *Cancel*

Command: a11 -layer
Current layer: "0"
Enter an option
[?/Make/Set/New/Rename/ON/OFF/Color/Ltype/LWeight/TRansparency/MATerial/Plot/Fre
eze/Thaw/LOck/Unlock/stAte/Description/rEconcile]: new
Enter name list for new layer(s): Arch - Niveau 1
Layer "Arch - Niveau 1" already exists.
Enter an option
[?/Make/Set/New/Rename/ON/OFF/Color/Ltype/LWeight/TRansparency/MATerial/Plot/Fre
eze/Thaw/LOck/Unlock/stAte/Description/rEconcile]:
Command:
Frozen"\nFrozen"

 

(Nothing Happen)

 

If the layer is already thawed

 

Command: *Cancel*

Command: *Cancel*

Command: a11 -layer
Current layer: "0"
Enter an option
[?/Make/Set/New/Rename/ON/OFF/Color/Ltype/LWeight/TRansparency/MATerial/Plot/Fre
eze/Thaw/LOck/Unlock/stAte/Description/rEconcile]: new
Enter name list for new layer(s): Arch - Niveau 1
Layer "Arch - Niveau 1" already exists.
Enter an option
[?/Make/Set/New/Rename/ON/OFF/Color/Ltype/LWeight/TRansparency/MATerial/Plot/Fre
eze/Thaw/LOck/Unlock/stAte/Description/rEconcile]:
Command:
Thawednil

 

So at this point, it does not work

 

Thanks

Message 4 of 10
Kent1Cooper
in reply to: Troispistols


@Troispistols wrote:

OK thanks, but I can't make it work.... 

.... 

Command: a11 -layer
Current layer: "0"
Enter an option
[?/Make/Set/New/Rename/ON/OFF/Color/Ltype/LWeight/TRansparency/MATerial/Plot/Fre
eze/Thaw/LOck/Unlock/stAte/Description/rEconcile]: new
....


I can only imagine there's some older definition of the same command name still in effect, which probably means the file you put that in did not load properly.  There's nothing in your posted code that would be feeding in the layer command name with the hyphen in front of it [not needed when inside a (command) function], nor the new option, nor should it be calling up the Layer command at all if the Layer already exists.  And the other oddball things happening later must also be coming from something else.

 

[And it looks like you have an extra right parenthesis at the very end.  That might prevent it from loading, but I think you should get some kind of message about it.]

Kent Cooper, AIA
Message 5 of 10
Troispistols
in reply to: Kent1Cooper

Hi, thanks for taking the time. But I found this more complicated that it is...

 

If I copy/paste what you gave to me and drop it in autocad in a fresh new dwg it doesn't load properly :

 

Regenerating model.

AutoCAD menu utilities loaded.
*** Acaddoc.lsp successfully loaded ***
Command:
Command:
Command:
Command: (LOAD "C:/Users/jpetitclerc/Desktop/a11.lsp") ; error: malformed list on input

 

I had to add the right parenthisis at the end do make it load properly :


Command:
Command: (LOAD "C:/Users/jpetitclerc/Desktop/a11.lsp") LFTTM

 

When I hit a11. It doesn't work :

 

Command:
Command: (LOAD "C:/Users/jpetitclerc/Desktop/a11.lsp") LFTTM

Command: a11
Unknown command "A11". Press F1 for help.

 

Also english isn't my first language and i didn't understand everything you answer me... Specificaly, what should I do to make it run? I think the principle is simple? 

 

"If layer is frozen : thaw it and vice versa"

 

Does someone can help me whit that please?

Message 6 of 10
Kent1Cooper
in reply to: Troispistols

My fault -- I left out a closing parenthesis for an (if) function.  Try it this way:

 

(defun LFTTM (layn / layobj); = Layer Freeze-Thaw Toggle or Make [sub-routine]

  (if (tblsearch "Layer" layn)

    (progn ; then -- freeze/thaw toggle it

      (setq layobj (vlax-ename->vla-object (tblobjname "Layer" layn)))

      (vlax-put layobj 'Freeze (1- (abs (vlax-get layobj 'Freeze))))

    ); progn

    (command "_.layer" "_make" layn ""); else - make it

  ); if

); defun

(defun C:a11 ()

  (LFTTM "Arch - Niveau 1")

)

(defun C:a22 ()

  (LFTTM "Arch - Niveau 2")

)

(defun C:a33 ()

  (LFTTM "Arch - Niveau 3")

)

Kent Cooper, AIA
Message 7 of 10
Troispistols
in reply to: Kent1Cooper

OK, thanks,

 

but again,

 

I get this:

 

Command: (LOAD "C:/Users/jpetitclerc/Desktop/a11.lsp") C:A33

Command: A11 ; error: no function definition: VLAX-ENAME->VLA-OBJECT

 

Sorry

Smiley Indifferent

Message 8 of 10
Troispistols
in reply to: Troispistols

Finally, elsewhere someone made me this lisp, credit to cadtutor forum

 

(defun c:a1 nil (FreezeThawLayer "Arch - Niveau 1"))
(defun c:a2 nil (FreezeThawLayer "Arch - Niveau 2"))
(defun c:a3 nil (FreezeThawLayer "Arch - Niveau 3"))

(defun FreezeThawLayer ( layer / dx en )
    (if (null (setq en (tblobjname "LAYER" layer)))
        (entmake
            (list
               '(0 . "LAYER")
               '(100 . "AcDbSymbolTableRecord")
               '(100 . "AcDbLayerTableRecord")
                (cons 2 layer)
               '(70 . 0)
            )
        )
        (setq en (entget en)
              dx (assoc 70 en)
              en (entmod (subst (cons 70 (boole 6 1 (cdr dx))) dx en))
        )
    )
    (princ)
)

 

 

Works fine, thanks again for taking the time

 

Have a good week end

Message 9 of 10
Kent1Cooper
in reply to: Troispistols

One other thing I often forget -- add this line to the code somewhere [most people put it at the top, but I don't think it matters in this case]:

 

(vl-load-com)

 

[I often forget to include that, because we use Architectural Desktop which somehow loads that for us, so things always work here without our including that in our routines.  Sometimes I remember in things I post, but obviously not always.]

Kent Cooper, AIA
Message 10 of 10
Troispistols
in reply to: Kent1Cooper

Haha ok ! Smiley Very Happy

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

Post to forums  

Autodesk Design & Make Report

”Boost