Beste Forumleden,
Als ik in de onderstaande code de regel met command weghaal dan gedraagt de tblnext-lus zich zoals verwacht: alle laagnamen worden weergegeven. Met deze regel stopt de tblnext-lus na de eerste laag. Het kan zijn dat dit een bug is in Bricscad 7.
Mijn vragen zijn:
1. Treedt dit probleem ook op in AutoCAD?
2. En zo ja: waarom treedt dit probleem op. Ik snap het niet maar misschien is het juist heel logisch dat de lus stopt.
(defun c:TestLL ( / layerEntLst layerName )
(setq layerEntLst (tblnext "LAYER" T))
(while layerEntLst
(setq layerName (cdr (assoc 2 layerEntLst)))
(princ (strcat "\n" layerName))
(setvar "cmdecho" 0)
(command "_.layer" "_unlock" layerName "_thaw" layerName "") ; conflict met tblnext-lus
(setvar "cmdecho" 1)
(setq layerEntLst (tblnext "LAYER"))
)
(princ)
)
Groet, Roy.
al eens getracht om de commando's afzonderlijk uit te voeren in BricsCad?
_layer
_unlock
"0"
_thaw
"0"
""
ik denk dat het er in BricsCad zo moet uit zien:
(command "layer" "U" layerName "T" layername "")
in ieder geval, als het een bug is --> zeker melden
Beste WebRacer,
Bedankt voor jouw antwoord. Maar de lisp loopt niet vast op het commando "layer". Het probleem is dat door het aanroepen van het commando de tblnext-lus blijkbaar wordt verstoord. Als ik de aangepaste code hieronder gebruik in een tekening waarin alle lagen gelockt zijn dan staat dit in de history:
: testll
0
TestLL voltooid!
En inderdaad is dan alleen laag 0 ge-unlockt.
Vandaar de 2 vragen in mijn eerste post.
(defun c:TestLL ( / layerEntLst layerName )
(setq layerEntLst (tblnext "LAYER" T))
(while layerEntLst
(setq layerName (cdr (assoc 2 layerEntLst)))
(princ (strcat "\n" layerName))
(setvar "cmdecho" 0)
(command "layer" "u" layerName "t" layerName "") ; conflict met tblnext-lus
(setvar "cmdecho" 1)
(setq layerEntLst (tblnext "LAYER"))
)
(princ "\nTestLL voltooid! ")
(princ)
)
Groet, Roy.
probeer deze eens:
(defun c:laylckall (/ lst lay)
(setq lst nil)
(setq lay (tblnext "LAYER" T))
(while (/= lay nil)
(setq lst (append (list (cdr (assoc 2 lay))) lst))
(setq lay (tblnext "LAYER")))
(foreach elm lst
(command "layer" "u" elm "t" elm "")))
Beste Roy,
Bij mij werkt in AutoCAD 2008 het programma TestLL
en het programma LAYLCKALL goed.
Hoe werkt onderstaand in Bricscad 7:
(defun C:TestLL2()
(vl-load-com)
(vlax-for vlaLayer (vla-get-layers (vla-get-activedocument (vlax-get-acad-object)))
(if (= :vlax-true (vla-get-lock vlaLayer))(vla-put-lock vlaLayer :vlax-false))
(if (/= :vlax-false (vla-get-freeze vlaLayer))(vla-put-freeze vlaLayer :vlax-false))
))
Met vriendelijke groet, HofCAD CSI.
Beste HofCAD en WebRacer,
Hartelijk dank voor jullie antwoorden. Het is nu duidelijk dat het onderbreken van de tblnext-lus een bug is in Bricscad 7.
De workaround van WebRacer werkt.
De code van HofCAD werkt niet in Bricscad 7. De vla*-functies worden niet ondersteund in Bricscad 7. In Bricscad 9 (http://www.bricsys.com/bricscad/help/en_US/V9/DevRef/source/IDR_LISP_VLR_VLA_VLAX.htm) worden de belangrijkste vla*-functie wel ondersteund. Misschien tijd voor een upgrade...
Groet, Roy.