Lisp routine breaks if xrefs are loaded

Lisp routine breaks if xrefs are loaded

pyreflos
Participant Participant
625 Views
2 Replies
Message 1 of 3

Lisp routine breaks if xrefs are loaded

pyreflos
Participant
Participant

I have a lisp routine I use to "print" the layers are in a drawing, but for some reason it only works in drawings without xrefs. Once an xref is loaded, the formatting gets messed up. Anyone know what I'm doing wrong with my code? This seems to happen regardless of whether it's a brand new file or an old one. This also happens in both vanilla AutoCAD & ACA 2015

 

;;
;; Build Layer Display
;; 
;; Draw a line and add text "Layer Name" and "Layer Description" for every layer in a drawing.
;; 

(vl-load-com)

(Defun C:BLD ()  ;; append after it works (/ dx1 dx2 dx3 dx4 dyy dyi adoc laycoll lay layn layd)

  (setq dx1 0 dx2 96 dx3 102 dx4 234)
  (setq dyy 0 dyi 24)
  (if(not(tblsearch "STYLE" "ARIAL"))
    (command "-style" "Arial" "Arial" "0" "1" "0" "n" "n")
  )
  (setq oldStyle (getvar "textstyle"))
  (setvar "textstyle" "Arial")
  (setq oldLay (getvar "clayer"))
  (setq adoc (vla-get-activedocument (vlax-get-acad-object)))
  (setq laycoll (vla-get-layers adoc))
  (vlax-for lay laycoll
    (setq layn (vla-get-Name lay))
    (setq layd (vla-get-Description lay))
    (setvar "clayer" layn)
    (command "line" (list dx1 dyy) (list dx2 dyy) "")
    (command "text" "s" "Arial" "j" "ml" (list dx3 dyy) "8" "0" layn)
    (command "text" "j" "ml" (list dx4 dyy) "8" "0" layd)
    (setq dyy(cadr(polar (list dx1 dyy) (* pi 1.5) dyi)))
  )
  (setvar "textstyle" oldStyle)
  (setvar "clayer" oldLay)
  (princ)
)

 Expected results (no xrefs):

xref.png

 

"Broken" results (xrefs loaded):

sheet.png

0 Likes
Accepted solutions (1)
626 Views
2 Replies
Replies (2)
Message 2 of 3

hmsilva
Mentor
Mentor

Hi pyreflos,

 

(Defun C:BLD ()

(setq osm (getvar 'OSMODE))

(setvar 'OSMODE 0)

;;;the rest of the code

(setvar 'OSMODE osm)

  (princ)
)

 

And you can't set as current 'Xref-dependent layers'...

 

Hope this helps,
Henrique

EESignature

0 Likes
Message 3 of 3

hmsilva
Mentor
Mentor
Accepted solution

@hmsilva wrote:

And you can't set as current 'Xref-dependent layers'...


We should also take into account the layer state, if frozen, will give an error, and to skip 'Xref-dependent layers', perhaps something like this

;;
;; Build Layer Display
;; 
;; Draw a line and add text "Layer Name" and "Layer Description" for every layer in a drawing.
;; 
(vl-load-com)
(Defun C:BLD ();; append after it works (/ dx1 dx2 dx3 dx4 dyy dyi adoc freezelst laycoll lay layn layd osm)
  (setq osm (getvar 'OSMODE))
  (setvar 'OSMODE 0)
  (setq dx1 0 dx2 96 dx3 102 dx4 234)
  (setq dyy dyi 24)
  (if (not (tblsearch "STYLE" "ARIAL"))
    (command "-style" "Arial" "Arial" "0" "1" "0" "n" "n")
  )
  (setq oldStyle (getvar "textstyle"))
  (setvar "textstyle" "Arial")
  (setq oldLay (getvar "clayer"))
  (setq adoc (vla-get-activedocument (vlax-get-acad-object)))
  (setq laycoll (vla-get-layers adoc))
  (vlax-for lay laycoll
    (setq layn (vla-get-Name lay))
    (if (not (wcmatch layn "*|*"))
      (progn
        (if (= (vla-get-freeze lay) :vlax-true)
          (progn
            (setq freezelst (cons (vla-get-name lay) freezelst))
            (vla-put-freeze lay :vlax-false)
          )
        )
        (setq layd (vla-get-Description lay))
        (setvar "clayer" layn)
        (command "line" (list dx1 dyy) (list dx2 dyy) "")
        (command "text" "s" "Arial" "j" "ml" (list dx3 dyy) "8" "0" layn)
        (command "text" "j" "ml" (list dx4 dyy) "8" "0" layd)
        (setq dyy (cadr (polar (list dx1 dyy) (* pi 1.5) dyi)))
      )
    )
  )
  (if freezelst
    (vlax-for lay laycoll
      (if (vl-position (vla-get-name lay) freezelst)
        (vla-put-freeze lay :vlax-true)
      )
    )
  )

  (setvar 'OSMODE osm)
  (setvar "textstyle" oldStyle)
  (setvar "clayer" oldLay)
  (princ)
)

 

And for AUTO/Visual LISP questions, should be easier to get help at the Visual LISP AutoLISP and General Customization forum

 

Hope this helps,
Henrique

EESignature