Ik wil een aantal lagen (genaamd "1" "2" "3") unpurgeble maken.
Maar ik kom er niet uit hoe ik deze lijst prts aanpas
Ik zou het wel erg handig vinden om mijn vaste lagen te kunnen vasthouden..
BVD
(setq ptrs (cons (cons 340 (tblobjname "LAYER" name)) ptrs))
hoe maak ik een goede layer lijst aan voor prts?
Merci beaucoup
;; gc:GetExtDict (gile)
;; Retourne le dictionnaire d'extension de l'entité (ou nil)
;;
;; Argument : ent (ENAME)
(defun gc:GetExtDict (ent)
(cdadr (member '(102 . "{ACAD_XDICTIONARY") (entget ent)))
)
;; gc:GetOrCreateExtDict (gile)
;; Retourne le dictionnaire d'extension de l'entité
;; Le dictionnaire est créé s'il n'existe pas
;;
;; Argument : ent (ENAME)
(defun gc:GetOrCreateExtDict (ent / dict)
(cond
((cdadr (member '(102 . "{ACAD_XDICTIONARY") (entget ent))))
((setq dict (entmakex
'((0 . "DICTIONARY") (100 . "AcDbDictionary"))
)
)
(entmod (append (entget ent)
(list '(102 . "{ACAD_XDICTIONARY")
(cons 360 dict)
'(102 . "}")
)
)
)
dict
)
)
)
;; gc:SetXrecData
;; Retourne le ENAME du xrecord auquel sont affectées mes données
;;
;; Arguments
;; dict : ENAME du dictionnaire parent
;; key : nom du Xrecord
;; data : liste de paires pointées contenant les données
(defun gc:SetXrecData (dict key data / xrec)
(if (snvalid key)
(progn
(and (setq xrec (dictsearch dict key))
(entdel (cdr (assoc -1 xrec)))
)
(dictadd
dict
key
(entmakex
(append
(list '(0 . "XRECORD")
'(100 . "AcDbXrecord")
)
data
)
)
)
)
)
)
;;----------------------------------------------------;;
;; Commands ;;
;;----------------------------------------------------;;
;; SETALLLAYERSUNPURGEABLE command to set all layers unpurgeable
(defun c:Unpurg (/ lay name ptrs tbl)
(while (setq lay (tblnext "LAYER" (not lay)))
(if (/= (setq name (cdr (assoc 2 lay))) "0")
(setq ptrs (cons (cons 340 (tblobjname "LAYER" name)) ptrs))
)
)
(setq tbl (cdr (assoc 330 (entget (tblobjname "LAYER" "0")))))
(gc:SetXrecData
(gc:GetOrCreateExtDict tbl)
"LAYER_UNPURGE"
ptrs
)
(princ)
)
;; RESETALLLAYERSPURGEABLE command to reset all layers purgeable
(defun c:Repurg(/ tbl xdict)
(setq tbl (cdr (assoc 330 (entget (tblobjname "LAYER" "0")))))
(and
(setq xdict (gc:GetExtDict tbl))
(dictremove xdict "LAYER_UNPURGE")
)
(princ)
)
(defun c:Unpurg (/ enm lst ptrs)
(setq lst '("1" "2" "3")) ; Laagnamen.
(foreach nme lst
(if (setq enm (tblobjname "LAYER" nme))
(setq ptrs (cons (cons 340 enm) ptrs))
)
)
(gc:SetXrecData
(gc:GetOrCreateExtDict (cdr (assoc 330 (entget (tblobjname "LAYER" "0")))))
"LAYER_UNPURGE"
ptrs
)
(princ)
)
Voor BricsCAD moet GetOrCreateExtDict overigens aangepast worden (volgorde append):
(defun gc:GetOrCreateExtDict (ent / dict)
(cond
((cdadr (member '(102 . "{ACAD_XDICTIONARY") (entget ent))))
((setq dict (entmakex
'((0 . "DICTIONARY") (100 . "AcDbDictionary"))
)
)
(entmod (append (list '(102 . "{ACAD_XDICTIONARY")
(cons 360 dict)
'(102 . "}")
)
(entget ent)
)
)
dict
)
)
)
Respect! Ziet er zoooo makkelijk uit.
Dat scheelt weer een flink aantal onnodige handelingen voor onnodig purgen en opnieuw aanmaken layers.
Super bedankt Roy!
Misschien voor de gebruikers die juist die tekening ontvangt...
Hoe kun je die lagen toch purgen?
Er zijn nog steeds opdrachtgevers die graag overbodige layers e.d. niet in de dwg willen zien.
ja dat kan wel maar de wereld vergaat niet met wat layer defs. meer of minder.
Alleen layer fanatici die daar moeilijk over doen. Kwestie van betere filters gebruiken..
Command:
Unpurgeall
Ik ga hem posten voor je Eddy
... De code in de OP bevat de functie c:Repurg... :roll: :roll:
Hij is van GileCAD. een fransman
Voor alle duidelijkheid:
Mijn vorige bericht is niet gericht aan het adres van de maker, hoewel een bronvermelding altijd welkom is. Mijn kritiek is gericht aan Eddy, en ook Hans. Heren: lees de code en de toelichting eens goed door! De functie c:Repurg is het antwoord op Eddy's vraag. :idea:
Bedankt voor toelichting. Dat had ik er eerder duidelijker bij morgen vermelden.
De orginele code maakte ALLE layers unpurgeble. Dat vind ik niet wenselijk en handig.
Citaat van: roy_043 op vr 15 07 2016, 23:39:15
Voor alle duidelijkheid:
Mijn vorige bericht is niet gericht aan het adres van de maker, hoewel een bronvermelding altijd welkom is. Mijn kritiek is gericht aan Eddy, en ook Hans. Heren: lees de code en de toelichting eens goed door! De functie c:Repurg is het antwoord op Eddy's vraag. :idea:
Dan bij deze de bal terug bij de criticus:
Wat als die
"layer fanatici die daar moeilijk over doen" nu niet lid van deze site zijn, en dus niet deze lisp hebben?
(Zoals opdrachtgevers die geen rommel in de dwg willen) Hoe staarten ze dan het commando "REPURGE"?
Dat is per discipline natuurlijk verschillend maar voor 'constructies' (NLCS) ken ik eigenlijk maar één opdrachtgever die kritisch is voor ontvangst DWG. De rest snapt het niet, maakt het niets uit of daarvoor geldt dat er NLCS als standaard is achterhaald.. Pogingen tot standaardisering lijken bij voorbaat kansloos..
Bedoel je deze niet, om ze weer purge-baar te maken?
;; RESETALLLAYERSPURGEABLE command to reset all layers purgeable
(defun c:Repurg(/ tbl xdict)
(setq tbl (cdr (assoc 330 (entget (tblobjname "LAYER" "0")))))
(and
(setq xdict (gc:GetExtDict tbl))
(dictremove xdict "LAYER_UNPURGE")
)
(princ)
)
Citaat van: EddyBeerke op di 19 07 2016, 11:51:17
Dan bij deze de bal terug bij de criticus:
Wat als die "layer fanatici die daar moeilijk over doen" nu niet lid van deze site zijn, en dus niet deze lisp hebben?
(Zoals opdrachtgevers die geen rommel in de dwg willen) Hoe staarten ze dan het commando "REPURGE"?
Daar heb je een punt Eddy. Ik hoop dat je het ermee eens bent dat ook ik een punt heb met mijn vorige opmerking.
dan maken ze even een wblock van de tekening en inserten die vervolgens die vervolgens in een lege.
Als de laag niet in gebruik is ben je hem dan kwijt
Citaat van: bart op wo 20 07 2016, 08:05:08
dan maken ze even een wblock van de tekening en inserten die vervolgens die vervolgens in een lege.
Als de laag niet in gebruik is ben je hem dan kwijt
:vreegoe:
Vreemd dat de 3 andere deelnemers aan deze topic, waaronder deze 'criticus' :D, dat niet getest hebben... :roll: :roll: :roll:
Nadeel van wblocken is wel dat je dan alles in paperspace kwijt bent.
Of je moet weet meer gaan overhevelen. Unpurge maakt gebruik van XDATA die wordt weggeschreven op een element, in dit geval object 'laag'. Eerlijk gezegd ben ik niet zo thuis in deze materie. Hoe kun je de tag die wordt meegegeven aan de layer, nl. 'UNPURGE' nu eigenlijk makkelijk zien? Code deel dat het wegschrijft.
(gc:SetXrecData
(gc:GetOrCreateExtDict tbl)
"LAYER_UNPURGE" ; XDATA, zien zien met functie..?
https://knowledge.autodesk.com/support/autocad/learn-explore/caas/CloudHelp/cloudhelp/2015/ENU/AutoCAD-Core/files/GUID-F0299B36-232F-446E-9F81-98F300B36991-htm.html
Je kunt ook 'Wblocken' zonder PS kwijt te raken. Je moet dan de 'entire drawing' optie gebruiken, voor het _WBLOCK commando, of '*' voor het _-WBLOCK commando.
De code maakt gebruik van Dictionaries en Xrecords, maar niet van Xdata.
Weer wat geleerd.. :vreegoe:
Citaat van: roy_043 op di 19 07 2016, 17:32:47
Daar heb je een punt Eddy. Ik hoop dat je het ermee eens bent dat ook ik een punt heb met mijn vorige opmerking.
Goed punt Roy :vreegoe:, moet je wel die lisp hebben.
Maar daar gaat het dan soms mis... De tekenaar vergeet dan om te "RePurgen"... Met als gevolg dat die lagen eeuwig in het archief blijven of de tekenkamer eindeloos blijven achtervolgen als er bv een kopie van een tekening gemaakt wordt om in het volgend project te gebruiken (als voorbeeld... en ja dit doen ze bij ons op de afdeling nog wel eens :cry: ).
Het was meer als waarschuwing bedoeld voor degene die achteloos dit soort "niet standaard" dingen doen en dus eigenlijk niet weten waar ze mee bezig zijn.
Dat het 'gevaarlijk is' vind ik nogal overdreven. Hooguit ongemakkelijk.
Het leuke van dit soort LSP handigheden is dat het open beschikbaar is. Mensen in de 'tekenkamer' (heet dat nog zo?) weten heus wel google en de code te vinden. Mooie van deze tweak is dat
het nu net even wat zaken bewaard houdt die jij specifiek gebruikt. En dat is heel handig voor je code waarbij je zeker wilt dat een laag of linetype beschikbaar blijft. En de wereld vergaat niet met een paar definities meer of minder ingeladen..